{"mappings":"AAAA;;;;;;;;;;CAUC,GAyBM,MAAM;IASX,YAAY,aAA+B,CAAE;aARrC,cAAqC;aACrC,aAAoC;aACpC,mBAA0C;aAC1C,eAAsC;aACtC,cAAkC;aAClC,wBAA+C;QAIrD,IAAI,CAAC,aAAa,GAAG;IACvB;IAEA,CAAC,CAAC,OAAO,QAAQ,CAAC,GAA6B;QAC7C,IAAI,OAAO,IAAI,CAAC,UAAU;QAC1B,MAAO,KAAM;YACX,MAAM;YACN,OAAO,KAAK,WAAW;QACzB;IACF;IAEA,IAAI,aAAoC;QACtC,OAAO,IAAI,CAAC,WAAW;IACzB;IAEA,IAAI,WAAW,UAAiC,EAAE;QAChD,IAAI,CAAC,WAAW,GAAG;QACnB,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI;IACnC;IAEA,IAAI,YAAmC;QACrC,OAAO,IAAI,CAAC,UAAU;IACxB;IAEA,IAAI,UAAU,SAAgC,EAAE;QAC9C,IAAI,CAAC,UAAU,GAAG;QAClB,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI;IACnC;IAEA,IAAI,kBAAyC;QAC3C,OAAO,IAAI,CAAC,gBAAgB;IAC9B;IAEA,IAAI,gBAAgB,eAAsC,EAAE;QAC1D,IAAI,CAAC,gBAAgB,GAAG;QACxB,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI;IACnC;IAEA,IAAI,cAAqC;QACvC,OAAO,IAAI,CAAC,YAAY;IAC1B;IAEA,IAAI,YAAY,WAAkC,EAAE;QAClD,IAAI,CAAC,YAAY,GAAG;QACpB,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI;IACnC;IAEA,IAAI,aAAiC;QACnC,OAAO,IAAI,CAAC,WAAW;IACzB;IAEA,IAAI,WAAW,UAA8B,EAAE;QAC7C,IAAI,CAAC,WAAW,GAAG;QACnB,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI;IACnC;IAEA,IAAI,cAAuB;QACzB,OAAO,IAAI,CAAC,UAAU,EAAE,eAAe;IACzC;IAEQ,uBAAuB,KAAqB,EAAQ;QAC1D,IAAI,IAAI,CAAC,qBAAqB,IAAI,QAAQ,CAAC,IAAI,CAAC,qBAAqB,CAAC,WAAW,IAAI,MAAM,KAAK,GAAG,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE;YACnI,IAAI,CAAC,qBAAqB,GAAG;YAC7B,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI;QACnC;IACF;IAEA,qBAA2B;QACzB,IAAI,OAAO,IAAI,CAAC,qBAAqB;QACrC,MAAO,KAAM;YACX,KAAK,KAAK,GAAG,KAAK,eAAe,GAAG,KAAK,eAAe,CAAC,KAAK,GAAG,IAAI;YACrE,OAAO,KAAK,WAAW;QACzB;QACA,IAAI,CAAC,qBAAqB,GAAG;IAC/B;IAEA,YAAY,KAAqB,EAAQ;QACvC,IAAI,MAAM,UAAU,EAClB,MAAM,UAAU,CAAC,WAAW,CAAC;QAG/B,IAAI,IAAI,CAAC,UAAU,IAAI,MACrB,IAAI,CAAC,UAAU,GAAG;QAGpB,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,CAAC,SAAS,CAAC,WAAW,GAAG;YAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG;YACrC,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS;QACxC,OAAO;YACL,MAAM,eAAe,GAAG;YACxB,MAAM,KAAK,GAAG;QAChB;QAEA,MAAM,UAAU,GAAG,IAAI;QACvB,MAAM,WAAW,GAAG;QACpB,IAAI,CAAC,SAAS,GAAG;QAEjB,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI;QACjC,IAAI,IAAI,CAAC,WAAW,EAClB,IAAI,CAAC,aAAa,CAAC,WAAW;IAElC;IAEA,aAAa,OAAuB,EAAE,aAA6B,EAAQ;QACzE,IAAI,iBAAiB,MACnB,OAAO,IAAI,CAAC,WAAW,CAAC;QAG1B,IAAI,QAAQ,UAAU,EACpB,QAAQ,UAAU,CAAC,WAAW,CAAC;QAGjC,QAAQ,WAAW,GAAG;QACtB,QAAQ,eAAe,GAAG,cAAc,eAAe;QACvD,kFAAkF;QAClF,sGAAsG;QACtG,6GAA6G;QAC7G,gEAAgE;QAChE,QAAQ,KAAK,GAAG,cAAc,KAAK,GAAG;QACtC,IAAI,IAAI,CAAC,UAAU,KAAK,eACtB,IAAI,CAAC,UAAU,GAAG;aACb,IAAI,cAAc,eAAe,EACtC,cAAc,eAAe,CAAC,WAAW,GAAG;QAG9C,cAAc,eAAe,GAAG;QAChC,QAAQ,UAAU,GAAG,cAAc,UAAU;QAE7C,IAAI,CAAC,sBAAsB,CAAC;QAC5B,IAAI,IAAI,CAAC,WAAW,EAClB,IAAI,CAAC,aAAa,CAAC,WAAW;IAElC;IAEA,YAAY,KAAqB,EAAQ;QACvC,IAAI,MAAM,UAAU,KAAK,IAAI,EAC3B;QAGF,IAAI,IAAI,CAAC,qBAAqB,KAAK,OACjC,IAAI,CAAC,qBAAqB,GAAG;QAG/B,IAAI,MAAM,WAAW,EAAE;YACrB,IAAI,CAAC,sBAAsB,CAAC,MAAM,WAAW;YAC7C,MAAM,WAAW,CAAC,eAAe,GAAG,MAAM,eAAe;QAC3D;QAEA,IAAI,MAAM,eAAe,EACvB,MAAM,eAAe,CAAC,WAAW,GAAG,MAAM,WAAW;QAGvD,IAAI,IAAI,CAAC,UAAU,KAAK,OACtB,IAAI,CAAC,UAAU,GAAG,MAAM,WAAW;QAGrC,IAAI,IAAI,CAAC,SAAS,KAAK,OACrB,IAAI,CAAC,SAAS,GAAG,MAAM,eAAe;QAGxC,MAAM,UAAU,GAAG;QACnB,MAAM,WAAW,GAAG;QACpB,MAAM,eAAe,GAAG;QACxB,MAAM,KAAK,GAAG;QAEd,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC;QAC7B,IAAI,IAAI,CAAC,WAAW,EAClB,IAAI,CAAC,aAAa,CAAC,WAAW;IAElC;IAEA,mBAAyB,CAAC;IAC1B,sBAA4B,CAAC;IAE7B,IAAI,yBAAgD;QAClD,IAAI,OAAO,IAAI,CAAC,eAAe;QAC/B,MAAO,QAAQ,KAAK,QAAQ,CAC1B,OAAO,KAAK,eAAe;QAE7B,OAAO;IACT;IAEA,IAAI,qBAA4C;QAC9C,IAAI,OAAO,IAAI,CAAC,WAAW;QAC3B,MAAO,QAAQ,KAAK,QAAQ,CAC1B,OAAO,KAAK,WAAW;QAEzB,OAAO;IACT;IAEA,IAAI,oBAA2C;QAC7C,IAAI,OAAO,IAAI,CAAC,UAAU;QAC1B,MAAO,QAAQ,KAAK,QAAQ,CAC1B,OAAO,KAAK,WAAW;QAEzB,OAAO;IACT;IAEA,IAAI,mBAA0C;QAC5C,IAAI,OAAO,IAAI,CAAC,SAAS;QACzB,MAAO,QAAQ,KAAK,QAAQ,CAC1B,OAAO,KAAK,eAAe;QAE7B,OAAO;IACT;AACF;AAMO,MAAM,kDAAuB;IAOlC,YAAY,IAAY,EAAE,aAA+B,CAAE;QACzD,KAAK,CAAC,qBAPR,WAAW,EAAG,0FAA0F;eAExG,YAAY,WACJ,SAAiB,QACzB,WAAW;QAIT,IAAI,CAAC,IAAI,GAAG;IACd;IAEA,IAAI,QAAgB;QAClB,OAAO,IAAI,CAAC,MAAM;IACpB;IAEA,IAAI,MAAM,KAAa,EAAE;QACvB,IAAI,CAAC,MAAM,GAAG;QACd,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI;IACnC;IAEA,IAAI,QAAgB;QAClB,IAAI,IAAI,CAAC,UAAU,YAAY,2CAC7B,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,GAAI,CAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,SAAS,SAAS,IAAI,CAAA;QAG9E,OAAO;IACT;IAEA;;;GAGC,GACD,AAAQ,iBAAoD;QAC1D,IAAI,IAAI,CAAC,IAAI,IAAI,MACf,OAAO;QAGT,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK;YAC3B,IAAI,CAAC,SAAS,GAAG;QACnB;QAEA,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI;QACjC,OAAO,IAAI,CAAC,IAAI;IAClB;IAEA,aAAmB;QACjB,IAAI,cAAc,IAAI,CAAC,kBAAkB;QACzC,IAAI,OAAO,IAAI,CAAC,cAAc;QAC9B,IAAI,QAAQ,MACV;QAGF,KAAK,KAAK,GAAG,IAAI,CAAC,KAAK;QACvB,KAAK,KAAK,GAAG,IAAI,CAAC,KAAK;QACvB,KAAK,SAAS,GAAG,IAAI,CAAC,UAAU,YAAY,4CAAc,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,OAAO;QAC9F,KAAK,OAAO,GAAG,IAAI,CAAC,sBAAsB,EAAE,MAAM,OAAO;QACzD,KAAK,OAAO,GAAG,aAAa,MAAM,OAAO;QACzC,KAAK,aAAa,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU;QACtC,KAAK,aAAa,GAAG,IAAI,CAAC,iBAAiB,EAAE,MAAM,OAAO;QAC1D,KAAK,YAAY,GAAG,IAAI,CAAC,gBAAgB,EAAE,MAAM,OAAO;QAExD,mEAAmE;QACnE,IAAI,AAAC,CAAA,KAAK,OAAO,IAAI,QAAQ,KAAK,QAAQ,IAAI,IAAG,KAAM,aAAa;YAClE,iFAAiF;YACjF,IAAI,eAAe,AAAC,CAAA,KAAK,QAAQ,IAAI,KAAK,KAAK,AAAD,IAAM,CAAA,KAAK,OAAO,IAAI,CAAA;YACpE,IAAI,YAAY,IAAI,IAAI,QAAQ,iBAAiB,YAAY,IAAI,CAAC,QAAQ,EAAE;gBAC1E,IAAI,cAAc,YAAY,cAAc;gBAC5C,YAAa,QAAQ,GAAG;YAC1B;QACF;IACF;IAEA,SAA4B,GAAyB,EAAE,GAAoB,EAAE,mBAA6C,EAAE,QAAoB,EAAE,MAAwC,EAAQ;QAChM,IAAI;QACJ,IAAI,EAAC,OAAA,MAAK,aAAE,SAAS,MAAE,EAAE,EAAE,GAAG,OAAM,GAAG;QACvC,IAAI,IAAI,CAAC,IAAI,IAAI,MAAM;YACrB,OAAO,IAAI,oBAAoB,MAAM,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE;YAChF,IAAI,CAAC,IAAI,GAAG;QACd,OACE,OAAO,IAAI,CAAC,cAAc;QAG5B,MAAM,GAAG,GAAG;QACZ,KAAK,KAAK,GAAG;QACb,KAAK,QAAQ,GAAG;QAChB,KAAK,MAAM,GAAG;QACd,KAAK,KAAK,GAAG;QACb,IAAI,GAAG,CAAC,aAAa,EACnB,IAAI,CAAC,aAAa,GAAG,GAAG,CAAC,aAAa;QAExC,KAAK,SAAS,GAAG,aAAc,CAAA,OAAO,MAAM,QAAQ,KAAK,WAAW,MAAM,QAAQ,GAAG,EAAC,KAAM,GAAG,CAAC,aAAa,IAAI;QACjH,IAAI,MAAM,QAAQ,OAAO,KAAK,GAAG,EAC/B,MAAM,IAAI,MAAM;QAGlB,IAAI,MAAM,OAAO,IAAI,MACnB,KAAK,OAAO,GAAG,MAAM,OAAO;QAG9B,IAAI,IAAI,CAAC,WAAW,EAClB,IAAI,CAAC,aAAa,CAAC,WAAW;IAElC;IAEA,IAAI,QAAuB;QACzB,6DAA6D;QAC7D,sEAAsE;QACtE,mEAAmE;QACnE,mCAAmC;QACnC,IAAI,UAAU,IAAI;QAClB,OAAO;YACL,IAAI,WAAU;gBACZ,OAAO,QAAQ,QAAQ,GAAG,SAAS;YACrC;YACA,IAAI,SAAQ,MAAO;gBACjB,IAAI,WAAW,UAAU;gBACzB,IAAI,QAAQ,QAAQ,KAAK,UAAU;oBACjC,uFAAuF;oBACvF,IAAI,QAAQ,UAAU,EAAE,sBAAsB,WAAW,QAAQ,UAAU,EAAE,qBAAqB,SAChG,QAAQ,aAAa,CAAC,SAAS,CAAC,QAAQ,UAAU;oBAGpD,uCAAuC;oBACvC,IAAI,OAAO,QAAQ,sBAAsB;oBACzC,IAAI,OAAO,QAAQ,kBAAkB;oBACrC,IAAI,MACF,QAAQ,aAAa,CAAC,SAAS,CAAC;oBAElC,IAAI,MACF,QAAQ,aAAa,CAAC,SAAS,CAAC;oBAGlC,mBAAmB;oBACnB,QAAQ,QAAQ,GAAG;oBACnB,QAAQ,aAAa,CAAC,SAAS,CAAC;gBAClC;YACF;QACF;IACF;IAEA,eAAqB,CAAC;IACtB,eAAqB,CAAC;IACtB,iBAAuB,CAAC;IACxB,kBAAwB,CAAC;AAC3B;AAMO,MAAM,kDAAqE;IAahF,YAAY,UAAa,CAAE;QACzB,aAAa;QACb,KAAK,CAAC,YAdR,WAAW,GAAI,yBAAyB;eACxC,gBAAgC,IAAI,OACpC,aAA+B,IAAI,YACnC,QAAQ,YACR,SAAS,QACT,eAAgD,IAAI,gBAE5C,iBAA2B,WAC3B,gBAAiC,IAAI,YACrC,eAAe,YACf,iBAAiB;QAKvB,IAAI,CAAC,UAAU,GAAG;QAClB,IAAI,CAAC,cAAc,GAAG;IACxB;IAEA,IAAI,cAAuB;QACzB,OAAO;IACT;IAEA,cAAc,IAAY,EAAkB;QAC1C,OAAO,IAAI,0CAAY,MAAM,IAAI;IACnC;IAEQ,uBAAuB;QAC7B,IAAI,CAAC,IAAI,CAAC,cAAc,EACtB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK;QAG7C,OAAO,IAAI,CAAC,cAAc;IAC5B;IAEA,UAAU,IAAiB,EAAQ;QACjC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;IACtB;IAEQ,QAAQ,OAAuB,EAAQ;QAC7C,IAAI,QAAQ,QAAQ,IAAI,QAAQ,IAAI,IAAI,MACtC;QAGF,IAAI,aAAa,IAAI,CAAC,oBAAoB;QAC1C,IAAI,CAAC,WAAW,OAAO,CAAC,QAAQ,IAAI,CAAC,GAAG,GACtC,KAAK,IAAI,SAAS,QAChB,IAAI,CAAC,OAAO,CAAC;QAIjB,WAAW,OAAO,CAAC,QAAQ,IAAI;IACjC;IAEQ,WAAW,IAAoB,EAAQ;QAC7C,KAAK,IAAI,SAAS,KAChB,IAAI,CAAC,UAAU,CAAC;QAGlB,IAAI,KAAK,IAAI,EAAE;YACb,IAAI,aAAa,IAAI,CAAC,oBAAoB;YAC1C,WAAW,UAAU,CAAC,KAAK,IAAI,CAAC,GAAG;QACrC;IACF;IAEA,qFAAqF,GACrF,gBAAmB;QACjB,sEAAsE;QACtE,sGAAsG;QACtG,IAAI,IAAI,CAAC,cAAc,EACrB,OAAO,IAAI,CAAC,UAAU;QAGxB,0EAA0E;QAC1E,IAAI,CAAC,YAAY,GAAG;QAEpB,IAAI,CAAC,gBAAgB;QACrB,OAAO,IAAI,CAAC,UAAU;IACxB;IAEA,mBAAyB;QACvB,qFAAqF;QACrF,KAAK,IAAI,WAAW,IAAI,CAAC,UAAU,CACjC,IAAI,mBAAmB,6CAAgB,CAAA,CAAC,QAAQ,WAAW,IAAI,QAAQ,QAAQ,AAAD,GAC5E,IAAI,CAAC,UAAU,CAAC;aAEhB,QAAQ,kBAAkB;QAI9B,uCAAuC;QACvC,KAAK,IAAI,WAAW,IAAI,CAAC,UAAU,CACjC,IAAI,mBAAmB,2CAAa;YAClC,IAAI,QAAQ,WAAW,IAAI,CAAC,QAAQ,QAAQ,EAAE;gBAC5C,QAAQ,UAAU;gBAClB,IAAI,CAAC,OAAO,CAAC;YACf;YAEA,IAAI,QAAQ,IAAI,EACd,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;YAGzB,QAAQ,SAAS,GAAG;QACtB,OACE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QAI3B,kCAAkC;QAClC,IAAI,IAAI,CAAC,cAAc,EAAE;YACvB,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,MAAM,OAAO,MAAM,IAAI,CAAC,gBAAgB,EAAE,MAAM,OAAO,MAAM,IAAI,CAAC,KAAK;YAC1H,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;gBACf,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,cAAc;gBACrC,IAAI,CAAC,cAAc,GAAG;YACxB;QACF;IACF;IAEA,cAAoB;QAClB,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,YAAY,EACjD;QAGF,iFAAiF;QACjF,2GAA2G;QAC3G,gGAAgG;QAChG,mGAAmG;QACnG,uCAAuC;QACvC,IAAI,CAAC,YAAY,GAAG;QACpB,IAAI,CAAC,cAAc,GAAG;QAEtB,8FAA8F;QAC9F,mFAAmF;QACnF,sBAAsB;QACtB,IAAI,CAAC,IAAI,CAAC,KAAK,EACb,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK;QAGzC,KAAK,IAAI,MAAM,IAAI,CAAC,aAAa,CAC/B;QAGF,IAAI,CAAC,cAAc,GAAG;IACxB;IAEA,UAAU,EAAc,EAAE;QACxB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;QACvB,OAAO,IAAe,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;IAClD;IAEA,gBAAsB;QACpB,IAAI,IAAI,CAAC,KAAK,EAAE;YACd,IAAI,CAAC,KAAK,GAAG;YACb,IAAI,CAAC,UAAU,GAAG;YAClB,IAAI,CAAC,SAAS,GAAG;YACjB,IAAI,CAAC,MAAM,GAAG;QAChB;IACF;AACF","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 (this._minInvalidChildIndex == null || !this._minInvalidChildIndex.isConnected || child.index < this._minInvalidChildIndex.index) {\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 = 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>(obj: {[key: string]: any}, ref: ForwardedRef<E>, CollectionNodeClass: CollectionNodeClass<any>, rendered?: ReactNode, render?: (node: Node<T>) => ReactElement): 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 = textValue || (typeof props.children === 'string' ? props.children : '') || obj['aria-label'] || '';\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 (element.parentNode?.firstVisibleChild === element || element.parentNode?.lastVisibleChild === element) {\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(this.firstVisibleChild?.node?.key ?? null, this.lastVisibleChild?.node?.key ?? null, this.isSSR);\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"}