im-ui-mobile 0.1.0 → 0.1.2

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 (85) hide show
  1. package/components/im-avatar/im-avatar.vue +7 -7
  2. package/components/im-badge/im-badge.vue +326 -0
  3. package/components/im-button/im-button.vue +71 -34
  4. package/components/im-card/im-card.vue +563 -0
  5. package/components/im-chat-item/im-chat-item.vue +5 -4
  6. package/components/im-col/im-col.vue +191 -0
  7. package/components/im-dialog/im-dialog.vue +543 -0
  8. package/components/im-double-tap-view/im-double-tap-view.vue +93 -0
  9. package/components/im-emoji-picker/im-emoji-picker.vue +1143 -0
  10. package/components/im-friend-item/im-friend-item.vue +1 -1
  11. package/components/im-group-item/im-group-item.vue +1 -1
  12. package/components/im-group-member-selector/im-group-member-selector.vue +5 -5
  13. package/components/im-group-rtc-join/im-group-rtc-join.vue +8 -8
  14. package/components/im-icon/im-icon.vue +593 -0
  15. package/components/im-image-upload/im-image-upload.vue +0 -2
  16. package/components/im-link/im-link.vue +628 -0
  17. package/components/im-loading/im-loading.vue +13 -4
  18. package/components/im-mention-picker/im-mention-picker.vue +8 -7
  19. package/components/im-message-action/im-message-action.vue +678 -0
  20. package/components/im-message-item/im-message-item.vue +28 -26
  21. package/components/im-message-list/im-message-list.vue +1108 -0
  22. package/components/im-modal/im-modal.vue +373 -0
  23. package/components/im-nav-bar/im-nav-bar.vue +689 -75
  24. package/components/im-parse/im-parse.vue +1054 -0
  25. package/components/im-popup/im-popup.vue +467 -0
  26. package/components/im-read-receipt/im-read-receipt.vue +10 -10
  27. package/components/im-row/im-row.vue +189 -0
  28. package/components/im-search/im-search.vue +762 -0
  29. package/components/im-sku/im-sku.vue +720 -0
  30. package/components/im-sku/utils/helper.ts +182 -0
  31. package/components/im-stepper/im-stepper.vue +585 -0
  32. package/components/im-stepper/utils/helper.ts +167 -0
  33. package/components/im-tabs/im-tabs.vue +1022 -0
  34. package/components/im-tabs/tabs-navigation.vue +489 -0
  35. package/components/im-tabs/utils/helper.ts +181 -0
  36. package/components/im-tabs-tab-pane/im-tabs-tab-pane.vue +145 -0
  37. package/components/im-upload/im-upload.vue +1236 -0
  38. package/components/im-voice-input/im-voice-input.vue +1 -1
  39. package/index.js +3 -5
  40. package/index.scss +19 -0
  41. package/libs/emoji-data.ts +229 -0
  42. package/libs/index.ts +16 -16
  43. package/package.json +1 -2
  44. package/styles/button.scss +33 -33
  45. package/theme.scss +2 -2
  46. package/types/components/badge.d.ts +42 -0
  47. package/types/components/button.d.ts +2 -1
  48. package/types/components/card.d.ts +122 -0
  49. package/types/components/col.d.ts +37 -0
  50. package/types/components/dialog.d.ts +125 -0
  51. package/types/components/double-tap-view.d.ts +31 -0
  52. package/types/components/emoji-picker.d.ts +121 -0
  53. package/types/components/group-rtc-join.d.ts +1 -1
  54. package/types/components/icon.d.ts +77 -0
  55. package/types/components/link.d.ts +55 -0
  56. package/types/components/loading.d.ts +1 -0
  57. package/types/components/message-action.d.ts +96 -0
  58. package/types/components/message-item.d.ts +2 -2
  59. package/types/components/message-list.d.ts +136 -0
  60. package/types/components/modal.d.ts +106 -0
  61. package/types/components/nav-bar.d.ts +125 -0
  62. package/types/components/parse.d.ts +90 -0
  63. package/types/components/popup.d.ts +58 -0
  64. package/types/components/row.d.ts +31 -0
  65. package/types/components/search.d.ts +54 -0
  66. package/types/components/sku.d.ts +195 -0
  67. package/types/components/stepper.d.ts +99 -0
  68. package/types/components/tabs-tab-pane.d.ts +27 -0
  69. package/types/components/tabs.d.ts +117 -0
  70. package/types/components/upload.d.ts +137 -0
  71. package/types/components.d.ts +19 -1
  72. package/types/index.d.ts +38 -1
  73. package/types/libs/index.d.ts +10 -10
  74. package/types/utils/base64.d.ts +5 -0
  75. package/types/utils/dom.d.ts +3 -0
  76. package/types/utils/enums.d.ts +4 -5
  77. package/types/utils/validator.d.ts +74 -0
  78. package/utils/base64.js +18 -0
  79. package/utils/dom.js +353 -1
  80. package/utils/enums.js +4 -5
  81. package/utils/validator.js +230 -0
  82. package/components/im-file-upload/im-file-upload.vue +0 -309
  83. package/plugins/uview-plus.js +0 -29
  84. package/types/components/arrow-bar.d.ts +0 -14
  85. package/types/components/file-upload.d.ts +0 -58
