Files

1 line
24 KiB
Plaintext

{"version":3,"file":"LayoutAnimationBuilder.mjs","sources":["../../../src/layout/LayoutAnimationBuilder.ts"],"sourcesContent":["import { clamp } from \"motion-utils\"\nimport { GroupAnimation } from \"../animation/GroupAnimation\"\nimport type { AnimationOptions, Transition } from \"../animation/types\"\nimport { frameData, frameSteps } from \"../frameloop\"\nimport { microtask } from \"../frameloop/microtask\"\nimport { time } from \"../frameloop/sync-time\"\nimport { HTMLProjectionNode } from \"../projection/node/HTMLProjectionNode\"\nimport type { IProjectionNode } from \"../projection/node/types\"\nimport { HTMLVisualElement } from \"../render/html/HTMLVisualElement\"\nimport { visualElementStore } from \"../render/store\"\nimport { hasTransform } from \"../projection/utils/has-transform\"\nimport {\n resolveElements,\n type ElementOrSelector,\n} from \"../utils/resolve-elements\"\n\ntype LayoutAnimationScope = Element | Document\ntype LayoutBuilderResolve = (animation: GroupAnimation) => void\ntype LayoutBuilderReject = (error: unknown) => void\n\ninterface RestorePoint {\n parent: Element\n next: ChildNode | null\n}\n\nconst layoutSelector = \"[data-layout],[data-layout-id]\"\n\n/**\n * All imperatively-created projection nodes live in one persistent tree,\n * shared across animateLayout() calls (and with any React-created nodes,\n * via the singleton document root). Keyed by element for reuse.\n */\nconst layoutNodes = new WeakMap<Element, IProjectionNode>()\n\n/**\n * Builders created within the same synchronous tick are flushed together\n * as a single \"commit\": every node is snapshotted before any updateDom\n * runs, mirroring React batching renders from different parts of the tree.\n */\nlet pendingBuilders: LayoutAnimationBuilder[] | undefined\n\nfunction collectLayoutElements(scope: LayoutAnimationScope): HTMLElement[] {\n const elements: HTMLElement[] = []\n\n if (scope instanceof HTMLElement && scope.matches(layoutSelector)) {\n elements.push(scope)\n }\n\n scope.querySelectorAll(layoutSelector).forEach((element) => {\n if (element instanceof HTMLElement) elements.push(element)\n })\n\n return elements\n}\n\n/**\n * Process any work scheduled on the frameloop now. A previous animation\n * may have been seeked while paused (controls.time = x) without a frame\n * having rendered it - we must materialise that state into the DOM\n * before taking snapshots.\n */\nfunction flushPendingFrame() {\n if (frameData.isProcessing) return\n\n const now = time.now()\n frameData.delta = clamp(0, 1000 / 60, now - frameData.timestamp)\n frameData.timestamp = now\n frameData.isProcessing = true\n frameSteps.update.process(frameData)\n frameSteps.preRender.process(frameData)\n frameSteps.render.process(frameData)\n frameData.isProcessing = false\n}\n\nfunction getProjectionParent(element: Element): IProjectionNode | undefined {\n let ancestor = element.parentElement\n while (ancestor) {\n const node = layoutNodes.get(ancestor)\n if (node && node.instance) return node\n ancestor = ancestor.parentElement\n }\n return undefined\n}\n\nfunction createVisualElement() {\n return new HTMLVisualElement(\n {\n props: {},\n presenceContext: null,\n visualState: {\n latestValues: {},\n renderState: {\n transform: {},\n transformOrigin: {},\n style: {},\n vars: {},\n },\n },\n },\n { allowProjection: true }\n )\n}\n\nfunction readNodeOptions(element: HTMLElement, transition?: Transition) {\n const layoutAttr = element.getAttribute(\"data-layout\")\n const layoutId = element.getAttribute(\"data-layout-id\") ?? undefined\n\n return {\n layoutId,\n layout: layoutAttr !== null ? true : undefined,\n animationType: (!layoutAttr || layoutAttr === \"true\"\n ? \"both\"\n : layoutAttr) as \"both\",\n transition,\n }\n}\n\nfunction prepareNode(\n element: HTMLElement,\n transition?: Transition\n): IProjectionNode {\n let node = layoutNodes.get(element)\n\n if (!node) {\n let visualElement = visualElementStore.get(element) as\n | HTMLVisualElement\n | undefined\n\n if (!visualElement) visualElement = createVisualElement()\n\n /**\n * A first-time element may carry a projection transform in its\n * inline style (e.g. it was cloned from an element mid-animation).\n * That transform isn't tracked in latestValues so the engine can't\n * reset it before measuring - clear it now so the first layout\n * measurement isn't inflated.\n */\n if (\n element.style.transform &&\n !hasTransform(visualElement.latestValues)\n ) {\n element.style.transform = \"\"\n }\n\n node = new HTMLProjectionNode(\n visualElement.latestValues,\n getProjectionParent(element)\n )\n visualElement.projection = node\n\n node.setOptions({\n ...readNodeOptions(element, transition),\n visualElement,\n })\n node.mount(element)\n layoutNodes.set(element, node)\n } else {\n node.setOptions(readNodeOptions(element, transition))\n }\n\n node.isPresent = true\n if (node.options.onExitComplete) {\n node.setOptions({ onExitComplete: undefined })\n }\n\n return node\n}\n\nfunction sortDocumentOrder(elements: Iterable<HTMLElement>) {\n return [...elements].sort((a, b) =>\n a.compareDocumentPosition(b) & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1\n )\n}\n\nfunction dropNode(element: Element, node: IProjectionNode) {\n node.setOptions({ onExitComplete: undefined })\n\n /**\n * Stop any lingering animation so it can't leak into future updates.\n * A follow node can share its currentAnimation with a surviving lead\n * (via resumingFrom), in which case it isn't ours to stop.\n */\n const stack = node.getStack()\n if (!stack || node.isLead()) node.currentAnimation?.stop()\n\n node.unmount()\n layoutNodes.delete(element)\n}\n\nfunction flushPendingBuilders() {\n const builders = pendingBuilders!\n pendingBuilders = undefined\n\n flushPendingFrame()\n\n /**\n * Discover and mount every node across all builders before snapshotting\n * any of them. Mounting during an active update flags isLayoutDirty,\n * which would make that node's own willUpdate skip its snapshot.\n * Document order guarantees ancestors mount before descendants, even\n * when they're discovered by different builders.\n */\n const targets = new Map<HTMLElement, LayoutAnimationBuilder[]>()\n for (const builder of builders) {\n for (const element of builder.collectTargets()) {\n const owners = targets.get(element)\n owners ? owners.push(builder) : targets.set(element, [builder])\n }\n }\n\n const union = new Map<HTMLElement, IProjectionNode>()\n for (const element of sortDocumentOrder(targets.keys())) {\n const owners = targets.get(element)!\n const node = prepareNode(\n element,\n owners[owners.length - 1].transitionFor(element)\n )\n for (const owner of owners) owner.adopt(element, node)\n union.set(element, node)\n }\n\n union.forEach((node) => {\n node.isLayoutDirty = false\n node.willUpdate()\n })\n\n const updatePromises: Promise<void>[] = []\n for (const builder of builders) {\n const result = builder.runUpdate()\n if (result) updatePromises.push(result)\n }\n\n const commit = () => {\n /**\n * Process all additions before any removals so that, even across\n * builders, a removed member knows whether a replacement with the\n * same layoutId was added in this commit.\n */\n const newMemberIds = new Set<string>()\n for (const builder of builders) {\n builder.reconcileAdditions(newMemberIds)\n }\n for (const builder of builders) {\n builder.reconcileRemovals(newMemberIds)\n }\n\n let root: IProjectionNode | undefined\n union.forEach((node) => (root ||= node.root))\n for (const builder of builders) root ||= builder.getRoot()\n\n root?.didUpdate()\n\n /**\n * The root flushes the update on a microtask, synchronously\n * processing the frame that creates the layout animations. Collect\n * them in a later microtask step of the same pass.\n */\n microtask.render(() => {\n for (const builder of builders) builder.finalize()\n })\n }\n\n updatePromises.length ? Promise.all(updatePromises).then(commit) : commit()\n}\n\nexport class LayoutAnimationBuilder {\n private sharedTransitions = new Map<string, AnimationOptions>()\n\n private notifyReady: LayoutBuilderResolve = () => {}\n private rejectReady: LayoutBuilderReject = () => {}\n private readyPromise: Promise<GroupAnimation>\n\n private tracked = new Map<HTMLElement, IProjectionNode>()\n private restorePoints = new Map<HTMLElement, RestorePoint>()\n private updateError: unknown\n\n constructor(\n private scope: LayoutAnimationScope,\n private updateDom: () => void | Promise<void>,\n private defaultOptions?: AnimationOptions\n ) {\n this.readyPromise = new Promise<GroupAnimation>((resolve, reject) => {\n this.notifyReady = resolve\n this.rejectReady = reject\n })\n\n if (!pendingBuilders) {\n pendingBuilders = []\n queueMicrotask(flushPendingBuilders)\n }\n pendingBuilders.push(this)\n }\n\n shared(id: string, transition: AnimationOptions): this {\n this.sharedTransitions.set(id, transition)\n return this\n }\n\n then(resolve: LayoutBuilderResolve, reject?: LayoutBuilderReject) {\n return this.readyPromise.then(resolve, reject)\n }\n\n transitionFor(element: HTMLElement): Transition | undefined {\n const layoutId = element.getAttribute(\"data-layout-id\")\n return ((layoutId && this.sharedTransitions.get(layoutId)) ||\n this.defaultOptions) as Transition | undefined\n }\n\n adopt(element: HTMLElement, node: IProjectionNode) {\n this.tracked.set(element, node)\n this.restorePoints.set(element, {\n parent: element.parentElement!,\n next: element.nextSibling,\n })\n }\n\n collectTargets() {\n return collectLayoutElements(this.scope)\n }\n\n runUpdate(): Promise<void> | undefined {\n try {\n const result = this.updateDom()\n if (result && typeof result.then === \"function\") {\n return result.then(undefined, (error: unknown) => {\n this.updateError = error\n })\n }\n } catch (error) {\n this.updateError = error\n }\n return undefined\n }\n\n reconcileAdditions(newMemberIds: Set<string>) {\n for (const element of collectLayoutElements(this.scope)) {\n if (this.tracked.has(element)) continue\n const node = prepareNode(element, this.transitionFor(element))\n this.adopt(element, node)\n node.options.layoutId && newMemberIds.add(node.options.layoutId)\n }\n }\n\n reconcileRemovals(newMemberIds: Set<string>) {\n this.tracked.forEach((node, element) => {\n if (element.isConnected) return\n\n const restore = this.restorePoints.get(element)\n this.restorePoints.delete(element)\n\n const { layoutId } = node.options\n const stack = node.getStack()\n const hasSurvivor =\n stack &&\n stack.members.some(\n (member) =>\n member !== node &&\n (member.instance as HTMLElement | undefined)\n ?.isConnected\n )\n\n /**\n * A removed lead with a surviving stack member - and no\n * replacement member added this commit - runs an exit\n * crossfade: restore the element to its old position in the\n * DOM, relegate it and let the survivor take over. It's\n * removed again once the animation completes.\n */\n if (\n layoutId &&\n node.isLead() &&\n hasSurvivor &&\n !newMemberIds.has(layoutId)\n ) {\n if (restore && restore.parent.isConnected) {\n restore.parent.insertBefore(\n element,\n restore.next && restore.next.parentNode === restore.parent\n ? restore.next\n : null\n )\n node.isPresent = false\n node.setOptions({\n onExitComplete: () => {\n element.remove()\n dropNode(element, node)\n },\n })\n if (node.relegate()) return\n\n element.remove()\n }\n }\n\n dropNode(element, node)\n this.tracked.delete(element)\n })\n }\n\n getRoot(): IProjectionNode | undefined {\n let root: IProjectionNode | undefined\n this.tracked.forEach((node) => (root ||= node.root))\n return root\n }\n\n finalize() {\n if (this.updateError) {\n this.rejectReady(this.updateError)\n return\n }\n\n const animations = new Set<GroupAnimation[\"animations\"][number]>()\n this.tracked.forEach((node) => {\n if (node.instance && node.currentAnimation) {\n animations.add(node.currentAnimation)\n }\n })\n\n this.notifyReady(new GroupAnimation([...animations]))\n }\n}\n\nexport function parseAnimateLayoutArgs(\n scopeOrUpdateDom: ElementOrSelector | (() => void),\n updateDomOrOptions?: (() => void) | AnimationOptions,\n options?: AnimationOptions\n): {\n scope: Element | Document\n updateDom: () => void\n defaultOptions?: AnimationOptions\n} {\n if (typeof scopeOrUpdateDom === \"function\") {\n return {\n scope: document,\n updateDom: scopeOrUpdateDom,\n defaultOptions: updateDomOrOptions as AnimationOptions | undefined,\n }\n }\n\n const scope =\n scopeOrUpdateDom instanceof Document\n ? scopeOrUpdateDom\n : resolveElements(scopeOrUpdateDom)[0] ?? document\n\n return {\n scope,\n updateDom: updateDomOrOptions as () => void,\n defaultOptions: options,\n }\n}\n"],"names":[],"mappings":"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"}