papayaui 0.2.12 → 0.2.13

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.
package/.DS_Store CHANGED
Binary file
Binary file
@@ -12,7 +12,6 @@
12
12
  :style="customStyle"
13
13
  :hover-class="ns.m('hover')"
14
14
  :disabled="disabled"
15
- :plain="plain"
16
15
  :open-type="openType"
17
16
  @getphonenumber="emit('getphonenumber', $event)"
18
17
  @getuserinfo="emit('getuserinfo', $event)"
@@ -112,7 +112,7 @@ const toggle = (show = !visible.value) => {
112
112
  visibleEnded.value = false
113
113
  } else {
114
114
  // 关闭弹窗的时候如果有展开的节点立即关闭,没有的话等待动画完毕再关闭
115
- if (menuProvide.isMenuItemShow && !visible.value) {
115
+ if (menuProvide.isMenuItemShow.value && !visible.value) {
116
116
  visibleEnded.value = true
117
117
  }
118
118
  }
@@ -28,26 +28,45 @@ export type TransitionMode =
28
28
  | 'slide-right'
29
29
 
30
30
  export const transitionProps = {
31
- /** 是否展示组件 */
31
+ /**
32
+ * 是否展示组件
33
+ */
32
34
  show: Boolean,
33
- /** 使用的动画模式 */
35
+ /**
36
+ * 使用的动画模式
37
+ */
34
38
  mode: {
35
39
  type: String as PropType<TransitionMode>,
36
40
  default: 'fade',
37
41
  },
38
- /** 动画的执行时间,单位ms */
42
+ /**
43
+ * 动画的执行时间,单位ms
44
+ */
39
45
  duration: {
40
46
  type: [String, Number],
41
47
  default: 300,
42
48
  },
43
- /** 使用的动画过渡函数 */
49
+ /**
50
+ * 使用的动画过渡函数
51
+ */
44
52
  timingFunction: {
45
53
  type: String as PropType<CSSProperties['transitionTimingFunction']>,
46
54
  default: 'ease-out',
47
55
  },
48
- /** 自定义class */
56
+ /**
57
+ * 关闭是否销毁内部元素
58
+ */
59
+ destroyOnClose: {
60
+ type: Boolean,
61
+ default: true,
62
+ },
63
+ /**
64
+ * 自定义class
65
+ */
49
66
  customClass: String,
50
- /** 自定义样式 */
67
+ /**
68
+ * 自定义样式
69
+ */
51
70
  customStyle: Object as PropType<CSSProperties>,
52
71
  }
53
72
 
@@ -0,0 +1,108 @@
1
+ @import '../../styles/vars.scss';
2
+
3
+ $transform-zoom-scale: scale(0.95);
4
+
5
+ .#{$prefix} {
6
+ &-transition {
7
+ &-hide {
8
+ display: none !important;
9
+ }
10
+ }
11
+
12
+ &-fade-enter-active,
13
+ &-fade-leave-active {
14
+ transition-property: opacity;
15
+ }
16
+
17
+ &-fade-enter,
18
+ &-fade-leave-to {
19
+ opacity: 0;
20
+ }
21
+
22
+ &-fade-zoom-enter,
23
+ &-fade-zoom-leave-to {
24
+ transform: $transform-zoom-scale;
25
+ opacity: 0;
26
+ }
27
+
28
+ &-fade-zoom-enter-active,
29
+ &-fade-zoom-leave-active {
30
+ transition-property: transform, opacity;
31
+ }
32
+
33
+ &-fade-down-enter-active,
34
+ &-fade-down-leave-active,
35
+ &-fade-left-enter-active,
36
+ &-fade-left-leave-active,
37
+ &-fade-right-enter-active,
38
+ &-fade-right-leave-active,
39
+ &-fade-up-enter-active,
40
+ &-fade-up-leave-active {
41
+ transition-property: opacity, transform;
42
+ }
43
+
44
+ &-fade-up-enter,
45
+ &-fade-up-leave-to {
46
+ transform: translate3d(0, 100%, 0);
47
+ opacity: 0;
48
+ }
49
+
50
+ &-fade-down-enter,
51
+ &-fade-down-leave-to {
52
+ transform: translate3d(0, -100%, 0);
53
+ opacity: 0;
54
+ }
55
+
56
+ &-fade-left-enter,
57
+ &-fade-left-leave-to {
58
+ transform: translate3d(-100%, 0, 0);
59
+ opacity: 0;
60
+ }
61
+
62
+ &-fade-right-enter,
63
+ &-fade-right-leave-to {
64
+ transform: translate3d(100%, 0, 0);
65
+ opacity: 0;
66
+ }
67
+
68
+ &-slide-down-enter-active,
69
+ &-slide-down-leave-active,
70
+ &-slide-left-enter-active,
71
+ &-slide-left-leave-active,
72
+ &-slide-right-enter-active,
73
+ &-slide-right-leave-active,
74
+ &-slide-up-enter-active,
75
+ &-slide-up-leave-active {
76
+ transition-property: transform;
77
+ }
78
+
79
+ &-slide-up-enter,
80
+ &-slide-up-leave-to {
81
+ transform: translate3d(0, 100%, 0);
82
+ }
83
+
84
+ &-slide-down-enter,
85
+ &-slide-down-leave-to {
86
+ transform: translate3d(0, -100%, 0);
87
+ }
88
+
89
+ &-slide-left-enter,
90
+ &-slide-left-leave-to {
91
+ transform: translate3d(-100%, 0, 0);
92
+ }
93
+
94
+ &-slide-right-enter,
95
+ &-slide-right-leave-to {
96
+ transform: translate3d(100%, 0, 0);
97
+ }
98
+
99
+ &-zoom-enter-active,
100
+ &-zoom-leave-active {
101
+ transition-property: transform;
102
+ }
103
+
104
+ &-zoom-enter,
105
+ &-zoom-leave-to {
106
+ transform: $transform-zoom-scale;
107
+ }
108
+ }
@@ -1,136 +1,120 @@
1
1
  <template>