@@ -0,0 +1,593 @@
1
+ <template>
2
+ <!-- 字体图标 -->
3
+ <text v-if="type === 'font'" class="im-icon im-icon--font" :class="[
4
+ `im-icon--${name}`,
5
+ `im-icon--${size}`,
6
+ spin ? 'im-icon--spin' : '',
7
+ rotate ? 'im-icon--rotate' : '',
8
+ customClass
9
+ ]" :style="[
10
+ iconStyles,
11
+ colorStyle,
12
+ rotateStyle,
13
+ customStyle
14
+ ]" @click="handleClick">
15
+ {{ iconChar }}
16
+ </text>
17
+
18
+ <!-- 图片图标 -->
19
+ <image v-else-if="type === 'image'" class="im-icon im-icon--image" :class="[
20
+ `im-icon--${size}`,
21
+ spin ? 'im-icon--spin' : '',
22
+ rotate ? 'im-icon--rotate' : '',
23
+ customClass
24
+ ]" :style="[
25
+ iconStyles,
26
+ rotateStyle,
27
+ customStyle
28
+ ]" :src="src || name" :mode="imageMode" :lazy-load="lazyLoad" :show-menu-by-longpress="showMenuByLongpress"
29
+ @click="handleClick" @error="handleError" @load="handleLoad" />
30
+
31
+ <!-- SVG图标 -->
32
+ <view v-else-if="type === 'svg'" class="im-icon im-icon--svg" :class="[
33
+ `im-icon--${size}`,
34
+ spin ? 'im-icon--spin' : '',
35
+ rotate ? 'im-icon--rotate' : '',
36
+ customClass
37
+ ]" :style="[
38
+ iconStyles,
39
+ colorStyle,
40
+ rotateStyle,
41
+ customStyle
42
+ ]" @click="handleClick">
43
+ <!-- 外部SVG内容 -->
44
+ <view v-if="useSvgContent" class="im-icon__svg-content" v-html="svgContent" />
45
+ <!-- 内置SVG图标 -->
46
+ <view v-else class="im-icon__svg-content">
47
+ <!-- 这里可以放置内置的SVG图标 -->
48
+ <slot>
49
+ {{ svgContent }}
50
+ </slot>
51
+ </view>
52
+ </view>
53
+
54
+ <!-- 自定义渲染 -->
55
+ <view v-else-if="type === 'custom'" class="im-icon im-icon--custom" :class="[
56
+ `im-icon--${size}`,
57
+ customClass
58
+ ]" :style="[
59
+ iconStyles,
60
+ customStyle
61
+ ]" @click="handleClick">
62
+ <slot>
63
+ <text v-if="name" class="im-icon__custom-text">{{ name }}</text>
64
+ </slot>
65
+ </view>
66
+ </template>
67
+
68
+ <script setup lang="ts">
69
+ import { computed, ref } from 'vue'
70
+ import { validator } from '../../index'
71
+
72
+ // 图标类型
73
+ type IconType = 'font' | 'image' | 'svg' | 'custom'
74
+
75
+ // 图标大小预设
76
+ type IconSize = 'xxsmall' | 'xsmall' | 'small' | 'medium' | 'large' | 'xlarge' | 'xxlarge' | string
77
+
78
+ // 旋转方向
79
+ type RotateDirection = 'clockwise' | 'counterclockwise'
80
+
81
+ // 定义Props
82
+ interface IconProps {
83
+ /** 图标名称或标识 */
84
+ name?: string
85
+ /** 图标类型 */
86
+ type?: IconType
87
+ /** 图标大小 */
88
+ size?: IconSize | number
89
+ /** 图标颜色(仅对字体图标和SVG有效) */
90
+ color?: string
91
+ /** 旋转角度(0-360) */
92
+ rotate?: number
93
+ /** 旋转方向 */
94
+ rotateDirection?: RotateDirection
95
+ /** 是否旋转动画 */
96
+ spin?: boolean
97
+ /** 旋转动画速度(秒) */
98
+ spinSpeed?: number
99
+ /** 是否禁用 */
100
+ disabled?: boolean
101
+ /** 点击时的波纹效果 */
102
+ ripple?: boolean
103
+ /** 波纹颜色 */
104
+ rippleColor?: string
105
+ /** 自定义类名 */
106
+ customClass?: string
107
+ /** 自定义样式 */
108
+ customStyle?: Record<string, string | number>
109
+ /** 图片模式(仅type='image'时有效) */
110
+ imageMode?: 'scaleToFill' | 'aspectFit' | 'aspectFill' | 'widthFix' | 'heightFix' | 'top' | 'bottom' | 'center' | 'left' | 'right' | 'top left' | 'top right' | 'bottom left' | 'bottom right'
111
+ /** 图片地址(仅type='image'时有效) */
112
+ src?: string
113
+ /** 是否懒加载图片(仅type='image'时有效) */
114
+ lazyLoad?: boolean
115
+ /** 是否长按显示菜单(仅type='image'时有效) */
116
+ showMenuByLongpress?: boolean
117
+ /** SVG内容(仅type='svg'时有效) */
118
+ svgContent?: string
119
+ /** 使用SVG内容而不是内置图标(仅type='svg'时有效) */
120
+ useSvgContent?: boolean
121
+ }
122
+
123
+ const props = withDefaults(defineProps<IconProps>(), {
124
+ name: '',
125
+ type: 'font',
126
+ size: 'medium',
127
+ color: 'currentColor',
128
+ rotate: 0,
129
+ rotateDirection: 'clockwise',
130
+ spin: false,
131
+ spinSpeed: 1,
132
+ disabled: false,
133
+ ripple: true,
134
+ rippleColor: 'rgba(0, 0, 0, 0.1)',
135
+ customClass: '',
136
+ customStyle: () => ({}),
137
+ imageMode: 'scaleToFill',
138
+ lazyLoad: false,
139
+ showMenuByLongpress: false,
140
+ svgContent: '',
141
+ useSvgContent: false
142
+ })
143
+
144
+ // 定义Emits
145
+ const emit = defineEmits<{
146
+ /** 点击事件 */
147
+ click: [event: MouseEvent]
148
+ /** 图片加载成功 */
149
+ load: [event: any]
150
+ /** 图片加载失败 */
151
+ error: [event: any]
152
+ }>()
153
+
154
+ // 响应式数据
155
+ const isLoaded = ref(false)
156
+ const loadError = ref(false)
157
+
158
+ // 内置字体图标映射表
159
+ const iconUnicodeMap = {
160
+ // 基础操作图标
161
+ 'settings': '\ue800',
162
+ 'home': '\ue801',
163
+ 'user': '\ue802',
164
+ 'search': '\ue803',
165
+ 'plus': '\ue804',
166
+ 'minus': '\ue805',
167
+ 'close': '\ue806',
168
+ 'ok': '\ue807',
169
+ 'edit': '\ue808',
170
+ 'delete': '\ue809',
171
+
172
+ // 视图与显示
173
+ 'eye': '\ue80a',
174
+ 'eye-off': '\ue80b',
175
+ 'fullscreen': '\ue832',
176
+ 'zoom-in': '\ue82d',
177
+ 'zoom-out': '\ue82e',
178
+
179
+ // 通知与反馈
180
+ 'bell': '\ue80c',
181
+ 'bell-off': '\uf1f7',
182
+ 'star': '\ue80d',
183
+ 'star-o': '\ue80e',
184
+ 'star-half': '\uf123',
185
+ 'heart': '\ue80f',
186
+ 'heart-o': '\ue810',
187
+ 'heart-broken': '\uf028',
188
+
189
+ // 文件与文档类型
190
+ 'file': '\ue817',
191
+ 'file-pdf': '\uf1c1',
192
+ 'file-word': '\uf1c2',
193
+ 'file-excel': '\uf1c3',
194
+ 'file-ppt': '\uf1c4',
195
+ 'file-audio': '\uf1c7',
196
+ 'folder': '\uf114',
197
+
198
+ // 媒体内容
199
+ 'picture': '\ue818',
200
+ 'video': '\ue819',
201
+ 'play': '\ue837',
202
+ 'pause': '\ue838',
203
+ 'stop': '\ue83b',
204
+ 'fast': '\ue839',
205
+ 'rewind': '\ue83a',
206
+ 'record': '\ue83c',
207
+
208
+ // 设备相关
209
+ 'phone': '\ue81a',
210
+ 'mobile': '\ue81f',
211
+ 'tablet': '\ue81b',
212
+ 'laptop': '\ue81c',
213
+ 'monitor': '\uf032',
214
+ 'monitor-o': '\ue827',
215
+ 'camera': '\ue81e',
216
+ 'headphone': '\ue820',
217
+
218
+ // 通讯与社交
219
+ 'chat': '\ue821',
220
+ 'comment': '\ue822',
221
+ 'mail': '\ue825',
222
+ 'share': '\ue811',
223
+ 'send': '\uf1d8',
224
+ 'qq': '\uf1d6',
225
+ 'wechat': '\uf1d7',
226
+ 'github': '\uf09b',
227
+
228
+ // 方向与导航
229
+ 'arrow-up': '\ue815',
230
+ 'arrow-down': '\ue812',
231
+ 'arrow-left': '\ue813',
232
+ 'arrow-right': '\ue814',
233
+ 'location': '\uf031',
234
+ 'compass': '\ue834',
235
+
236
+ // 状态与提示
237
+ 'error': '\ue828',
238
+ 'warning': '\ue829',
239
+ 'info': '\ue82a',
240
+ 'help': '\ue82b',
241
+ 'loading': '\ue830',
242
+
243
+ // 工具与操作
244
+ 'power': '\ue826',
245
+ 'refresh': '\ue82c',
246
+ 'sync': '\ue816',
247
+ 'filter': '\uf0b0',
248
+ 'sort': '\uf0dc',
249
+ 'menu': '\uf0c9',
250
+ 'download': '\uf0ed',
251
+ 'upload': '\uf0ee',
252
+ 'more': '\ue81d',
253
+
254
+ // 媒体控制
255
+ 'volume-up': '\ue840',
256
+ 'volume-down': '\ue83f',
257
+ 'volume-off': '\ue83e',
258
+
259
+ // 安全与权限
260
+ 'lock': '\ue843',
261
+ 'lock-open': '\ue844',
262
+ 'key': '\ue845',
263
+
264
+ // 工具与附件
265
+ 'params': '\ue841',
266
+ 'repair': '\ue842',
267
+ 'tag': '\ue846',
268
+ 'attach': '\ue847',
269
+ 'link': '\ue848',
270
+ 'bookmark': '\uf097',
271
+
272
+ // 扫码与识别
273
+ 'qrcode': '\ue849',
274
+ 'barcode': '\ue84a',
275
+
276
+ // 其他功能
277
+ 'basket': '\ue824',
278
+ 'clock': '\ue835',
279
+ 'calendar-o': '\uf133',
280
+ 'flag-o': '\uf11d',
281
+ 'plus-squared': '\ue82f',
282
+ 'minus-squared': '\ue831'
283
+ };
284
+
285
+ // 计算属性
286
+ const iconChar = computed(() => {
287
+ if (props.type === 'font') {
288
+ return iconUnicodeMap[props.name as keyof typeof iconUnicodeMap] || ''
289
+ }
290
+ return ''
291
+ })
292
+
293
+ const sizeValue = computed(() => {
294
+ if (validator.isNumber(props.size)) {
295
+ return `${props.size}rpx`
296
+ }
297
+
298
+ const sizeMap: Record<IconSize, string> = {
299
+ xxsmall: '24rpx',
300
+ xsmall: '32rpx',
301
+ small: '40rpx',
302
+ medium: '48rpx',
303
+ large: '56rpx',
304
+ xlarge: '64rpx',
305
+ xxlarge: '72rpx'
306
+ }
307
+
308
+ return sizeMap[props.size as IconSize] || '48rpx'
309
+ })
310
+
311
+ const fontSizeValue = computed(() => {
312
+ if (validator.isNumber(props.size)) {
313
+ return `${props.size}rpx`
314
+ }
315
+
316
+ const sizeMap: Record<IconSize, string> = {
317
+ xxsmall: '20rpx',
318
+ xsmall: '24rpx',
319
+ small: '28rpx',
320
+ medium: '32rpx',
321
+ large: '36rpx',
322
+ xlarge: '40rpx',
323
+ xxlarge: '44rpx'
324
+ }
325
+
326
+ return sizeMap[props.size as IconSize] || '32rpx'
327
+ })
328
+
329
+ // 样式计算
330
+ const iconStyles = computed(() => {
331
+ const styles: Record<string, string> = {}
332
+
333
+ if (props.type === 'font') {
334
+ styles.fontSize = fontSizeValue.value
335
+ } else if (props.type === 'image' || props.type === 'svg') {
336
+ styles.width = sizeValue.value
337
+ styles.height = sizeValue.value
338
+ } else if (props.type === 'custom') {
339
+ styles.width = sizeValue.value
340
+ styles.height = sizeValue.value
341
+ styles.display = 'flex'
342
+ styles.alignItems = 'center'
343
+ styles.justifyContent = 'center'
344
+ }
345
+
346
+ if (props.disabled) {
347
+ styles.opacity = '0.5'
348
+ styles.cursor = 'not-allowed'
349
+ } else {
350
+ styles.cursor = 'pointer'
351
+ }
352
+
353
+ return styles
354
+ })
355
+
356
+ const colorStyle = computed(() => ({
357
+ color: props.color
358
+ }))
359
+
360
+ const rotateStyle = computed(() => {
361
+ if (!props.rotate && !props.spin) return {}
362
+
363
+ const direction = props.rotateDirection === 'counterclockwise' ? -1 : 1
364
+
365
+ return {
366
+ transform: `rotate(${props.rotate * direction}deg)`
367
+ }
368
+ })
369
+
370
+ // 事件处理
371
+ const handleClick = (event: MouseEvent) => {
372
+ if (props.disabled) return
373
+
374
+ emit('click', event)
375
+ }
376
+
377
+ const handleLoad = (event: any) => {
378
+ isLoaded.value = true
379
+ loadError.value = false
380
+ emit('load', event)
381
+ }
382
+
383
+ const handleError = (event: any) => {
384
+ loadError.value = true
385
+ isLoaded.value = false
386
+ emit('error', event)
387
+ }
388
+
389
+ // 暴露方法
390
+ defineExpose({
391
+ /** 重新加载图标 */
392
+ reload: () => {
393
+ if (props.type === 'image') {
394
+ isLoaded.value = false
395
+ loadError.value = false
396
+ }
397
+ },
398
+ /** 获取图标状态 */
399
+ getStatus: () => ({
400
+ isLoaded: isLoaded.value,
401
+ loadError: loadError.value,
402
+ type: props.type,
403
+ name: props.name
404
+ })
405
+ })
406
+ </script>
407
+
408
+ <style lang="scss" scoped>
409
+ @font-face {
410
+ font-family: 'im-iconfont';
411
+ src: url("data:font/woff2;charset=utf-8;base64,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") format('woff2');
412
+ font-weight: normal;
413
+ font-style: normal;
414
+ font-display: swap;
415
+ }
416
+
417
+ .im-icon {
418
+ display: inline-flex;
419
+ align-items: center;
420
+ justify-content: center;
421
+ vertical-align: middle;
422
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
423
+
424
+ // 通用点击效果
425
+ &:active:not(.im-icon--disabled) {
426
+ opacity: 0.7;
427
+ transform: scale(0.95);
428
+ }
429
+
430
+ // 旋转动画
431
+ &--spin {
432
+ animation: im-icon-spin linear infinite;
433
+ animation-duration: v-bind('`${props.spinSpeed}s`');
434
+
435
+ @keyframes im-icon-spin {
436
+ from {
437
+ transform: rotate(0deg);
438
+ }
439
+
440
+ to {
441
+ transform: rotate(360deg);
442
+ }
443
+ }
444
+ }
445
+
446
+ // 大小类
447
+ &--xxsmall {
448
+ font-size: 20rpx;
449
+ width: 24rpx;
450
+ height: 24rpx;
451
+ }
452
+
453
+ &--xsmall {
454
+ font-size: 24rpx;
455
+ width: 32rpx;
456
+ height: 32rpx;
457
+ }
458
+
459
+ &--small {
460
+ font-size: 28rpx;
461
+ width: 40rpx;
462
+ height: 40rpx;
463
+ }
464
+
465
+ &--medium {
466
+ font-size: 32rpx;
467
+ width: 48rpx;
468
+ height: 48rpx;
469
+ }
470
+
471
+ &--large {
472
+ font-size: 36rpx;
473
+ width: 56rpx;
474
+ height: 56rpx;
475
+ }
476
+
477
+ &--xlarge {
478
+ font-size: 40rpx;
479
+ width: 64rpx;
480
+ height: 64rpx;
481
+ }
482
+
483
+ &--xxlarge {
484
+ font-size: 44rpx;
485
+ width: 72rpx;
486
+ height: 72rpx;
487
+ }
488
+
489
+ // 字体图标
490
+ &--font {
491
+ font-family: 'im-iconfont', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
492
+ font-weight: normal;
493
+ font-style: normal;
494
+ line-height: 1;
495
+ text-transform: none;
496
+ letter-spacing: normal;
497
+ word-wrap: normal;
498
+ white-space: nowrap;
499
+ direction: ltr;
500
+ -webkit-font-smoothing: antialiased;
501
+ -moz-osx-font-smoothing: grayscale;
502
+ text-rendering: optimizeLegibility;
503
+ font-feature-settings: 'liga';
504
+ }
505
+
506
+ // 图片图标
507
+ &--image {
508
+ object-fit: contain;
509
+
510
+ &.im-icon--spin {
511
+ animation: im-icon-spin linear infinite;
512
+ }
513
+ }
514
+
515
+ // SVG图标
516
+ &--svg {
517
+ .im-icon__svg-content {
518
+ width: 100%;
519
+ height: 100%;
520
+
521
+ :deep(svg) {
522
+ width: 100%;
523
+ height: 100%;
524
+ fill: currentColor;
525
+
526
+ * {
527
+ fill: inherit;
528
+ }
529
+ }
530
+ }
531
+ }
532
+
533
+ // 自定义图标
534
+ &--custom {
535
+ .im-icon__custom-text {
536
+ font-size: inherit;
537
+ color: inherit;
538
+ }
539
+ }
540
+
541
+ // 禁用状态
542
+ &--disabled {
543
+ opacity: 0.5;
544
+ cursor: not-allowed !important;
545
+
546
+ &:active {
547
+ opacity: 0.5;
548
+ transform: none;
549
+ }
550
+ }
551
+ }
552
+
553
+ // 波纹效果
554
+ .im-icon-ripple {
555
+ position: relative;
556
+ overflow: hidden;
557
+
558
+ &::after {
559
+ content: '';
560
+ position: absolute;
561
+ top: 50%;
562
+ left: 50%;
563
+ width: 5px;
564
+ height: 5px;
565
+ background: v-bind('props.rippleColor');
566
+ opacity: 0;
567
+ border-radius: 100%;
568
+ transform: scale(1, 1) translate(-50%, -50%);
569
+ transform-origin: 50% 50%;
570
+ }
571
+
572
+ &:focus:not(:active)::after {
573
+ animation: im-icon-ripple 1s ease-out;
574
+ }
575
+
576
+ @keyframes im-icon-ripple {
577
+ 0% {
578
+ transform: scale(0, 0);
579
+ opacity: 0.5;
580
+ }
581
+
582
+ 20% {
583
+ transform: scale(25, 25);
584
+ opacity: 0.3;
585
+ }
586
+
587
+ 100% {
588
+ opacity: 0;
589
+ transform: scale(40, 40);
590
+ }
591
+ }
592
+ }
593
+ </style>
@@ -5,8 +5,6 @@
5
5
  </template>
6
6
 
7
7
  <script setup lang="ts">
8
- import { ref } from 'vue'
9
-
10
8
  interface Props {
11
9
  maxCount?: number;
12
10
  maxSize?: number;