react-aria
Version:
Spectrum UI components in React
1 lines • 27.9 kB
Source Map (JSON)
{"mappings":"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","sources":["packages/react-aria/src/collections/Document.ts"],"sourcesContent":["/*\n * Copyright 2024 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {BaseCollection, CollectionNode, Mutable} from './BaseCollection';\nimport {CollectionNodeClass} from './CollectionBuilder';\nimport {CSSProperties, ForwardedRef, ReactElement, ReactNode} from 'react';\nimport {Node} from '@react-types/shared';\n\n// This Collection implementation is perhaps a little unusual. It works by rendering the React tree into a\n// Portal to a fake DOM implementation. This gives us efficient access to the tree of rendered objects, and\n// supports React features like composition and context. We use this fake DOM to access the full set of elements\n// before we render into the real DOM, which allows us to render a subset of the elements (e.g. virtualized scrolling),\n// and compute properties like the total number of items. It also enables keyboard navigation, selection, and other features.\n// React takes care of efficiently rendering components and updating the collection for us via this fake DOM.\n//\n// The DOM is a mutable API, and React expects the node instances to remain stable over time. So the implementation is split\n// into two parts. Each mutable fake DOM node owns an instance of an immutable collection node. When a fake DOM node is updated,\n// it queues a second render for the collection. Multiple updates to a collection can be queued at once. Collection nodes are\n// lazily copied on write, so only the changed nodes need to be cloned. During the second render, the new immutable collection\n// is finalized by updating the map of Key -> Node with the new cloned nodes. Then the new collection is frozen so it can no\n// longer be mutated, and returned to the calling component to render.\n\n/**\n * A mutable node in the fake DOM tree. When mutated, it marks itself as dirty\n * and queues an update with the owner document.\n */\nexport class BaseNode<T> {\n private _firstChild: ElementNode<T> | null = null;\n private _lastChild: ElementNode<T> | null = null;\n private _previousSibling: ElementNode<T> | null = null;\n private _nextSibling: ElementNode<T> | null = null;\n private _parentNode: BaseNode<T> | null = null;\n private _minInvalidChildIndex: ElementNode<T> | null = null;\n ownerDocument: Document<T, any>;\n\n constructor(ownerDocument: Document<T, any>) {\n this.ownerDocument = ownerDocument;\n }\n\n *[Symbol.iterator](): Iterator<ElementNode<T>> {\n let node = this.firstChild;\n while (node) {\n yield node;\n node = node.nextSibling;\n }\n }\n\n get firstChild(): ElementNode<T> | null {\n return this._firstChild;\n }\n\n set firstChild(firstChild: ElementNode<T> | null) {\n this._firstChild = firstChild;\n this.ownerDocument.markDirty(this);\n }\n\n get lastChild(): ElementNode<T> | null {\n return this._lastChild;\n }\n\n set lastChild(lastChild: ElementNode<T> | null) {\n this._lastChild = lastChild;\n this.ownerDocument.markDirty(this);\n }\n\n get previousSibling(): ElementNode<T> | null {\n return this._previousSibling;\n }\n\n set previousSibling(previousSibling: ElementNode<T> | null) {\n this._previousSibling = previousSibling;\n this.ownerDocument.markDirty(this);\n }\n\n get nextSibling(): ElementNode<T> | null {\n return this._nextSibling;\n }\n\n set nextSibling(nextSibling: ElementNode<T> | null) {\n this._nextSibling = nextSibling;\n this.ownerDocument.markDirty(this);\n }\n\n get parentNode(): BaseNode<T> | null {\n return this._parentNode;\n }\n\n set parentNode(parentNode: BaseNode<T> | null) {\n this._parentNode = parentNode;\n this.ownerDocument.markDirty(this);\n }\n\n get isConnected(): boolean {\n return this.parentNode?.isConnected || false;\n }\n\n private invalidateChildIndices(child: ElementNode<T>): void {\n if (\n this._minInvalidChildIndex == null ||\n !this._minInvalidChildIndex.isConnected ||\n child.index < this._minInvalidChildIndex.index\n ) {\n this._minInvalidChildIndex = child;\n this.ownerDocument.markDirty(this);\n }\n }\n\n updateChildIndices(): void {\n let node = this._minInvalidChildIndex;\n while (node) {\n node.index = node.previousSibling ? node.previousSibling.index + 1 : 0;\n node = node.nextSibling;\n }\n this._minInvalidChildIndex = null;\n }\n\n appendChild(child: ElementNode<T>): void {\n if (child.parentNode) {\n child.parentNode.removeChild(child);\n }\n\n if (this.firstChild == null) {\n this.firstChild = child;\n }\n\n if (this.lastChild) {\n this.lastChild.nextSibling = child;\n child.index = this.lastChild.index + 1;\n child.previousSibling = this.lastChild;\n } else {\n child.previousSibling = null;\n child.index = 0;\n }\n\n child.parentNode = this;\n child.nextSibling = null;\n this.lastChild = child;\n\n this.ownerDocument.markDirty(this);\n if (this.isConnected) {\n this.ownerDocument.queueUpdate();\n }\n }\n\n insertBefore(newNode: ElementNode<T>, referenceNode: ElementNode<T>): void {\n if (referenceNode == null) {\n return this.appendChild(newNode);\n }\n\n if (newNode.parentNode) {\n newNode.parentNode.removeChild(newNode);\n }\n\n newNode.nextSibling = referenceNode;\n newNode.previousSibling = referenceNode.previousSibling;\n // Ensure that the newNode's index is less than that of the reference node so that\n // invalidateChildIndices will properly use the newNode as the _minInvalidChildIndex, thus making sure\n // we will properly update the indexes of all sibiling nodes after the newNode. The value here doesn't matter\n // since updateChildIndices should calculate the proper indexes.\n newNode.index = referenceNode.index - 1;\n if (this.firstChild === referenceNode) {\n this.firstChild = newNode;\n } else if (referenceNode.previousSibling) {\n referenceNode.previousSibling.nextSibling = newNode;\n }\n\n referenceNode.previousSibling = newNode;\n newNode.parentNode = referenceNode.parentNode;\n\n this.invalidateChildIndices(newNode);\n if (this.isConnected) {\n this.ownerDocument.queueUpdate();\n }\n }\n\n removeChild(child: ElementNode<T>): void {\n if (child.parentNode !== this) {\n return;\n }\n\n if (this._minInvalidChildIndex === child) {\n this._minInvalidChildIndex = null;\n }\n\n if (child.nextSibling) {\n this.invalidateChildIndices(child.nextSibling);\n child.nextSibling.previousSibling = child.previousSibling;\n }\n\n if (child.previousSibling) {\n child.previousSibling.nextSibling = child.nextSibling;\n }\n\n if (this.firstChild === child) {\n this.firstChild = child.nextSibling;\n }\n\n if (this.lastChild === child) {\n this.lastChild = child.previousSibling;\n }\n\n child.parentNode = null;\n child.nextSibling = null;\n child.previousSibling = null;\n child.index = 0;\n\n this.ownerDocument.markDirty(child);\n if (this.isConnected) {\n this.ownerDocument.queueUpdate();\n }\n }\n\n addEventListener(): void {}\n removeEventListener(): void {}\n\n get previousVisibleSibling(): ElementNode<T> | null {\n let node = this.previousSibling;\n while (node && node.isHidden) {\n node = node.previousSibling;\n }\n return node;\n }\n\n get nextVisibleSibling(): ElementNode<T> | null {\n let node = this.nextSibling;\n while (node && node.isHidden) {\n node = node.nextSibling;\n }\n return node;\n }\n\n get firstVisibleChild(): ElementNode<T> | null {\n let node = this.firstChild;\n while (node && node.isHidden) {\n node = node.nextSibling;\n }\n return node;\n }\n\n get lastVisibleChild(): ElementNode<T> | null {\n let node = this.lastChild;\n while (node && node.isHidden) {\n node = node.previousSibling;\n }\n return node;\n }\n}\n\n/**\n * A mutable element node in the fake DOM tree. It owns an immutable\n * Collection Node which is copied on write.\n */\nexport class ElementNode<T> extends BaseNode<T> {\n nodeType = 8; // COMMENT_NODE (we'd use ELEMENT_NODE but React DevTools will fail to get its dimensions)\n node: CollectionNode<T> | null;\n isMutated = true;\n private _index: number = 0;\n isHidden = false;\n\n constructor(type: string, ownerDocument: Document<T, any>) {\n super(ownerDocument);\n this.node = null;\n }\n\n get index(): number {\n return this._index;\n }\n\n set index(index: number) {\n this._index = index;\n this.ownerDocument.markDirty(this);\n }\n\n get level(): number {\n if (this.parentNode instanceof ElementNode) {\n return this.parentNode.level + (this.parentNode.node?.type === 'item' ? 1 : 0);\n }\n\n return 0;\n }\n\n /**\n * Lazily gets a mutable instance of a Node. If the node has already\n * been cloned during this update cycle, it just returns the existing one.\n */\n private getMutableNode(): Mutable<CollectionNode<T>> | null {\n if (this.node == null) {\n return null;\n }\n\n if (!this.isMutated) {\n this.node = this.node.clone();\n this.isMutated = true;\n }\n\n this.ownerDocument.markDirty(this);\n return this.node;\n }\n\n updateNode(): void {\n let nextSibling = this.nextVisibleSibling;\n let node = this.getMutableNode();\n if (node == null) {\n return;\n }\n\n node.index = this.index;\n node.level = this.level;\n node.parentKey =\n this.parentNode instanceof ElementNode ? (this.parentNode.node?.key ?? null) : null;\n node.prevKey = this.previousVisibleSibling?.node?.key ?? null;\n node.nextKey = nextSibling?.node?.key ?? null;\n node.hasChildNodes = !!this.firstChild;\n node.firstChildKey = this.firstVisibleChild?.node?.key ?? null;\n node.lastChildKey = this.lastVisibleChild?.node?.key ?? null;\n\n // Update the colIndex of sibling nodes if this node has a colSpan.\n if ((node.colSpan != null || node.colIndex != null) && nextSibling) {\n // This queues the next sibling for update, which means this happens recursively.\n let nextColIndex = (node.colIndex ?? node.index) + (node.colSpan ?? 1);\n if (nextSibling.node != null && nextColIndex !== nextSibling.node.colIndex) {\n let siblingNode = nextSibling.getMutableNode();\n siblingNode!.colIndex = nextColIndex;\n }\n }\n }\n\n setProps<E extends Element>(\n obj: {[key: string]: any},\n ref: ForwardedRef<E>,\n CollectionNodeClass: CollectionNodeClass<any>,\n rendered?: ReactNode,\n render?: (node: Node<T>) => ReactElement\n ): void {\n let node;\n let {value, textValue, id, ...props} = obj;\n if (this.node == null) {\n node = new CollectionNodeClass(id ?? `react-aria-${++this.ownerDocument.nodeId}`);\n this.node = node;\n } else {\n node = this.getMutableNode();\n }\n\n props.ref = ref;\n node.props = props;\n node.rendered = rendered;\n node.render = render;\n node.value = value;\n if (obj['aria-label']) {\n node['aria-label'] = obj['aria-label'];\n }\n node.textValue =\n textValue ||\n (typeof props.children === 'string' ? props.children : '') ||\n obj['aria-label'] ||\n '';\n if (id != null && id !== node.key) {\n throw new Error('Cannot change the id of an item');\n }\n\n if (props.colSpan != null) {\n node.colSpan = props.colSpan;\n }\n\n if (this.isConnected) {\n this.ownerDocument.queueUpdate();\n }\n }\n\n get style(): CSSProperties {\n // React sets display: none to hide elements during Suspense.\n // We'll handle this by setting the element to hidden and invalidating\n // its siblings/parent. Hidden elements remain in the Document, but\n // are removed from the Collection.\n let element = this;\n return {\n get display() {\n return element.isHidden ? 'none' : '';\n },\n set display(value) {\n let isHidden = value === 'none';\n if (element.isHidden !== isHidden) {\n // Mark parent node dirty if this element is currently the first or last visible child.\n if (\n element.parentNode?.firstVisibleChild === element ||\n element.parentNode?.lastVisibleChild === element\n ) {\n element.ownerDocument.markDirty(element.parentNode);\n }\n\n // Mark sibling visible elements dirty.\n let prev = element.previousVisibleSibling;\n let next = element.nextVisibleSibling;\n if (prev) {\n element.ownerDocument.markDirty(prev);\n }\n if (next) {\n element.ownerDocument.markDirty(next);\n }\n\n // Mark self dirty.\n element.isHidden = isHidden;\n element.ownerDocument.markDirty(element);\n }\n }\n };\n }\n\n hasAttribute(): void {}\n setAttribute(): void {}\n setAttributeNS(): void {}\n removeAttribute(): void {}\n}\n\n/**\n * A mutable Document in the fake DOM. It owns an immutable Collection instance,\n * which is lazily copied on write during updates.\n */\nexport class Document<T, C extends BaseCollection<T> = BaseCollection<T>> extends BaseNode<T> {\n nodeType = 11; // DOCUMENT_FRAGMENT_NODE\n ownerDocument: Document<T, C> = this;\n dirtyNodes: Set<BaseNode<T>> = new Set();\n isSSR = false;\n nodeId = 0;\n nodesByProps: WeakMap<object, ElementNode<T>> = new WeakMap<object, ElementNode<T>>();\n private collection: C;\n private nextCollection: C | null = null;\n private subscriptions: Set<() => void> = new Set();\n private queuedRender = false;\n private inSubscription = false;\n\n constructor(collection: C) {\n // @ts-ignore\n super(null);\n this.collection = collection;\n this.nextCollection = collection;\n }\n\n get isConnected(): boolean {\n return true;\n }\n\n createElement(type: string): ElementNode<T> {\n return new ElementNode(type, this);\n }\n\n private getMutableCollection() {\n if (!this.nextCollection) {\n this.nextCollection = this.collection.clone();\n }\n\n return this.nextCollection;\n }\n\n markDirty(node: BaseNode<T>): void {\n this.dirtyNodes.add(node);\n }\n\n private addNode(element: ElementNode<T>): void {\n if (element.isHidden || element.node == null) {\n return;\n }\n\n let collection = this.getMutableCollection();\n if (!collection.getItem(element.node.key)) {\n for (let child of element) {\n this.addNode(child);\n }\n }\n\n collection.addNode(element.node);\n }\n\n private removeNode(node: ElementNode<T>): void {\n for (let child of node) {\n this.removeNode(child);\n }\n\n if (node.node) {\n let collection = this.getMutableCollection();\n collection.removeNode(node.node.key);\n }\n }\n\n /** Finalizes the collection update, updating all nodes and freezing the collection. */\n getCollection(): C {\n // If in a subscription update, return return the existing collection.\n // React will call getCollection again during render, at which point all the updates will be complete.\n if (this.inSubscription) {\n return this.collection;\n }\n\n // Reset queuedRender to false when getCollection is called during render.\n this.queuedRender = false;\n\n this.updateCollection();\n return this.collection;\n }\n\n updateCollection(): void {\n // First, remove disconnected nodes and update the indices of dirty element children.\n for (let element of this.dirtyNodes) {\n if (element instanceof ElementNode && (!element.isConnected || element.isHidden)) {\n this.removeNode(element);\n } else {\n element.updateChildIndices();\n }\n }\n\n // Next, update dirty collection nodes.\n for (let element of this.dirtyNodes) {\n if (element instanceof ElementNode) {\n if (element.isConnected && !element.isHidden) {\n element.updateNode();\n this.addNode(element);\n }\n\n if (element.node) {\n this.dirtyNodes.delete(element);\n }\n\n element.isMutated = false;\n } else {\n this.dirtyNodes.delete(element);\n }\n }\n\n // Finally, update the collection.\n if (this.nextCollection) {\n this.nextCollection.commit(\n this.firstVisibleChild?.node?.key ?? null,\n this.lastVisibleChild?.node?.key ?? null,\n this.isSSR\n );\n if (!this.isSSR) {\n this.collection = this.nextCollection;\n this.nextCollection = null;\n }\n }\n }\n\n queueUpdate(): void {\n if (this.dirtyNodes.size === 0 || this.queuedRender) {\n return;\n }\n\n // Only trigger subscriptions once during an update, when the first item changes.\n // React's useSyncExternalStore will call getCollection immediately, to check whether the snapshot changed.\n // If so, React will queue a render to happen after the current commit to our fake DOM finishes.\n // We track whether getCollection is called in a subscription, and once it is called during render,\n // we reset queuedRender back to false.\n this.queuedRender = true;\n this.inSubscription = true;\n\n // Clone the collection to ensure that React queues a render. It will call getCollection again\n // during render, at which point all the updates will be complete and we can return\n // the new collection.\n if (!this.isSSR) {\n this.collection = this.collection.clone();\n }\n\n for (let fn of this.subscriptions) {\n fn();\n }\n\n this.inSubscription = false;\n }\n\n subscribe(fn: () => void) {\n this.subscriptions.add(fn);\n return (): boolean => this.subscriptions.delete(fn);\n }\n\n resetAfterSSR(): void {\n if (this.isSSR) {\n this.isSSR = false;\n this.firstChild = null;\n this.lastChild = null;\n this.nodeId = 0;\n }\n }\n}\n"],"names":[],"version":3,"file":"Document.mjs.map"}