2
2
  <view
3
- v-if="state.inited"
4
- :class="[ns.b(), state.classes, customClass]"
3
+ v-if="inited"
4
+ :class="[ns.b(), customClass]"
5
5
  :style="mergeStyle"
6
- @tap="clickHandler"
6
+ :options="options"
7
+ :show="show"
8
+ :change:options="wxs.onOptionsChange"
9
+ :change:show="wxs.onShowChange"
10
+ @tap="onClick"
7
11
  @touchmove="noop"
8
12
  >
9
13
  <slot />
10
14
  </view>
11
15
  </template>
12
16
 
13
- <script lang="ts" setup>
14
- import { computed, nextTick, reactive, watch } from 'vue'
17
+ <script lang="ts">
18
+ import { computed, defineComponent, reactive, toRefs, watch } from 'vue'
15
19
  import useNamespace, { defaultNamespace } from '../../core/useNamespace'
16
20
  import { noop } from '../../utils'
17
21
  import { transitionEmits, transitionProps } from './props'
18
22
 
19
- const ns = useNamespace('transition')
20
-
21
- const props = defineProps(transitionProps)
22
- const emit = defineEmits(transitionEmits)
23
-
24
- const state = reactive<{
25
- inited: boolean // 是否显示/隐藏组件
26
- status: '' | 'enter' | 'leave' // 记录组件动画的状态
27
- transitionEnded: boolean // 组件是否结束的标记
28
- display: boolean // 组件是否展示
29
- classes: string // 应用的类名
30
- }>({
31
- inited: false,
32
- status: '',
33
- transitionEnded: false,
34
- display: false,
35
- classes: '',
36
- })
23
+ export default defineComponent({
24
+ props: transitionProps,
25
+ emits: transitionEmits,
26
+ setup(props, { emit }) {
27
+ const ns = useNamespace('transition')
37
28
 
38
- const mergeStyle = computed(() => {
39
- return {
40
- transitionDuration: `${props.duration}ms`,
41
- transitionTimingFunction: props.timingFunction,
42
- ...props.customStyle,
43
- }
44
- })
29
+ const state = reactive<{
30
+ inited: boolean // 是否显示/隐藏组件
31
+ }>({
32
+ inited: false,
33
+ })
45
34
 
46
- // 定义类名,通过给元素动态切换类名,赋予元素一定的css动画样式
47
- const getClassNames = (name: string) => {
48
- const classPrefix = `${defaultNamespace}-${name}`
49
- return {
50
- enter: `${classPrefix}-enter ${classPrefix}-enter-active`,
51
- 'enter-to': `${classPrefix}-enter-to ${classPrefix}-enter-active`,
52
- leave: `${classPrefix}-leave ${classPrefix}-leave-active`,
53
- 'leave-to': `${classPrefix}-leave-to ${classPrefix}-leave-active`,
54
- }
55
- }
56
-
57
- const onEnter = async () => {
58
- // 动画进入时的类名
59
- const classNames = getClassNames(props.mode)
60
- // 定义状态和发出动画进入前事件
61
- state.status = 'enter'
62
- emit('beforeEnter')
63
- state.inited = true
64
- state.display = true
65
- state.classes = classNames.enter
66
- await nextTick()
67
- await new Promise<void>((resolve) => {
68
- return setTimeout(() => {
69
- resolve()
70
- }, 1000 / 30)
71
- })
72
- // 标识动画尚未结束
73
- emit('enter')
74
- state.transitionEnded = false
75
- // 组件动画进入后触发的事件
76
- emit('afterEnter')
77
- // 赋予组件enter-to类名
78
- state.classes = classNames['enter-to']
79
- }
80
-
81
- // 动画离场处理
82
- const onLeave = () => {
83
- // 如果不是展示状态,无需执行逻辑
84
- if (!state.display) return
85
- const classNames = getClassNames(props.mode)
86
- // 标记离开状态和发出事件
87
- state.status = 'leave'
88
- emit('beforeLeave')
89
- // 获得类名
90
- state.classes = classNames.leave
91
-
92
- nextTick(() => {
93
- // 动画正在离场的状态
94
- state.transitionEnded = false
95
- emit('leave')
96
- // 组件执行动画,到了执行的执行时间后,执行一些额外处理
97
- setTimeout(onTransitionEnd, +props.duration)
98
- state.classes = classNames['leave-to']
99
- })
100
- }
101
-
102
- // 完成过渡后触发
103
- const onTransitionEnd = () => {
104
- // 如果已经是结束的状态,无需再处理
105
- if (state.transitionEnded) return
106
- state.transitionEnded = true
107
- // 发出组件动画执行后的事件
108
- if (state.status === 'leave') {
109
- emit('afterLeave')
110
- } else {
111
- emit('afterEnter')
112
- }
113
- if (!props.show && state.display) {
114
- state.display = false
115
- state.inited = false
116
- }
117
- }
118
-
119
- watch(
120
- () => props.show,
121
- (newVal) => {
122
- newVal ? onEnter() : onLeave()
123
- },
124
- {
125
- immediate: true,
126
- },
127
- )
35
+ const options = computed(() => {
36
+ return {
37
+ mainClass: ns.b(),
38
+ prefix: defaultNamespace,
39
+ mode: props.mode,
40
+ duration: +props.duration,
41
+ }
42
+ })
43
+
44
+ const mergeStyle = computed(() => {
45
+ return {
46
+ transitionTimingFunction: props.timingFunction,
47
+ ...props.customStyle,
48
+ }
49
+ })
50
+
51
+ const onInit = async () => {
52
+ state.inited = true
53
+ }
54
+
55
+ const beforeEnter = () => {
56
+ emit('beforeEnter')
57
+ }
58
+
59
+ const enter = () => {
60
+ emit('enter')
61
+ }
128
62
 
129
- const clickHandler = () => {
130
- emit('click')
131
- }
63
+ const afterEnter = () => {
64
+ emit('afterEnter')
65
+ }
66
+
67
+ const beforeLeave = () => {
68
+ emit('beforeLeave')
69
+ }
70
+
71
+ const leave = () => {
72
+ emit('leave')
73
+ }
74
+
75
+ const afterLeave = () => {
76
+ emit('afterLeave')
77
+ if (props.destroyOnClose) {
78
+ state.inited = false
79
+ }
80
+ }
81
+
82
+ watch(
83
+ () => props.show,
84
+ (newVal) => {
85
+ if (newVal) {
86
+ onInit()
87
+ }
88
+ },
89
+ {
90
+ immediate: true,
91
+ },
92
+ )
93
+
94
+ const onClick = () => {
95
+ emit('click')
96
+ }
97
+
98
+ return {
99
+ wxs: {} as any,
100
+ ns,
101
+ ...toRefs(state),
102
+ options,
103
+ mergeStyle,
104
+ noop,
105
+ onClick,
106
+ beforeEnter,
107
+ enter,
108
+ afterEnter,
109
+ beforeLeave,
110
+ leave,
111
+ afterLeave,
112
+ }
113
+ },
114
+ })
132
115
  </script>
