@varlet/cli 1.21.0 → 1.21.1-alpha.64

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 (133) hide show
  1. package/README.en-US.md +11 -0
  2. package/README.md +11 -0
  3. package/generators/sfc/package.json +3 -2
  4. package/generators/sfc/varlet.config.js +5 -0
  5. package/generators/tsx/package.json +3 -2
  6. package/generators/tsx/varlet.config.js +5 -0
  7. package/lib/commands/build.js +19 -15
  8. package/lib/commands/dev.d.ts +3 -2
  9. package/lib/commands/dev.js +23 -34
  10. package/lib/commands/jest.d.ts +3 -3
  11. package/lib/commands/preview.d.ts +1 -0
  12. package/lib/commands/preview.js +65 -0
  13. package/lib/compiler/compileModule.js +7 -14
  14. package/lib/compiler/compileSFC.js +7 -2
  15. package/lib/compiler/compileSiteEntry.d.ts +1 -4
  16. package/lib/compiler/compileSiteEntry.js +10 -20
  17. package/lib/compiler/compileStyle.js +1 -60
  18. package/lib/config/babel.config.js +0 -9
  19. package/lib/config/jest.config.js +1 -1
  20. package/lib/config/jest.lib.mock.d.ts +0 -0
  21. package/lib/config/jest.lib.mock.js +2 -0
  22. package/lib/config/varlet.config.d.ts +1 -1
  23. package/lib/config/vite.config.d.ts +4 -0
  24. package/lib/config/vite.config.js +128 -0
  25. package/lib/index.js +7 -2
  26. package/lib/shared/constant.d.ts +2 -8
  27. package/lib/shared/constant.js +3 -9
  28. package/lib/site/components/app-bar/index.d.ts +3 -0
  29. package/lib/site/components/app-bar/index.js +12 -0
  30. package/lib/site/components/app-bar/props.d.ts +21 -0
  31. package/lib/site/components/app-bar/props.js +28 -0
  32. package/lib/site/components/button/index.d.ts +3 -0
  33. package/lib/site/components/button/index.js +12 -0
  34. package/lib/site/components/button/props.d.ts +62 -0
  35. package/lib/site/components/button/props.js +69 -0
  36. package/lib/site/components/cell/index.d.ts +3 -0
  37. package/lib/site/components/cell/index.js +12 -0
  38. package/lib/site/components/cell/props.d.ts +27 -0
  39. package/lib/site/components/cell/props.js +30 -0
  40. package/lib/site/components/context/index.d.ts +15 -0
  41. package/lib/site/components/context/index.js +11 -0
  42. package/lib/site/components/context/lock.d.ts +10 -0
  43. package/lib/site/components/context/lock.js +94 -0
  44. package/lib/site/components/context/zIndex.d.ts +4 -0
  45. package/lib/site/components/context/zIndex.js +19 -0
  46. package/lib/site/components/icon/index.d.ts +3 -0
  47. package/lib/site/components/icon/index.js +12 -0
  48. package/lib/site/components/icon/props.d.ts +23 -0
  49. package/lib/site/components/icon/props.js +25 -0
  50. package/lib/site/components/loading/index.d.ts +3 -0
  51. package/lib/site/components/loading/index.js +12 -0
  52. package/lib/site/components/loading/props.d.ts +26 -0
  53. package/lib/site/components/loading/props.js +34 -0
  54. package/lib/site/components/menu/index.d.ts +3 -0
  55. package/lib/site/components/menu/index.js +12 -0
  56. package/lib/site/components/menu/props.d.ts +40 -0
  57. package/lib/site/components/menu/props.js +43 -0
  58. package/lib/site/components/progress/index.d.ts +3 -0
  59. package/lib/site/components/progress/index.js +12 -0
  60. package/lib/site/components/progress/props.d.ts +43 -0
  61. package/lib/site/components/progress/props.js +57 -0
  62. package/lib/site/components/ripple/index.d.ts +8 -0
  63. package/lib/site/components/ripple/index.js +125 -0
  64. package/lib/site/components/utils/components.d.ts +53 -0
  65. package/lib/site/components/utils/components.js +279 -0
  66. package/lib/site/components/utils/elements.d.ts +30 -0
  67. package/lib/site/components/utils/elements.js +240 -0
  68. package/lib/site/components/utils/shared.d.ts +36 -0
  69. package/lib/site/components/utils/shared.js +181 -0
  70. package/lib/site/mobile/main.d.ts +3 -0
  71. package/lib/site/mobile/main.js +93 -0
  72. package/lib/site/pc/main.d.ts +3 -0
  73. package/lib/site/pc/main.js +69 -0
  74. package/lib/site/useProgress.d.ts +4 -0
  75. package/lib/site/useProgress.js +58 -0
  76. package/lib/site/utils.d.ts +24 -0
  77. package/lib/site/utils.js +133 -0
  78. package/package.json +16 -30
  79. package/site/.DS_Store +0 -0
  80. package/site/components/app-bar/AppBar.vue +45 -0
  81. package/site/components/app-bar/appBar.less +66 -0
  82. package/site/components/app-bar/index.ts +10 -0
  83. package/site/components/app-bar/props.ts +25 -0
  84. package/site/components/button/Button.vue +84 -0
  85. package/site/components/button/button.less +183 -0
  86. package/site/components/button/index.ts +10 -0
  87. package/site/components/button/props.ts +70 -0
  88. package/site/components/cell/Cell.vue +42 -0
  89. package/site/components/cell/cell.less +74 -0
  90. package/site/components/cell/index.ts +10 -0
  91. package/site/components/cell/props.ts +27 -0
  92. package/site/components/context/index.ts +17 -0
  93. package/site/components/context/lock.ts +103 -0
  94. package/site/components/context/zIndex.ts +20 -0
  95. package/site/components/icon/Icon.vue +68 -0
  96. package/site/components/icon/icon.less +25 -0
  97. package/site/components/icon/index.ts +10 -0
  98. package/site/components/icon/props.ts +24 -0
  99. package/site/components/loading/Loading.vue +55 -0
  100. package/site/components/loading/index.ts +10 -0
  101. package/site/components/loading/loading.less +420 -0
  102. package/site/components/loading/props.ts +37 -0
  103. package/site/components/menu/Menu.vue +113 -0
  104. package/site/components/menu/index.ts +10 -0
  105. package/site/components/menu/menu.less +27 -0
  106. package/site/components/menu/props.ts +43 -0
  107. package/site/components/progress/Progress.vue +108 -0
  108. package/site/components/progress/index.ts +10 -0
  109. package/site/components/progress/progress.less +98 -0
  110. package/site/components/progress/props.ts +55 -0
  111. package/site/components/ripple/index.ts +167 -0
  112. package/site/components/ripple/ripple.less +17 -0
  113. package/site/components/styles/common.less +64 -0
  114. package/site/components/styles/elevation.less +126 -0
  115. package/site/components/styles/var.less +27 -0
  116. package/site/components/utils/components.ts +53 -0
  117. package/site/components/utils/elements.ts +83 -0
  118. package/site/components/utils/shared.ts +27 -0
  119. package/site/{pc/index.html → index.html} +6 -4
  120. package/site/mobile/App.vue +20 -18
  121. package/site/mobile/components/AppHome.vue +6 -8
  122. package/site/mobile/main.ts +17 -2
  123. package/site/{mobile/mobile.html → mobile.html} +6 -5
  124. package/site/pc/App.vue +16 -11
  125. package/site/pc/components/AppHeader.vue +15 -13
  126. package/site/pc/components/AppMobile.vue +3 -3
  127. package/site/pc/components/AppSidebar.vue +17 -23
  128. package/site/pc/main.ts +10 -2
  129. package/site/useProgress.ts +11 -9
  130. package/site/utils.ts +14 -3
  131. package/varlet.default.config.js +3 -2
  132. package/generators/sfc/yarn.lock +0 -11231
  133. package/generators/tsx/yarn.lock +0 -11231
