Skip to content

feat(vapor): vapor transition + transition-group #12962

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 66 commits into
base: minor
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
66 commits
Select commit Hold shift + click to select a range
41822e3
feat(vapor): vapor transition
edison1105 Feb 27, 2025
7cee024
wip: handle mode
edison1105 Feb 27, 2025
a8140ac
refactor: reuse code from BaseTransition
edison1105 Feb 28, 2025
8957eaa
wip: handle in-out mode
edison1105 Feb 28, 2025
413651d
wip: save
edison1105 Mar 3, 2025
1e79054
wip: save
edison1105 Mar 3, 2025
75de3bb
wip: save
edison1105 Mar 4, 2025
3a31f08
wip: auto generate key for vif branch if it wraps in transition
edison1105 Mar 4, 2025
7e593c2
wip: handle built-in components
edison1105 Mar 4, 2025
11bcb21
wip: handle keyed element transition
edison1105 Mar 4, 2025
90dc4e2
wip: refactor
edison1105 Mar 5, 2025
3fcba1d
wip: improve types
edison1105 Mar 5, 2025
5dce316
wip: inject useVaporTransition call for treeshaking
edison1105 Mar 5, 2025
b92ea0a
wip: save
edison1105 Mar 5, 2025
e3f8ba4
wip: save
edison1105 Mar 5, 2025
14f102a
Merge branch 'vapor' into edison/feat/vaporTransition
edison1105 Mar 5, 2025
7c68b48
wip: vdom interop
edison1105 Mar 5, 2025
2e45f06
wip: refactor
edison1105 Mar 5, 2025
6b9e9ce
wip: refactor
edison1105 Mar 5, 2025
d0faf6c
wip: vdom interop
edison1105 Mar 5, 2025
31d9247
wip: vapor interop
edison1105 Mar 6, 2025
3cb3e1a
wip: revert some changes
edison1105 Mar 6, 2025
41c2589
wip: add tests
edison1105 Mar 6, 2025
b65db59
wip: add vapor transition e2e tests
edison1105 Mar 6, 2025
0f3dffc
[autofix.ci] apply automated fixes
autofix-ci[bot] Mar 6, 2025
205858e
wip: test
edison1105 Mar 6, 2025
0d950d4
wip: save
edison1105 Mar 6, 2025
299624d
wip: fix tests
edison1105 Mar 6, 2025
8879875
wip: fix tests
edison1105 Mar 6, 2025
6e7c5e3
wip: fix tests
edison1105 Mar 7, 2025
26d1d21
wip: add tests
edison1105 Mar 7, 2025
d5d8ada
[autofix.ci] apply automated fixes
autofix-ci[bot] Mar 7, 2025
d184928
wip: add interop tests
edison1105 Mar 7, 2025
915e205
wip: refactor
edison1105 Mar 7, 2025
9ffa5ac
wip: fix build-dts error
edison1105 Mar 7, 2025
05d9f53
wip: rename key to $key
edison1105 Mar 7, 2025
1511d6c
wip: add TransformTransition
edison1105 Mar 7, 2025
d9d0112
fix: vapor transition multiple chilren check
edison1105 Mar 8, 2025
7c9bd7c
Merge branch 'vapor' into edison/feat/vaporTransition
edison1105 Mar 8, 2025
5392c7a
chore: improve
edison1105 Mar 9, 2025
2e71c9e
feat(vapor): vapor TransitionGroup (#13019)
edison1105 Mar 11, 2025
dbecdf9
wip: save
edison1105 Mar 12, 2025
957aa09
chore: update
edison1105 Mar 12, 2025
4ad3ee9
chore: rename
edison1105 Mar 12, 2025
e7300a0
chore: update
edison1105 Mar 12, 2025
af2eb2d
wip: port tests and fix bugs
edison1105 Mar 12, 2025
1540002
wip: handle props update
edison1105 Mar 13, 2025
055ca98
test: add more tests
edison1105 Mar 13, 2025
b1b11c7
wip: port tests and fix bugs
edison1105 Mar 13, 2025
d147b1c
test: add more tests
edison1105 Mar 13, 2025
d5bd63a
test: add more tests
edison1105 Mar 13, 2025
c9ee8d1
wip: handle fallthrough attrs
edison1105 Mar 13, 2025
ecef92b
wip: handle fallthrough attrs
edison1105 Mar 13, 2025
bbe4452
wip: add more tests
edison1105 Mar 14, 2025
9ee219a
test: add more tests
edison1105 Mar 14, 2025
2caeecd
wip: work with v-show appear
edison1105 Mar 14, 2025
acd2af2
wip: refactor
edison1105 Mar 16, 2025
f0ebb0b
chore: update export
edison1105 Mar 17, 2025
c7bd982
refactor: add createElement helper
edison1105 Mar 17, 2025
7a4a4c0
wip: update
edison1105 Mar 17, 2025
e42ff1b
chore: update
edison1105 Mar 17, 2025
d8ccabe
chore: update
edison1105 Mar 19, 2025
cb8830f
chore: reset prevChildren after updated
edison1105 Apr 10, 2025
542e401
fix: mark single root for transition block
edison1105 Jun 19, 2025
58ac955
chore: Merge branch 'vapor' into edison/feat/vaporTransition
edison1105 Jun 20, 2025
98e1dd1
chore: Merge branch 'minor' into edison/feat/vaporTransition
edison1105 Jul 15, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
406 changes: 406 additions & 0 deletions packages-private/vapor-e2e-test/__tests__/transition-group.spec.ts

Large diffs are not rendered by default.

1,660 changes: 1,660 additions & 0 deletions packages-private/vapor-e2e-test/__tests__/transition.spec.ts

Large diffs are not rendered by default.

185 changes: 180 additions & 5 deletions packages-private/vapor-e2e-test/__tests__/vdomInterop.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,23 @@ import {
} from '../../../packages/vue/__tests__/e2e/e2eUtils'
import connect from 'connect'
import sirv from 'sirv'
const {
page,
click,
text,
enterValue,
html,
transitionStart,
waitForElement,
nextFrame,
timeout,
} = setupPuppeteer()

describe('vdom / vapor interop', () => {
const { page, click, text, enterValue } = setupPuppeteer()
const duration = process.env.CI ? 200 : 50
const buffer = process.env.CI ? 50 : 20
const transitionFinish = (time = duration) => timeout(time + buffer)

describe('vdom / vapor interop', () => {
let server: any
const port = '8193'
beforeAll(() => {
Expand All @@ -22,12 +35,15 @@ describe('vdom / vapor interop', () => {
server.close()
})

beforeEach(async () => {
const baseUrl = `http://localhost:${port}/interop/`
await page().goto(baseUrl)
await page().waitForSelector('#app')
})

test(
'should work',
async () => {
const baseUrl = `http://localhost:${port}/interop/`
await page().goto(baseUrl)

expect(await text('.vapor > h2')).toContain('Vapor component in VDOM')

expect(await text('.vapor-prop')).toContain('hello')
Expand Down Expand Up @@ -81,4 +97,163 @@ describe('vdom / vapor interop', () => {
},
E2E_TIMEOUT,
)

describe('vdom transition', () => {
test(
'render vapor component',
async () => {
const btnSelector = '.trans-vapor > button'
const containerSelector = '.trans-vapor > div'

expect(await html(containerSelector)).toBe(`<div>vapor compA</div>`)

// comp leave
expect(
(await transitionStart(btnSelector, containerSelector)).innerHTML,
).toBe(
`<div class="v-leave-from v-leave-active">vapor compA</div><!---->`,
)

await nextFrame()
expect(await html(containerSelector)).toBe(
`<div class="v-leave-active v-leave-to">vapor compA</div><!---->`,
)

await transitionFinish()
expect(await html(containerSelector)).toBe(`<!---->`)

// comp enter
expect(
(await transitionStart(btnSelector, containerSelector)).innerHTML,
).toBe(`<div class="v-enter-from v-enter-active">vapor compA</div>`)

await nextFrame()
expect(await html(containerSelector)).toBe(
`<div class="v-enter-active v-enter-to">vapor compA</div>`,
)

await transitionFinish()
expect(await html(containerSelector)).toBe(
`<div class="">vapor compA</div>`,
)
},
E2E_TIMEOUT,
)

test(
'switch between vdom/vapor component (out-in mode)',
async () => {
const btnSelector = '.trans-vdom-vapor-out-in > button'
const containerSelector = '.trans-vdom-vapor-out-in > div'
const childSelector = `${containerSelector} > div`

expect(await html(containerSelector)).toBe(`<div>vdom comp</div>`)

// switch to vapor comp
// vdom comp leave
expect(
(await transitionStart(btnSelector, containerSelector)).innerHTML,
).toBe(
`<div class="fade-leave-from fade-leave-active">vdom comp</div><!---->`,
)

await nextFrame()
expect(await html(containerSelector)).toBe(
`<div class="fade-leave-active fade-leave-to">vdom comp</div><!---->`,
)

// vapor comp enter
await waitForElement(childSelector, 'vapor compA', [
'fade-enter-from',
'fade-enter-active',
])

await nextFrame()
expect(await html(containerSelector)).toBe(
`<div class="fade-enter-active fade-enter-to">vapor compA</div>`,
)

await transitionFinish()
expect(await html(containerSelector)).toBe(
`<div class="">vapor compA</div>`,
)

// switch to vdom comp
// vapor comp leave
expect(
(await transitionStart(btnSelector, containerSelector)).innerHTML,
).toBe(
`<div class="fade-leave-from fade-leave-active">vapor compA</div><!---->`,
)

await nextFrame()
expect(await html(containerSelector)).toBe(
`<div class="fade-leave-active fade-leave-to">vapor compA</div><!---->`,
)

// vdom comp enter
await waitForElement(childSelector, 'vdom comp', [
'fade-enter-from',
'fade-enter-active',
])

await nextFrame()
expect(await html(containerSelector)).toBe(
`<div class="fade-enter-active fade-enter-to">vdom comp</div>`,
)

await transitionFinish()
expect(await html(containerSelector)).toBe(
`<div class="">vdom comp</div>`,
)
},
E2E_TIMEOUT,
)
})

describe('vdom transition-group', () => {
test(
'render vapor component',
async () => {
const btnSelector = '.trans-group-vapor > button'
const containerSelector = '.trans-group-vapor > div'

expect(await html(containerSelector)).toBe(
`<div><div>a</div></div>` +
`<div><div>b</div></div>` +
`<div><div>c</div></div>`,
)

// insert
expect(
(await transitionStart(btnSelector, containerSelector)).innerHTML,
).toBe(
`<div><div>a</div></div>` +
`<div><div>b</div></div>` +
`<div><div>c</div></div>` +
`<div class="test-enter-from test-enter-active"><div>d</div></div>` +
`<div class="test-enter-from test-enter-active"><div>e</div></div>`,
)

await nextFrame()
expect(await html(containerSelector)).toBe(
`<div><div>a</div></div>` +
`<div><div>b</div></div>` +
`<div><div>c</div></div>` +
`<div class="test-enter-active test-enter-to"><div>d</div></div>` +
`<div class="test-enter-active test-enter-to"><div>e</div></div>`,
)

await transitionFinish()
expect(await html(containerSelector)).toBe(
`<div><div>a</div></div>` +
`<div><div>b</div></div>` +
`<div><div>c</div></div>` +
`<div class=""><div>d</div></div>` +
`<div class=""><div>e</div></div>`,
)
},
E2E_TIMEOUT,
)
})
})
9 changes: 9 additions & 0 deletions packages-private/vapor-e2e-test/index.html
Original file line number Diff line number Diff line change
@@ -1,2 +1,11 @@
<a href="/interop/">VDOM / Vapor interop</a>
<a href="/todomvc/">Vapor TodoMVC</a>
<a href="/transition/">Vapor Transition</a>
<a href="/transition-group/">Vapor TransitionGroup</a>

<style>
a {
display: block;
margin: 10px;
}
</style>
52 changes: 51 additions & 1 deletion packages-private/vapor-e2e-test/interop/App.vue
Original file line number Diff line number Diff line change
@@ -1,9 +1,22 @@
<script setup lang="ts">
import { ref } from 'vue'
import { ref, shallowRef } from 'vue'
import VaporComp from './VaporComp.vue'
import VaporCompA from '../transition/components/VaporCompA.vue'
import VdomComp from '../transition/components/VdomComp.vue'
import VaporSlot from '../transition/components/VaporSlot.vue'

const msg = ref('hello')
const passSlot = ref(true)

const toggleVapor = ref(true)
const interopComponent = shallowRef(VdomComp)
function toggleInteropComponent() {
interopComponent.value =
interopComponent.value === VaporCompA ? VdomComp : VaporCompA
}

const items = ref(['a', 'b', 'c'])
const enterClick = () => items.value.push('d', 'e')
</script>

<template>
Expand All @@ -19,4 +32,41 @@ const passSlot = ref(true)

<template #test v-if="passSlot">A test slot</template>
</VaporComp>

<!-- transition interop -->
<div>
<div class="trans-vapor">
<button @click="toggleVapor = !toggleVapor">
toggle vapor component
</button>
<div>
<Transition>
<VaporCompA v-if="toggleVapor" />
</Transition>
</div>
</div>
<div class="trans-vdom-vapor-out-in">
<button @click="toggleInteropComponent">
switch between vdom/vapor component out-in mode
</button>
<div>
<Transition name="fade" mode="out-in">
<component :is="interopComponent"></component>
</Transition>
</div>
</div>
</div>
<!-- transition-group interop -->
<div>
<div class="trans-group-vapor">
<button @click="enterClick">insert items</button>
<div>
<transition-group name="test">
<VaporSlot v-for="item in items" :key="item">
<div>{{ item }}</div>
</VaporSlot>
</transition-group>
</div>
</div>
</div>
</template>
1 change: 1 addition & 0 deletions packages-private/vapor-e2e-test/interop/main.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { createApp, vaporInteropPlugin } from 'vue'
import App from './App.vue'
import '../transition/style.css'

createApp(App).use(vaporInteropPlugin).mount('#app')
Loading
Loading