116
+ <script module="wxs" lang="wxs" src="./transition.wxs"></script>
133
117
 
134
118
  <style lang="scss">
135
- @import './animate.scss';
119
+ @import './transition.scss';
136
120
  </style>
@@ -0,0 +1,106 @@
1
+ function getClassNames(name) {
2
+ return {
3
+ enter: name + '-enter ' + name + '-enter-active',
4
+ 'enter-to': name + '-enter-to ' + name + '-enter-active',
5
+ leave: name + '-leave ' + name + '-leave-active',
6
+ 'leave-to': name + '-leave-to ' + name + '-leave-active',
7
+ }
8
+ }
9
+
10
+ function onOptionsChange(newValue, _oldValue, _ownInstance, instance) {
11
+ if (typeof newValue === 'undefined') return
12
+ var state = instance.getState()
13
+ state.mainClass = newValue.mainClass
14
+ state.prefix = newValue.prefix
15
+ state.mode = newValue.mode
16
+ state.duration = newValue.duration
17
+ }
18
+
19
+ function onShowChange(newValue, _oldValue, ownInstance, instance) {
20
+ if (typeof newValue === 'undefined') return
21
+ var state = instance.getState()
22
+ var classNames = getClassNames(state.prefix + '-' + state.mode)
23
+ classNames.hide = state.mainClass + '-hide'
24
+
25
+ if (newValue) {
26
+ enter(ownInstance, instance, classNames)
27
+ } else {
28
+ leave(ownInstance, instance, classNames)
29
+ }
30
+ }
31
+
32
+ function enter(ownInstance, instance, classNames) {
33
+ var state = instance.getState()
34
+ var clearClassNames = [classNames.hide, classNames.leave, classNames['leave-to']]
35
+ clearClassNames.forEach(function (className) {
36
+ instance.removeClass(className)
37
+ })
38
+ // 进入前
39
+ ownInstance.callMethod('beforeEnter')
40
+ instance.setStyle({
41
+ 'transition-duration': '0ms',
42
+ })
43
+ // 进入动画
44
+ ownInstance.callMethod('enter')
45
+ instance.addClass(classNames.enter)
46
+
47
+ instance.requestAnimationFrame(function () {
48
+ instance.removeClass(classNames.enter)
49
+ instance.setStyle({
50
+ 'transition-duration': state.duration + 'ms',
51
+ })
52
+ // 进入动画中
53
+ instance.addClass(classNames['enter-to'])
54
+ state.transitionEnded = false
55
+
56
+ state._enterTimer = instance.setTimeout(function () {
57
+ if (state.transitionEnded) return
58
+ state.transitionEnded = true
59
+ state._enterTimer = null
60
+ // 进入动画完成
61
+ instance.removeClass(classNames['enter-to'])
62
+ ownInstance.callMethod('afterEnter')
63
+ }, state.duration)
64
+ })
65
+ }
66
+
67
+ function leave(ownInstance, instance, classNames) {
68
+ var state = instance.getState()
69
+ var clearClassNames = [classNames.enter, classNames['enter-to']]
70
+ clearClassNames.forEach(function (className) {
71
+ instance.removeClass(className)
72
+ })
73
+ if (state._enterTimer) {
74
+ instance.clearTimeout(state._enterTimer)
75
+ state._enterTimer = null
76
+ }
77
+ // 离开前
78
+ ownInstance.callMethod('beforeLeave')
79
+
80
+ instance.requestAnimationFrame(function () {
81
+ // 离开动画
82
+ ownInstance.callMethod('leave')
83
+ instance.addClass(classNames.leave)
84
+
85
+ instance.requestAnimationFrame(function () {
86
+ instance.removeClass(classNames.leave)
87
+ // 离开动画中
88
+ instance.addClass(classNames['leave-to'])
89
+ state.transitionEnded = false
90
+
91
+ instance.setTimeout(function () {
92
+ if (state.transitionEnded) return
93
+ state.transitionEnded = true
94
+ // 离开动画完成
95
+ instance.removeClass(classNames['leave-to'])
96
+ instance.addClass(classNames.hide)
97
+ ownInstance.callMethod('afterLeave')
98
+ }, state.duration)
99
+ })
100
+ })
101
+ }
102
+
103
+ module.exports = {
104
+ onOptionsChange: onOptionsChange,
105
+ onShowChange: onShowChange,
106
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "papayaui",
3
- "version": "0.2.12",
3
+ "version": "0.2.13",
4
4
  "description": "适用于uniapp的ui扩展库",
5
5
  "packageManager": "pnpm@8.6.0",
6
6
  "dependencies": {
@@ -1,123 +0,0 @@
1
- /**
2
- * 动画内置的动画模式有如下:
3
- * fade:淡入
4
- * zoom:缩放
5
- * fade-zoom:缩放淡入
6
- * fade-up:上滑淡入
7
- * fade-down:下滑淡入
8
- * fade-left:左滑淡入
9
- * fade-right:右滑淡入
10
- * slide-up:上滑进入
11
- * slide-down:下滑进入
12
- * slide-left:左滑进入
13
- * slide-right:右滑进入
14
- */
15
-
16
- @import '../../styles/vars.scss';
17
-
18
- $transform-zoom-scale: scale(0.95);
19
-
20
- .#{$prefix} {
21
- &-fade {
22
- &-enter-active,
23
- &-leave-active {
24
- transition-property: opacity;
25
- }
26
-
27
- &-enter,
28
- &-leave-to {
29
- opacity: 0;
30
- }
31
-
32
- &-zoom-enter,
33
- &-zoom-leave-to {
34
- transform: $transform-zoom-scale;
35
- opacity: 0;
36
- }
37
-
38
- &-zoom-enter-active,
39
- &-zoom-leave-active {
40
- transition-property: transform, opacity;
41
- }
42
-
43
- &-down-enter-active,
44
- &-down-leave-active,
45
- &-left-enter-active,
46
- &-left-leave-active,
47
- &-right-enter-active,
48
- &-right-leave-active,
49
- &-up-enter-active,
50
- &-up-leave-active {
51
- transition-property: opacity, transform;
52
- }
53
-
54
- &-up-enter,
55
- &-up-leave-to {
56
- transform: translate3d(0, 100%, 0);
57
- opacity: 0;
58
- }
59
-
60
- &-down-enter,
61
- &-down-leave-to {
62
- transform: translate3d(0, -100%, 0);
63
- opacity: 0;
64
- }
65
-
66
- &-left-enter,
67
- &-left-leave-to {
68
- transform: translate3d(-100%, 0, 0);
69
- opacity: 0;
70
- }
71
-
72
- &-right-enter,
73
- &-right-leave-to {
74
- transform: translate3d(100%, 0, 0);
75
- opacity: 0;
76
- }
77
- }
78
-
79
- &-slide {
80
- &-down-enter-active,
81
- &-down-leave-active,
82
- &-left-enter-active,
83
- &-left-leave-active,
84
- &-right-enter-active,
85
- &-right-leave-active,
86
- &-up-enter-active,
87
- &-up-leave-active {
88
- transition-property: transform;
89
- }
90
-
91
- &-up-enter,
92
- &-up-leave-to {
93
- transform: translate3d(0, 100%, 0);
94
- }
95
-
96
- &-down-enter,
97
- &-down-leave-to {
98
- transform: translate3d(0, -100%, 0);
99
- }
100
-
101
- &-left-enter,
102
- &-left-leave-to {
103
- transform: translate3d(-100%, 0, 0);
104
- }
105
-
106
- &-right-enter,
107
- &-right-leave-to {
108
- transform: translate3d(100%, 0, 0);
109
- }
110
- }
111
-
112
- &-zoom {
113
- &-enter-active,
114
- &-leave-active {
115
- transition-property: transform;
116
- }
117
-
118
- &-enter,
119
- &-leave-to {
120
- transform: $transform-zoom-scale;
121
- }
122
- }
123
- }