@atooyu/uxto-ui 1.0.7 → 1.0.9

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.
@@ -1,216 +1,216 @@
1
- <template>
2
- <view
3
- v-show="visible"
4
- class="u-transition"
5
- :class="transitionClass"
6
- :style="transitionStyle"
7
- @transitionend="onTransitionEnd"
8
- >
9
- <slot />
10
- </view>
11
- </template>
12
-
13
- <script setup lang="ts">
14
- import { computed, ref, watch } from 'vue'
15
-
16
- type TransitionMode =
17
- | 'fade'
18
- | 'fade-up'
19
- | 'fade-down'
20
- | 'fade-left'
21
- | 'fade-right'
22
- | 'slide-up'
23
- | 'slide-down'
24
- | 'slide-left'
25
- | 'slide-right'
26
- | 'zoom'
27
- | 'zoom-fade'
28
-
29
- interface Props {
30
- show?: boolean
31
- mode?: TransitionMode
32
- duration?: number
33
- delay?: number
34
- customStyle?: Record<string, string | number>
35
- }
36
-
37
- const props = withDefaults(defineProps<Props>(), {
38
- show: false,
39
- mode: 'fade',
40
- duration: 300,
41
- delay: 0
42
- })
43
-
44
- const emit = defineEmits<{
45
- (e: 'after-enter'): void
46
- (e: 'after-leave'): void
47
- }>()
48
-
49
- const visible = ref(false)
50
- const animationPhase = ref<'enter' | 'leave'>('enter')
51
-
52
- // 监听 show 变化
53
- watch(
54
- () => props.show,
55
- (val) => {
56
- if (val) {
57
- visible.value = true
58
- animationPhase.value = 'enter'
59
- } else {
60
- animationPhase.value = 'leave'
61
- }
62
- },
63
- { immediate: true }
64
- )
65
-
66
- const transitionClass = computed(() => {
67
- const classes: string[] = []
68
-
69
- if (animationPhase.value === 'enter') {
70
- classes.push(`u-transition--${props.mode}-enter`)
71
- } else {
72
- classes.push(`u-transition--${props.mode}-leave`)
73
- }
74
-
75
- return classes
76
- })
77
-
78
- const transitionStyle = computed(() => {
79
- const style: Record<string, string | number> = {
80
- transitionDuration: `${props.duration}ms`,
81
- transitionDelay: `${props.delay}ms`,
82
- transitionProperty: 'opacity, transform',
83
- transitionTimingFunction: 'ease-out'
84
- }
85
-
86
- if (props.customStyle) {
87
- Object.assign(style, props.customStyle)
88
- }
89
-
90
- return style
91
- })
92
-
93
- const onTransitionEnd = () => {
94
- if (animationPhase.value === 'leave') {
95
- visible.value = false
96
- emit('after-leave')
97
- } else {
98
- emit('after-enter')
99
- }
100
- }
101
- </script>
102
-
103
- <script lang="ts">
104
- export default {
105
- options: {
106
- virtualHost: true,
107
- styleIsolation: 'shared'
108
- }
109
- }
110
- </script>
111
-
112
- <style lang="scss" scoped>
113
- .u-transition {
114
- // 基础状态
115
- opacity: 1;
116
- transform: none;
117
-
118
- // 淡入淡出
119
- &--fade-enter {
120
- opacity: 0;
121
- }
122
- &--fade-leave {
123
- opacity: 0;
124
- }
125
-
126
- // 上滑淡入
127
- &--fade-up-enter {
128
- opacity: 0;
129
- transform: translateY(100%);
130
- }
131
- &--fade-up-leave {
132
- opacity: 0;
133
- transform: translateY(-100%);
134
- }
135
-
136
- // 下滑淡入
137
- &--fade-down-enter {
138
- opacity: 0;
139
- transform: translateY(-100%);
140
- }
141
- &--fade-down-leave {
142
- opacity: 0;
143
- transform: translateY(100%);
144
- }
145
-
146
- // 左滑淡入
147
- &--fade-left-enter {
148
- opacity: 0;
149
- transform: translateX(100%);
150
- }
151
- &--fade-left-leave {
152
- opacity: 0;
153
- transform: translateX(-100%);
154
- }
155
-
156
- // 右滑淡入
157
- &--fade-right-enter {
158
- opacity: 0;
159
- transform: translateX(-100%);
160
- }
161
- &--fade-right-leave {
162
- opacity: 0;
163
- transform: translateX(100%);
164
- }
165
-
166
- // 上滑进入
167
- &--slide-up-enter {
168
- transform: translateY(100%);
169
- }
170
- &--slide-up-leave {
171
- transform: translateY(-100%);
172
- }
173
-
174
- // 下滑进入
175
- &--slide-down-enter {
176
- transform: translateY(-100%);
177
- }
178
- &--slide-down-leave {
179
- transform: translateY(100%);
180
- }
181
-
182
- // 左滑进入
183
- &--slide-left-enter {
184
- transform: translateX(100%);
185
- }
186
- &--slide-left-leave {
187
- transform: translateX(-100%);
188
- }
189
-
190
- // 右滑进入
191
- &--slide-right-enter {
192
- transform: translateX(-100%);
193
- }
194
- &--slide-right-leave {
195
- transform: translateX(100%);
196
- }
197
-
198
- // 缩放
199
- &--zoom-enter {
200
- transform: scale(0);
201
- }
202
- &--zoom-leave {
203
- transform: scale(0);
204
- }
205
-
206
- // 缩放淡入
207
- &--zoom-fade-enter {
208
- opacity: 0;
209
- transform: scale(0.5);
210
- }
211
- &--zoom-fade-leave {
212
- opacity: 0;
213
- transform: scale(0.5);
214
- }
215
- }
1
+ <template>
2
+ <view
3
+ v-show="visible"
4
+ class="u-transition"
5
+ :class="transitionClass"
6
+ :style="transitionStyle"
7
+ @transitionend="onTransitionEnd"
8
+ >
9
+ <slot />
10
+ </view>
11
+ </template>
12
+
13
+ <script setup lang="ts">
14
+ import { computed, ref, watch } from 'vue'
15
+
16
+ type TransitionMode =
17
+ | 'fade'
18
+ | 'fade-up'
19
+ | 'fade-down'
20
+ | 'fade-left'
21
+ | 'fade-right'
22
+ | 'slide-up'
23
+ | 'slide-down'
24
+ | 'slide-left'
25
+ | 'slide-right'
26
+ | 'zoom'
27
+ | 'zoom-fade'
28
+
29
+ interface Props {
30
+ show?: boolean
31
+ mode?: TransitionMode
32
+ duration?: number
33
+ delay?: number
34
+ customStyle?: Record<string, string | number>
35
+ }
36
+
37
+ const props = withDefaults(defineProps<Props>(), {
38
+ show: false,
39
+ mode: 'fade',
40
+ duration: 300,
41
+ delay: 0
42
+ })
43
+
44
+ const emit = defineEmits<{
45
+ (e: 'after-enter'): void
46
+ (e: 'after-leave'): void
47
+ }>()
48
+
49
+ const visible = ref(false)
50
+ const animationPhase = ref<'enter' | 'leave'>('enter')
51
+
52
+ // 监听 show 变化
53
+ watch(
54
+ () => props.show,
55
+ (val) => {
56
+ if (val) {
57
+ visible.value = true
58
+ animationPhase.value = 'enter'
59
+ } else {
60
+ animationPhase.value = 'leave'
61
+ }
62
+ },
63
+ { immediate: true }
64
+ )
65
+
66
+ const transitionClass = computed(() => {
67
+ const classes: string[] = []
68
+
69
+ if (animationPhase.value === 'enter') {
70
+ classes.push(`u-transition--${props.mode}-enter`)
71
+ } else {
72
+ classes.push(`u-transition--${props.mode}-leave`)
73
+ }
74
+
75
+ return classes
76
+ })
77
+
78
+ const transitionStyle = computed(() => {
79
+ const style: Record<string, string | number> = {
80
+ transitionDuration: `${props.duration}ms`,
81
+ transitionDelay: `${props.delay}ms`,
82
+ transitionProperty: 'opacity, transform',
83
+ transitionTimingFunction: 'ease-out'
84
+ }
85
+
86
+ if (props.customStyle) {
87
+ Object.assign(style, props.customStyle)
88
+ }
89
+
90
+ return style
91
+ })
92
+
93
+ const onTransitionEnd = () => {
94
+ if (animationPhase.value === 'leave') {
95
+ visible.value = false
96
+ emit('after-leave')
97
+ } else {
98
+ emit('after-enter')
99
+ }
100
+ }
101
+ </script>
102
+
103
+ <script lang="ts">
104
+ export default {
105
+ options: {
106
+ virtualHost: true,
107
+ styleIsolation: 'shared'
108
+ }
109
+ }
110
+ </script>
111
+
112
+ <style lang="scss" scoped>
113
+ .u-transition {
114
+ // 基础状态
115
+ opacity: 1;
116
+ transform: none;
117
+
118
+ // 淡入淡出
119
+ &--fade-enter {
120
+ opacity: 0;
121
+ }
122
+ &--fade-leave {
123
+ opacity: 0;
124
+ }
125
+
126
+ // 上滑淡入
127
+ &--fade-up-enter {
128
+ opacity: 0;
129
+ transform: translateY(100%);
130
+ }
131
+ &--fade-up-leave {
132
+ opacity: 0;
133
+ transform: translateY(-100%);
134
+ }
135
+
136
+ // 下滑淡入
137
+ &--fade-down-enter {
138
+ opacity: 0;
139
+ transform: translateY(-100%);
140
+ }
141
+ &--fade-down-leave {
142
+ opacity: 0;
143
+ transform: translateY(100%);
144
+ }
145
+
146
+ // 左滑淡入
147
+ &--fade-left-enter {
148
+ opacity: 0;
149
+ transform: translateX(100%);
150
+ }
151
+ &--fade-left-leave {
152
+ opacity: 0;
153
+ transform: translateX(-100%);
154
+ }
155
+
156
+ // 右滑淡入
157
+ &--fade-right-enter {
158
+ opacity: 0;
159
+ transform: translateX(-100%);
160
+ }
161
+ &--fade-right-leave {
162
+ opacity: 0;
163
+ transform: translateX(100%);
164
+ }
165
+
166
+ // 上滑进入
167
+ &--slide-up-enter {
168
+ transform: translateY(100%);
169
+ }
170
+ &--slide-up-leave {
171
+ transform: translateY(-100%);
172
+ }
173
+
174
+ // 下滑进入
175
+ &--slide-down-enter {
176
+ transform: translateY(-100%);
177
+ }
178
+ &--slide-down-leave {
179
+ transform: translateY(100%);
180
+ }
181
+
182
+ // 左滑进入
183
+ &--slide-left-enter {
184
+ transform: translateX(100%);
185
+ }
186
+ &--slide-left-leave {
187
+ transform: translateX(-100%);
188
+ }
189
+
190
+ // 右滑进入
191
+ &--slide-right-enter {
192
+ transform: translateX(-100%);
193
+ }
194
+ &--slide-right-leave {
195
+ transform: translateX(100%);
196
+ }
197
+
198
+ // 缩放
199
+ &--zoom-enter {
200
+ transform: scale(0);
201
+ }
202
+ &--zoom-leave {
203
+ transform: scale(0);
204
+ }
205
+
206
+ // 缩放淡入
207
+ &--zoom-fade-enter {
208
+ opacity: 0;
209
+ transform: scale(0.5);
210
+ }
211
+ &--zoom-fade-leave {
212
+ opacity: 0;
213
+ transform: scale(0.5);
214
+ }
215
+ }
216
216
  </style>