Skip to content
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

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

Draft
wants to merge 50 commits into
base: vapor
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 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
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,247 changes: 1,247 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