@bgub/fig-reconciler 0.0.1 → 0.1.0-alpha.1
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/act.d.ts +4 -0
- package/dist/act.js +2 -0
- package/dist/commit-coordinator.d.ts +21 -0
- package/dist/commit-coordinator.js +1 -0
- package/dist/devtools.d.ts +3 -4
- package/dist/devtools.js +1 -22
- package/dist/fiber-traversal-BHyIAyG9.js +251 -0
- package/dist/fiber-traversal-BHyIAyG9.js.map +1 -0
- package/dist/index.d.ts +20 -34
- package/dist/index.js +296 -863
- package/dist/index.js.map +1 -1
- package/dist/refresh.js.map +1 -1
- package/dist/scheduler-WVeIVb_n.js +209 -0
- package/dist/scheduler-WVeIVb_n.js.map +1 -0
- package/dist/view-transitions.d.ts +31 -0
- package/dist/view-transitions.js +404 -0
- package/dist/view-transitions.js.map +1 -0
- package/package.json +18 -3
- package/dist/devtools.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view-transitions.js","names":[],"sources":["../src/transition-types.ts","../src/view-transitions.ts"],"sourcesContent":["import {\n includesSomeLane,\n laneToIndex,\n transitionTypeHooks,\n type Lane,\n type Lanes,\n} from \"./lanes.ts\";\n\ninterface ActiveTransition {\n scopes: number;\n types: Set<string>;\n}\n\nconst activeTransitions: Array<ActiveTransition | null> = [];\nconst rootTransitionTypes = new WeakMap<object, Map<Lane, Set<string>>>();\n\nexport function getCurrentTransitionTypes(\n lane: Lane,\n): ReadonlySet<string> | null {\n const transition = activeTransitions[laneToIndex(lane)];\n return transition === undefined ||\n transition === null ||\n transition.types.size === 0\n ? null\n : transition.types;\n}\n\nexport function getRootTransitionTypes(\n root: object,\n renderLanes: Lanes,\n): string[] {\n const types = new Set<string>();\n const typesByLane = rootTransitionTypes.get(root);\n if (typesByLane === undefined) return [];\n\n for (const [lane, laneTypes] of typesByLane) {\n if (!includesSomeLane(renderLanes, lane)) continue;\n for (const type of laneTypes) types.add(type);\n }\n return [...types];\n}\n\nfunction retainTransitionTypes(\n lane: Lane,\n types: readonly string[] | undefined,\n): () => void {\n const index = laneToIndex(lane);\n let transition = activeTransitions[index];\n if (transition === undefined || transition === null) {\n transition = { scopes: 0, types: new Set() };\n activeTransitions[index] = transition;\n }\n transition.scopes += 1;\n\n if (types !== undefined) {\n for (const type of types) transition.types.add(type);\n }\n\n return () => {\n transition.scopes -= 1;\n if (transition.scopes === 0) activeTransitions[index] = null;\n };\n}\n\nfunction recordRootTransitionTypes(root: object, lane: Lane): void {\n const types = getCurrentTransitionTypes(lane);\n if (types === null) return;\n\n let typesByLane = rootTransitionTypes.get(root);\n if (typesByLane === undefined) {\n typesByLane = new Map();\n rootTransitionTypes.set(root, typesByLane);\n }\n let pendingTypes = typesByLane.get(lane);\n if (pendingTypes === undefined) {\n pendingTypes = new Set();\n typesByLane.set(lane, pendingTypes);\n }\n for (const type of types) pendingTypes.add(type);\n}\n\nfunction completeRootTransitionTypes(\n root: object,\n remainingLanes: Lanes,\n): void {\n const typesByLane = rootTransitionTypes.get(root);\n if (typesByLane === undefined) return;\n\n for (const lane of typesByLane.keys()) {\n if (!includesSomeLane(remainingLanes, lane)) typesByLane.delete(lane);\n }\n if (typesByLane.size === 0) rootTransitionTypes.delete(root);\n}\n\ntransitionTypeHooks.retain = retainTransitionTypes;\ntransitionTypeHooks.record = recordRootTransitionTypes;\ntransitionTypeHooks.complete = completeRootTransitionTypes;\n","import type {\n Props,\n ViewTransitionCallback,\n ViewTransitionClass,\n ViewTransitionEvent,\n ViewTransitionPhase,\n ViewTransitionProps,\n ViewTransitionSurface as PublicViewTransitionSurface,\n} from \"@bgub/fig\";\nimport type {\n ReconcilerCommitResult,\n ReconcilerCommitCoordinator,\n} from \"./commit-coordinator.ts\";\nimport {\n ActivityTag,\n HostTag,\n PortalTag,\n ViewTransitionTag,\n} from \"./fiber-tags.ts\";\nimport { walkFiberForest, walkFiberSubtree } from \"./fiber-traversal.ts\";\nimport {\n AdoptedFlag,\n DeletionFlag,\n HoistedStaticFlag,\n HostUpdateMask,\n HydrationFlag,\n MutationMask,\n PlacementFlag,\n ViewTransitionStaticFlag,\n} from \"./fiber-work.ts\";\nimport {\n AllTransitionLanes,\n DeferredLane,\n IdleLane,\n NoLanes,\n RetryLanes,\n} from \"./lanes.ts\";\nimport type {\n ViewTransitionPlannerFiber as PlannerFiber,\n ViewTransitionPlannerRoot as PlannerRoot,\n ViewTransitionPlannerState as ViewTransitionState,\n} from \"./view-transition-planner-types.ts\";\nimport { getRootTransitionTypes } from \"./transition-types.ts\";\ndeclare const __FIG_DEV__: boolean | undefined;\n\nconst __DEV__ = typeof __FIG_DEV__ === \"boolean\" ? __FIG_DEV__ : false;\n\nexport type ViewTransitionCommitResult = ReconcilerCommitResult;\n\nexport interface ViewTransitionSurfaceMeasurement {\n // Width/height changes of statically positioned surfaces relayout their\n // parent; absolutely positioned ones do not.\n absolutelyPositioned: boolean;\n height: number;\n inViewport: boolean;\n width: number;\n x: number;\n y: number;\n}\n\nexport interface ViewTransitionMutationResult {\n canceledNames: string[];\n cancelRootSnapshot: boolean;\n}\n\nexport interface ViewTransitionSurfaceSnapshots {\n readonly old: boolean;\n readonly new: boolean;\n}\n\nexport interface ViewTransitionHostConfig<Container, Instance> {\n commit(\n this: void,\n container: Container,\n types: readonly string[],\n prepareSnapshot: () => void,\n mutate: () => ViewTransitionMutationResult,\n ready: (active: boolean) => void,\n finished: () => void,\n ): ViewTransitionCommitResult;\n apply(\n this: void,\n instance: Instance,\n name: string,\n className: string | null,\n ): void;\n restore(this: void, instance: Instance, props: Props): void;\n measure?(\n this: void,\n instance: Instance,\n ): ViewTransitionSurfaceMeasurement | null;\n createSurface?(\n this: void,\n instance: Instance,\n name: string,\n snapshots: ViewTransitionSurfaceSnapshots,\n ): PublicViewTransitionSurface;\n suspend?(this: void, container: Container, onFinished: () => void): boolean;\n}\n\ninterface ViewTransitionSurface<Instance> {\n boundary: PlannerFiber;\n className: string | null;\n instance: Instance;\n measurement: ViewTransitionSurfaceMeasurement | null;\n mustAnimate: boolean;\n name: string;\n phase: ViewTransitionPhase;\n props: Props;\n skipped: boolean;\n}\n\ninterface ViewTransitionPlan<Instance> {\n newSurfaces: ViewTransitionSurface<Instance>[];\n oldSurfaces: ViewTransitionSurface<Instance>[];\n rootAffected: boolean;\n types: string[];\n}\n\ninterface ViewTransitionCollection<Instance> {\n changedBoundaries: Set<PlannerFiber> | null;\n exitsByName: Map<string, PlannerFiber>;\n plan: ViewTransitionPlan<Instance>;\n}\n\nconst ViewTransitionEligibleLanes =\n AllTransitionLanes | RetryLanes | DeferredLane | IdleLane;\n\nexport function createViewTransitionCommitCoordinator<Container, Instance>(\n host: ViewTransitionHostConfig<Container, Instance>,\n): ReconcilerCommitCoordinator<Container, Instance> {\n let autoNameCounter = 0;\n\n function isEligible(root: PlannerRoot<Container>): boolean {\n return (\n !root.clearContainerBeforeCommit &&\n root.renderLanes !== NoLanes &&\n (root.renderLanes & ~ViewTransitionEligibleLanes) === NoLanes\n );\n }\n\n function preparePlan(\n root: PlannerRoot<Container>,\n finishedWork: PlannerFiber,\n ): ViewTransitionPlan<Instance> | null {\n if (!isEligible(root)) return null;\n if (\n (finishedWork.subtreeFlags & ViewTransitionStaticFlag) === 0 &&\n !root.needsCommitDeletions\n ) {\n return null;\n }\n const plan: ViewTransitionPlan<Instance> = {\n newSurfaces: [],\n oldSurfaces: [],\n rootAffected: false,\n types: getRootTransitionTypes(root, root.renderLanes),\n };\n const collection: ViewTransitionCollection<Instance> = {\n changedBoundaries: null,\n exitsByName: new Map(),\n plan,\n };\n\n if (root.needsCommitDeletions) {\n collectDeletedViewTransitions(root, finishedWork, collection);\n }\n collection.changedBoundaries = attributeQueuedHostUpdates(root, plan);\n collectFinishedViewTransitions(\n finishedWork.child,\n false,\n false,\n false,\n collection,\n );\n if (__DEV__ && !plan.rootAffected && devFlagRootAffected(finishedWork)) {\n throw new Error(\n \"Fig internal parity error: commit-queue attribution missed a \" +\n \"mutation outside view-transition boundaries (rootAffected).\",\n );\n }\n\n if (plan.oldSurfaces.length === 0 && plan.newSurfaces.length === 0) {\n return null;\n }\n\n if (__DEV__) warnOnDuplicateViewTransitionNames(plan);\n return plan;\n }\n\n function warnOnDuplicateViewTransitionNames(\n plan: ViewTransitionPlan<Instance>,\n ): void {\n for (const surfaces of [plan.oldSurfaces, plan.newSurfaces]) {\n const owners = new Map<string, PlannerFiber>();\n for (const surface of surfaces) {\n const owner = owners.get(surface.name);\n if (owner !== undefined && owner !== surface.boundary) {\n console.error(\n `Multiple <ViewTransition> boundaries resolved to the name ` +\n `\"${surface.name}\" in one commit. The browser skips the ` +\n \"entire transition when a view-transition-name is duplicated; \" +\n \"give each simultaneously mounted boundary a distinct name.\",\n );\n }\n owners.set(surface.name, surface.boundary);\n }\n }\n }\n\n function collectDeletedViewTransitions(\n root: PlannerRoot<Container>,\n node: PlannerFiber,\n collection: ViewTransitionCollection<Instance>,\n ): void {\n let collected = 0;\n for (const cursor of root.commitIndex) {\n if (cursor.deletions === null) continue;\n if (__DEV__) collected += 1;\n for (const deletion of cursor.deletions) {\n collectDeletedViewTransitionFiber(deletion, collection, true);\n }\n }\n\n if (__DEV__) {\n let expected = 0;\n walkFiberSubtree(node, (cursor) => {\n if (cursor.deletions !== null) expected += 1;\n return (cursor.subtreeFlags & DeletionFlag) !== 0;\n });\n if (collected !== expected) {\n throw new Error(\n \"Fig internal parity error: the commit index collected deleted \" +\n `view transitions from ${collected} fiber(s) where the tree ` +\n `walk found ${expected}.`,\n );\n }\n }\n }\n\n function collectDeletedViewTransitionFiber(\n cursor: PlannerFiber,\n collection: ViewTransitionCollection<Instance>,\n collectExit: boolean,\n ): void {\n if (cursor.tag === PortalTag || isHiddenBoundary(cursor)) return;\n\n if (cursor.tag === ViewTransitionTag) {\n const name = explicitViewTransitionName(cursor);\n if (name !== null) collection.exitsByName.set(name, cursor);\n if (collectExit) {\n collectViewTransitionSurfaces(\n cursor,\n \"exit\",\n collection.plan.oldSurfaces,\n \"committed\",\n );\n }\n for (let child = cursor.child; child !== null; child = child.sibling) {\n collectDeletedViewTransitionFiber(child, collection, false);\n }\n return;\n }\n\n if ((cursor.subtreeFlags & ViewTransitionStaticFlag) === 0) return;\n for (let child = cursor.child; child !== null; child = child.sibling) {\n collectDeletedViewTransitionFiber(child, collection, collectExit);\n }\n }\n\n function attributeQueuedHostUpdates(\n root: PlannerRoot<Container>,\n plan: ViewTransitionPlan<Instance>,\n ): Set<PlannerFiber> | null {\n let changed: Set<PlannerFiber> | null = null;\n\n for (const entry of root.commitIndex) {\n if ((entry.flags & HostUpdateMask) === 0) continue;\n let sawPortal = false;\n let boundary: PlannerFiber | null = null;\n for (let parent = entry.return; parent !== null; parent = parent.return) {\n if (parent.tag === ViewTransitionTag) {\n boundary = parent;\n break;\n }\n if (parent.tag === PortalTag) sawPortal = true;\n }\n if (boundary === null) {\n plan.rootAffected = true;\n } else if (!sawPortal) {\n (changed ??= new Set()).add(boundary);\n }\n }\n\n return changed;\n }\n\n function devFlagRootAffected(node: PlannerFiber): boolean {\n let affected = false;\n walkFiberSubtree(node, (cursor) => {\n if (cursor === node) return true;\n const containsViewTransition =\n cursor.tag === ViewTransitionTag ||\n (cursor.subtreeFlags & ViewTransitionStaticFlag) !== 0;\n if (!containsViewTransition) {\n if (devSubtreeHasMutations(cursor)) affected = true;\n return false;\n }\n if (isStablyHiddenBoundary(cursor)) return false;\n if (cursor.tag === ViewTransitionTag) return false;\n if (cursor.tag === PortalTag) return false;\n if ((cursor.flags & (MutationMask | DeletionFlag)) !== 0) affected = true;\n return true;\n });\n return affected;\n }\n\n function devSubtreeHasMutations(node: PlannerFiber): boolean {\n let found = false;\n walkFiberSubtree(node, (cursor) => {\n if ((cursor.flags & (MutationMask | DeletionFlag)) !== 0) found = true;\n return !found;\n });\n return found;\n }\n\n function collectFinishedViewTransitions(\n node: PlannerFiber | null,\n placed: boolean,\n insideBoundary: boolean,\n ancestorLayoutChanged: boolean,\n collection: ViewTransitionCollection<Instance>,\n ): void {\n const { changedBoundaries, exitsByName, plan } = collection;\n let layoutChanged = ancestorLayoutChanged;\n for (\n let cursor = node;\n !layoutChanged && cursor !== null;\n cursor = cursor.sibling\n ) {\n if (\n (cursor.flags & PlacementFlag) !== 0 &&\n (cursor.alternate !== null || (cursor.flags & AdoptedFlag) !== 0)\n ) {\n layoutChanged = true;\n }\n }\n\n for (let cursor = node; cursor !== null; cursor = cursor.sibling) {\n const cursorPlaced = placed || (cursor.flags & PlacementFlag) !== 0;\n const containsViewTransition =\n cursor.tag === ViewTransitionTag ||\n (cursor.subtreeFlags & ViewTransitionStaticFlag) !== 0;\n\n if (!containsViewTransition) {\n if (\n !insideBoundary &&\n ((cursor.flags | cursor.subtreeFlags) &\n (MutationMask | DeletionFlag)) !==\n 0\n ) {\n plan.rootAffected = true;\n }\n continue;\n }\n if (isStablyHiddenBoundary(cursor)) continue;\n\n if (cursor.tag === ViewTransitionTag) {\n if (\n !cursorPlaced &&\n ((cursor.flags | cursor.subtreeFlags) & HydrationFlag) !== 0\n ) {\n continue;\n }\n if (cursorPlaced) {\n const name = viewTransitionName(cursor);\n const pairedExit = exitsByName.get(name);\n if (pairedExit !== undefined) {\n if (!insideBoundary) plan.rootAffected = true;\n collectViewTransitionPair(plan, pairedExit, cursor);\n exitsByName.delete(name);\n } else if (cursor.alternate !== null) {\n collectViewTransitionSurfaces(\n cursor.alternate,\n \"update\",\n plan.oldSurfaces,\n \"committed\",\n false,\n );\n collectViewTransitionSurfaces(\n cursor,\n \"update\",\n plan.newSurfaces,\n \"finished\",\n false,\n );\n } else {\n if (!insideBoundary) plan.rootAffected = true;\n collectViewTransitionSurfaces(\n cursor,\n \"enter\",\n plan.newSurfaces,\n \"finished\",\n );\n }\n collectAppearingPairViewTransitions(cursor.child, collection);\n continue;\n }\n\n const current = cursor.alternate ?? cursor;\n const contentChanged = viewTransitionChangedOutsideNested(\n cursor,\n changedBoundaries,\n );\n if (__DEV__) {\n const expected = devViewTransitionChangedOutsideNested(cursor);\n if (contentChanged !== expected) {\n throw new Error(\n \"Fig internal parity error: commit-queue attribution \" +\n `classified a view-transition boundary as ${contentChanged ? \"changed\" : \"unchanged\"} ` +\n \"where own-fiber flags disagree.\",\n );\n }\n }\n if (contentChanged || layoutChanged) {\n collectViewTransitionSurfaces(\n current,\n \"update\",\n plan.oldSurfaces,\n \"committed\",\n contentChanged,\n );\n collectViewTransitionSurfaces(\n cursor,\n \"update\",\n plan.newSurfaces,\n \"finished\",\n contentChanged,\n );\n }\n collectFinishedViewTransitions(\n cursor.child,\n cursorPlaced,\n true,\n contentChanged || layoutChanged,\n collection,\n );\n continue;\n }\n\n if (cursor.tag !== PortalTag) {\n if (\n !insideBoundary &&\n (cursor.flags & (MutationMask | DeletionFlag)) !== 0\n ) {\n plan.rootAffected = true;\n }\n collectFinishedViewTransitions(\n cursor.child,\n cursorPlaced,\n insideBoundary,\n layoutChanged || (cursor.flags & (MutationMask | DeletionFlag)) !== 0,\n collection,\n );\n }\n }\n }\n\n function collectAppearingPairViewTransitions(\n node: PlannerFiber | null,\n collection: ViewTransitionCollection<Instance>,\n ): void {\n const { exitsByName, plan } = collection;\n if (exitsByName.size === 0) return;\n\n walkFiberForest(node, (cursor) => {\n if (exitsByName.size === 0) return false;\n if (cursor.tag === PortalTag || isStablyHiddenBoundary(cursor)) {\n return false;\n }\n\n if (cursor.tag === ViewTransitionTag) {\n const name = explicitViewTransitionName(cursor);\n if (name !== null) {\n const pairedExit = exitsByName.get(name);\n if (pairedExit !== undefined) {\n collectViewTransitionPair(plan, pairedExit, cursor);\n exitsByName.delete(name);\n }\n }\n }\n return true;\n });\n }\n\n function collectViewTransitionPair(\n plan: ViewTransitionPlan<Instance>,\n oldBoundary: PlannerFiber,\n newBoundary: PlannerFiber,\n ): void {\n removeViewTransitionSurfaces(plan.oldSurfaces, oldBoundary);\n collectViewTransitionSurfaces(\n oldBoundary,\n \"share\",\n plan.oldSurfaces,\n \"committed\",\n );\n collectViewTransitionSurfaces(\n newBoundary,\n \"share\",\n plan.newSurfaces,\n \"finished\",\n );\n }\n\n function isHiddenBoundary(node: PlannerFiber): boolean {\n return node.tag === ActivityTag && node.props.mode === \"hidden\";\n }\n\n function isStablyHiddenBoundary(node: PlannerFiber): boolean {\n if (!isHiddenBoundary(node)) return false;\n const current = node.alternate;\n return (\n current === null ||\n (current.memoizedProps ?? current.props).mode === \"hidden\"\n );\n }\n\n function viewTransitionChangedOutsideNested(\n boundary: PlannerFiber,\n changedBoundaries: Set<PlannerFiber> | null,\n ): boolean {\n if ((boundary.flags & (MutationMask | DeletionFlag)) !== 0) return true;\n if (changedBoundaries?.has(boundary) === true) return true;\n return subtreeChangedOutsideNested(boundary.child);\n }\n\n function devViewTransitionChangedOutsideNested(\n boundary: PlannerFiber,\n ): boolean {\n if ((boundary.flags & (MutationMask | DeletionFlag)) !== 0) return true;\n let changed = false;\n walkFiberForest(boundary.child, (cursor) => {\n if (changed || cursor.tag === PortalTag) return false;\n if (cursor.tag === ViewTransitionTag) return false;\n if ((cursor.flags & (MutationMask | DeletionFlag)) !== 0) changed = true;\n return !changed;\n });\n return changed;\n }\n\n function subtreeChangedOutsideNested(node: PlannerFiber | null): boolean {\n for (let cursor = node; cursor !== null; cursor = cursor.sibling) {\n if (cursor.tag === PortalTag || cursor.tag === ViewTransitionTag)\n continue;\n if ((cursor.flags & (MutationMask | DeletionFlag)) !== 0) return true;\n if ((cursor.subtreeFlags & (MutationMask | DeletionFlag)) === 0) continue;\n if (subtreeChangedOutsideNested(cursor.child)) return true;\n }\n return false;\n }\n\n function removeViewTransitionSurfaces(\n surfaces: ViewTransitionSurface<Instance>[],\n boundary: PlannerFiber,\n ): void {\n for (let index = surfaces.length - 1; index >= 0; index -= 1) {\n if (surfaces[index].boundary === boundary) surfaces.splice(index, 1);\n }\n }\n\n function collectViewTransitionSurfaces(\n boundary: PlannerFiber,\n phase: ViewTransitionPhase,\n surfaces: ViewTransitionSurface<Instance>[],\n propsSource: \"committed\" | \"finished\",\n mustAnimate = true,\n ): void {\n const className = viewTransitionClass(boundary.props, phase);\n if (className === \"none\") return;\n\n const name = viewTransitionName(boundary);\n let index = 0;\n\n walkFiberForest(boundary.child, (cursor) => {\n if (cursor.tag === PortalTag || cursor.tag === ViewTransitionTag) {\n return false;\n }\n if (cursor.tag !== HostTag) return true;\n if ((cursor.flags & HoistedStaticFlag) === 0) {\n surfaces.push({\n boundary,\n className,\n instance: cursor.stateNode as Instance,\n measurement: null,\n mustAnimate,\n name: index === 0 ? name : `${name}_${index}`,\n phase,\n props: viewTransitionSurfaceProps(cursor, propsSource),\n skipped: false,\n });\n index += 1;\n }\n return false;\n });\n }\n\n function viewTransitionSurfaceProps(\n node: PlannerFiber,\n source: \"committed\" | \"finished\",\n ): Props {\n if (source === \"committed\") {\n return node.committedProps ?? node.memoizedProps ?? node.props;\n }\n return node.memoizedProps ?? node.props;\n }\n\n function viewTransitionName(node: PlannerFiber): string {\n const props = node.props as ViewTransitionProps;\n if (props.name !== undefined && props.name !== \"auto\") return props.name;\n\n const state = node.stateNode as ViewTransitionState;\n state.autoName ??= `fig-vt-${autoNameCounter++}`;\n return state.autoName;\n }\n\n function explicitViewTransitionName(node: PlannerFiber): string | null {\n const name = (node.props as ViewTransitionProps).name;\n return name === undefined || name === \"auto\" ? null : name;\n }\n\n function viewTransitionClass(\n props: Props,\n phase: ViewTransitionPhase,\n ): ViewTransitionClass | null {\n const viewTransitionProps = props as ViewTransitionProps;\n const phaseClass = viewTransitionProps[phase];\n const className =\n phaseClass === undefined ? viewTransitionProps.default : phaseClass;\n\n return className === undefined || className === \"auto\" ? null : className;\n }\n\n function applyOldViewTransitionSurfaces(\n plan: ViewTransitionPlan<Instance>,\n ): void {\n const measure = host.measure;\n\n for (const surface of plan.oldSurfaces) {\n surface.measurement = measure?.(surface.instance) ?? null;\n if (\n surface.phase === \"exit\" &&\n surface.measurement !== null &&\n !surface.measurement.inViewport\n ) {\n surface.skipped = true;\n continue;\n }\n host.apply(surface.instance, surface.name, surface.className);\n }\n }\n\n function resolveViewTransitionPlan(\n plan: ViewTransitionPlan<Instance>,\n ): ViewTransitionMutationResult {\n const result: ViewTransitionMutationResult = {\n canceledNames: [],\n cancelRootSnapshot: false,\n };\n const measure = host.measure;\n\n const oldByName = new Map<string, ViewTransitionSurface<Instance>>();\n for (const surface of plan.oldSurfaces) {\n if (!surface.skipped) oldByName.set(surface.name, surface);\n }\n\n let rootAffected = plan.rootAffected;\n const newNames = new Set<string>();\n\n for (const surface of plan.newSurfaces) {\n newNames.add(surface.name);\n const measurement = measure?.(surface.instance) ?? null;\n\n if (surface.phase === \"enter\") {\n if (measurement !== null && !measurement.inViewport) {\n surface.skipped = true;\n continue;\n }\n host.apply(surface.instance, surface.name, surface.className);\n continue;\n }\n\n if (surface.phase === \"update\") {\n const oldSurface = oldByName.get(surface.name);\n const before = oldSurface?.measurement ?? null;\n if (before !== null && measurement !== null) {\n const moved =\n before.x !== measurement.x ||\n before.y !== measurement.y ||\n before.width !== measurement.width ||\n before.height !== measurement.height;\n const offscreen = !before.inViewport && !measurement.inViewport;\n\n if (offscreen || (!surface.mustAnimate && !moved)) {\n surface.skipped = true;\n host.restore(surface.instance, surface.props);\n if (oldSurface !== undefined) {\n oldSurface.skipped = true;\n result.canceledNames.push(surface.name);\n }\n continue;\n }\n if (\n (before.width !== measurement.width ||\n before.height !== measurement.height) &&\n !measurement.absolutelyPositioned\n ) {\n rootAffected = true;\n }\n }\n }\n\n host.apply(surface.instance, surface.name, surface.className);\n }\n\n for (const [name, surface] of oldByName) {\n if (surface.phase === \"update\" && !newNames.has(name)) {\n rootAffected = true;\n }\n }\n\n result.cancelRootSnapshot = !rootAffected;\n return result;\n }\n\n function restoreViewTransitionSurfaces(\n plan: ViewTransitionPlan<Instance>,\n ): void {\n const propsByInstance = new Map<Instance, Props>();\n for (const surface of plan.oldSurfaces) {\n propsByInstance.set(surface.instance, surface.props);\n }\n for (const surface of plan.newSurfaces) {\n propsByInstance.set(surface.instance, surface.props);\n }\n\n for (const [instance, props] of propsByInstance) {\n host.restore(instance, props);\n }\n }\n\n function participatingSurfaceNames(\n surfaces: ViewTransitionSurface<Instance>[],\n ): Set<string> {\n const names = new Set<string>();\n for (const surface of surfaces) {\n if (!surface.skipped) names.add(surface.name);\n }\n return names;\n }\n\n function dispatchViewTransitionCallbacks(\n plan: ViewTransitionPlan<Instance>,\n signal: AbortSignal,\n ): void {\n const groups = new Map<\n PlannerFiber,\n {\n callback: ViewTransitionCallback;\n surfaces: ViewTransitionSurface<Instance>[];\n }\n >();\n const collect = (surface: ViewTransitionSurface<Instance>): void => {\n if (surface.skipped) return;\n const callback = (surface.boundary.props as ViewTransitionProps)\n .onTransition;\n if (callback === undefined) return;\n const group = groups.get(surface.boundary);\n if (group === undefined) {\n groups.set(surface.boundary, { callback, surfaces: [surface] });\n } else {\n group.surfaces.push(surface);\n }\n };\n\n // New surfaces own enter, update, and share callbacks. Exit has no new\n // side, so its committed boundary owns the callback instead.\n for (const surface of plan.newSurfaces) collect(surface);\n for (const surface of plan.oldSurfaces) {\n if (surface.phase === \"exit\") collect(surface);\n }\n if (groups.size === 0) return;\n\n const oldNames = participatingSurfaceNames(plan.oldSurfaces);\n const newNames = participatingSurfaceNames(plan.newSurfaces);\n for (const { callback, surfaces: group } of groups.values()) {\n const surfaces = group.map((surface) => {\n const snapshots: ViewTransitionSurfaceSnapshots = {\n old: oldNames.has(surface.name),\n new: newNames.has(surface.name),\n };\n return (\n host.createSurface?.(surface.instance, surface.name, snapshots) ?? {\n name: surface.name,\n }\n );\n });\n const event: ViewTransitionEvent = {\n phase: group[0].phase,\n surfaces,\n types: plan.types,\n };\n callback(event, signal);\n }\n }\n\n return {\n name: \"view-transitions\",\n viewTransitions: true,\n suspend(rootIdentity, onReady) {\n const root = rootIdentity as PlannerRoot<Container>;\n return (\n isEligible(root) && host.suspend?.(root.container, onReady) === true\n );\n },\n commit(context) {\n const root = context.root as PlannerRoot<Container>;\n const finishedWork = context.finishedWork as PlannerFiber;\n const plan = preparePlan(root, finishedWork);\n if (plan === null) return false;\n let didRunMutation = false;\n let didFinish = false;\n let controller: AbortController | null = null;\n\n return host.commit(\n context.container,\n plan.types,\n () => applyOldViewTransitionSurfaces(plan),\n () => {\n didRunMutation = true;\n return (\n context.runMutation(() => resolveViewTransitionPlan(plan)) ?? {\n canceledNames: [],\n cancelRootSnapshot: false,\n }\n );\n },\n (active) => {\n try {\n restoreViewTransitionSurfaces(plan);\n } finally {\n // The host also cleans up prepared names when its native commit\n // fails before mutation so the reconciler can fall back normally.\n if (didRunMutation) context.captureFinished();\n }\n if (active && !didFinish && controller === null) {\n controller = new AbortController();\n dispatchViewTransitionCallbacks(plan, controller.signal);\n }\n },\n () => {\n didFinish = true;\n controller?.abort();\n },\n );\n },\n };\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bgub/fig-reconciler",
|
|
3
|
-
"version": "0.0.1",
|
|
3
|
+
"version": "0.1.0-alpha.1",
|
|
4
4
|
"description": "Fig reconciler",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"homepage": "https://github.com/bgub/fig",
|
|
@@ -11,6 +11,16 @@
|
|
|
11
11
|
"import": "./dist/index.js",
|
|
12
12
|
"default": "./dist/index.js"
|
|
13
13
|
},
|
|
14
|
+
"./commit-coordinator": {
|
|
15
|
+
"types": "./dist/commit-coordinator.d.ts",
|
|
16
|
+
"import": "./dist/commit-coordinator.js",
|
|
17
|
+
"default": "./dist/commit-coordinator.js"
|
|
18
|
+
},
|
|
19
|
+
"./view-transitions": {
|
|
20
|
+
"types": "./dist/view-transitions.d.ts",
|
|
21
|
+
"import": "./dist/view-transitions.js",
|
|
22
|
+
"default": "./dist/view-transitions.js"
|
|
23
|
+
},
|
|
14
24
|
"./devtools": {
|
|
15
25
|
"types": "./dist/devtools.d.ts",
|
|
16
26
|
"import": "./dist/devtools.js",
|
|
@@ -21,6 +31,11 @@
|
|
|
21
31
|
"import": "./dist/refresh.js",
|
|
22
32
|
"default": "./dist/refresh.js"
|
|
23
33
|
},
|
|
34
|
+
"./test-utils": {
|
|
35
|
+
"types": "./dist/act.d.ts",
|
|
36
|
+
"import": "./dist/act.js",
|
|
37
|
+
"default": "./dist/act.js"
|
|
38
|
+
},
|
|
24
39
|
"./package.json": "./package.json"
|
|
25
40
|
},
|
|
26
41
|
"types": "./dist/index.d.ts",
|
|
@@ -42,10 +57,10 @@
|
|
|
42
57
|
"access": "public"
|
|
43
58
|
},
|
|
44
59
|
"peerDependencies": {
|
|
45
|
-
"@bgub/fig": "0.0.1"
|
|
60
|
+
"@bgub/fig": "0.1.0-alpha.1"
|
|
46
61
|
},
|
|
47
62
|
"devDependencies": {
|
|
48
|
-
"@bgub/fig": "0.0.1"
|
|
63
|
+
"@bgub/fig": "0.1.0-alpha.1"
|
|
49
64
|
},
|
|
50
65
|
"engines": {
|
|
51
66
|
"node": "^20.19.0 || >=22.12.0"
|
package/dist/devtools.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"devtools.js","names":["globalWithHook"],"sources":["../src/devtools.ts"],"sourcesContent":["import {\n type DependencyList,\n type ElementType,\n type FigContext,\n Fragment,\n type Props,\n} from \"@bgub/fig\";\nimport type { DataStoreEntrySnapshot } from \"@bgub/fig/internal\";\n\nexport type FigDevtoolsFiberKind =\n | \"root\"\n | \"host\"\n | \"text\"\n | \"function\"\n | \"fragment\"\n | \"assets\"\n | \"context-provider\"\n | \"suspense\"\n | \"error-boundary\"\n | \"portal\"\n | \"activity\"\n | \"view-transition\";\n\nexport type FigDevtoolsHookKind =\n | \"state\"\n | \"action-state\"\n | \"id\"\n | \"deferred-value\"\n | \"external-store\"\n | \"memo\"\n | \"transition\"\n | \"stable-event\"\n | \"reactive\"\n | \"before-paint\"\n | \"before-layout\";\n\nexport type FigDevtoolsEffectPhase =\n | \"reactive\"\n | \"before-paint\"\n | \"before-layout\";\n\nexport type FigDevtoolsWorkLabel =\n | \"sync\"\n | \"input\"\n | \"default\"\n | \"gesture\"\n | \"transition\"\n | \"retry\"\n | \"idle\"\n | \"offscreen\"\n | \"deferred\"\n | \"selective-hydration\";\n\nexport interface FigDevtoolsHookSnapshot {\n id: number;\n kind: FigDevtoolsHookKind;\n state?: unknown;\n deps?: DependencyList | null;\n phase?: FigDevtoolsEffectPhase;\n active?: boolean;\n}\n\nexport interface FigDevtoolsFiberSnapshot {\n id: number;\n parentId: number | null;\n name: string;\n kind: FigDevtoolsFiberKind;\n key: string | number | null;\n index: number;\n props: Props;\n pendingWork: FigDevtoolsWorkLabel[];\n childWork: FigDevtoolsWorkLabel[];\n hooks: FigDevtoolsHookSnapshot[];\n contextDependencies: string[];\n host?: FigDevtoolsHostSnapshot;\n capturedError?: unknown;\n componentStack?: string;\n children: FigDevtoolsFiberSnapshot[];\n}\n\nexport interface FigDevtoolsHostSnapshot {\n kind: \"element\" | \"text\";\n tagName?: string;\n attributes?: Record<string, string>;\n text?: string;\n}\n\nexport interface FigDevtoolsRootSnapshot {\n id: number;\n rendererId: number;\n committedAt: number;\n dataResources: DataStoreEntrySnapshot[];\n pendingWork: FigDevtoolsWorkLabel[];\n suspendedWork: FigDevtoolsWorkLabel[];\n pingedWork: FigDevtoolsWorkLabel[];\n expiredWork: FigDevtoolsWorkLabel[];\n tree: FigDevtoolsFiberSnapshot;\n}\n\nexport interface FigDevtoolsElementInspection {\n rootId: number;\n fiberId: number;\n}\n\nexport interface FigDevtoolsCommitInspection {\n inspectElement(target: unknown): FigDevtoolsElementInspection | null;\n elementForFiber(fiberId: number): unknown;\n}\n\nexport interface FigDevtoolsRendererInfo {\n name: string;\n packageName: string;\n}\n\nexport interface FigDevtoolsGlobalHook {\n inject(renderer: FigDevtoolsRendererInfo): number;\n onCommitRoot(\n rendererId: number,\n snapshot: FigDevtoolsRootSnapshot,\n inspection?: FigDevtoolsCommitInspection,\n ): void;\n}\n\nexport function devtoolsTypeName(\n type: ElementType | FigContext<unknown> | null,\n fallback: string,\n): string {\n if (typeof type === \"string\") return type;\n if (type === Fragment) return \"Fragment\";\n if (typeof type !== \"function\") return fallback;\n\n const namedType = type as {\n displayName?: unknown;\n name?: unknown;\n };\n\n if (typeof namedType.displayName === \"string\" && namedType.displayName !== \"\")\n return namedType.displayName;\n if (typeof namedType.name === \"string\" && namedType.name !== \"\")\n return namedType.name;\n\n return fallback;\n}\n\nexport function getFigDevtoolsGlobalHook(): FigDevtoolsGlobalHook | null {\n const globalWithHook = globalThis as typeof globalThis & {\n __FIG_DEVTOOLS_GLOBAL_HOOK__?: unknown;\n };\n const hook = globalWithHook.__FIG_DEVTOOLS_GLOBAL_HOOK__;\n\n if (\n typeof hook !== \"object\" ||\n hook === null ||\n !(\"inject\" in hook) ||\n !(\"onCommitRoot\" in hook)\n ) {\n return null;\n }\n\n const candidate = hook as Partial<FigDevtoolsGlobalHook>;\n if (\n typeof candidate.inject !== \"function\" ||\n typeof candidate.onCommitRoot !== \"function\"\n ) {\n return null;\n }\n\n return candidate as FigDevtoolsGlobalHook;\n}\n"],"mappings":";;AA2HA,SAAgB,iBACd,MACA,UACQ;CACR,IAAI,OAAO,SAAS,UAAU,OAAO;CACrC,IAAI,SAAS,UAAU,OAAO;CAC9B,IAAI,OAAO,SAAS,YAAY,OAAO;CAEvC,MAAM,YAAY;CAKlB,IAAI,OAAO,UAAU,gBAAgB,YAAY,UAAU,gBAAgB,IACzE,OAAO,UAAU;CACnB,IAAI,OAAO,UAAU,SAAS,YAAY,UAAU,SAAS,IAC3D,OAAO,UAAU;CAEnB,OAAO;AACT;AAEA,SAAgB,2BAAyD;CAIvE,MAAM,OAAOA,WAAe;CAE5B,IACE,OAAO,SAAS,YAChB,SAAS,QACT,EAAE,YAAY,SACd,EAAE,kBAAkB,OAEpB,OAAO;CAGT,MAAM,YAAY;CAClB,IACE,OAAO,UAAU,WAAW,cAC5B,OAAO,UAAU,iBAAiB,YAElC,OAAO;CAGT,OAAO;AACT"}
|