@@ -0,0 +1,420 @@
1
+ @import '../styles/var';
2
+
3
+ @site-loading-normal-width: 50px;
4
+ @site-loading-normal-height: @site-font-size-md + 2;
5
+
6
+ @site-loading-large-width: 64px;
7
+ @site-loading-large-height: @site-font-size-lg + 2;
8
+
9
+ @site-loading-small-width: 36px;
10
+ @site-loading-small-height: @site-font-size-sm + 2;
11
+
12
+ @site-loading-mini-width: 22px;
13
+ @site-loading-mini-height: @site-font-size-xs + 2;
14
+
15
+ .var-site-loading {
16
+ display: flex;
17
+ justify-content: center;
18
+ align-items: center;
19
+
20
+ &__circle {
21
+ display: flex;
22
+
23
+ &-block {
24
+ display: inline-block;
25
+ animation: circle 1.8s linear infinite;
26
+
27
+ svg {
28
+ display: block;
29
+ width: 100%;
30
+ height: 100%;
31
+
32
+ circle {
33
+ animation: circular 1.5s ease-in-out infinite;
34
+ stroke: currentColor;
35
+ stroke-width: 3;
36
+ stroke-linecap: round;
37
+ }
38
+ }
39
+ }
40
+
41
+ @keyframes circle {
42
+ from {
43
+ transform: rotate(0deg);
44
+ }
45
+ to {
46
+ transform: rotate(360deg);
47
+ }
48
+ }
49
+ @keyframes circular {
50
+ 0% {
51
+ stroke-dasharray: 1, 200;
52
+ stroke-dashoffset: 0;
53
+ }
54
+
55
+ 50% {
56
+ stroke-dasharray: 90, 150;
57
+ stroke-dashoffset: -40;
58
+ }
59
+
60
+ 100% {
61
+ stroke-dasharray: 90, 150;
62
+ stroke-dashoffset: -120;
63
+ }
64
+ }
65
+ }
66
+
67
+ &__wave {
68
+ @site-loading-wave-size-item-width: 5px;
69
+ @site-loading-wave-size-item-margin: 5px;
70
+
71
+ display: flex;
72
+ align-items: center;
73
+ justify-content: center;
74
+
75
+ &-large {
76
+ width: @site-loading-large-width;
77
+ height: @site-loading-large-height;
78
+ }
79
+
80
+ &-normal {
81
+ width: @site-loading-normal-width;
82
+ height: @site-loading-normal-height;
83
+ }
84
+
85
+ &-small {
86
+ width: @site-loading-small-width;
87
+ height: @site-loading-small-height;
88
+ }
89
+
90
+ &-mini {
91
+ width: @site-loading-mini-width;
92
+ height: @site-loading-mini-height;
93
+ }
94
+
95
+ &-item {
96
+ height: 100%;
97
+ display: inline-block;
98
+ animation: 1.2s ease-in-out infinite wave;
99
+
100
+ &:nth-child(1) {
101
+ animation-delay: -1.2s;
102
+ margin-left: 0;
103
+ }
104
+
105
+ &:nth-child(2) {
106
+ animation-delay: -1.1s;
107
+ }
108
+
109
+ &:nth-child(3) {
110
+ animation-delay: -1s;
111
+ }
112
+
113
+ &:nth-child(4) {
114
+ animation-delay: -0.9s;
115
+ }
116
+
117
+ &:nth-child(5) {
118
+ animation-delay: -0.8s;
119
+ }
120
+ }
121
+
122
+ &-item-large {
123
+ width: @site-loading-wave-size-item-width;
124
+ margin-left: @site-loading-wave-size-item-margin;
125
+ }
126
+
127
+ &-item-normal {
128
+ width: @site-loading-wave-size-item-width - 1;
129
+ margin-left: @site-loading-wave-size-item-margin - 1;
130
+ }
131
+
132
+ &-item-small {
133
+ width: @site-loading-wave-size-item-width - 2;
134
+ margin-left: @site-loading-wave-size-item-margin - 2;
135
+ }
136
+
137
+ &-item-mini {
138
+ width: @site-loading-wave-size-item-width - 3;
139
+ margin-left: @site-loading-wave-size-item-margin - 3;
140
+ }
141
+
142
+ @keyframes wave {
143
+ 0%,
144
+ 40%,
145
+ 100% {
146
+ transform: scaleY(0.4);
147
+ }
148
+ 20% {
149
+ transform: scaleY(1);
150
+ }
151
+ }
152
+ }
153
+
154
+ &__cube {
155
+ @site-loading-cube-size-item-width: 10px;
156
+ @site-loading-cube-size-item-height: 10px;
157
+ @site-loading-cube-size-item-margin: 5px;
158
+
159
+ display: flex;
160
+ align-items: center;
161
+
162
+ &-large {
163
+ width: @site-loading-large-width;
164
+ height: @site-loading-large-height;
165
+ }
166
+
167
+ &-normal {
168
+ width: @site-loading-normal-width;
169
+ height: @site-loading-normal-height;
170
+ }
171
+
172
+ &-small {
173
+ width: @site-loading-small-width;
174
+ height: @site-loading-small-height;
175
+ }
176
+
177
+ &-mini {
178
+ width: @site-loading-mini-width;
179
+ height: @site-loading-mini-height;
180
+ }
181
+
182
+ &-item {
183
+ display: inline-block;
184
+ transform-origin: right bottom;
185
+ animation: 1.5s ease infinite cube;
186
+
187
+ &:nth-child(1) {
188
+ animation-delay: 0.2s;
189
+ margin-left: 0;
190
+ }
191
+
192
+ &:nth-child(2) {
193
+ animation-delay: 0.4s;
194
+ }
195
+
196
+ &:nth-child(3) {
197
+ animation-delay: 0.6s;
198
+ }
199
+
200
+ &:nth-child(4) {
201
+ animation-delay: 0.8s;
202
+ }
203
+ }
204
+
205
+ &-item-large {
206
+ height: @site-loading-cube-size-item-height;
207
+ width: @site-loading-cube-size-item-width;
208
+ margin-left: @site-loading-cube-size-item-margin;
209
+ }
210
+
211
+ &-item-normal {
212
+ height: @site-loading-cube-size-item-height - 2;
213
+ width: @site-loading-cube-size-item-width - 2;
214
+ margin-left: @site-loading-cube-size-item-margin - 1;
215
+ }
216
+
217
+ &-item-small {
218
+ height: @site-loading-cube-size-item-height - 4;
219
+ width: @site-loading-cube-size-item-width - 4;
220
+ margin-left: @site-loading-cube-size-item-margin - 2;
221
+ }
222
+
223
+ &-item-mini {
224
+ height: @site-loading-cube-size-item-height - 6;
225
+ width: @site-loading-cube-size-item-width - 6;
226
+ margin-left: @site-loading-cube-size-item-margin - 3;
227
+ }
228
+
229
+ @keyframes cube {
230
+ 0% {
231
+ opacity: 1;
232
+ transform: scale(1);
233
+ }
234
+ 100% {
235
+ opacity: 0;
236
+ transform: rotate(90deg) scale(0.3);
237
+ }
238
+ }
239
+ }
240
+
241
+ &__rect {
242
+ @site-loading-rect-size-item-width: 8px;
243
+ @site-loading-rect-size-item-height: 100%;
244
+
245
+ display: flex;
246
+ flex-wrap: nowrap;
247
+ justify-content: center;
248
+ align-items: center;
249
+
250
+ &-large {
251
+ width: @site-loading-large-width;
252
+ height: @site-loading-large-height;
253
+ }
254
+
255
+ &-normal {
256
+ width: @site-loading-normal-width;
257
+ height: @site-loading-normal-height;
258
+ }
259
+
260
+ &-small {
261
+ width: @site-loading-small-width;
262
+ height: @site-loading-small-height;
263
+ }
264
+
265
+ &-mini {
266
+ width: @site-loading-mini-width;
267
+ height: @site-loading-mini-height;
268
+ }
269
+
270
+ &-item {
271
+ animation: 2s ease-in-out infinite rect;
272
+
273
+ &:nth-child(1) {
274
+ animation-delay: 1.75s;
275
+ }
276
+
277
+ &:nth-child(2) {
278
+ animation-delay: 1.5s;
279
+ }
280
+
281
+ &:nth-child(3) {
282
+ animation-delay: 1.25s;
283
+ }
284
+
285
+ &:nth-child(4) {
286
+ animation-delay: 1s;
287
+ }
288
+
289
+ &:nth-child(5) {
290
+ animation-delay: 0.75s;
291
+ }
292
+
293
+ &:nth-child(6) {
294
+ animation-delay: 0.5s;
295
+ }
296
+
297
+ &:nth-child(7) {
298
+ animation-delay: 0.25s;
299
+ }
300
+
301
+ &:nth-child(8) {
302
+ animation-delay: 0s;
303
+ }
304
+ }
305
+
306
+ &-item-large {
307
+ height: @site-loading-rect-size-item-height;
308
+ width: @site-loading-rect-size-item-width;
309
+ }
310
+
311
+ &-item-normal {
312
+ height: @site-loading-rect-size-item-height * 0.9;
313
+ width: @site-loading-rect-size-item-width * 0.8;
314
+ }
315
+
316
+ &-item-small {
317
+ height: @site-loading-rect-size-item-height * 0.8;
318
+ width: @site-loading-rect-size-item-width * 0.6;
319
+ }
320
+
321
+ &-item-mini {
322
+ height: @site-loading-rect-size-item-height * 0.7;
323
+ width: @site-loading-rect-size-item-width * 0.4;
324
+ }
325
+
326
+ @keyframes rect {
327
+ 0% {
328
+ opacity: 0.3;
329
+ }
330
+ 25% {
331
+ opacity: 1;
332
+ }
333
+ 50% {
334
+ opacity: 0.3;
335
+ }
336
+ 65% {
337
+ opacity: 1;
338
+ }
339
+ 100% {
340
+ opacity: 0.3;
341
+ }
342
+ }
343
+ }
344
+
345
+ &__disappear {
346
+ @site-loading-disappear-size-item-width: 15px;
347
+ @site-loading-disappear-size-item-height: 15px;
348
+
349
+ display: flex;
350
+ justify-content: space-around;
351
+ align-items: center;
352
+ flex-flow: nowrap;
353
+
354
+ &-large {
355
+ width: @site-loading-large-width;
356
+ height: @site-loading-large-height;
357
+ }
358
+
359
+ &-normal {
360
+ width: @site-loading-normal-width;
361
+ height: @site-loading-normal-height;
362
+ }
363
+
364
+ &-small {
365
+ width: @site-loading-small-width;
366
+ height: @site-loading-small-height;
367
+ }
368
+
369
+ &-mini {
370
+ width: @site-loading-mini-width;
371
+ height: @site-loading-mini-height;
372
+ }
373
+
374
+ &-item {
375
+ border-radius: 50%;
376
+ animation: 0.5s ease-in-out infinite alternate disappear;
377
+
378
+ &:nth-child(1) {
379
+ animation-delay: -0.4s;
380
+ }
381
+
382
+ &:nth-child(2) {
383
+ animation-delay: -0.2s;
384
+ }
385
+
386
+ &:nth-child(3) {
387
+ animation-delay: 0s;
388
+ }
389
+ }
390
+
391
+ &-item-large {
392
+ height: @site-loading-disappear-size-item-height;
393
+ width: @site-loading-disappear-size-item-width;
394
+ }
395
+
396
+ &-item-normal {
397
+ height: @site-loading-disappear-size-item-height * 0.8;
398
+ width: @site-loading-disappear-size-item-width * 0.8;
399
+ }
400
+
401
+ &-item-small {
402
+ height: @site-loading-disappear-size-item-height * 0.6;
403
+ width: @site-loading-disappear-size-item-width * 0.6;
404
+ }
405
+
406
+ &-item-mini {
407
+ height: @site-loading-disappear-size-item-height * 0.4;
408
+ width: @site-loading-disappear-size-item-width * 0.4;
409
+ }
410
+
411
+ @keyframes disappear {
412
+ 0% {
413
+ opacity: 1;
414
+ }
415
+ 100% {
416
+ opacity: 0;
417
+ }
418
+ }
419
+ }
420
+ }
@@ -0,0 +1,37 @@
1
+ import type { PropType } from 'vue'
2
+
3
+ type LoadingType = 'circle' | 'wave' | 'cube' | 'rect' | 'disappear'
4
+
5
+ type LoadingSize = 'normal' | 'mini' | 'small' | 'large'
6
+
7
+ export function typeValidator(type: string): boolean {
8
+ return ['circle', 'wave', 'cube', 'rect', 'disappear'].includes(type)
9
+ }
10
+
11
+ export function sizeValidator(size: string): boolean {
12
+ return ['normal', 'mini', 'small', 'large'].includes(size)
13
+ }
14
+
15
+ export const props = {
16
+ // loading类型
17
+ type: {
18
+ type: String as PropType<LoadingType>,
19
+ default: 'circle',
20
+ validator: typeValidator,
21
+ },
22
+ radius: {
23
+ type: [String, Number],
24
+ default: 15,
25
+ },
26
+ // loading尺寸
27
+ size: {
28
+ type: String as PropType<LoadingSize>,
29
+ default: 'normal',
30
+ validator: sizeValidator,
31
+ },
32
+ // loading颜色
33
+ color: {
34
+ type: String,
35
+ default: 'currentColor',
36
+ },
37
+ }
@@ -0,0 +1,113 @@
1
+ <template>
2
+ <div class="var-site-menu" ref="host" @click="handleClick">
3
+ <slot />
4
+
5
+ <teleport :to="teleport">
6
+ <transition name="var-site-menu" @after-enter="onOpened" @after-leave="onClosed">
7
+ <div
8
+ class="var-site-menu__menu var-site-elevation--3"
9
+ ref="menu"
10
+ :style="{
11
+ top: `calc(${top}px + ${toSizeUnit(offsetY)})`,
12
+ left: `calc(${left}px + ${toSizeUnit(offsetX)})`,
13
+ zIndex,
14
+ }"
15
+ v-show="show"
16
+ @click.stop
17
+ >
18
+ <slot name="menu" />
19
+ </div>
20
+ </transition>
21
+ </teleport>
22
+ </div>
23
+ </template>
24
+
25
+ <script lang="ts">
26
+ import { defineComponent, ref, watch, onMounted, onUnmounted } from 'vue'
27
+ import { props } from './props'
28
+ import { getLeft, getTop, toSizeUnit } from '../utils/elements'
29
+ import { useZIndex } from '../context/zIndex'
30
+ import type { Ref } from 'vue'
31
+
32
+ export default defineComponent({
33
+ name: 'VarSiteMenu',
34
+ props,
35
+ setup(props) {
36
+ const host: Ref<null | HTMLElement> = ref(null)
37
+ const menu: Ref<null | HTMLElement> = ref(null)
38
+ const top: Ref<number> = ref(0)
39
+ const left: Ref<number> = ref(0)
40
+ const { zIndex } = useZIndex(() => props.show, 1)
41
+ let clickSelf = false
42
+
43
+ const computeTop = (alignment: string): number => {
44
+ return alignment === 'top'
45
+ ? getTop(host.value as HTMLElement)
46
+ : getTop(host.value as HTMLElement) - (menu.value as HTMLElement).offsetHeight
47
+ }
48
+
49
+ const handleClick = () => {
50
+ clickSelf = true
51
+ }
52
+
53
+ const handleMenuClose = () => {
54
+ if (clickSelf) {
55
+ clickSelf = false
56
+ return
57
+ }
58
+
59
+ if (!props.show) {
60
+ return
61
+ }
62
+
63
+ props['onUpdate:show']?.(false)
64
+ }
65
+
66
+ // expose
67
+ const resize = () => {
68
+ top.value = computeTop(props.alignment)
69
+ left.value = getLeft(host.value as HTMLElement)
70
+ }
71
+
72
+ watch(() => props.alignment, resize)
73
+
74
+ watch(
75
+ () => props.show,
76
+ async (newValue: boolean) => {
77
+ const { onOpen, onClose } = props
78
+ newValue && resize()
79
+ newValue ? onOpen?.() : onClose?.()
80
+ }
81
+ )
82
+
83
+ onMounted(() => {
84
+ resize()
85
+
86
+ document.addEventListener('click', handleMenuClose)
87
+ window.addEventListener('resize', resize)
88
+ })
89
+
90
+ onUnmounted(() => {
91
+ document.removeEventListener('click', handleMenuClose)
92
+ window.removeEventListener('resize', resize)
93
+ })
94
+
95
+ return {
96
+ zIndex,
97
+ host,
98
+ menu,
99
+ top,
100
+ left,
101
+ toSizeUnit,
102
+ handleClick,
103
+ resize,
104
+ }
105
+ },
106
+ })
107
+ </script>
108
+
109
+ <style lang="less">
110
+ @import '../styles/common';
111
+ @import '../styles/elevation';
112
+ @import './menu';
113
+ </style>
@@ -0,0 +1,10 @@
1
+ import type { App } from 'vue'
2
+ import Menu from './Menu.vue'
3
+
4
+ Menu.install = function (app: App) {
5
+ app.component(Menu.name, Menu)
6
+ }
7
+
8
+ export const _MenuComponent = Menu
9
+
10
+ export default Menu
@@ -0,0 +1,27 @@
1
+ @site-menu-background: #fff;
2
+
3
+ :root {
4
+ --site-menu-background: @site-menu-background;
5
+ }
6
+
7
+ .var {
8
+ &-site-menu-enter-from,
9
+ &-site-menu-leave-to {
10
+ transform: scale(0.8);
11
+ opacity: 0;
12
+ }
13
+ &-site-menu-enter-active,
14
+ &-site-menu-leave-active {
15
+ transition-property: opacity, transform;
16
+ transition-duration: 0.25s;
17
+ }
18
+ }
19
+
20
+ .var-site-menu {
21
+ display: inline-block;
22
+ background: var(--site-menu-background);
23
+
24
+ &__menu {
25
+ position: absolute;
26
+ }
27
+ }
@@ -0,0 +1,43 @@
1
+ import type { PropType } from 'vue'
2
+
3
+ function alignmentValidator(alignment: string) {
4
+ return ['top', 'bottom'].includes(alignment)
5
+ }
6
+
7
+ export const props = {
8
+ show: {
9
+ type: Boolean,
10
+ default: false,
11
+ },
12
+ alignment: {
13
+ type: String as PropType<'top' | 'bottom'>,
14
+ default: 'top',
15
+ validator: alignmentValidator,
16
+ },
17
+ offsetX: {
18
+ type: [Number, String],
19
+ default: 0,
20
+ },
21
+ offsetY: {
22
+ type: [Number, String],
23
+ default: 0,
24
+ },
25
+ teleport: {
26
+ default: 'body',
27
+ },
28
+ onOpen: {
29
+ type: Function as PropType<() => void>,
30
+ },
31
+ onOpened: {
32
+ type: Function as PropType<() => void>,
33
+ },
34
+ onClose: {
35
+ type: Function as PropType<() => void>,
36
+ },
37
+ onClosed: {
38
+ type: Function as PropType<() => void>,
39
+ },
40
+ 'onUpdate:show': {
41
+ type: Function as PropType<(show: boolean) => void>,
42
+ },
43
+ }