-import { resolveDynamicComponent } from '@vue/runtime-dom'
+import { currentInstance, resolveDynamicComponent } from '@vue/runtime-dom'
import { DynamicFragment, type VaporFragment } from './block'
-import { createComponentWithFallback } from './component'
+import { createComponentWithFallback, emptyContext } from './component'
import { renderEffect } from './renderEffect'
import type { RawProps } from './componentProps'
import type { RawSlots } from './componentSlots'
: new DynamicFragment()
renderEffect(() => {
const value = getter()
+ const appContext =
+ (currentInstance && currentInstance.appContext) || emptyContext
frag.update(
() =>
createComponentWithFallback(
rawProps,
rawSlots,
isSingleRoot,
+ appContext,
),
value,
)
$transition?: VaporTransitionHooks | undefined
nodes: Block
anchor?: Node
- insert?: (parent: ParentNode, anchor: Node | null) => void
- remove?: (parent?: ParentNode) => void
+ insert?: (
+ parent: ParentNode,
+ anchor: Node | null,
+ transitionHooks?: TransitionHooks,
+ ) => void
+ remove?: (parent?: ParentNode, transitionHooks?: TransitionHooks) => void
constructor(nodes: Block) {
this.nodes = nodes
} else {
// fragment
if (block.insert) {
- block.insert(parent, anchor)
+ block.insert(parent, anchor, (block as TransitionBlock).$transition)
} else {
insert(block.nodes, parent, anchor, parentSuspense)
}
} else {
// fragment
if (block.remove) {
- block.remove(parent)
+ block.remove(parent, (block as TransitionBlock).$transition)
} else {
remove(block.nodes, parent)
}
) || []
}
-const emptyContext: GenericAppContext = {
+export const emptyContext: GenericAppContext = {
app: null as any,
config: {},
provides: /*@__PURE__*/ Object.create(null),
rawProps?: LooseRawProps | null,
rawSlots?: LooseRawSlots | null,
isSingleRoot?: boolean,
+ appContext?: GenericAppContext,
): HTMLElement | VaporComponentInstance {
if (!isString(comp)) {
- return createComponent(comp, rawProps, rawSlots, isSingleRoot)
+ return createComponent(comp, rawProps, rawSlots, isSingleRoot, appContext)
}
const el = document.createElement(comp)
}
}
} else if (isFragment(block)) {
- child = findTransitionBlock(block.nodes)
+ if (block.insert) {
+ child = block
+ } else {
+ child = findTransitionBlock(block.nodes)
+ }
}
if (__DEV__ && !child) {
type RendererInternals,
type ShallowRef,
type Slots,
+ type TransitionHooks,
type VNode,
type VaporInteropInterface,
createVNode,
ensureRenderer,
onScopeDispose,
renderSlot,
+ setTransitionHooks,
shallowRef,
simpleSetCurrentInstance,
} from '@vue/runtime-dom'
let isMounted = false
const parentInstance = currentInstance as VaporComponentInstance
- const unmount = (parentNode?: ParentNode) => {
+ const unmount = (parentNode?: ParentNode, transition?: TransitionHooks) => {
+ if (transition) setTransitionHooks(vnode, transition)
internals.umt(vnode.component!, null, !!parentNode)
}
- frag.insert = (parentNode, anchor) => {
+ frag.insert = (parentNode, anchor, transition) => {
const prev = currentInstance
simpleSetCurrentInstance(parentInstance)
if (!isMounted) {
+ if (transition) setTransitionHooks(vnode, transition)
internals.mt(
vnode,
parentNode,