applyTransitionLeaveHooks,
} from './components/Transition'
-export type Block = (
- | Node
- | VaporFragment
- | DynamicFragment
- | VaporComponentInstance
- | Block[]
-) &
- TransitionBlock
+export interface TransitionOptions {
+ key?: any
+ $transition?: VaporTransitionHooks
+}
export interface VaporTransitionHooks extends TransitionHooks {
state: TransitionState
props: TransitionProps
}
-export type TransitionBlock = {
- key?: any
- $transition?: VaporTransitionHooks
-}
+export type TransitionBlock =
+ | (Node & TransitionOptions)
+ | (VaporFragment & TransitionOptions)
+ | (DynamicFragment & TransitionOptions)
+
+export type Block = TransitionBlock | VaporComponentInstance | Block[]
export type BlockFn = (...args: any[]) => Block
-export class VaporFragment {
+export class VaporFragment implements TransitionOptions {
+ key?: any
+ $transition?: VaporTransitionHooks | undefined
nodes: Block
anchor?: Node
insert?: (parent: ParentNode, anchor: Node | null) => void
remove?: (parent?: ParentNode) => void
- $transition?: VaporTransitionHooks | undefined
constructor(nodes: Block) {
this.nodes = nodes
pauseTracking()
const parent = this.anchor.parentNode
-
const transition = this.$transition
const renderBranch = () => {
if (render) {
anchor = anchor === 0 ? parent.firstChild : anchor
if (block instanceof Node) {
// don't apply transition on text or comment nodes
- if (block.$transition && block instanceof Element) {
+ if ((block as TransitionBlock).$transition && block instanceof Element) {
performTransitionEnter(
block,
- // @ts-expect-error
- block.$transition,
+ (block as TransitionBlock).$transition as TransitionHooks,
() => parent.insertBefore(block, anchor),
parentSuspense,
)
export function remove(block: Block, parent?: ParentNode): void {
if (block instanceof Node) {
- if (block.$transition && block instanceof Element) {
+ if ((block as TransitionBlock).$transition && block instanceof Element) {
performTransitionLeave(
block,
- // @ts-expect-error
- block.$transition,
+ (block as TransitionBlock).$transition as TransitionHooks,
() => parent && parent.removeChild(block),
)
} else {
useTransitionState,
warn,
} from '@vue/runtime-dom'
-import { type Block, type VaporTransitionHooks, isFragment } from '../block'
+import {
+ type Block,
+ type TransitionBlock,
+ type VaporTransitionHooks,
+ isFragment,
+} from '../block'
import { isVaporComponent } from '../component'
export const vaporTransitionImpl: VaporTransitionInterface = {
}
function resolveTransitionHooks(
- block: Block,
+ block: TransitionBlock,
props: TransitionProps,
state: TransitionState,
instance: GenericComponentInstance,
return hooks
}
-function setTransitionHooks(block: Block, hooks: VaporTransitionHooks) {
+function setTransitionHooks(
+ block: TransitionBlock,
+ hooks: VaporTransitionHooks,
+) {
if (!isFragment(block)) {
block.$transition = hooks
}
}
}
-const transitionChildCache = new WeakMap<Block, Block>()
-export function findElementChild(block: Block): Block | undefined {
+const transitionChildCache = new WeakMap<Block, TransitionBlock>()
+export function findElementChild(block: Block): TransitionBlock | undefined {
if (transitionChildCache.has(block)) {
return transitionChildCache.get(block)
}
- let child: Block | undefined
+ let child: TransitionBlock | undefined
if (block instanceof Node) {
// transition can only be applied on Element child
if (block instanceof Element) child = block
} else if (isVaporComponent(block)) {
child = findElementChild(block.block)
} else if (Array.isArray(block)) {
- child = block[0]
+ child = block[0] as TransitionBlock
let hasFound = false
for (const c of block) {
const item = findElementChild(c)
if (!__DEV__) break
}
}
- } else {
- // fragment
+ } else if (isFragment(block)) {
child = findElementChild(block.nodes)
}
} from '@vue/runtime-dom'
import { renderEffect } from '../renderEffect'
import { isVaporComponent } from '../component'
-import { type Block, DynamicFragment } from '../block'
+import { type Block, DynamicFragment, type TransitionBlock } from '../block'
import { isArray } from '@vue/shared'
export function applyVShow(target: Block, source: () => any): void {
if (target instanceof DynamicFragment) {
return setDisplay(target.nodes, value)
}
- const { $transition } = target
+ const { $transition } = target as TransitionBlock
if (target instanceof Element) {
const el = target as VShowElement
if (!(vShowOriginalDisplay in el)) {