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

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