@citizenplane/pimp 13.1.0 → 14.0.0
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/dist/pimp.es.js +2654 -2531
- package/dist/pimp.umd.js +16 -16
- package/dist/style.css +1 -1
- package/package.json +1 -1
- package/src/components/CpAccordion.vue +2 -13
- package/src/components/CpDate.vue +2 -2
- package/src/components/CpInput.vue +2 -2
- package/src/components/CpMultiselect.vue +3 -3
- package/src/components/CpSelect.vue +3 -3
- package/src/components/CpTelInput.vue +2 -2
- package/src/components/CpTextarea.vue +3 -3
- package/src/components/CpTransitionCounter.vue +77 -0
- package/src/components/CpTransitionListItems.vue +41 -0
- package/src/components/CpTransitionSize.vue +88 -0
- package/src/components/CpTransitionSlide.vue +44 -0
- package/src/components/CpTransitionTabContent.vue +70 -0
- package/src/components/index.ts +12 -2
- package/src/stories/BaseInputLabel.stories.ts +1 -1
- package/src/stories/CpAccordion.stories.ts +1 -1
- package/src/stories/CpAccordionGroup.stories.ts +1 -1
- package/src/stories/CpAirlineLogo.stories.ts +1 -1
- package/src/stories/CpAlert.stories.ts +1 -1
- package/src/stories/CpBadge.stories.ts +1 -1
- package/src/stories/CpButton.stories.ts +1 -1
- package/src/stories/CpCheckbox.stories.ts +1 -1
- package/src/stories/CpContextualMenu.stories.ts +1 -1
- package/src/stories/CpDate.stories.ts +1 -1
- package/src/stories/CpDatepicker.stories.ts +1 -1
- package/src/stories/CpDialog.stories.ts +1 -1
- package/src/stories/CpHeading.stories.ts +1 -1
- package/src/stories/CpIcon.stories.ts +1 -1
- package/src/stories/CpInput.stories.ts +1 -1
- package/src/stories/CpItemActions.stories.ts +1 -1
- package/src/stories/CpLoader.stories.ts +1 -1
- package/src/stories/CpMenuItem.stories.ts +1 -1
- package/src/stories/CpMultiselect.stories.ts +1 -1
- package/src/stories/CpPartnerBadge.stories.ts +1 -1
- package/src/stories/CpRadio.stories.ts +1 -1
- package/src/stories/CpSelect.stories.ts +1 -1
- package/src/stories/CpSelectMenu.stories.ts +1 -1
- package/src/stories/CpSelectableButton.stories.ts +1 -1
- package/src/stories/CpSwitch.stories.ts +1 -1
- package/src/stories/CpTable.stories.ts +1 -1
- package/src/stories/CpTableEmptyState.stories.ts +1 -1
- package/src/stories/CpTabs.stories.ts +1 -1
- package/src/stories/CpTelInput.stories.ts +1 -1
- package/src/stories/CpTextarea.stories.ts +1 -1
- package/src/stories/CpToast.stories.ts +1 -1
- package/src/stories/CpTooltip.stories.ts +1 -1
- package/src/stories/CpTransitionCounter.stories.ts +66 -0
- package/src/stories/{TransitionExpand.stories.ts → CpTransitionExpand.stories.ts} +11 -11
- package/src/stories/CpTransitionListItems.stories.ts +147 -0
- package/src/stories/CpTransitionSize.stories.ts +147 -0
- package/src/stories/CpTransitionSlide.stories.ts +65 -0
- package/src/stories/CpTransitionTabContent.stories.ts +78 -0
- /package/src/components/{TransitionExpand.vue → CpTransitionExpand.vue} +0 -0
package/package.json
CHANGED
|
@@ -29,11 +29,11 @@
|
|
|
29
29
|
:quick-options-limit="resolvedQuickOptionsLimit"
|
|
30
30
|
/>
|
|
31
31
|
</button>
|
|
32
|
-
<transition-expand>
|
|
32
|
+
<cp-transition-expand>
|
|
33
33
|
<div v-if="isToggled" :id="accordionContentId" :aria-labelledby="accordionId" class="cpAccordion__content">
|
|
34
34
|
<slot />
|
|
35
35
|
</div>
|
|
36
|
-
</transition-expand>
|
|
36
|
+
</cp-transition-expand>
|
|
37
37
|
</div>
|
|
38
38
|
</template>
|
|
39
39
|
|
|
@@ -150,12 +150,8 @@ const handleClick = () => (isToggled.value = !isToggled.value)
|
|
|
150
150
|
}
|
|
151
151
|
|
|
152
152
|
&__actions {
|
|
153
|
-
right: 0;
|
|
154
|
-
top: 0;
|
|
155
|
-
height: 100%;
|
|
156
153
|
background: linear-gradient(270deg, var(--cp-utility-neutral-100) 0%, rgba(242, 246, 250, 0) 100%);
|
|
157
154
|
padding: 0 var(--cp-spacing-md) 0 15%;
|
|
158
|
-
transform: translate3d(calc(var(--cp-dimensions-1) * 1.25), 0%, 0);
|
|
159
155
|
display: flex;
|
|
160
156
|
align-items: center;
|
|
161
157
|
}
|
|
@@ -164,11 +160,4 @@ const handleClick = () => (isToggled.value = !isToggled.value)
|
|
|
164
160
|
color: var(--cp-foreground-primary);
|
|
165
161
|
}
|
|
166
162
|
}
|
|
167
|
-
|
|
168
|
-
@media (hover: hover) and (pointer: fine) {
|
|
169
|
-
[cp-item-actions-trigger]:has(.cpItemActions--isDropdownOpen) .cpItemActions,
|
|
170
|
-
[cp-item-actions-trigger]:is(:focus-within, :focus-visible, :hover) .cpItemActions {
|
|
171
|
-
transform: translate3d(0, 0, 0);
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
163
|
</style>
|
|
@@ -45,9 +45,9 @@
|
|
|
45
45
|
:required="required"
|
|
46
46
|
/>
|
|
47
47
|
</div>
|
|
48
|
-
<transition-expand>
|
|
48
|
+
<cp-transition-expand>
|
|
49
49
|
<div v-if="advancedErrorMessage" class="cpDate__errorMessage">{{ advancedErrorMessage }}</div>
|
|
50
|
-
</transition-expand>
|
|
50
|
+
</cp-transition-expand>
|
|
51
51
|
</div>
|
|
52
52
|
</template>
|
|
53
53
|
|
|
@@ -39,14 +39,14 @@
|
|
|
39
39
|
</transition>
|
|
40
40
|
</div>
|
|
41
41
|
</div>
|
|
42
|
-
<transition-expand mode="out-in">
|
|
42
|
+
<cp-transition-expand mode="out-in">
|
|
43
43
|
<p v-if="displayErrorMessage" :id="errorMessageId" class="cpInput__error">
|
|
44
44
|
{{ errorMessage }}
|
|
45
45
|
</p>
|
|
46
46
|
<p v-else-if="displayHelp" :id="helpMessageId" class="cpInput__help">
|
|
47
47
|
{{ help }}
|
|
48
48
|
</p>
|
|
49
|
-
</transition-expand>
|
|
49
|
+
</cp-transition-expand>
|
|
50
50
|
</div>
|
|
51
51
|
</template>
|
|
52
52
|
|
|
@@ -86,11 +86,11 @@
|
|
|
86
86
|
/>
|
|
87
87
|
</template>
|
|
88
88
|
</auto-complete>
|
|
89
|
-
<transition-expand mode="out-in">
|
|
89
|
+
<cp-transition-expand mode="out-in">
|
|
90
90
|
<p v-if="isInvalid" class="cpMultiselect__error">
|
|
91
91
|
{{ errorMessage }}
|
|
92
92
|
</p>
|
|
93
|
-
</transition-expand>
|
|
93
|
+
</cp-transition-expand>
|
|
94
94
|
</div>
|
|
95
95
|
</template>
|
|
96
96
|
|
|
@@ -101,7 +101,7 @@ import { ref, computed, onMounted, useSlots, useId } from 'vue'
|
|
|
101
101
|
|
|
102
102
|
import BaseInputLabel from '@/components/BaseInputLabel.vue'
|
|
103
103
|
import BaseSelectClearButton from '@/components/BaseSelectClearButton.vue'
|
|
104
|
-
import
|
|
104
|
+
import CpTransitionExpand from '@/components/CpTransitionExpand.vue'
|
|
105
105
|
|
|
106
106
|
import { isEmpty } from '@/helpers/object'
|
|
107
107
|
|
|
@@ -25,14 +25,14 @@
|
|
|
25
25
|
<option v-for="(option, index) in options" :key="index" :value="option.value">{{ option.label }}</option>
|
|
26
26
|
</select>
|
|
27
27
|
</div>
|
|
28
|
-
<transition-expand mode="out-in">
|
|
28
|
+
<cp-transition-expand mode="out-in">
|
|
29
29
|
<p v-if="displayErrorMessage" :id="errorMessageId" class="cpSelect__error">
|
|
30
30
|
{{ errorMessage }}
|
|
31
31
|
</p>
|
|
32
32
|
<p v-else-if="displayHelp" :id="helpMessageId" class="cpSelect__help">
|
|
33
33
|
{{ help }}
|
|
34
34
|
</p>
|
|
35
|
-
</transition-expand>
|
|
35
|
+
</cp-transition-expand>
|
|
36
36
|
</div>
|
|
37
37
|
</template>
|
|
38
38
|
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
import { computed, useId } from 'vue'
|
|
41
41
|
|
|
42
42
|
import BaseInputLabel from '@/components/BaseInputLabel.vue'
|
|
43
|
-
import
|
|
43
|
+
import CpTransitionExpand from '@/components/CpTransitionExpand.vue'
|
|
44
44
|
|
|
45
45
|
import type { Sizes } from '@/constants'
|
|
46
46
|
import { capitalizeFirstLetter } from '@/helpers'
|
|
@@ -28,14 +28,14 @@
|
|
|
28
28
|
</template>
|
|
29
29
|
</vue-tel-input>
|
|
30
30
|
</div>
|
|
31
|
-
<transition-expand mode="out-in">
|
|
31
|
+
<cp-transition-expand mode="out-in">
|
|
32
32
|
<p v-if="displayErrorMessage" :id="errorMessageId" class="cpTelInput__error">
|
|
33
33
|
{{ errorMessage }}
|
|
34
34
|
</p>
|
|
35
35
|
<p v-else-if="displayHelp" :id="helpMessageId" class="cpTelInput__help">
|
|
36
36
|
{{ help }}
|
|
37
37
|
</p>
|
|
38
|
-
</transition-expand>
|
|
38
|
+
</cp-transition-expand>
|
|
39
39
|
</div>
|
|
40
40
|
</template>
|
|
41
41
|
|
|
@@ -19,11 +19,11 @@
|
|
|
19
19
|
:required="required"
|
|
20
20
|
:style="`min-height: ${height}px`"
|
|
21
21
|
/>
|
|
22
|
-
<transition-expand>
|
|
22
|
+
<cp-transition-expand>
|
|
23
23
|
<p v-if="displayErrorMessage" class="cpTextarea__error">
|
|
24
24
|
{{ errorMessage }}
|
|
25
25
|
</p>
|
|
26
|
-
</transition-expand>
|
|
26
|
+
</cp-transition-expand>
|
|
27
27
|
</div>
|
|
28
28
|
</template>
|
|
29
29
|
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
import { ref, computed, useId } from 'vue'
|
|
32
32
|
|
|
33
33
|
import BaseInputLabel from '@/components/BaseInputLabel.vue'
|
|
34
|
-
import
|
|
34
|
+
import CpTransitionExpand from '@/components/CpTransitionExpand.vue'
|
|
35
35
|
|
|
36
36
|
import { capitalizeFirstLetter } from '@/helpers'
|
|
37
37
|
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="cpTransitionCounter">
|
|
3
|
+
<transition :duration="duration" mode="out-in" :name="formattedTransitionName">
|
|
4
|
+
<span :key="counterNumber">
|
|
5
|
+
<slot />
|
|
6
|
+
</span>
|
|
7
|
+
</transition>
|
|
8
|
+
</div>
|
|
9
|
+
</template>
|
|
10
|
+
|
|
11
|
+
<script setup lang="ts">
|
|
12
|
+
import { ref, computed, watch } from 'vue'
|
|
13
|
+
|
|
14
|
+
interface Props {
|
|
15
|
+
counterNumber?: number
|
|
16
|
+
duration?: number
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const props = withDefaults(defineProps<Props>(), {
|
|
20
|
+
counterNumber: 0,
|
|
21
|
+
duration: 300,
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
enum Directions {
|
|
25
|
+
UP = 'up',
|
|
26
|
+
DOWN = 'down',
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const direction = ref<Directions>(Directions.UP)
|
|
30
|
+
|
|
31
|
+
const formattedTransitionName = computed(() => `counter-${direction.value}`)
|
|
32
|
+
|
|
33
|
+
watch(
|
|
34
|
+
() => props.counterNumber,
|
|
35
|
+
(newValue: number, oldValue: number) => {
|
|
36
|
+
direction.value = newValue < oldValue ? Directions.DOWN : Directions.UP
|
|
37
|
+
},
|
|
38
|
+
)
|
|
39
|
+
</script>
|
|
40
|
+
|
|
41
|
+
<style lang="scss">
|
|
42
|
+
.cpTransitionCounter {
|
|
43
|
+
display: inline-flex;
|
|
44
|
+
overflow: hidden;
|
|
45
|
+
|
|
46
|
+
&-up-enter-from {
|
|
47
|
+
transform: translate3d(0, 100%, 0);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
&-down-enter-from {
|
|
51
|
+
transform: translate3d(0, -100%, 0);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
&-up-leave-to,
|
|
55
|
+
&-down-leave-to {
|
|
56
|
+
filter: blur(1px);
|
|
57
|
+
opacity: 0;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
&-up-leave-to {
|
|
61
|
+
transform: translate3d(0, -100%, 0) skewY(-30deg);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
&-down-leave-to {
|
|
65
|
+
transform: translate3d(0, 100%, 0) skewY(30deg);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
&-up-enter-active,
|
|
69
|
+
&-down-enter-active,
|
|
70
|
+
&-up-leave-active,
|
|
71
|
+
&-down-leave-active {
|
|
72
|
+
transition:
|
|
73
|
+
transform 200ms ease,
|
|
74
|
+
opacity 200ms ease;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
</style>
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<transition-group :name="dynamicTransitionName">
|
|
3
|
+
<slot />
|
|
4
|
+
</transition-group>
|
|
5
|
+
</template>
|
|
6
|
+
|
|
7
|
+
<script setup lang="ts">
|
|
8
|
+
import { computed, onMounted, ref } from 'vue'
|
|
9
|
+
|
|
10
|
+
interface Props {
|
|
11
|
+
disableOnLoad?: boolean
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const props = withDefaults(defineProps<Props>(), { disableOnLoad: false })
|
|
15
|
+
|
|
16
|
+
const isDisabled = ref<boolean>(props.disableOnLoad)
|
|
17
|
+
|
|
18
|
+
const dynamicTransitionName = computed<string>(() => (isDisabled.value ? '' : 'list-items'))
|
|
19
|
+
|
|
20
|
+
onMounted(() => (isDisabled.value = false))
|
|
21
|
+
</script>
|
|
22
|
+
|
|
23
|
+
<style lang="scss">
|
|
24
|
+
.list-items-move,
|
|
25
|
+
.list-items-enter-active,
|
|
26
|
+
.list-items-leave-active {
|
|
27
|
+
transition:
|
|
28
|
+
transform 400ms ease,
|
|
29
|
+
opacity 200ms ease;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.list-items-enter-from,
|
|
33
|
+
.list-items-leave-to {
|
|
34
|
+
opacity: 0;
|
|
35
|
+
transform: translate3d(fn.px-to-rem(30), 0, 0);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.list-items-leave-active {
|
|
39
|
+
position: absolute;
|
|
40
|
+
}
|
|
41
|
+
</style>
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div :id="transitionId" ref="slotWrapper" class="cpTransitionSize" :class="componentDynamicClass">
|
|
3
|
+
<slot />
|
|
4
|
+
</div>
|
|
5
|
+
</template>
|
|
6
|
+
|
|
7
|
+
<script setup lang="ts">
|
|
8
|
+
import { computed, ref, onMounted, onBeforeUnmount, useId, nextTick } from 'vue'
|
|
9
|
+
|
|
10
|
+
interface Props {
|
|
11
|
+
type?: 'width' | 'height'
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const props = withDefaults(defineProps<Props>(), { type: 'width' })
|
|
15
|
+
|
|
16
|
+
const slotWrapper = ref()
|
|
17
|
+
const slotContent = computed<HTMLElement | null>(() => slotWrapper.value?.children[0])
|
|
18
|
+
|
|
19
|
+
const isHeight = computed<boolean>(() => props.type === 'height')
|
|
20
|
+
|
|
21
|
+
const componentDynamicClass = computed(() => {
|
|
22
|
+
return { 'cpTransitionSize--isHeight': isHeight.value }
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
const transitionId = useId()
|
|
26
|
+
|
|
27
|
+
const updateWrapperSize = async () => {
|
|
28
|
+
if (!slotContent.value) return
|
|
29
|
+
|
|
30
|
+
const size = slotContent.value[isHeight.value ? 'clientHeight' : 'clientWidth']
|
|
31
|
+
const property = isHeight.value ? 'min-height' : 'width'
|
|
32
|
+
|
|
33
|
+
slotWrapper.value.style[property] = `${size}px`
|
|
34
|
+
|
|
35
|
+
const transitionItem = document.getElementById(transitionId)
|
|
36
|
+
if (!transitionItem || !isHeight.value) return
|
|
37
|
+
|
|
38
|
+
slotWrapper.value.style.height = 0
|
|
39
|
+
|
|
40
|
+
await nextTick()
|
|
41
|
+
|
|
42
|
+
transitionItem.addEventListener(
|
|
43
|
+
'transitionend',
|
|
44
|
+
() => {
|
|
45
|
+
if (slotWrapper.value) {
|
|
46
|
+
slotWrapper.value.style.height = 'auto'
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
{ once: true },
|
|
50
|
+
)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const observer = ref<MutationObserver>()
|
|
54
|
+
|
|
55
|
+
const initObserver = () => {
|
|
56
|
+
observer.value = new MutationObserver(updateWrapperSize)
|
|
57
|
+
observer.value.observe(slotContent.value as HTMLElement, { childList: true, subtree: false })
|
|
58
|
+
|
|
59
|
+
updateWrapperSize()
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
onMounted(() => {
|
|
63
|
+
if (slotContent.value) {
|
|
64
|
+
initObserver()
|
|
65
|
+
}
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
onBeforeUnmount(() => {
|
|
69
|
+
if (observer.value) observer.value.disconnect()
|
|
70
|
+
})
|
|
71
|
+
</script>
|
|
72
|
+
|
|
73
|
+
<style lang="scss">
|
|
74
|
+
.cpTransitionSize {
|
|
75
|
+
display: inline-flex;
|
|
76
|
+
overflow: hidden;
|
|
77
|
+
transition-duration: 350ms;
|
|
78
|
+
transition-property: width;
|
|
79
|
+
transition-timing-function: var(--cp-easing-elastic);
|
|
80
|
+
white-space: nowrap;
|
|
81
|
+
|
|
82
|
+
&--isHeight {
|
|
83
|
+
display: block;
|
|
84
|
+
transition-property: min-height;
|
|
85
|
+
transition-timing-function: ease;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
</style>
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<transition :mode="mode" :name="formattedTransitionName">
|
|
3
|
+
<slot />
|
|
4
|
+
</transition>
|
|
5
|
+
</template>
|
|
6
|
+
|
|
7
|
+
<script setup lang="ts">
|
|
8
|
+
import { computed } from 'vue'
|
|
9
|
+
|
|
10
|
+
interface Props {
|
|
11
|
+
mode?: 'in-out' | 'out-in' | 'default'
|
|
12
|
+
slideTo?: 'top' | 'left'
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const props = withDefaults(defineProps<Props>(), {
|
|
16
|
+
slideTo: 'top',
|
|
17
|
+
mode: 'out-in',
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
const formattedTransitionName = computed(() => `slide-${props.slideTo}`)
|
|
21
|
+
</script>
|
|
22
|
+
|
|
23
|
+
<style lang="scss">
|
|
24
|
+
.slide-top-enter-active,
|
|
25
|
+
.slide-top-leave-active,
|
|
26
|
+
.slide-left-enter-active,
|
|
27
|
+
.slide-left-leave-active {
|
|
28
|
+
transition:
|
|
29
|
+
transform 300ms ease,
|
|
30
|
+
opacity 300ms ease;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.slide-top-enter-from,
|
|
34
|
+
.slide-top-leave-to {
|
|
35
|
+
opacity: 0;
|
|
36
|
+
transform: scale3d(0.8, 0.8, 1) translate3d(0, fn.px-to-rem(10), 0);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.slide-left-enter-from,
|
|
40
|
+
.slide-left-leave-to {
|
|
41
|
+
opacity: 0;
|
|
42
|
+
transform: scale3d(0.8, 0.8, 1) translate3d(fn.px-to-rem(10), 0, 0);
|
|
43
|
+
}
|
|
44
|
+
</style>
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<transition :duration="duration" mode="out-in" :name="formattedTransitionName" @after-enter="emit('onAfterEnter')">
|
|
3
|
+
<slot />
|
|
4
|
+
</transition>
|
|
5
|
+
</template>
|
|
6
|
+
|
|
7
|
+
<script setup lang="ts">
|
|
8
|
+
import { computed } from 'vue'
|
|
9
|
+
|
|
10
|
+
type Direction = 'forward' | 'backward'
|
|
11
|
+
|
|
12
|
+
type EmitType = {
|
|
13
|
+
(event: 'onAfterEnter'): void
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
interface Props {
|
|
17
|
+
direction?: Direction
|
|
18
|
+
duration?: number
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const props = withDefaults(defineProps<Props>(), {
|
|
22
|
+
direction: 'forward',
|
|
23
|
+
duration: 300,
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
const emit = defineEmits<EmitType>()
|
|
27
|
+
|
|
28
|
+
const formattedTransitionName = computed(() => `tab-content-${props.direction}`)
|
|
29
|
+
</script>
|
|
30
|
+
|
|
31
|
+
<style lang="scss">
|
|
32
|
+
.tab-content-backward,
|
|
33
|
+
.tab-content-forward {
|
|
34
|
+
&-enter-active,
|
|
35
|
+
&-leave-active {
|
|
36
|
+
transition:
|
|
37
|
+
transform 300ms ease,
|
|
38
|
+
opacity 300ms ease;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
&-enter-from,
|
|
42
|
+
&-leave-to {
|
|
43
|
+
opacity: 0;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
&-enter-to {
|
|
47
|
+
transform: translate3d(0, 0, 0);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.tab-content-forward {
|
|
52
|
+
&-enter-from {
|
|
53
|
+
transform: translate3d(10vw, 0, 0);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
&-leave-to {
|
|
57
|
+
transform: translate3d(-10vw, 0, 0);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.tab-content-backward {
|
|
62
|
+
&-enter-from {
|
|
63
|
+
transform: translate3d(-10vw, 0, 0);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
&-leave-to {
|
|
67
|
+
transform: translate3d(10vw, 0, 0);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
</style>
|
package/src/components/index.ts
CHANGED
|
@@ -47,7 +47,13 @@ import CpTelInput from './CpTelInput.vue'
|
|
|
47
47
|
import CpTextarea from './CpTextarea.vue'
|
|
48
48
|
import CpToast from './CpToast.vue'
|
|
49
49
|
import CpTooltip from './CpTooltip.vue'
|
|
50
|
+
import CpTransitionCounter from './CpTransitionCounter.vue'
|
|
50
51
|
import CpTransitionDialog from './CpTransitionDialog.vue'
|
|
52
|
+
import CpTransitionExpand from './CpTransitionExpand.vue'
|
|
53
|
+
import CpTransitionListItems from './CpTransitionListItems.vue'
|
|
54
|
+
import CpTransitionSize from './CpTransitionSize.vue'
|
|
55
|
+
import CpTransitionSlide from './CpTransitionSlide.vue'
|
|
56
|
+
import CpTransitionTabContent from './CpTransitionTabContent.vue'
|
|
51
57
|
import IconAirline from './icons/IconAirline.vue'
|
|
52
58
|
import IconCheckList from './icons/IconCheckList.vue'
|
|
53
59
|
import IconCollapse from './icons/IconCollapse.vue'
|
|
@@ -57,7 +63,6 @@ import IconOta from './icons/IconOta.vue'
|
|
|
57
63
|
import IconSupplier from './icons/IconSupplier.vue'
|
|
58
64
|
import IconThirdParty from './icons/IconThirdParty.vue'
|
|
59
65
|
import IconTooltip from './icons/IconTooltip.vue'
|
|
60
|
-
import TransitionExpand from './TransitionExpand.vue'
|
|
61
66
|
|
|
62
67
|
const Components = {
|
|
63
68
|
CpAccordion,
|
|
@@ -104,7 +109,12 @@ const Components = {
|
|
|
104
109
|
IconExpand,
|
|
105
110
|
IconCheckList,
|
|
106
111
|
CpTransitionDialog,
|
|
107
|
-
|
|
112
|
+
CpTransitionExpand,
|
|
113
|
+
CpTransitionSize,
|
|
114
|
+
CpTransitionCounter,
|
|
115
|
+
CpTransitionListItems,
|
|
116
|
+
CpTransitionSlide,
|
|
117
|
+
CpTransitionTabContent,
|
|
108
118
|
}
|
|
109
119
|
|
|
110
120
|
const Pimp = {
|