@react-stately/virtualizer 4.2.0 → 4.3.0

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.
@@ -25,17 +25,24 @@ $parcel$export(module.exports, "Layout", () => $ac14d65a0ec196dd$export$c84671f4
25
25
  return newRect.width !== oldRect.width || newRect.height !== oldRect.height;
26
26
  }
27
27
  /**
28
+ * Returns whether the layout should invalidate when the layout options change.
29
+ * By default it invalidates when the object identity changes. Override this
30
+ * method to optimize layout updates based on specific option changes.
31
+ */ shouldInvalidateLayoutOptions(newOptions, oldOptions) {
32
+ return newOptions !== oldOptions;
33
+ }
34
+ /**
28
35
  * This method allows the layout to perform any pre-computation
29
- * it needs to in order to prepare {@link LayoutInfo}s for retrieval.
30
- * Called by the virtualizer before {@link getVisibleLayoutInfos}
31
- * or {@link getLayoutInfo} are called.
36
+ * it needs to in order to prepare LayoutInfos for retrieval.
37
+ * Called by the virtualizer before `getVisibleLayoutInfos`
38
+ * or `getLayoutInfo` are called.
32
39
  */ update(invalidationContext) {}
33
- getItemRect(key) {
40
+ /** @private */ getItemRect(key) {
34
41
  var _this_getLayoutInfo;
35
42
  var _this_getLayoutInfo_rect;
36
43
  return (_this_getLayoutInfo_rect = (_this_getLayoutInfo = this.getLayoutInfo(key)) === null || _this_getLayoutInfo === void 0 ? void 0 : _this_getLayoutInfo.rect) !== null && _this_getLayoutInfo_rect !== void 0 ? _this_getLayoutInfo_rect : null;
37
44
  }
38
- getVisibleRect() {
45
+ /** @private */ getVisibleRect() {
39
46
  return this.virtualizer.visibleRect;
40
47
  }
41
48
  constructor(){
@@ -1 +1 @@
1
- {"mappings":";;;;;;AAAA;;;;;;;;;;CAUC,GAsBM,MAAe;IAIpB;;;;;GAKC,GACD,iBAAiB,OAAa,EAAE,OAAa,EAAW;QACtD,+CAA+C;QAC/C,OAAO,QAAQ,KAAK,KAAK,QAAQ,KAAK,IAC/B,QAAQ,MAAM,KAAK,QAAQ,MAAM;IAC1C;IAEA;;;;;GAKC,GACD,OAAO,mBAA2C,EAAE,CAAC;IA+BrD,YAAY,GAAQ,EAAe;YAC1B;YAAA;QAAP,OAAO,CAAA,4BAAA,sBAAA,IAAI,CAAC,aAAa,CAAC,kBAAnB,0CAAA,oBAAyB,IAAI,cAA7B,sCAAA,2BAAiC;IAC1C;IAEA,iBAAuB;QACrB,OAAO,IAAI,CAAC,WAAW,CAAE,WAAW;IACtC;;QA1DA,yDAAyD,QACzD,cAA0C;;AA0D5C","sources":["packages/@react-stately/virtualizer/src/Layout.ts"],"sourcesContent":["/*\n * Copyright 2020 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 {InvalidationContext} from './types';\nimport {ItemDropTarget, Key, LayoutDelegate} from '@react-types/shared';\nimport {LayoutInfo} from './LayoutInfo';\nimport {Rect} from './Rect';\nimport {Size} from './Size';\nimport {Virtualizer} from './Virtualizer';\n\n/**\n * [Virtualizer]{@link Virtualizer} supports arbitrary layout objects, which compute what views are visible, and how\n * to position and style them. However, layouts do not create the views themselves directly. Instead,\n * layouts produce lightweight {@link LayoutInfo} objects which describe various properties of a view,\n * such as its position and size. The {@link Virtualizer} is then responsible for creating the actual\n * views as needed, based on this layout information.\n *\n * Every layout extends from the {@link Layout} abstract base class. Layouts must implement a minimum of the\n * two methods listed below. All other methods can be optionally overridden to implement custom behavior.\n *\n * @see {@link getVisibleLayoutInfos}\n * @see {@link getLayoutInfo}\n */\nexport abstract class Layout<T extends object, O = any> implements LayoutDelegate {\n /** The Virtualizer the layout is currently attached to. */\n virtualizer: Virtualizer<T, any> | null = null;\n\n /**\n * Returns whether the layout should invalidate in response to\n * visible rectangle changes. By default, it only invalidates\n * when the virtualizer's size changes. Return true always\n * to make the layout invalidate while scrolling (e.g. sticky headers).\n */\n shouldInvalidate(newRect: Rect, oldRect: Rect): boolean {\n // By default, invalidate when the size changes\n return newRect.width !== oldRect.width\n || newRect.height !== oldRect.height;\n }\n\n /**\n * This method allows the layout to perform any pre-computation\n * it needs to in order to prepare {@link LayoutInfo}s for retrieval.\n * Called by the virtualizer before {@link getVisibleLayoutInfos}\n * or {@link getLayoutInfo} are called.\n */\n update(invalidationContext: InvalidationContext<O>) {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\n /**\n * Returns an array of {@link LayoutInfo} objects which are inside the given rectangle.\n * Should be implemented by subclasses.\n * @param rect The rectangle that should contain the returned LayoutInfo objects.\n */\n abstract getVisibleLayoutInfos(rect: Rect): LayoutInfo[];\n\n /**\n * Returns a {@link LayoutInfo} for the given key.\n * Should be implemented by subclasses.\n * @param key The key of the LayoutInfo to retrieve.\n */\n abstract getLayoutInfo(key: Key): LayoutInfo | null;\n\n /**\n * Returns size of the content. By default, it returns collectionView's size.\n */\n abstract getContentSize(): Size;\n\n /** \n * Updates the size of the given item.\n */\n updateItemSize?(key: Key, size: Size): boolean;\n\n /**\n * Returns a LayoutInfo for the given drop target.\n */\n getDropTargetLayoutInfo?(target: ItemDropTarget): LayoutInfo;\n\n getItemRect(key: Key): Rect | null {\n return this.getLayoutInfo(key)?.rect ?? null;\n }\n\n getVisibleRect(): Rect {\n return this.virtualizer!.visibleRect;\n }\n}\n"],"names":[],"version":3,"file":"Layout.main.js.map"}
1
+ {"mappings":";;;;;;AAAA;;;;;;;;;;CAUC,GAmBM,MAAe;IAuBpB;;;;;GAKC,GACD,iBAAiB,OAAa,EAAE,OAAa,EAAW;QACtD,+CAA+C;QAC/C,OAAO,QAAQ,KAAK,KAAK,QAAQ,KAAK,IAC/B,QAAQ,MAAM,KAAK,QAAQ,MAAM;IAC1C;IAEA;;;;GAIC,GACD,8BAA8B,UAAa,EAAE,UAAa,EAAW;QACnE,OAAO,eAAe;IACxB;IAEA;;;;;GAKC,GACD,OAAO,mBAA2C,EAAE,CAAC;IAYrD,aAAa,GACb,YAAY,GAAQ,EAAe;YAC1B;YAAA;QAAP,OAAO,CAAA,4BAAA,sBAAA,IAAI,CAAC,aAAa,CAAC,kBAAnB,0CAAA,oBAAyB,IAAI,cAA7B,sCAAA,2BAAiC;IAC1C;IAEA,aAAa,GACb,iBAAuB;QACrB,OAAO,IAAI,CAAC,WAAW,CAAE,WAAW;IACtC;;QArEA,yDAAyD,QACzD,cAA0C;;AAqE5C","sources":["packages/@react-stately/virtualizer/src/Layout.ts"],"sourcesContent":["/*\n * Copyright 2020 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 {InvalidationContext} from './types';\nimport {ItemDropTarget, Key, LayoutDelegate, Node} from '@react-types/shared';\nimport {LayoutInfo} from './LayoutInfo';\nimport {Rect} from './Rect';\nimport {Size} from './Size';\nimport {Virtualizer} from './Virtualizer';\n\n/**\n * Virtualizer supports arbitrary layout objects, which compute what items are visible, and how\n * to position and style them. However, layouts do not render items directly. Instead,\n * layouts produce lightweight LayoutInfo objects which describe various properties of an item,\n * such as its position and size. The Virtualizer is then responsible for creating the actual\n * views as needed, based on this layout information.\n *\n * Every layout extends from the Layout abstract base class. Layouts must implement the `getVisibleLayoutInfos`,\n * `getLayoutInfo`, and `getContentSize` methods. All other methods can be optionally overridden to implement custom behavior.\n */\nexport abstract class Layout<T extends object = Node<any>, O = any> implements LayoutDelegate {\n /** The Virtualizer the layout is currently attached to. */\n virtualizer: Virtualizer<T, any> | null = null;\n\n /**\n * Returns an array of `LayoutInfo` objects which are inside the given rectangle.\n * Should be implemented by subclasses.\n * @param rect The rectangle that should contain the returned LayoutInfo objects.\n */\n abstract getVisibleLayoutInfos(rect: Rect): LayoutInfo[];\n\n /**\n * Returns a `LayoutInfo` for the given key.\n * Should be implemented by subclasses.\n * @param key The key of the LayoutInfo to retrieve.\n */\n abstract getLayoutInfo(key: Key): LayoutInfo | null;\n\n /**\n * Returns size of the content. By default, it returns virtualizer's size.\n */\n abstract getContentSize(): Size; \n\n /**\n * Returns whether the layout should invalidate in response to\n * visible rectangle changes. By default, it only invalidates\n * when the virtualizer's size changes. Return true always\n * to make the layout invalidate while scrolling (e.g. sticky headers).\n */\n shouldInvalidate(newRect: Rect, oldRect: Rect): boolean {\n // By default, invalidate when the size changes\n return newRect.width !== oldRect.width\n || newRect.height !== oldRect.height;\n }\n\n /**\n * Returns whether the layout should invalidate when the layout options change.\n * By default it invalidates when the object identity changes. Override this\n * method to optimize layout updates based on specific option changes.\n */\n shouldInvalidateLayoutOptions(newOptions: O, oldOptions: O): boolean {\n return newOptions !== oldOptions;\n }\n\n /**\n * This method allows the layout to perform any pre-computation\n * it needs to in order to prepare LayoutInfos for retrieval.\n * Called by the virtualizer before `getVisibleLayoutInfos`\n * or `getLayoutInfo` are called.\n */\n update(invalidationContext: InvalidationContext<O>) {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\n /** \n * Updates the size of the given item.\n */\n updateItemSize?(key: Key, size: Size): boolean;\n\n /**\n * Returns a `LayoutInfo` for the given drop target.\n */\n getDropTargetLayoutInfo?(target: ItemDropTarget): LayoutInfo;\n\n /** @private */\n getItemRect(key: Key): Rect | null {\n return this.getLayoutInfo(key)?.rect ?? null;\n }\n\n /** @private */\n getVisibleRect(): Rect {\n return this.virtualizer!.visibleRect;\n }\n}\n"],"names":[],"version":3,"file":"Layout.main.js.map"}
package/dist/Layout.mjs CHANGED
@@ -19,17 +19,24 @@
19
19
  return newRect.width !== oldRect.width || newRect.height !== oldRect.height;
20
20
  }
21
21
  /**
22
+ * Returns whether the layout should invalidate when the layout options change.
23
+ * By default it invalidates when the object identity changes. Override this
24
+ * method to optimize layout updates based on specific option changes.
25
+ */ shouldInvalidateLayoutOptions(newOptions, oldOptions) {
26
+ return newOptions !== oldOptions;
27
+ }
28
+ /**
22
29
  * This method allows the layout to perform any pre-computation
23
- * it needs to in order to prepare {@link LayoutInfo}s for retrieval.
24
- * Called by the virtualizer before {@link getVisibleLayoutInfos}
25
- * or {@link getLayoutInfo} are called.
30
+ * it needs to in order to prepare LayoutInfos for retrieval.
31
+ * Called by the virtualizer before `getVisibleLayoutInfos`
32
+ * or `getLayoutInfo` are called.
26
33
  */ update(invalidationContext) {}
27
- getItemRect(key) {
34
+ /** @private */ getItemRect(key) {
28
35
  var _this_getLayoutInfo;
29
36
  var _this_getLayoutInfo_rect;
30
37
  return (_this_getLayoutInfo_rect = (_this_getLayoutInfo = this.getLayoutInfo(key)) === null || _this_getLayoutInfo === void 0 ? void 0 : _this_getLayoutInfo.rect) !== null && _this_getLayoutInfo_rect !== void 0 ? _this_getLayoutInfo_rect : null;
31
38
  }
32
- getVisibleRect() {
39
+ /** @private */ getVisibleRect() {
33
40
  return this.virtualizer.visibleRect;
34
41
  }
35
42
  constructor(){
@@ -19,17 +19,24 @@
19
19
  return newRect.width !== oldRect.width || newRect.height !== oldRect.height;
20
20
  }
21
21
  /**
22
+ * Returns whether the layout should invalidate when the layout options change.
23
+ * By default it invalidates when the object identity changes. Override this
24
+ * method to optimize layout updates based on specific option changes.
25
+ */ shouldInvalidateLayoutOptions(newOptions, oldOptions) {
26
+ return newOptions !== oldOptions;
27
+ }
28
+ /**
22
29
  * This method allows the layout to perform any pre-computation
23
- * it needs to in order to prepare {@link LayoutInfo}s for retrieval.
24
- * Called by the virtualizer before {@link getVisibleLayoutInfos}
25
- * or {@link getLayoutInfo} are called.
30
+ * it needs to in order to prepare LayoutInfos for retrieval.
31
+ * Called by the virtualizer before `getVisibleLayoutInfos`
32
+ * or `getLayoutInfo` are called.
26
33
  */ update(invalidationContext) {}
27
- getItemRect(key) {
34
+ /** @private */ getItemRect(key) {
28
35
  var _this_getLayoutInfo;
29
36
  var _this_getLayoutInfo_rect;
30
37
  return (_this_getLayoutInfo_rect = (_this_getLayoutInfo = this.getLayoutInfo(key)) === null || _this_getLayoutInfo === void 0 ? void 0 : _this_getLayoutInfo.rect) !== null && _this_getLayoutInfo_rect !== void 0 ? _this_getLayoutInfo_rect : null;
31
38
  }
32
- getVisibleRect() {
39
+ /** @private */ getVisibleRect() {
33
40
  return this.virtualizer.visibleRect;
34
41
  }
35
42
  constructor(){
@@ -1 +1 @@
1
- {"mappings":"AAAA;;;;;;;;;;CAUC,GAsBM,MAAe;IAIpB;;;;;GAKC,GACD,iBAAiB,OAAa,EAAE,OAAa,EAAW;QACtD,+CAA+C;QAC/C,OAAO,QAAQ,KAAK,KAAK,QAAQ,KAAK,IAC/B,QAAQ,MAAM,KAAK,QAAQ,MAAM;IAC1C;IAEA;;;;;GAKC,GACD,OAAO,mBAA2C,EAAE,CAAC;IA+BrD,YAAY,GAAQ,EAAe;YAC1B;YAAA;QAAP,OAAO,CAAA,4BAAA,sBAAA,IAAI,CAAC,aAAa,CAAC,kBAAnB,0CAAA,oBAAyB,IAAI,cAA7B,sCAAA,2BAAiC;IAC1C;IAEA,iBAAuB;QACrB,OAAO,IAAI,CAAC,WAAW,CAAE,WAAW;IACtC;;QA1DA,yDAAyD,QACzD,cAA0C;;AA0D5C","sources":["packages/@react-stately/virtualizer/src/Layout.ts"],"sourcesContent":["/*\n * Copyright 2020 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 {InvalidationContext} from './types';\nimport {ItemDropTarget, Key, LayoutDelegate} from '@react-types/shared';\nimport {LayoutInfo} from './LayoutInfo';\nimport {Rect} from './Rect';\nimport {Size} from './Size';\nimport {Virtualizer} from './Virtualizer';\n\n/**\n * [Virtualizer]{@link Virtualizer} supports arbitrary layout objects, which compute what views are visible, and how\n * to position and style them. However, layouts do not create the views themselves directly. Instead,\n * layouts produce lightweight {@link LayoutInfo} objects which describe various properties of a view,\n * such as its position and size. The {@link Virtualizer} is then responsible for creating the actual\n * views as needed, based on this layout information.\n *\n * Every layout extends from the {@link Layout} abstract base class. Layouts must implement a minimum of the\n * two methods listed below. All other methods can be optionally overridden to implement custom behavior.\n *\n * @see {@link getVisibleLayoutInfos}\n * @see {@link getLayoutInfo}\n */\nexport abstract class Layout<T extends object, O = any> implements LayoutDelegate {\n /** The Virtualizer the layout is currently attached to. */\n virtualizer: Virtualizer<T, any> | null = null;\n\n /**\n * Returns whether the layout should invalidate in response to\n * visible rectangle changes. By default, it only invalidates\n * when the virtualizer's size changes. Return true always\n * to make the layout invalidate while scrolling (e.g. sticky headers).\n */\n shouldInvalidate(newRect: Rect, oldRect: Rect): boolean {\n // By default, invalidate when the size changes\n return newRect.width !== oldRect.width\n || newRect.height !== oldRect.height;\n }\n\n /**\n * This method allows the layout to perform any pre-computation\n * it needs to in order to prepare {@link LayoutInfo}s for retrieval.\n * Called by the virtualizer before {@link getVisibleLayoutInfos}\n * or {@link getLayoutInfo} are called.\n */\n update(invalidationContext: InvalidationContext<O>) {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\n /**\n * Returns an array of {@link LayoutInfo} objects which are inside the given rectangle.\n * Should be implemented by subclasses.\n * @param rect The rectangle that should contain the returned LayoutInfo objects.\n */\n abstract getVisibleLayoutInfos(rect: Rect): LayoutInfo[];\n\n /**\n * Returns a {@link LayoutInfo} for the given key.\n * Should be implemented by subclasses.\n * @param key The key of the LayoutInfo to retrieve.\n */\n abstract getLayoutInfo(key: Key): LayoutInfo | null;\n\n /**\n * Returns size of the content. By default, it returns collectionView's size.\n */\n abstract getContentSize(): Size;\n\n /** \n * Updates the size of the given item.\n */\n updateItemSize?(key: Key, size: Size): boolean;\n\n /**\n * Returns a LayoutInfo for the given drop target.\n */\n getDropTargetLayoutInfo?(target: ItemDropTarget): LayoutInfo;\n\n getItemRect(key: Key): Rect | null {\n return this.getLayoutInfo(key)?.rect ?? null;\n }\n\n getVisibleRect(): Rect {\n return this.virtualizer!.visibleRect;\n }\n}\n"],"names":[],"version":3,"file":"Layout.module.js.map"}
1
+ {"mappings":"AAAA;;;;;;;;;;CAUC,GAmBM,MAAe;IAuBpB;;;;;GAKC,GACD,iBAAiB,OAAa,EAAE,OAAa,EAAW;QACtD,+CAA+C;QAC/C,OAAO,QAAQ,KAAK,KAAK,QAAQ,KAAK,IAC/B,QAAQ,MAAM,KAAK,QAAQ,MAAM;IAC1C;IAEA;;;;GAIC,GACD,8BAA8B,UAAa,EAAE,UAAa,EAAW;QACnE,OAAO,eAAe;IACxB;IAEA;;;;;GAKC,GACD,OAAO,mBAA2C,EAAE,CAAC;IAYrD,aAAa,GACb,YAAY,GAAQ,EAAe;YAC1B;YAAA;QAAP,OAAO,CAAA,4BAAA,sBAAA,IAAI,CAAC,aAAa,CAAC,kBAAnB,0CAAA,oBAAyB,IAAI,cAA7B,sCAAA,2BAAiC;IAC1C;IAEA,aAAa,GACb,iBAAuB;QACrB,OAAO,IAAI,CAAC,WAAW,CAAE,WAAW;IACtC;;QArEA,yDAAyD,QACzD,cAA0C;;AAqE5C","sources":["packages/@react-stately/virtualizer/src/Layout.ts"],"sourcesContent":["/*\n * Copyright 2020 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 {InvalidationContext} from './types';\nimport {ItemDropTarget, Key, LayoutDelegate, Node} from '@react-types/shared';\nimport {LayoutInfo} from './LayoutInfo';\nimport {Rect} from './Rect';\nimport {Size} from './Size';\nimport {Virtualizer} from './Virtualizer';\n\n/**\n * Virtualizer supports arbitrary layout objects, which compute what items are visible, and how\n * to position and style them. However, layouts do not render items directly. Instead,\n * layouts produce lightweight LayoutInfo objects which describe various properties of an item,\n * such as its position and size. The Virtualizer is then responsible for creating the actual\n * views as needed, based on this layout information.\n *\n * Every layout extends from the Layout abstract base class. Layouts must implement the `getVisibleLayoutInfos`,\n * `getLayoutInfo`, and `getContentSize` methods. All other methods can be optionally overridden to implement custom behavior.\n */\nexport abstract class Layout<T extends object = Node<any>, O = any> implements LayoutDelegate {\n /** The Virtualizer the layout is currently attached to. */\n virtualizer: Virtualizer<T, any> | null = null;\n\n /**\n * Returns an array of `LayoutInfo` objects which are inside the given rectangle.\n * Should be implemented by subclasses.\n * @param rect The rectangle that should contain the returned LayoutInfo objects.\n */\n abstract getVisibleLayoutInfos(rect: Rect): LayoutInfo[];\n\n /**\n * Returns a `LayoutInfo` for the given key.\n * Should be implemented by subclasses.\n * @param key The key of the LayoutInfo to retrieve.\n */\n abstract getLayoutInfo(key: Key): LayoutInfo | null;\n\n /**\n * Returns size of the content. By default, it returns virtualizer's size.\n */\n abstract getContentSize(): Size; \n\n /**\n * Returns whether the layout should invalidate in response to\n * visible rectangle changes. By default, it only invalidates\n * when the virtualizer's size changes. Return true always\n * to make the layout invalidate while scrolling (e.g. sticky headers).\n */\n shouldInvalidate(newRect: Rect, oldRect: Rect): boolean {\n // By default, invalidate when the size changes\n return newRect.width !== oldRect.width\n || newRect.height !== oldRect.height;\n }\n\n /**\n * Returns whether the layout should invalidate when the layout options change.\n * By default it invalidates when the object identity changes. Override this\n * method to optimize layout updates based on specific option changes.\n */\n shouldInvalidateLayoutOptions(newOptions: O, oldOptions: O): boolean {\n return newOptions !== oldOptions;\n }\n\n /**\n * This method allows the layout to perform any pre-computation\n * it needs to in order to prepare LayoutInfos for retrieval.\n * Called by the virtualizer before `getVisibleLayoutInfos`\n * or `getLayoutInfo` are called.\n */\n update(invalidationContext: InvalidationContext<O>) {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\n /** \n * Updates the size of the given item.\n */\n updateItemSize?(key: Key, size: Size): boolean;\n\n /**\n * Returns a `LayoutInfo` for the given drop target.\n */\n getDropTargetLayoutInfo?(target: ItemDropTarget): LayoutInfo;\n\n /** @private */\n getItemRect(key: Key): Rect | null {\n return this.getLayoutInfo(key)?.rect ?? null;\n }\n\n /** @private */\n getVisibleRect(): Rect {\n return this.virtualizer!.visibleRect;\n }\n}\n"],"names":[],"version":3,"file":"Layout.module.js.map"}
@@ -30,10 +30,9 @@ $parcel$export(module.exports, "LayoutInfo", () => $8a899922c0a55745$export$7e0e
30
30
  return res;
31
31
  }
32
32
  /**
33
- * @param type A string representing the view type. Should be `'item'` for item views.
34
- Other types are used by supplementary views.
35
- * @param key The unique key for this view.
36
- * @param rect The rectangle describing the size and position of this view.
33
+ * @param type The type of element represented by this LayoutInfo. Should match the `type` of the corresponding collection node.
34
+ * @param key A unique key for this LayoutInfo. Should match the `key` of the corresponding collection node.
35
+ * @param rect The rectangle describing the size and position of this element.
37
36
  */ constructor(type, key, rect){
38
37
  this.type = type;
39
38
  this.key = key;
@@ -1 +1 @@
1
- {"mappings":";;;;;;AAAA;;;;;;;;;;CAUC,GAWM,MAAM;IA8EX;;GAEC,GACD,OAAmB;QACjB,IAAI,MAAM,IAAI,0CAAW,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;QAC5D,IAAI,aAAa,GAAG,IAAI,CAAC,aAAa;QACtC,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO;QAC1B,IAAI,SAAS,GAAG,IAAI,CAAC,SAAS;QAC9B,IAAI,SAAS,GAAG,IAAI,CAAC,SAAS;QAC9B,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO;QAC1B,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ;QAC5B,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM;QACxB,IAAI,aAAa,GAAG,IAAI,CAAC,aAAa;QACtC,OAAO;IACT;IAlCA;;;;;GAKC,GACD,YAAY,IAAY,EAAE,GAAQ,EAAE,IAAU,CAAE;QAC9C,IAAI,CAAC,IAAI,GAAG;QACZ,IAAI,CAAC,GAAG,GAAG;QACX,IAAI,CAAC,SAAS,GAAG;QACjB,IAAI,CAAC,OAAO,GAAG;QACf,IAAI,CAAC,IAAI,GAAG;QACZ,IAAI,CAAC,aAAa,GAAG;QACrB,IAAI,CAAC,QAAQ,GAAG;QAChB,IAAI,CAAC,OAAO,GAAG;QACf,IAAI,CAAC,SAAS,GAAG;QACjB,IAAI,CAAC,MAAM,GAAG;QACd,IAAI,CAAC,aAAa,GAAG;IACvB;AAiBF","sources":["packages/@react-stately/virtualizer/src/LayoutInfo.ts"],"sourcesContent":["/*\n * Copyright 2020 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 {Key} from '@react-types/shared';\nimport {Rect} from './Rect';\n\n/**\n * Instances of this lightweight class are created by {@link Layout} subclasses\n * to represent each view in the {@link Virtualizer}. LayoutInfo objects describe\n * various properties of a view, such as its position and size, and style information.\n * The virtualizer uses this information when creating actual views to display.\n */\nexport class LayoutInfo {\n /**\n * A string representing the view type. Should be `'item'` for item views.\n * Other types are used by supplementary views.\n */\n type: string;\n\n /**\n * A unique key for this view. For item views, it should match the content key.\n */\n key: Key;\n\n /**\n * The key for a parent layout info, if any.\n */\n parentKey: Key | null;\n\n /** \n * Content for this view if it was generated by the layout rather than coming from the Collection.\n */\n content: any | null;\n\n /**\n * The rectangle describing the size and position of this view.\n */\n rect: Rect;\n\n /**\n * Whether the size is estimated. `false` by default.\n */\n estimatedSize: boolean;\n\n /**\n * Whether the layout info sticks to the viewport when scrolling.\n */\n isSticky: boolean;\n\n /**\n * The view's opacity. 1 by default.\n */\n opacity: number;\n\n /**\n * A CSS transform string to apply to the view. `null` by default.\n */\n transform: string | null;\n\n /**\n * The z-index of the view. 0 by default.\n */\n zIndex: number;\n\n /**\n * Whether the layout info allows its contents to overflow its container.\n * @default false\n */\n allowOverflow: boolean;\n\n /**\n * @param type A string representing the view type. Should be `'item'` for item views.\n Other types are used by supplementary views.\n * @param key The unique key for this view.\n * @param rect The rectangle describing the size and position of this view.\n */\n constructor(type: string, key: Key, rect: Rect) {\n this.type = type;\n this.key = key;\n this.parentKey = null;\n this.content = null;\n this.rect = rect;\n this.estimatedSize = false;\n this.isSticky = false;\n this.opacity = 1;\n this.transform = null;\n this.zIndex = 0;\n this.allowOverflow = false;\n }\n\n /**\n * Returns a copy of the LayoutInfo.\n */\n copy(): LayoutInfo {\n let res = new LayoutInfo(this.type, this.key, this.rect.copy());\n res.estimatedSize = this.estimatedSize;\n res.opacity = this.opacity;\n res.transform = this.transform;\n res.parentKey = this.parentKey;\n res.content = this.content;\n res.isSticky = this.isSticky;\n res.zIndex = this.zIndex;\n res.allowOverflow = this.allowOverflow;\n return res;\n }\n}\n"],"names":[],"version":3,"file":"LayoutInfo.main.js.map"}
1
+ {"mappings":";;;;;;AAAA;;;;;;;;;;CAUC,GAWM,MAAM;IAiFX;;GAEC,GACD,OAAmB;QACjB,IAAI,MAAM,IAAI,0CAAW,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;QAC5D,IAAI,aAAa,GAAG,IAAI,CAAC,aAAa;QACtC,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO;QAC1B,IAAI,SAAS,GAAG,IAAI,CAAC,SAAS;QAC9B,IAAI,SAAS,GAAG,IAAI,CAAC,SAAS;QAC9B,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO;QAC1B,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ;QAC5B,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM;QACxB,IAAI,aAAa,GAAG,IAAI,CAAC,aAAa;QACtC,OAAO;IACT;IAjCA;;;;GAIC,GACD,YAAY,IAAY,EAAE,GAAQ,EAAE,IAAU,CAAE;QAC9C,IAAI,CAAC,IAAI,GAAG;QACZ,IAAI,CAAC,GAAG,GAAG;QACX,IAAI,CAAC,SAAS,GAAG;QACjB,IAAI,CAAC,OAAO,GAAG;QACf,IAAI,CAAC,IAAI,GAAG;QACZ,IAAI,CAAC,aAAa,GAAG;QACrB,IAAI,CAAC,QAAQ,GAAG;QAChB,IAAI,CAAC,OAAO,GAAG;QACf,IAAI,CAAC,SAAS,GAAG;QACjB,IAAI,CAAC,MAAM,GAAG;QACd,IAAI,CAAC,aAAa,GAAG;IACvB;AAiBF","sources":["packages/@react-stately/virtualizer/src/LayoutInfo.ts"],"sourcesContent":["/*\n * Copyright 2020 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 {Key} from '@react-types/shared';\nimport {Rect} from './Rect';\n\n/**\n * Instances of this lightweight class are created by `Layout` subclasses\n * to represent each item in the `Virtualizer`. LayoutInfo objects describe\n * various properties of an item, such as its position and size, and style information.\n * The virtualizer uses this information when creating actual DOM elements to display.\n */\nexport class LayoutInfo {\n /**\n * The type of element represented by this LayoutInfo. Should match the `type` of the corresponding collection node.\n */\n type: string;\n\n /**\n * A unique key for this LayoutInfo. Should match the `key` of the corresponding collection node.\n */\n key: Key;\n\n /**\n * The key for a parent LayoutInfo, if any.\n */\n parentKey: Key | null;\n\n /** \n * Content for this item if it was generated by the layout rather than coming from the Collection.\n */\n content: any | null;\n\n /**\n * The rectangle describing the size and position of this element.\n */\n rect: Rect;\n\n /**\n * Whether the size is estimated. `false` by default.\n * Items with estimated sizes will be measured the first time they are added to the DOM.\n * The estimated size is used to calculate the size and position of the scrollbar.\n * @default false\n */\n estimatedSize: boolean;\n\n /**\n * Whether the layout info sticks to the viewport when scrolling.\n * @default false\n */\n isSticky: boolean;\n\n /**\n * The element's opacity.\n * @default 1\n */\n opacity: number;\n\n /**\n * A CSS transform string to apply to the element. `null` by default.\n */\n transform: string | null;\n\n /**\n * The z-index of the element. 0 by default.\n */\n zIndex: number;\n\n /**\n * Whether the element allows its contents to overflow its container.\n * @default false\n */\n allowOverflow: boolean;\n\n /**\n * @param type The type of element represented by this LayoutInfo. Should match the `type` of the corresponding collection node.\n * @param key A unique key for this LayoutInfo. Should match the `key` of the corresponding collection node.\n * @param rect The rectangle describing the size and position of this element.\n */\n constructor(type: string, key: Key, rect: Rect) {\n this.type = type;\n this.key = key;\n this.parentKey = null;\n this.content = null;\n this.rect = rect;\n this.estimatedSize = false;\n this.isSticky = false;\n this.opacity = 1;\n this.transform = null;\n this.zIndex = 0;\n this.allowOverflow = false;\n }\n\n /**\n * Returns a copy of the LayoutInfo.\n */\n copy(): LayoutInfo {\n let res = new LayoutInfo(this.type, this.key, this.rect.copy());\n res.estimatedSize = this.estimatedSize;\n res.opacity = this.opacity;\n res.transform = this.transform;\n res.parentKey = this.parentKey;\n res.content = this.content;\n res.isSticky = this.isSticky;\n res.zIndex = this.zIndex;\n res.allowOverflow = this.allowOverflow;\n return res;\n }\n}\n"],"names":[],"version":3,"file":"LayoutInfo.main.js.map"}
@@ -24,10 +24,9 @@
24
24
  return res;
25
25
  }
26
26
  /**
27
- * @param type A string representing the view type. Should be `'item'` for item views.
28
- Other types are used by supplementary views.
29
- * @param key The unique key for this view.
30
- * @param rect The rectangle describing the size and position of this view.
27
+ * @param type The type of element represented by this LayoutInfo. Should match the `type` of the corresponding collection node.
28
+ * @param key A unique key for this LayoutInfo. Should match the `key` of the corresponding collection node.
29
+ * @param rect The rectangle describing the size and position of this element.
31
30
  */ constructor(type, key, rect){
32
31
  this.type = type;
33
32
  this.key = key;
@@ -24,10 +24,9 @@
24
24
  return res;
25
25
  }
26
26
  /**
27
- * @param type A string representing the view type. Should be `'item'` for item views.
28
- Other types are used by supplementary views.
29
- * @param key The unique key for this view.
30
- * @param rect The rectangle describing the size and position of this view.
27
+ * @param type The type of element represented by this LayoutInfo. Should match the `type` of the corresponding collection node.
28
+ * @param key A unique key for this LayoutInfo. Should match the `key` of the corresponding collection node.
29
+ * @param rect The rectangle describing the size and position of this element.
31
30
  */ constructor(type, key, rect){
32
31
  this.type = type;
33
32
  this.key = key;
@@ -1 +1 @@
1
- {"mappings":"AAAA;;;;;;;;;;CAUC,GAWM,MAAM;IA8EX;;GAEC,GACD,OAAmB;QACjB,IAAI,MAAM,IAAI,0CAAW,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;QAC5D,IAAI,aAAa,GAAG,IAAI,CAAC,aAAa;QACtC,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO;QAC1B,IAAI,SAAS,GAAG,IAAI,CAAC,SAAS;QAC9B,IAAI,SAAS,GAAG,IAAI,CAAC,SAAS;QAC9B,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO;QAC1B,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ;QAC5B,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM;QACxB,IAAI,aAAa,GAAG,IAAI,CAAC,aAAa;QACtC,OAAO;IACT;IAlCA;;;;;GAKC,GACD,YAAY,IAAY,EAAE,GAAQ,EAAE,IAAU,CAAE;QAC9C,IAAI,CAAC,IAAI,GAAG;QACZ,IAAI,CAAC,GAAG,GAAG;QACX,IAAI,CAAC,SAAS,GAAG;QACjB,IAAI,CAAC,OAAO,GAAG;QACf,IAAI,CAAC,IAAI,GAAG;QACZ,IAAI,CAAC,aAAa,GAAG;QACrB,IAAI,CAAC,QAAQ,GAAG;QAChB,IAAI,CAAC,OAAO,GAAG;QACf,IAAI,CAAC,SAAS,GAAG;QACjB,IAAI,CAAC,MAAM,GAAG;QACd,IAAI,CAAC,aAAa,GAAG;IACvB;AAiBF","sources":["packages/@react-stately/virtualizer/src/LayoutInfo.ts"],"sourcesContent":["/*\n * Copyright 2020 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 {Key} from '@react-types/shared';\nimport {Rect} from './Rect';\n\n/**\n * Instances of this lightweight class are created by {@link Layout} subclasses\n * to represent each view in the {@link Virtualizer}. LayoutInfo objects describe\n * various properties of a view, such as its position and size, and style information.\n * The virtualizer uses this information when creating actual views to display.\n */\nexport class LayoutInfo {\n /**\n * A string representing the view type. Should be `'item'` for item views.\n * Other types are used by supplementary views.\n */\n type: string;\n\n /**\n * A unique key for this view. For item views, it should match the content key.\n */\n key: Key;\n\n /**\n * The key for a parent layout info, if any.\n */\n parentKey: Key | null;\n\n /** \n * Content for this view if it was generated by the layout rather than coming from the Collection.\n */\n content: any | null;\n\n /**\n * The rectangle describing the size and position of this view.\n */\n rect: Rect;\n\n /**\n * Whether the size is estimated. `false` by default.\n */\n estimatedSize: boolean;\n\n /**\n * Whether the layout info sticks to the viewport when scrolling.\n */\n isSticky: boolean;\n\n /**\n * The view's opacity. 1 by default.\n */\n opacity: number;\n\n /**\n * A CSS transform string to apply to the view. `null` by default.\n */\n transform: string | null;\n\n /**\n * The z-index of the view. 0 by default.\n */\n zIndex: number;\n\n /**\n * Whether the layout info allows its contents to overflow its container.\n * @default false\n */\n allowOverflow: boolean;\n\n /**\n * @param type A string representing the view type. Should be `'item'` for item views.\n Other types are used by supplementary views.\n * @param key The unique key for this view.\n * @param rect The rectangle describing the size and position of this view.\n */\n constructor(type: string, key: Key, rect: Rect) {\n this.type = type;\n this.key = key;\n this.parentKey = null;\n this.content = null;\n this.rect = rect;\n this.estimatedSize = false;\n this.isSticky = false;\n this.opacity = 1;\n this.transform = null;\n this.zIndex = 0;\n this.allowOverflow = false;\n }\n\n /**\n * Returns a copy of the LayoutInfo.\n */\n copy(): LayoutInfo {\n let res = new LayoutInfo(this.type, this.key, this.rect.copy());\n res.estimatedSize = this.estimatedSize;\n res.opacity = this.opacity;\n res.transform = this.transform;\n res.parentKey = this.parentKey;\n res.content = this.content;\n res.isSticky = this.isSticky;\n res.zIndex = this.zIndex;\n res.allowOverflow = this.allowOverflow;\n return res;\n }\n}\n"],"names":[],"version":3,"file":"LayoutInfo.module.js.map"}
1
+ {"mappings":"AAAA;;;;;;;;;;CAUC,GAWM,MAAM;IAiFX;;GAEC,GACD,OAAmB;QACjB,IAAI,MAAM,IAAI,0CAAW,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;QAC5D,IAAI,aAAa,GAAG,IAAI,CAAC,aAAa;QACtC,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO;QAC1B,IAAI,SAAS,GAAG,IAAI,CAAC,SAAS;QAC9B,IAAI,SAAS,GAAG,IAAI,CAAC,SAAS;QAC9B,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO;QAC1B,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ;QAC5B,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM;QACxB,IAAI,aAAa,GAAG,IAAI,CAAC,aAAa;QACtC,OAAO;IACT;IAjCA;;;;GAIC,GACD,YAAY,IAAY,EAAE,GAAQ,EAAE,IAAU,CAAE;QAC9C,IAAI,CAAC,IAAI,GAAG;QACZ,IAAI,CAAC,GAAG,GAAG;QACX,IAAI,CAAC,SAAS,GAAG;QACjB,IAAI,CAAC,OAAO,GAAG;QACf,IAAI,CAAC,IAAI,GAAG;QACZ,IAAI,CAAC,aAAa,GAAG;QACrB,IAAI,CAAC,QAAQ,GAAG;QAChB,IAAI,CAAC,OAAO,GAAG;QACf,IAAI,CAAC,SAAS,GAAG;QACjB,IAAI,CAAC,MAAM,GAAG;QACd,IAAI,CAAC,aAAa,GAAG;IACvB;AAiBF","sources":["packages/@react-stately/virtualizer/src/LayoutInfo.ts"],"sourcesContent":["/*\n * Copyright 2020 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 {Key} from '@react-types/shared';\nimport {Rect} from './Rect';\n\n/**\n * Instances of this lightweight class are created by `Layout` subclasses\n * to represent each item in the `Virtualizer`. LayoutInfo objects describe\n * various properties of an item, such as its position and size, and style information.\n * The virtualizer uses this information when creating actual DOM elements to display.\n */\nexport class LayoutInfo {\n /**\n * The type of element represented by this LayoutInfo. Should match the `type` of the corresponding collection node.\n */\n type: string;\n\n /**\n * A unique key for this LayoutInfo. Should match the `key` of the corresponding collection node.\n */\n key: Key;\n\n /**\n * The key for a parent LayoutInfo, if any.\n */\n parentKey: Key | null;\n\n /** \n * Content for this item if it was generated by the layout rather than coming from the Collection.\n */\n content: any | null;\n\n /**\n * The rectangle describing the size and position of this element.\n */\n rect: Rect;\n\n /**\n * Whether the size is estimated. `false` by default.\n * Items with estimated sizes will be measured the first time they are added to the DOM.\n * The estimated size is used to calculate the size and position of the scrollbar.\n * @default false\n */\n estimatedSize: boolean;\n\n /**\n * Whether the layout info sticks to the viewport when scrolling.\n * @default false\n */\n isSticky: boolean;\n\n /**\n * The element's opacity.\n * @default 1\n */\n opacity: number;\n\n /**\n * A CSS transform string to apply to the element. `null` by default.\n */\n transform: string | null;\n\n /**\n * The z-index of the element. 0 by default.\n */\n zIndex: number;\n\n /**\n * Whether the element allows its contents to overflow its container.\n * @default false\n */\n allowOverflow: boolean;\n\n /**\n * @param type The type of element represented by this LayoutInfo. Should match the `type` of the corresponding collection node.\n * @param key A unique key for this LayoutInfo. Should match the `key` of the corresponding collection node.\n * @param rect The rectangle describing the size and position of this element.\n */\n constructor(type: string, key: Key, rect: Rect) {\n this.type = type;\n this.key = key;\n this.parentKey = null;\n this.content = null;\n this.rect = rect;\n this.estimatedSize = false;\n this.isSticky = false;\n this.opacity = 1;\n this.transform = null;\n this.zIndex = 0;\n this.allowOverflow = false;\n }\n\n /**\n * Returns a copy of the LayoutInfo.\n */\n copy(): LayoutInfo {\n let res = new LayoutInfo(this.type, this.key, this.rect.copy());\n res.estimatedSize = this.estimatedSize;\n res.opacity = this.opacity;\n res.transform = this.transform;\n res.parentKey = this.parentKey;\n res.content = this.content;\n res.isSticky = this.isSticky;\n res.zIndex = this.zIndex;\n res.allowOverflow = this.allowOverflow;\n return res;\n }\n}\n"],"names":[],"version":3,"file":"LayoutInfo.module.js.map"}
@@ -1 +1 @@
1
- {"mappings":";;;;;;;AAAA;;;;;;;;;;CAUC,GAMD,IAAI,4BAAM;AAMH,MAAM;IA6BX;;GAEC,GACD,kBAAkB;QAChB,IAAI,CAAC,OAAO,GAAG;QACf,IAAI,CAAC,QAAQ,GAAG;QAChB,IAAI,CAAC,UAAU,GAAG;IACpB;IAEA,gBAAgB,SAAiB,EAAE;QACjC,4FAA4F;QAC5F,oGAAoG;QACpG,iGAAiG;QACjG,sEAAsE;QACtE,IAAI,WAAW,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;QACtC,IAAI,OAAO,YAAY,SAAS,MAAM,GAAG,IACrC,SAAS,KAAK,KACd,IAAI,0CAAgB,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE;QAEhD,OAAO;IACT;IAEA,WAAW,KAAsB,EAAE;QACjC,MAAM,eAAe;QACrB,IAAI,WAAW,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,QAAQ;QACpD,IAAI,CAAC,UAAU;YACb,WAAW,EAAE;YACb,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,QAAQ,EAAE;QACzC;QACA,SAAS,IAAI,CAAC;IAChB;IAzCA,YAAY,WAA8B,EAAE,QAAgB,CAAE;QAC5D,IAAI,CAAC,WAAW,GAAG;QACnB,IAAI,CAAC,GAAG,GAAG,EAAE;QACb,IAAI,CAAC,QAAQ,GAAG;QAChB,IAAI,CAAC,QAAQ,GAAG,IAAI;QACpB,IAAI,CAAC,aAAa,GAAG,IAAI;QACzB,IAAI,CAAC,UAAU,GAAG;QAClB,IAAI,CAAC,OAAO,GAAG;QACf,IAAI,CAAC,QAAQ,GAAG;IAClB;AAiCF;AAEO,MAAM,kDAAsC;IACjD,YAAY,WAA8B,CAAE;QAC1C,KAAK,CAAC,aAAa;IACrB;AACF;AAEO,MAAM,kDAAuC;IAGlD,YAAY,WAA8B,EAAE,MAA0B,EAAE,QAAgB,CAAE;QACxF,KAAK,CAAC,aAAa;QACnB,IAAI,CAAC,MAAM,GAAG;IAChB;AACF","sources":["packages/@react-stately/virtualizer/src/ReusableView.ts"],"sourcesContent":["/*\n * Copyright 2020 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 {Key} from '@react-types/shared';\nimport {LayoutInfo} from './LayoutInfo';\nimport {Virtualizer} from './Virtualizer';\n\nlet KEY = 0;\n\n/**\n * [Virtualizer]{@link Virtualizer} creates instances of the [ReusableView]{@link ReusableView} class to\n * represent views currently being displayed.\n */\nexport class ReusableView<T extends object, V> {\n /** The Virtualizer this view is a part of. */\n virtualizer: Virtualizer<T, V>;\n\n /** The LayoutInfo this view is currently representing. */\n layoutInfo: LayoutInfo | null;\n\n /** The content currently being displayed by this view, set by the virtualizer. */\n content: T | null;\n\n rendered: V | null;\n\n viewType: string;\n key: Key;\n\n children: Set<ChildView<T, V>>;\n reusableViews: Map<string, ChildView<T, V>[]>;\n\n constructor(virtualizer: Virtualizer<T, V>, viewType: string) {\n this.virtualizer = virtualizer;\n this.key = ++KEY;\n this.viewType = viewType;\n this.children = new Set();\n this.reusableViews = new Map();\n this.layoutInfo = null;\n this.content = null;\n this.rendered = null;\n }\n\n /**\n * Prepares the view for reuse. Called just before the view is removed from the DOM.\n */\n prepareForReuse() {\n this.content = null;\n this.rendered = null;\n this.layoutInfo = null;\n }\n\n getReusableView(reuseType: string) {\n // Reusable view queue should be FIFO so that DOM order remains consistent during scrolling.\n // For example, cells within a row should remain in the same order even if the row changes contents.\n // The cells within a row are removed from their parent in order. If the row is reused, the cells\n // should be reused in the new row in the same order they were before.\n let reusable = this.reusableViews.get(reuseType);\n let view = reusable && reusable.length > 0\n ? reusable.shift()!\n : new ChildView<T, V>(this.virtualizer, this, reuseType);\n\n return view;\n }\n\n reuseChild(child: ChildView<T, V>) {\n child.prepareForReuse();\n let reusable = this.reusableViews.get(child.viewType);\n if (!reusable) {\n reusable = [];\n this.reusableViews.set(child.viewType, reusable);\n }\n reusable.push(child);\n }\n}\n\nexport class RootView<T extends object, V> extends ReusableView<T, V> {\n constructor(virtualizer: Virtualizer<T, V>) {\n super(virtualizer, 'root');\n }\n}\n\nexport class ChildView<T extends object, V> extends ReusableView<T, V> {\n parent: ReusableView<T, V>;\n\n constructor(virtualizer: Virtualizer<T, V>, parent: ReusableView<T, V>, viewType: string) {\n super(virtualizer, viewType);\n this.parent = parent;\n }\n}\n"],"names":[],"version":3,"file":"ReusableView.main.js.map"}
1
+ {"mappings":";;;;;;;AAAA;;;;;;;;;;CAUC,GAMD,IAAI,4BAAM;AAMH,MAAM;IA6BX;;GAEC,GACD,kBAAkB;QAChB,IAAI,CAAC,OAAO,GAAG;QACf,IAAI,CAAC,QAAQ,GAAG;QAChB,IAAI,CAAC,UAAU,GAAG;IACpB;IAEA,gBAAgB,SAAiB,EAAE;QACjC,4FAA4F;QAC5F,oGAAoG;QACpG,iGAAiG;QACjG,sEAAsE;QACtE,IAAI,WAAW,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;QACtC,IAAI,OAAO,YAAY,SAAS,MAAM,GAAG,IACrC,SAAS,KAAK,KACd,IAAI,0CAAgB,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE;QAEhD,OAAO;IACT;IAEA,WAAW,KAAsB,EAAE;QACjC,MAAM,eAAe;QACrB,IAAI,WAAW,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,QAAQ;QACpD,IAAI,CAAC,UAAU;YACb,WAAW,EAAE;YACb,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,QAAQ,EAAE;QACzC;QACA,SAAS,IAAI,CAAC;IAChB;IAzCA,YAAY,WAA8B,EAAE,QAAgB,CAAE;QAC5D,IAAI,CAAC,WAAW,GAAG;QACnB,IAAI,CAAC,GAAG,GAAG,EAAE;QACb,IAAI,CAAC,QAAQ,GAAG;QAChB,IAAI,CAAC,QAAQ,GAAG,IAAI;QACpB,IAAI,CAAC,aAAa,GAAG,IAAI;QACzB,IAAI,CAAC,UAAU,GAAG;QAClB,IAAI,CAAC,OAAO,GAAG;QACf,IAAI,CAAC,QAAQ,GAAG;IAClB;AAiCF;AAEO,MAAM,kDAAsC;IACjD,YAAY,WAA8B,CAAE;QAC1C,KAAK,CAAC,aAAa;IACrB;AACF;AAEO,MAAM,kDAAuC;IAGlD,YAAY,WAA8B,EAAE,MAA0B,EAAE,QAAgB,CAAE;QACxF,KAAK,CAAC,aAAa;QACnB,IAAI,CAAC,MAAM,GAAG;IAChB;AACF","sources":["packages/@react-stately/virtualizer/src/ReusableView.ts"],"sourcesContent":["/*\n * Copyright 2020 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 {Key} from '@react-types/shared';\nimport {LayoutInfo} from './LayoutInfo';\nimport {Virtualizer} from './Virtualizer';\n\nlet KEY = 0;\n\n/**\n * `Virtualizer` creates instances of the `ReusableView` class to\n * represent views currently being displayed.\n */\nexport class ReusableView<T extends object, V> {\n /** The Virtualizer this view is a part of. */\n virtualizer: Virtualizer<T, V>;\n\n /** The LayoutInfo this view is currently representing. */\n layoutInfo: LayoutInfo | null;\n\n /** The content currently being displayed by this view, set by the virtualizer. */\n content: T | null;\n\n rendered: V | null;\n\n viewType: string;\n key: Key;\n\n children: Set<ChildView<T, V>>;\n reusableViews: Map<string, ChildView<T, V>[]>;\n\n constructor(virtualizer: Virtualizer<T, V>, viewType: string) {\n this.virtualizer = virtualizer;\n this.key = ++KEY;\n this.viewType = viewType;\n this.children = new Set();\n this.reusableViews = new Map();\n this.layoutInfo = null;\n this.content = null;\n this.rendered = null;\n }\n\n /**\n * Prepares the view for reuse. Called just before the view is removed from the DOM.\n */\n prepareForReuse() {\n this.content = null;\n this.rendered = null;\n this.layoutInfo = null;\n }\n\n getReusableView(reuseType: string) {\n // Reusable view queue should be FIFO so that DOM order remains consistent during scrolling.\n // For example, cells within a row should remain in the same order even if the row changes contents.\n // The cells within a row are removed from their parent in order. If the row is reused, the cells\n // should be reused in the new row in the same order they were before.\n let reusable = this.reusableViews.get(reuseType);\n let view = reusable && reusable.length > 0\n ? reusable.shift()!\n : new ChildView<T, V>(this.virtualizer, this, reuseType);\n\n return view;\n }\n\n reuseChild(child: ChildView<T, V>) {\n child.prepareForReuse();\n let reusable = this.reusableViews.get(child.viewType);\n if (!reusable) {\n reusable = [];\n this.reusableViews.set(child.viewType, reusable);\n }\n reusable.push(child);\n }\n}\n\nexport class RootView<T extends object, V> extends ReusableView<T, V> {\n constructor(virtualizer: Virtualizer<T, V>) {\n super(virtualizer, 'root');\n }\n}\n\nexport class ChildView<T extends object, V> extends ReusableView<T, V> {\n parent: ReusableView<T, V>;\n\n constructor(virtualizer: Virtualizer<T, V>, parent: ReusableView<T, V>, viewType: string) {\n super(virtualizer, viewType);\n this.parent = parent;\n }\n}\n"],"names":[],"version":3,"file":"ReusableView.main.js.map"}
@@ -1 +1 @@
1
- {"mappings":"AAAA;;;;;;;;;;CAUC,GAMD,IAAI,4BAAM;AAMH,MAAM;IA6BX;;GAEC,GACD,kBAAkB;QAChB,IAAI,CAAC,OAAO,GAAG;QACf,IAAI,CAAC,QAAQ,GAAG;QAChB,IAAI,CAAC,UAAU,GAAG;IACpB;IAEA,gBAAgB,SAAiB,EAAE;QACjC,4FAA4F;QAC5F,oGAAoG;QACpG,iGAAiG;QACjG,sEAAsE;QACtE,IAAI,WAAW,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;QACtC,IAAI,OAAO,YAAY,SAAS,MAAM,GAAG,IACrC,SAAS,KAAK,KACd,IAAI,0CAAgB,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE;QAEhD,OAAO;IACT;IAEA,WAAW,KAAsB,EAAE;QACjC,MAAM,eAAe;QACrB,IAAI,WAAW,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,QAAQ;QACpD,IAAI,CAAC,UAAU;YACb,WAAW,EAAE;YACb,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,QAAQ,EAAE;QACzC;QACA,SAAS,IAAI,CAAC;IAChB;IAzCA,YAAY,WAA8B,EAAE,QAAgB,CAAE;QAC5D,IAAI,CAAC,WAAW,GAAG;QACnB,IAAI,CAAC,GAAG,GAAG,EAAE;QACb,IAAI,CAAC,QAAQ,GAAG;QAChB,IAAI,CAAC,QAAQ,GAAG,IAAI;QACpB,IAAI,CAAC,aAAa,GAAG,IAAI;QACzB,IAAI,CAAC,UAAU,GAAG;QAClB,IAAI,CAAC,OAAO,GAAG;QACf,IAAI,CAAC,QAAQ,GAAG;IAClB;AAiCF;AAEO,MAAM,kDAAsC;IACjD,YAAY,WAA8B,CAAE;QAC1C,KAAK,CAAC,aAAa;IACrB;AACF;AAEO,MAAM,kDAAuC;IAGlD,YAAY,WAA8B,EAAE,MAA0B,EAAE,QAAgB,CAAE;QACxF,KAAK,CAAC,aAAa;QACnB,IAAI,CAAC,MAAM,GAAG;IAChB;AACF","sources":["packages/@react-stately/virtualizer/src/ReusableView.ts"],"sourcesContent":["/*\n * Copyright 2020 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 {Key} from '@react-types/shared';\nimport {LayoutInfo} from './LayoutInfo';\nimport {Virtualizer} from './Virtualizer';\n\nlet KEY = 0;\n\n/**\n * [Virtualizer]{@link Virtualizer} creates instances of the [ReusableView]{@link ReusableView} class to\n * represent views currently being displayed.\n */\nexport class ReusableView<T extends object, V> {\n /** The Virtualizer this view is a part of. */\n virtualizer: Virtualizer<T, V>;\n\n /** The LayoutInfo this view is currently representing. */\n layoutInfo: LayoutInfo | null;\n\n /** The content currently being displayed by this view, set by the virtualizer. */\n content: T | null;\n\n rendered: V | null;\n\n viewType: string;\n key: Key;\n\n children: Set<ChildView<T, V>>;\n reusableViews: Map<string, ChildView<T, V>[]>;\n\n constructor(virtualizer: Virtualizer<T, V>, viewType: string) {\n this.virtualizer = virtualizer;\n this.key = ++KEY;\n this.viewType = viewType;\n this.children = new Set();\n this.reusableViews = new Map();\n this.layoutInfo = null;\n this.content = null;\n this.rendered = null;\n }\n\n /**\n * Prepares the view for reuse. Called just before the view is removed from the DOM.\n */\n prepareForReuse() {\n this.content = null;\n this.rendered = null;\n this.layoutInfo = null;\n }\n\n getReusableView(reuseType: string) {\n // Reusable view queue should be FIFO so that DOM order remains consistent during scrolling.\n // For example, cells within a row should remain in the same order even if the row changes contents.\n // The cells within a row are removed from their parent in order. If the row is reused, the cells\n // should be reused in the new row in the same order they were before.\n let reusable = this.reusableViews.get(reuseType);\n let view = reusable && reusable.length > 0\n ? reusable.shift()!\n : new ChildView<T, V>(this.virtualizer, this, reuseType);\n\n return view;\n }\n\n reuseChild(child: ChildView<T, V>) {\n child.prepareForReuse();\n let reusable = this.reusableViews.get(child.viewType);\n if (!reusable) {\n reusable = [];\n this.reusableViews.set(child.viewType, reusable);\n }\n reusable.push(child);\n }\n}\n\nexport class RootView<T extends object, V> extends ReusableView<T, V> {\n constructor(virtualizer: Virtualizer<T, V>) {\n super(virtualizer, 'root');\n }\n}\n\nexport class ChildView<T extends object, V> extends ReusableView<T, V> {\n parent: ReusableView<T, V>;\n\n constructor(virtualizer: Virtualizer<T, V>, parent: ReusableView<T, V>, viewType: string) {\n super(virtualizer, viewType);\n this.parent = parent;\n }\n}\n"],"names":[],"version":3,"file":"ReusableView.module.js.map"}
1
+ {"mappings":"AAAA;;;;;;;;;;CAUC,GAMD,IAAI,4BAAM;AAMH,MAAM;IA6BX;;GAEC,GACD,kBAAkB;QAChB,IAAI,CAAC,OAAO,GAAG;QACf,IAAI,CAAC,QAAQ,GAAG;QAChB,IAAI,CAAC,UAAU,GAAG;IACpB;IAEA,gBAAgB,SAAiB,EAAE;QACjC,4FAA4F;QAC5F,oGAAoG;QACpG,iGAAiG;QACjG,sEAAsE;QACtE,IAAI,WAAW,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;QACtC,IAAI,OAAO,YAAY,SAAS,MAAM,GAAG,IACrC,SAAS,KAAK,KACd,IAAI,0CAAgB,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE;QAEhD,OAAO;IACT;IAEA,WAAW,KAAsB,EAAE;QACjC,MAAM,eAAe;QACrB,IAAI,WAAW,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,QAAQ;QACpD,IAAI,CAAC,UAAU;YACb,WAAW,EAAE;YACb,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,QAAQ,EAAE;QACzC;QACA,SAAS,IAAI,CAAC;IAChB;IAzCA,YAAY,WAA8B,EAAE,QAAgB,CAAE;QAC5D,IAAI,CAAC,WAAW,GAAG;QACnB,IAAI,CAAC,GAAG,GAAG,EAAE;QACb,IAAI,CAAC,QAAQ,GAAG;QAChB,IAAI,CAAC,QAAQ,GAAG,IAAI;QACpB,IAAI,CAAC,aAAa,GAAG,IAAI;QACzB,IAAI,CAAC,UAAU,GAAG;QAClB,IAAI,CAAC,OAAO,GAAG;QACf,IAAI,CAAC,QAAQ,GAAG;IAClB;AAiCF;AAEO,MAAM,kDAAsC;IACjD,YAAY,WAA8B,CAAE;QAC1C,KAAK,CAAC,aAAa;IACrB;AACF;AAEO,MAAM,kDAAuC;IAGlD,YAAY,WAA8B,EAAE,MAA0B,EAAE,QAAgB,CAAE;QACxF,KAAK,CAAC,aAAa;QACnB,IAAI,CAAC,MAAM,GAAG;IAChB;AACF","sources":["packages/@react-stately/virtualizer/src/ReusableView.ts"],"sourcesContent":["/*\n * Copyright 2020 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 {Key} from '@react-types/shared';\nimport {LayoutInfo} from './LayoutInfo';\nimport {Virtualizer} from './Virtualizer';\n\nlet KEY = 0;\n\n/**\n * `Virtualizer` creates instances of the `ReusableView` class to\n * represent views currently being displayed.\n */\nexport class ReusableView<T extends object, V> {\n /** The Virtualizer this view is a part of. */\n virtualizer: Virtualizer<T, V>;\n\n /** The LayoutInfo this view is currently representing. */\n layoutInfo: LayoutInfo | null;\n\n /** The content currently being displayed by this view, set by the virtualizer. */\n content: T | null;\n\n rendered: V | null;\n\n viewType: string;\n key: Key;\n\n children: Set<ChildView<T, V>>;\n reusableViews: Map<string, ChildView<T, V>[]>;\n\n constructor(virtualizer: Virtualizer<T, V>, viewType: string) {\n this.virtualizer = virtualizer;\n this.key = ++KEY;\n this.viewType = viewType;\n this.children = new Set();\n this.reusableViews = new Map();\n this.layoutInfo = null;\n this.content = null;\n this.rendered = null;\n }\n\n /**\n * Prepares the view for reuse. Called just before the view is removed from the DOM.\n */\n prepareForReuse() {\n this.content = null;\n this.rendered = null;\n this.layoutInfo = null;\n }\n\n getReusableView(reuseType: string) {\n // Reusable view queue should be FIFO so that DOM order remains consistent during scrolling.\n // For example, cells within a row should remain in the same order even if the row changes contents.\n // The cells within a row are removed from their parent in order. If the row is reused, the cells\n // should be reused in the new row in the same order they were before.\n let reusable = this.reusableViews.get(reuseType);\n let view = reusable && reusable.length > 0\n ? reusable.shift()!\n : new ChildView<T, V>(this.virtualizer, this, reuseType);\n\n return view;\n }\n\n reuseChild(child: ChildView<T, V>) {\n child.prepareForReuse();\n let reusable = this.reusableViews.get(child.viewType);\n if (!reusable) {\n reusable = [];\n this.reusableViews.set(child.viewType, reusable);\n }\n reusable.push(child);\n }\n}\n\nexport class RootView<T extends object, V> extends ReusableView<T, V> {\n constructor(virtualizer: Virtualizer<T, V>) {\n super(virtualizer, 'root');\n }\n}\n\nexport class ChildView<T extends object, V> extends ReusableView<T, V> {\n parent: ReusableView<T, V>;\n\n constructor(virtualizer: Virtualizer<T, V>, parent: ReusableView<T, V>, viewType: string) {\n super(virtualizer, viewType);\n this.parent = parent;\n }\n}\n"],"names":[],"version":3,"file":"ReusableView.module.js.map"}
@@ -155,6 +155,7 @@ class $e1bc15d49d21df0e$export$89be5a243e59c4b2 {
155
155
  let offsetChanged = false;
156
156
  let sizeChanged = false;
157
157
  let itemSizeChanged = false;
158
+ let layoutOptionsChanged = false;
158
159
  let needsUpdate = false;
159
160
  if (opts.collection !== this.collection) {
160
161
  mutableThis.collection = opts.collection;
@@ -185,8 +186,8 @@ class $e1bc15d49d21df0e$export$89be5a243e59c4b2 {
185
186
  sizeChanged || (sizeChanged = opts.invalidationContext.sizeChanged || false);
186
187
  offsetChanged || (offsetChanged = opts.invalidationContext.offsetChanged || false);
187
188
  itemSizeChanged || (itemSizeChanged = opts.invalidationContext.itemSizeChanged || false);
188
- needsLayout || (needsLayout = itemSizeChanged || sizeChanged || offsetChanged);
189
- needsLayout || (needsLayout = opts.invalidationContext.layoutOptions !== this._invalidationContext.layoutOptions);
189
+ layoutOptionsChanged || (layoutOptionsChanged = opts.invalidationContext.layoutOptions != null && this._invalidationContext.layoutOptions != null && opts.invalidationContext.layoutOptions !== this._invalidationContext.layoutOptions && this.layout.shouldInvalidateLayoutOptions(opts.invalidationContext.layoutOptions, this._invalidationContext.layoutOptions));
190
+ needsLayout || (needsLayout = itemSizeChanged || sizeChanged || offsetChanged || layoutOptionsChanged);
190
191
  }
191
192
  this._invalidationContext = opts.invalidationContext;
192
193
  }
@@ -199,6 +200,7 @@ class $e1bc15d49d21df0e$export$89be5a243e59c4b2 {
199
200
  offsetChanged: offsetChanged,
200
201
  sizeChanged: sizeChanged,
201
202
  itemSizeChanged: itemSizeChanged,
203
+ layoutOptionsChanged: layoutOptionsChanged,
202
204
  layoutOptions: this._invalidationContext.layoutOptions
203
205
  });
204
206
  else if (needsUpdate) this.updateSubviews();
@@ -1 +1 @@
1
- {"mappings":"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","sources":["packages/@react-stately/virtualizer/src/Virtualizer.ts"],"sourcesContent":["/*\n * Copyright 2020 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 {ChildView, ReusableView, RootView} from './ReusableView';\nimport {Collection, Key} from '@react-types/shared';\nimport {InvalidationContext, Mutable, VirtualizerDelegate, VirtualizerRenderOptions} from './types';\nimport {isSetEqual} from './utils';\nimport {Layout} from './Layout';\nimport {LayoutInfo} from './LayoutInfo';\nimport {OverscanManager} from './OverscanManager';\nimport {Point} from './Point';\nimport {Rect} from './Rect';\nimport {Size} from './Size';\n\ninterface VirtualizerOptions<T extends object, V> {\n delegate: VirtualizerDelegate<T, V>,\n collection: Collection<T>,\n layout: Layout<T>\n}\n\n/**\n * The Virtualizer class renders a scrollable collection of data using customizable layouts.\n * It supports very large collections by only rendering visible views to the DOM, reusing\n * them as you scroll. Virtualizer can present any type of view, including non-item views\n * such as section headers and footers.\n *\n * Virtualizer uses {@link Layout} objects to compute what views should be visible, and how\n * to position and style them. This means that virtualizer can have its items arranged in\n * a stack, a grid, a circle, or any other layout you can think of. The layout can be changed\n * dynamically at runtime as well.\n *\n * Layouts produce information on what views should appear in the virtualizer, but do not create\n * the views themselves directly. It is the responsibility of the {@link VirtualizerDelegate} object\n * to render elements for each layout info. The virtualizer manages a set of {@link ReusableView} objects,\n * which are reused as the user scrolls by swapping their content with cached elements returned by the delegate.\n */\nexport class Virtualizer<T extends object, V> {\n /**\n * The virtualizer delegate. The delegate is used by the virtualizer\n * to create and configure views.\n */\n delegate: VirtualizerDelegate<T, V>;\n\n /** The current content of the virtualizer. */\n readonly collection: Collection<T>;\n /** The layout object that determines the visible views. */\n readonly layout: Layout<T>;\n /** The size of the scrollable content. */\n readonly contentSize: Size;\n /** The currently visible rectangle. */\n readonly visibleRect: Rect;\n /** The set of persisted keys that are always present in the DOM, even if not currently in view. */\n readonly persistedKeys: Set<Key>;\n\n private _visibleViews: Map<Key, ChildView<T, V>>;\n private _renderedContent: WeakMap<T, V>;\n private _rootView: RootView<T, V>;\n private _isScrolling: boolean;\n private _invalidationContext: InvalidationContext;\n private _overscanManager: OverscanManager;\n\n constructor(options: VirtualizerOptions<T, V>) {\n this.delegate = options.delegate;\n this.collection = options.collection;\n this.layout = options.layout;\n this.contentSize = new Size;\n this.visibleRect = new Rect;\n this.persistedKeys = new Set();\n this._visibleViews = new Map();\n this._renderedContent = new WeakMap();\n this._rootView = new RootView(this);\n this._isScrolling = false;\n this._invalidationContext = {};\n this._overscanManager = new OverscanManager();\n }\n\n /** Returns whether the given key, or an ancestor, is persisted. */\n isPersistedKey(key: Key) {\n // Quick check if the key is directly in the set of persisted keys.\n if (this.persistedKeys.has(key)) {\n return true;\n }\n\n // If not, check if the key is an ancestor of any of the persisted keys.\n for (let k of this.persistedKeys) {\n while (k != null) {\n let layoutInfo = this.layout.getLayoutInfo(k);\n if (!layoutInfo || layoutInfo.parentKey == null) {\n break;\n }\n\n k = layoutInfo.parentKey;\n\n if (k === key) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n private getParentView(layoutInfo: LayoutInfo): ReusableView<T, V> | undefined {\n return layoutInfo.parentKey != null ? this._visibleViews.get(layoutInfo.parentKey) : this._rootView;\n }\n\n private getReusableView(layoutInfo: LayoutInfo): ChildView<T, V> {\n let parentView = this.getParentView(layoutInfo)!;\n let view = parentView.getReusableView(layoutInfo.type);\n view.layoutInfo = layoutInfo;\n this._renderView(view);\n return view;\n }\n\n private _renderView(reusableView: ReusableView<T, V>) {\n if (reusableView.layoutInfo) {\n let {type, key, content} = reusableView.layoutInfo;\n reusableView.content = content || this.collection.getItem(key);\n reusableView.rendered = this._renderContent(type, reusableView.content);\n }\n }\n\n private _renderContent(type: string, content: T | null) {\n let cached = content != null ? this._renderedContent.get(content) : null;\n if (cached != null) {\n return cached;\n }\n\n let rendered = this.delegate.renderView(type, content);\n if (content) {\n this._renderedContent.set(content, rendered);\n }\n return rendered;\n }\n\n /**\n * Returns the key for the item view currently at the given point.\n */\n keyAtPoint(point: Point): Key | null {\n let rect = new Rect(point.x, point.y, 1, 1);\n let layoutInfos = rect.area === 0 ? [] : this.layout.getVisibleLayoutInfos(rect);\n\n // Layout may return multiple layout infos in the case of\n // persisted keys, so find the first one that actually intersects.\n for (let layoutInfo of layoutInfos) {\n if (layoutInfo.rect.intersects(rect)) {\n return layoutInfo.key;\n }\n }\n\n return null;\n }\n\n private relayout(context: InvalidationContext = {}) {\n // Update the layout\n this.layout.update(context);\n (this as Mutable<this>).contentSize = this.layout.getContentSize();\n\n // Constrain scroll position.\n // If the content changed, scroll to the top.\n let visibleRect = this.visibleRect;\n let contentOffsetX = context.contentChanged ? 0 : visibleRect.x;\n let contentOffsetY = context.contentChanged ? 0 : visibleRect.y;\n contentOffsetX = Math.max(0, Math.min(this.contentSize.width - visibleRect.width, contentOffsetX));\n contentOffsetY = Math.max(0, Math.min(this.contentSize.height - visibleRect.height, contentOffsetY));\n\n if (contentOffsetX !== visibleRect.x || contentOffsetY !== visibleRect.y) {\n // If the offset changed, trigger a new re-render.\n let rect = new Rect(contentOffsetX, contentOffsetY, visibleRect.width, visibleRect.height);\n this.delegate.setVisibleRect(rect);\n } else {\n this.updateSubviews();\n }\n }\n\n getVisibleLayoutInfos() {\n let isTestEnv = process.env.NODE_ENV === 'test' && !process.env.VIRT_ON;\n let isClientWidthMocked = isTestEnv && typeof HTMLElement !== 'undefined' && Object.getOwnPropertyNames(HTMLElement.prototype).includes('clientWidth');\n let isClientHeightMocked = isTestEnv && typeof HTMLElement !== 'undefined' && Object.getOwnPropertyNames(HTMLElement.prototype).includes('clientHeight');\n\n let rect: Rect;\n if (isTestEnv && !(isClientWidthMocked && isClientHeightMocked)) {\n rect = new Rect(0, 0, this.contentSize.width, this.contentSize.height);\n } else {\n rect = this._overscanManager.getOverscannedRect();\n }\n\n let layoutInfos = rect.area === 0 ? [] : this.layout.getVisibleLayoutInfos(rect);\n let map = new Map;\n for (let layoutInfo of layoutInfos) {\n map.set(layoutInfo.key, layoutInfo);\n }\n\n return map;\n }\n\n private updateSubviews() {\n let visibleLayoutInfos = this.getVisibleLayoutInfos();\n\n let removed = new Set<ChildView<T, V>>();\n for (let [key, view] of this._visibleViews) {\n let layoutInfo = visibleLayoutInfos.get(key);\n // If a view's parent changed, treat it as a delete and re-create in the new parent.\n if (!layoutInfo || view.parent !== this.getParentView(layoutInfo)) {\n this._visibleViews.delete(key);\n view.parent.reuseChild(view);\n removed.add(view); // Defer removing in case we reuse this view.\n }\n }\n\n for (let [key, layoutInfo] of visibleLayoutInfos) {\n let view = this._visibleViews.get(key);\n if (!view) {\n view = this.getReusableView(layoutInfo);\n view.parent.children.add(view);\n this._visibleViews.set(key, view);\n removed.delete(view);\n } else {\n view.layoutInfo = layoutInfo;\n\n let item = this.collection.getItem(layoutInfo.key);\n if (view.content !== item) {\n if (view.content != null) {\n this._renderedContent.delete(view.content);\n }\n this._renderView(view);\n }\n }\n }\n\n // The remaining views in `removed` were not reused to render new items.\n // They should be removed from the DOM. We also clear the reusable view queue\n // here since there's no point holding onto views that have been removed.\n // Doing so hurts performance in the future when reusing elements due to FIFO order.\n for (let view of removed) {\n view.parent.children.delete(view);\n view.parent.reusableViews.clear();\n }\n\n // Reordering DOM nodes is costly, so we defer this until scrolling stops.\n // DOM order does not affect visual order (due to absolute positioning),\n // but does matter for assistive technology users.\n if (!this._isScrolling) {\n // Layout infos must be in topological order (parents before children).\n for (let key of visibleLayoutInfos.keys()) {\n let view = this._visibleViews.get(key)!;\n view.parent.children.delete(view);\n view.parent.children.add(view);\n }\n }\n }\n\n /** Performs layout and updates visible views as needed. */\n render(opts: VirtualizerRenderOptions<T>): ReusableView<T, V>[] {\n let mutableThis: Mutable<this> = this;\n let needsLayout = false;\n let offsetChanged = false;\n let sizeChanged = false;\n let itemSizeChanged = false;\n let needsUpdate = false;\n\n if (opts.collection !== this.collection) {\n mutableThis.collection = opts.collection;\n needsLayout = true;\n }\n\n if (opts.layout !== this.layout || this.layout.virtualizer !== this) {\n if (this.layout) {\n this.layout.virtualizer = null;\n }\n\n opts.layout.virtualizer = this;\n mutableThis.layout = opts.layout;\n needsLayout = true;\n }\n\n if (opts.persistedKeys && !isSetEqual(opts.persistedKeys, this.persistedKeys)) {\n mutableThis.persistedKeys = opts.persistedKeys;\n needsUpdate = true;\n }\n\n if (!this.visibleRect.equals(opts.visibleRect)) {\n this._overscanManager.setVisibleRect(opts.visibleRect);\n let shouldInvalidate = this.layout.shouldInvalidate(opts.visibleRect, this.visibleRect);\n\n if (shouldInvalidate) {\n offsetChanged = !opts.visibleRect.pointEquals(this.visibleRect);\n sizeChanged = !opts.visibleRect.sizeEquals(this.visibleRect);\n needsLayout = true;\n } else {\n needsUpdate = true;\n }\n\n mutableThis.visibleRect = opts.visibleRect;\n }\n\n if (opts.invalidationContext !== this._invalidationContext) {\n if (opts.invalidationContext) {\n sizeChanged ||= opts.invalidationContext.sizeChanged || false;\n offsetChanged ||= opts.invalidationContext.offsetChanged || false;\n itemSizeChanged ||= opts.invalidationContext.itemSizeChanged || false;\n needsLayout ||= itemSizeChanged || sizeChanged || offsetChanged;\n needsLayout ||= opts.invalidationContext.layoutOptions !== this._invalidationContext.layoutOptions;\n }\n this._invalidationContext = opts.invalidationContext;\n }\n\n if (opts.isScrolling !== this._isScrolling) {\n this._isScrolling = opts.isScrolling;\n if (!opts.isScrolling) {\n // Update to fix the DOM order after scrolling.\n needsUpdate = true;\n }\n }\n\n if (needsLayout) {\n this.relayout({\n offsetChanged,\n sizeChanged,\n itemSizeChanged,\n layoutOptions: this._invalidationContext.layoutOptions\n });\n } else if (needsUpdate) {\n this.updateSubviews();\n }\n\n return Array.from(this._rootView.children);\n }\n\n getVisibleView(key: Key): ReusableView<T, V> | undefined {\n return this._visibleViews.get(key);\n }\n\n invalidate(context: InvalidationContext) {\n this.delegate.invalidate(context);\n }\n\n updateItemSize(key: Key, size: Size) {\n if (!this.layout.updateItemSize) {\n return;\n }\n\n let changed = this.layout.updateItemSize(key, size);\n if (changed) {\n this.invalidate({\n itemSizeChanged: true\n });\n }\n }\n}\n"],"names":[],"version":3,"file":"Virtualizer.main.js.map"}
1
+ {"mappings":"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","sources":["packages/@react-stately/virtualizer/src/Virtualizer.ts"],"sourcesContent":["/*\n * Copyright 2020 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 {ChildView, ReusableView, RootView} from './ReusableView';\nimport {Collection, Key} from '@react-types/shared';\nimport {InvalidationContext, Mutable, VirtualizerDelegate, VirtualizerRenderOptions} from './types';\nimport {isSetEqual} from './utils';\nimport {Layout} from './Layout';\nimport {LayoutInfo} from './LayoutInfo';\nimport {OverscanManager} from './OverscanManager';\nimport {Point} from './Point';\nimport {Rect} from './Rect';\nimport {Size} from './Size';\n\ninterface VirtualizerOptions<T extends object, V> {\n delegate: VirtualizerDelegate<T, V>,\n collection: Collection<T>,\n layout: Layout<T>\n}\n\n/**\n * The Virtualizer class renders a scrollable collection of data using customizable layouts.\n * It supports very large collections by only rendering visible views to the DOM, reusing\n * them as you scroll. Virtualizer can present any type of view, including non-item views\n * such as section headers and footers.\n *\n * Virtualizer uses `Layout` objects to compute what views should be visible, and how\n * to position and style them. This means that virtualizer can have its items arranged in\n * a stack, a grid, a circle, or any other layout you can think of. The layout can be changed\n * dynamically at runtime as well.\n *\n * Layouts produce information on what views should appear in the virtualizer, but do not create\n * the views themselves directly. It is the responsibility of the `VirtualizerDelegate` object\n * to render elements for each layout info. The virtualizer manages a set of `ReusableView` objects,\n * which are reused as the user scrolls by swapping their content with cached elements returned by the delegate.\n */\nexport class Virtualizer<T extends object, V> {\n /**\n * The virtualizer delegate. The delegate is used by the virtualizer\n * to create and configure views.\n */\n delegate: VirtualizerDelegate<T, V>;\n\n /** The current content of the virtualizer. */\n readonly collection: Collection<T>;\n /** The layout object that determines the visible views. */\n readonly layout: Layout<T>;\n /** The size of the scrollable content. */\n readonly contentSize: Size;\n /** The currently visible rectangle. */\n readonly visibleRect: Rect;\n /** The set of persisted keys that are always present in the DOM, even if not currently in view. */\n readonly persistedKeys: Set<Key>;\n\n private _visibleViews: Map<Key, ChildView<T, V>>;\n private _renderedContent: WeakMap<T, V>;\n private _rootView: RootView<T, V>;\n private _isScrolling: boolean;\n private _invalidationContext: InvalidationContext;\n private _overscanManager: OverscanManager;\n\n constructor(options: VirtualizerOptions<T, V>) {\n this.delegate = options.delegate;\n this.collection = options.collection;\n this.layout = options.layout;\n this.contentSize = new Size;\n this.visibleRect = new Rect;\n this.persistedKeys = new Set();\n this._visibleViews = new Map();\n this._renderedContent = new WeakMap();\n this._rootView = new RootView(this);\n this._isScrolling = false;\n this._invalidationContext = {};\n this._overscanManager = new OverscanManager();\n }\n\n /** Returns whether the given key, or an ancestor, is persisted. */\n isPersistedKey(key: Key) {\n // Quick check if the key is directly in the set of persisted keys.\n if (this.persistedKeys.has(key)) {\n return true;\n }\n\n // If not, check if the key is an ancestor of any of the persisted keys.\n for (let k of this.persistedKeys) {\n while (k != null) {\n let layoutInfo = this.layout.getLayoutInfo(k);\n if (!layoutInfo || layoutInfo.parentKey == null) {\n break;\n }\n\n k = layoutInfo.parentKey;\n\n if (k === key) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n private getParentView(layoutInfo: LayoutInfo): ReusableView<T, V> | undefined {\n return layoutInfo.parentKey != null ? this._visibleViews.get(layoutInfo.parentKey) : this._rootView;\n }\n\n private getReusableView(layoutInfo: LayoutInfo): ChildView<T, V> {\n let parentView = this.getParentView(layoutInfo)!;\n let view = parentView.getReusableView(layoutInfo.type);\n view.layoutInfo = layoutInfo;\n this._renderView(view);\n return view;\n }\n\n private _renderView(reusableView: ReusableView<T, V>) {\n if (reusableView.layoutInfo) {\n let {type, key, content} = reusableView.layoutInfo;\n reusableView.content = content || this.collection.getItem(key);\n reusableView.rendered = this._renderContent(type, reusableView.content);\n }\n }\n\n private _renderContent(type: string, content: T | null) {\n let cached = content != null ? this._renderedContent.get(content) : null;\n if (cached != null) {\n return cached;\n }\n\n let rendered = this.delegate.renderView(type, content);\n if (content) {\n this._renderedContent.set(content, rendered);\n }\n return rendered;\n }\n\n /**\n * Returns the key for the item view currently at the given point.\n */\n keyAtPoint(point: Point): Key | null {\n let rect = new Rect(point.x, point.y, 1, 1);\n let layoutInfos = rect.area === 0 ? [] : this.layout.getVisibleLayoutInfos(rect);\n\n // Layout may return multiple layout infos in the case of\n // persisted keys, so find the first one that actually intersects.\n for (let layoutInfo of layoutInfos) {\n if (layoutInfo.rect.intersects(rect)) {\n return layoutInfo.key;\n }\n }\n\n return null;\n }\n\n private relayout(context: InvalidationContext = {}) {\n // Update the layout\n this.layout.update(context);\n (this as Mutable<this>).contentSize = this.layout.getContentSize();\n\n // Constrain scroll position.\n // If the content changed, scroll to the top.\n let visibleRect = this.visibleRect;\n let contentOffsetX = context.contentChanged ? 0 : visibleRect.x;\n let contentOffsetY = context.contentChanged ? 0 : visibleRect.y;\n contentOffsetX = Math.max(0, Math.min(this.contentSize.width - visibleRect.width, contentOffsetX));\n contentOffsetY = Math.max(0, Math.min(this.contentSize.height - visibleRect.height, contentOffsetY));\n\n if (contentOffsetX !== visibleRect.x || contentOffsetY !== visibleRect.y) {\n // If the offset changed, trigger a new re-render.\n let rect = new Rect(contentOffsetX, contentOffsetY, visibleRect.width, visibleRect.height);\n this.delegate.setVisibleRect(rect);\n } else {\n this.updateSubviews();\n }\n }\n\n getVisibleLayoutInfos() {\n let isTestEnv = process.env.NODE_ENV === 'test' && !process.env.VIRT_ON;\n let isClientWidthMocked = isTestEnv && typeof HTMLElement !== 'undefined' && Object.getOwnPropertyNames(HTMLElement.prototype).includes('clientWidth');\n let isClientHeightMocked = isTestEnv && typeof HTMLElement !== 'undefined' && Object.getOwnPropertyNames(HTMLElement.prototype).includes('clientHeight');\n\n let rect: Rect;\n if (isTestEnv && !(isClientWidthMocked && isClientHeightMocked)) {\n rect = new Rect(0, 0, this.contentSize.width, this.contentSize.height);\n } else {\n rect = this._overscanManager.getOverscannedRect();\n }\n\n let layoutInfos = rect.area === 0 ? [] : this.layout.getVisibleLayoutInfos(rect);\n let map = new Map;\n for (let layoutInfo of layoutInfos) {\n map.set(layoutInfo.key, layoutInfo);\n }\n\n return map;\n }\n\n private updateSubviews() {\n let visibleLayoutInfos = this.getVisibleLayoutInfos();\n\n let removed = new Set<ChildView<T, V>>();\n for (let [key, view] of this._visibleViews) {\n let layoutInfo = visibleLayoutInfos.get(key);\n // If a view's parent changed, treat it as a delete and re-create in the new parent.\n if (!layoutInfo || view.parent !== this.getParentView(layoutInfo)) {\n this._visibleViews.delete(key);\n view.parent.reuseChild(view);\n removed.add(view); // Defer removing in case we reuse this view.\n }\n }\n\n for (let [key, layoutInfo] of visibleLayoutInfos) {\n let view = this._visibleViews.get(key);\n if (!view) {\n view = this.getReusableView(layoutInfo);\n view.parent.children.add(view);\n this._visibleViews.set(key, view);\n removed.delete(view);\n } else {\n view.layoutInfo = layoutInfo;\n\n let item = this.collection.getItem(layoutInfo.key);\n if (view.content !== item) {\n if (view.content != null) {\n this._renderedContent.delete(view.content);\n }\n this._renderView(view);\n }\n }\n }\n\n // The remaining views in `removed` were not reused to render new items.\n // They should be removed from the DOM. We also clear the reusable view queue\n // here since there's no point holding onto views that have been removed.\n // Doing so hurts performance in the future when reusing elements due to FIFO order.\n for (let view of removed) {\n view.parent.children.delete(view);\n view.parent.reusableViews.clear();\n }\n\n // Reordering DOM nodes is costly, so we defer this until scrolling stops.\n // DOM order does not affect visual order (due to absolute positioning),\n // but does matter for assistive technology users.\n if (!this._isScrolling) {\n // Layout infos must be in topological order (parents before children).\n for (let key of visibleLayoutInfos.keys()) {\n let view = this._visibleViews.get(key)!;\n view.parent.children.delete(view);\n view.parent.children.add(view);\n }\n }\n }\n\n /** Performs layout and updates visible views as needed. */\n render(opts: VirtualizerRenderOptions<T>): ReusableView<T, V>[] {\n let mutableThis: Mutable<this> = this;\n let needsLayout = false;\n let offsetChanged = false;\n let sizeChanged = false;\n let itemSizeChanged = false;\n let layoutOptionsChanged = false;\n let needsUpdate = false;\n\n if (opts.collection !== this.collection) {\n mutableThis.collection = opts.collection;\n needsLayout = true;\n }\n\n if (opts.layout !== this.layout || this.layout.virtualizer !== this) {\n if (this.layout) {\n this.layout.virtualizer = null;\n }\n\n opts.layout.virtualizer = this;\n mutableThis.layout = opts.layout;\n needsLayout = true;\n }\n\n if (opts.persistedKeys && !isSetEqual(opts.persistedKeys, this.persistedKeys)) {\n mutableThis.persistedKeys = opts.persistedKeys;\n needsUpdate = true;\n }\n\n if (!this.visibleRect.equals(opts.visibleRect)) {\n this._overscanManager.setVisibleRect(opts.visibleRect);\n let shouldInvalidate = this.layout.shouldInvalidate(opts.visibleRect, this.visibleRect);\n\n if (shouldInvalidate) {\n offsetChanged = !opts.visibleRect.pointEquals(this.visibleRect);\n sizeChanged = !opts.visibleRect.sizeEquals(this.visibleRect);\n needsLayout = true;\n } else {\n needsUpdate = true;\n }\n\n mutableThis.visibleRect = opts.visibleRect;\n }\n\n if (opts.invalidationContext !== this._invalidationContext) {\n if (opts.invalidationContext) {\n sizeChanged ||= opts.invalidationContext.sizeChanged || false;\n offsetChanged ||= opts.invalidationContext.offsetChanged || false;\n itemSizeChanged ||= opts.invalidationContext.itemSizeChanged || false;\n layoutOptionsChanged ||= opts.invalidationContext.layoutOptions != null\n && this._invalidationContext.layoutOptions != null\n && opts.invalidationContext.layoutOptions !== this._invalidationContext.layoutOptions \n && this.layout.shouldInvalidateLayoutOptions(opts.invalidationContext.layoutOptions, this._invalidationContext.layoutOptions);\n needsLayout ||= itemSizeChanged || sizeChanged || offsetChanged || layoutOptionsChanged;\n }\n this._invalidationContext = opts.invalidationContext;\n }\n\n if (opts.isScrolling !== this._isScrolling) {\n this._isScrolling = opts.isScrolling;\n if (!opts.isScrolling) {\n // Update to fix the DOM order after scrolling.\n needsUpdate = true;\n }\n }\n\n if (needsLayout) {\n this.relayout({\n offsetChanged,\n sizeChanged,\n itemSizeChanged,\n layoutOptionsChanged,\n layoutOptions: this._invalidationContext.layoutOptions\n });\n } else if (needsUpdate) {\n this.updateSubviews();\n }\n\n return Array.from(this._rootView.children);\n }\n\n getVisibleView(key: Key): ReusableView<T, V> | undefined {\n return this._visibleViews.get(key);\n }\n\n invalidate(context: InvalidationContext) {\n this.delegate.invalidate(context);\n }\n\n updateItemSize(key: Key, size: Size) {\n if (!this.layout.updateItemSize) {\n return;\n }\n\n let changed = this.layout.updateItemSize(key, size);\n if (changed) {\n this.invalidate({\n itemSizeChanged: true\n });\n }\n }\n}\n"],"names":[],"version":3,"file":"Virtualizer.main.js.map"}
@@ -149,6 +149,7 @@ class $38b9490c1cca8fc4$export$89be5a243e59c4b2 {
149
149
  let offsetChanged = false;
150
150
  let sizeChanged = false;
151
151
  let itemSizeChanged = false;
152
+ let layoutOptionsChanged = false;
152
153
  let needsUpdate = false;
153
154
  if (opts.collection !== this.collection) {
154
155
  mutableThis.collection = opts.collection;
@@ -179,8 +180,8 @@ class $38b9490c1cca8fc4$export$89be5a243e59c4b2 {
179
180
  sizeChanged || (sizeChanged = opts.invalidationContext.sizeChanged || false);
180
181
  offsetChanged || (offsetChanged = opts.invalidationContext.offsetChanged || false);
181
182
  itemSizeChanged || (itemSizeChanged = opts.invalidationContext.itemSizeChanged || false);
182
- needsLayout || (needsLayout = itemSizeChanged || sizeChanged || offsetChanged);
183
- needsLayout || (needsLayout = opts.invalidationContext.layoutOptions !== this._invalidationContext.layoutOptions);
183
+ layoutOptionsChanged || (layoutOptionsChanged = opts.invalidationContext.layoutOptions != null && this._invalidationContext.layoutOptions != null && opts.invalidationContext.layoutOptions !== this._invalidationContext.layoutOptions && this.layout.shouldInvalidateLayoutOptions(opts.invalidationContext.layoutOptions, this._invalidationContext.layoutOptions));
184
+ needsLayout || (needsLayout = itemSizeChanged || sizeChanged || offsetChanged || layoutOptionsChanged);
184
185
  }
185
186
  this._invalidationContext = opts.invalidationContext;
186
187
  }
@@ -193,6 +194,7 @@ class $38b9490c1cca8fc4$export$89be5a243e59c4b2 {
193
194
  offsetChanged: offsetChanged,
194
195
  sizeChanged: sizeChanged,
195
196
  itemSizeChanged: itemSizeChanged,
197
+ layoutOptionsChanged: layoutOptionsChanged,
196
198
  layoutOptions: this._invalidationContext.layoutOptions
197
199
  });
198
200
  else if (needsUpdate) this.updateSubviews();
@@ -149,6 +149,7 @@ class $38b9490c1cca8fc4$export$89be5a243e59c4b2 {
149
149
  let offsetChanged = false;
150
150
  let sizeChanged = false;
151
151
  let itemSizeChanged = false;
152
+ let layoutOptionsChanged = false;
152
153
  let needsUpdate = false;
153
154
  if (opts.collection !== this.collection) {
154
155
  mutableThis.collection = opts.collection;
@@ -179,8 +180,8 @@ class $38b9490c1cca8fc4$export$89be5a243e59c4b2 {
179
180
  sizeChanged || (sizeChanged = opts.invalidationContext.sizeChanged || false);
180
181
  offsetChanged || (offsetChanged = opts.invalidationContext.offsetChanged || false);
181
182
  itemSizeChanged || (itemSizeChanged = opts.invalidationContext.itemSizeChanged || false);
182
- needsLayout || (needsLayout = itemSizeChanged || sizeChanged || offsetChanged);
183
- needsLayout || (needsLayout = opts.invalidationContext.layoutOptions !== this._invalidationContext.layoutOptions);
183
+ layoutOptionsChanged || (layoutOptionsChanged = opts.invalidationContext.layoutOptions != null && this._invalidationContext.layoutOptions != null && opts.invalidationContext.layoutOptions !== this._invalidationContext.layoutOptions && this.layout.shouldInvalidateLayoutOptions(opts.invalidationContext.layoutOptions, this._invalidationContext.layoutOptions));
184
+ needsLayout || (needsLayout = itemSizeChanged || sizeChanged || offsetChanged || layoutOptionsChanged);
184
185
  }
185
186
  this._invalidationContext = opts.invalidationContext;
186
187
  }
@@ -193,6 +194,7 @@ class $38b9490c1cca8fc4$export$89be5a243e59c4b2 {
193
194
  offsetChanged: offsetChanged,
194
195
  sizeChanged: sizeChanged,
195
196
  itemSizeChanged: itemSizeChanged,
197
+ layoutOptionsChanged: layoutOptionsChanged,
196
198
  layoutOptions: this._invalidationContext.layoutOptions
197
199
  });
198
200
  else if (needsUpdate) this.updateSubviews();
@@ -1 +1 @@
1
- {"mappings":"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","sources":["packages/@react-stately/virtualizer/src/Virtualizer.ts"],"sourcesContent":["/*\n * Copyright 2020 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 {ChildView, ReusableView, RootView} from './ReusableView';\nimport {Collection, Key} from '@react-types/shared';\nimport {InvalidationContext, Mutable, VirtualizerDelegate, VirtualizerRenderOptions} from './types';\nimport {isSetEqual} from './utils';\nimport {Layout} from './Layout';\nimport {LayoutInfo} from './LayoutInfo';\nimport {OverscanManager} from './OverscanManager';\nimport {Point} from './Point';\nimport {Rect} from './Rect';\nimport {Size} from './Size';\n\ninterface VirtualizerOptions<T extends object, V> {\n delegate: VirtualizerDelegate<T, V>,\n collection: Collection<T>,\n layout: Layout<T>\n}\n\n/**\n * The Virtualizer class renders a scrollable collection of data using customizable layouts.\n * It supports very large collections by only rendering visible views to the DOM, reusing\n * them as you scroll. Virtualizer can present any type of view, including non-item views\n * such as section headers and footers.\n *\n * Virtualizer uses {@link Layout} objects to compute what views should be visible, and how\n * to position and style them. This means that virtualizer can have its items arranged in\n * a stack, a grid, a circle, or any other layout you can think of. The layout can be changed\n * dynamically at runtime as well.\n *\n * Layouts produce information on what views should appear in the virtualizer, but do not create\n * the views themselves directly. It is the responsibility of the {@link VirtualizerDelegate} object\n * to render elements for each layout info. The virtualizer manages a set of {@link ReusableView} objects,\n * which are reused as the user scrolls by swapping their content with cached elements returned by the delegate.\n */\nexport class Virtualizer<T extends object, V> {\n /**\n * The virtualizer delegate. The delegate is used by the virtualizer\n * to create and configure views.\n */\n delegate: VirtualizerDelegate<T, V>;\n\n /** The current content of the virtualizer. */\n readonly collection: Collection<T>;\n /** The layout object that determines the visible views. */\n readonly layout: Layout<T>;\n /** The size of the scrollable content. */\n readonly contentSize: Size;\n /** The currently visible rectangle. */\n readonly visibleRect: Rect;\n /** The set of persisted keys that are always present in the DOM, even if not currently in view. */\n readonly persistedKeys: Set<Key>;\n\n private _visibleViews: Map<Key, ChildView<T, V>>;\n private _renderedContent: WeakMap<T, V>;\n private _rootView: RootView<T, V>;\n private _isScrolling: boolean;\n private _invalidationContext: InvalidationContext;\n private _overscanManager: OverscanManager;\n\n constructor(options: VirtualizerOptions<T, V>) {\n this.delegate = options.delegate;\n this.collection = options.collection;\n this.layout = options.layout;\n this.contentSize = new Size;\n this.visibleRect = new Rect;\n this.persistedKeys = new Set();\n this._visibleViews = new Map();\n this._renderedContent = new WeakMap();\n this._rootView = new RootView(this);\n this._isScrolling = false;\n this._invalidationContext = {};\n this._overscanManager = new OverscanManager();\n }\n\n /** Returns whether the given key, or an ancestor, is persisted. */\n isPersistedKey(key: Key) {\n // Quick check if the key is directly in the set of persisted keys.\n if (this.persistedKeys.has(key)) {\n return true;\n }\n\n // If not, check if the key is an ancestor of any of the persisted keys.\n for (let k of this.persistedKeys) {\n while (k != null) {\n let layoutInfo = this.layout.getLayoutInfo(k);\n if (!layoutInfo || layoutInfo.parentKey == null) {\n break;\n }\n\n k = layoutInfo.parentKey;\n\n if (k === key) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n private getParentView(layoutInfo: LayoutInfo): ReusableView<T, V> | undefined {\n return layoutInfo.parentKey != null ? this._visibleViews.get(layoutInfo.parentKey) : this._rootView;\n }\n\n private getReusableView(layoutInfo: LayoutInfo): ChildView<T, V> {\n let parentView = this.getParentView(layoutInfo)!;\n let view = parentView.getReusableView(layoutInfo.type);\n view.layoutInfo = layoutInfo;\n this._renderView(view);\n return view;\n }\n\n private _renderView(reusableView: ReusableView<T, V>) {\n if (reusableView.layoutInfo) {\n let {type, key, content} = reusableView.layoutInfo;\n reusableView.content = content || this.collection.getItem(key);\n reusableView.rendered = this._renderContent(type, reusableView.content);\n }\n }\n\n private _renderContent(type: string, content: T | null) {\n let cached = content != null ? this._renderedContent.get(content) : null;\n if (cached != null) {\n return cached;\n }\n\n let rendered = this.delegate.renderView(type, content);\n if (content) {\n this._renderedContent.set(content, rendered);\n }\n return rendered;\n }\n\n /**\n * Returns the key for the item view currently at the given point.\n */\n keyAtPoint(point: Point): Key | null {\n let rect = new Rect(point.x, point.y, 1, 1);\n let layoutInfos = rect.area === 0 ? [] : this.layout.getVisibleLayoutInfos(rect);\n\n // Layout may return multiple layout infos in the case of\n // persisted keys, so find the first one that actually intersects.\n for (let layoutInfo of layoutInfos) {\n if (layoutInfo.rect.intersects(rect)) {\n return layoutInfo.key;\n }\n }\n\n return null;\n }\n\n private relayout(context: InvalidationContext = {}) {\n // Update the layout\n this.layout.update(context);\n (this as Mutable<this>).contentSize = this.layout.getContentSize();\n\n // Constrain scroll position.\n // If the content changed, scroll to the top.\n let visibleRect = this.visibleRect;\n let contentOffsetX = context.contentChanged ? 0 : visibleRect.x;\n let contentOffsetY = context.contentChanged ? 0 : visibleRect.y;\n contentOffsetX = Math.max(0, Math.min(this.contentSize.width - visibleRect.width, contentOffsetX));\n contentOffsetY = Math.max(0, Math.min(this.contentSize.height - visibleRect.height, contentOffsetY));\n\n if (contentOffsetX !== visibleRect.x || contentOffsetY !== visibleRect.y) {\n // If the offset changed, trigger a new re-render.\n let rect = new Rect(contentOffsetX, contentOffsetY, visibleRect.width, visibleRect.height);\n this.delegate.setVisibleRect(rect);\n } else {\n this.updateSubviews();\n }\n }\n\n getVisibleLayoutInfos() {\n let isTestEnv = process.env.NODE_ENV === 'test' && !process.env.VIRT_ON;\n let isClientWidthMocked = isTestEnv && typeof HTMLElement !== 'undefined' && Object.getOwnPropertyNames(HTMLElement.prototype).includes('clientWidth');\n let isClientHeightMocked = isTestEnv && typeof HTMLElement !== 'undefined' && Object.getOwnPropertyNames(HTMLElement.prototype).includes('clientHeight');\n\n let rect: Rect;\n if (isTestEnv && !(isClientWidthMocked && isClientHeightMocked)) {\n rect = new Rect(0, 0, this.contentSize.width, this.contentSize.height);\n } else {\n rect = this._overscanManager.getOverscannedRect();\n }\n\n let layoutInfos = rect.area === 0 ? [] : this.layout.getVisibleLayoutInfos(rect);\n let map = new Map;\n for (let layoutInfo of layoutInfos) {\n map.set(layoutInfo.key, layoutInfo);\n }\n\n return map;\n }\n\n private updateSubviews() {\n let visibleLayoutInfos = this.getVisibleLayoutInfos();\n\n let removed = new Set<ChildView<T, V>>();\n for (let [key, view] of this._visibleViews) {\n let layoutInfo = visibleLayoutInfos.get(key);\n // If a view's parent changed, treat it as a delete and re-create in the new parent.\n if (!layoutInfo || view.parent !== this.getParentView(layoutInfo)) {\n this._visibleViews.delete(key);\n view.parent.reuseChild(view);\n removed.add(view); // Defer removing in case we reuse this view.\n }\n }\n\n for (let [key, layoutInfo] of visibleLayoutInfos) {\n let view = this._visibleViews.get(key);\n if (!view) {\n view = this.getReusableView(layoutInfo);\n view.parent.children.add(view);\n this._visibleViews.set(key, view);\n removed.delete(view);\n } else {\n view.layoutInfo = layoutInfo;\n\n let item = this.collection.getItem(layoutInfo.key);\n if (view.content !== item) {\n if (view.content != null) {\n this._renderedContent.delete(view.content);\n }\n this._renderView(view);\n }\n }\n }\n\n // The remaining views in `removed` were not reused to render new items.\n // They should be removed from the DOM. We also clear the reusable view queue\n // here since there's no point holding onto views that have been removed.\n // Doing so hurts performance in the future when reusing elements due to FIFO order.\n for (let view of removed) {\n view.parent.children.delete(view);\n view.parent.reusableViews.clear();\n }\n\n // Reordering DOM nodes is costly, so we defer this until scrolling stops.\n // DOM order does not affect visual order (due to absolute positioning),\n // but does matter for assistive technology users.\n if (!this._isScrolling) {\n // Layout infos must be in topological order (parents before children).\n for (let key of visibleLayoutInfos.keys()) {\n let view = this._visibleViews.get(key)!;\n view.parent.children.delete(view);\n view.parent.children.add(view);\n }\n }\n }\n\n /** Performs layout and updates visible views as needed. */\n render(opts: VirtualizerRenderOptions<T>): ReusableView<T, V>[] {\n let mutableThis: Mutable<this> = this;\n let needsLayout = false;\n let offsetChanged = false;\n let sizeChanged = false;\n let itemSizeChanged = false;\n let needsUpdate = false;\n\n if (opts.collection !== this.collection) {\n mutableThis.collection = opts.collection;\n needsLayout = true;\n }\n\n if (opts.layout !== this.layout || this.layout.virtualizer !== this) {\n if (this.layout) {\n this.layout.virtualizer = null;\n }\n\n opts.layout.virtualizer = this;\n mutableThis.layout = opts.layout;\n needsLayout = true;\n }\n\n if (opts.persistedKeys && !isSetEqual(opts.persistedKeys, this.persistedKeys)) {\n mutableThis.persistedKeys = opts.persistedKeys;\n needsUpdate = true;\n }\n\n if (!this.visibleRect.equals(opts.visibleRect)) {\n this._overscanManager.setVisibleRect(opts.visibleRect);\n let shouldInvalidate = this.layout.shouldInvalidate(opts.visibleRect, this.visibleRect);\n\n if (shouldInvalidate) {\n offsetChanged = !opts.visibleRect.pointEquals(this.visibleRect);\n sizeChanged = !opts.visibleRect.sizeEquals(this.visibleRect);\n needsLayout = true;\n } else {\n needsUpdate = true;\n }\n\n mutableThis.visibleRect = opts.visibleRect;\n }\n\n if (opts.invalidationContext !== this._invalidationContext) {\n if (opts.invalidationContext) {\n sizeChanged ||= opts.invalidationContext.sizeChanged || false;\n offsetChanged ||= opts.invalidationContext.offsetChanged || false;\n itemSizeChanged ||= opts.invalidationContext.itemSizeChanged || false;\n needsLayout ||= itemSizeChanged || sizeChanged || offsetChanged;\n needsLayout ||= opts.invalidationContext.layoutOptions !== this._invalidationContext.layoutOptions;\n }\n this._invalidationContext = opts.invalidationContext;\n }\n\n if (opts.isScrolling !== this._isScrolling) {\n this._isScrolling = opts.isScrolling;\n if (!opts.isScrolling) {\n // Update to fix the DOM order after scrolling.\n needsUpdate = true;\n }\n }\n\n if (needsLayout) {\n this.relayout({\n offsetChanged,\n sizeChanged,\n itemSizeChanged,\n layoutOptions: this._invalidationContext.layoutOptions\n });\n } else if (needsUpdate) {\n this.updateSubviews();\n }\n\n return Array.from(this._rootView.children);\n }\n\n getVisibleView(key: Key): ReusableView<T, V> | undefined {\n return this._visibleViews.get(key);\n }\n\n invalidate(context: InvalidationContext) {\n this.delegate.invalidate(context);\n }\n\n updateItemSize(key: Key, size: Size) {\n if (!this.layout.updateItemSize) {\n return;\n }\n\n let changed = this.layout.updateItemSize(key, size);\n if (changed) {\n this.invalidate({\n itemSizeChanged: true\n });\n }\n }\n}\n"],"names":[],"version":3,"file":"Virtualizer.module.js.map"}
1
+ {"mappings":"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","sources":["packages/@react-stately/virtualizer/src/Virtualizer.ts"],"sourcesContent":["/*\n * Copyright 2020 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 {ChildView, ReusableView, RootView} from './ReusableView';\nimport {Collection, Key} from '@react-types/shared';\nimport {InvalidationContext, Mutable, VirtualizerDelegate, VirtualizerRenderOptions} from './types';\nimport {isSetEqual} from './utils';\nimport {Layout} from './Layout';\nimport {LayoutInfo} from './LayoutInfo';\nimport {OverscanManager} from './OverscanManager';\nimport {Point} from './Point';\nimport {Rect} from './Rect';\nimport {Size} from './Size';\n\ninterface VirtualizerOptions<T extends object, V> {\n delegate: VirtualizerDelegate<T, V>,\n collection: Collection<T>,\n layout: Layout<T>\n}\n\n/**\n * The Virtualizer class renders a scrollable collection of data using customizable layouts.\n * It supports very large collections by only rendering visible views to the DOM, reusing\n * them as you scroll. Virtualizer can present any type of view, including non-item views\n * such as section headers and footers.\n *\n * Virtualizer uses `Layout` objects to compute what views should be visible, and how\n * to position and style them. This means that virtualizer can have its items arranged in\n * a stack, a grid, a circle, or any other layout you can think of. The layout can be changed\n * dynamically at runtime as well.\n *\n * Layouts produce information on what views should appear in the virtualizer, but do not create\n * the views themselves directly. It is the responsibility of the `VirtualizerDelegate` object\n * to render elements for each layout info. The virtualizer manages a set of `ReusableView` objects,\n * which are reused as the user scrolls by swapping their content with cached elements returned by the delegate.\n */\nexport class Virtualizer<T extends object, V> {\n /**\n * The virtualizer delegate. The delegate is used by the virtualizer\n * to create and configure views.\n */\n delegate: VirtualizerDelegate<T, V>;\n\n /** The current content of the virtualizer. */\n readonly collection: Collection<T>;\n /** The layout object that determines the visible views. */\n readonly layout: Layout<T>;\n /** The size of the scrollable content. */\n readonly contentSize: Size;\n /** The currently visible rectangle. */\n readonly visibleRect: Rect;\n /** The set of persisted keys that are always present in the DOM, even if not currently in view. */\n readonly persistedKeys: Set<Key>;\n\n private _visibleViews: Map<Key, ChildView<T, V>>;\n private _renderedContent: WeakMap<T, V>;\n private _rootView: RootView<T, V>;\n private _isScrolling: boolean;\n private _invalidationContext: InvalidationContext;\n private _overscanManager: OverscanManager;\n\n constructor(options: VirtualizerOptions<T, V>) {\n this.delegate = options.delegate;\n this.collection = options.collection;\n this.layout = options.layout;\n this.contentSize = new Size;\n this.visibleRect = new Rect;\n this.persistedKeys = new Set();\n this._visibleViews = new Map();\n this._renderedContent = new WeakMap();\n this._rootView = new RootView(this);\n this._isScrolling = false;\n this._invalidationContext = {};\n this._overscanManager = new OverscanManager();\n }\n\n /** Returns whether the given key, or an ancestor, is persisted. */\n isPersistedKey(key: Key) {\n // Quick check if the key is directly in the set of persisted keys.\n if (this.persistedKeys.has(key)) {\n return true;\n }\n\n // If not, check if the key is an ancestor of any of the persisted keys.\n for (let k of this.persistedKeys) {\n while (k != null) {\n let layoutInfo = this.layout.getLayoutInfo(k);\n if (!layoutInfo || layoutInfo.parentKey == null) {\n break;\n }\n\n k = layoutInfo.parentKey;\n\n if (k === key) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n private getParentView(layoutInfo: LayoutInfo): ReusableView<T, V> | undefined {\n return layoutInfo.parentKey != null ? this._visibleViews.get(layoutInfo.parentKey) : this._rootView;\n }\n\n private getReusableView(layoutInfo: LayoutInfo): ChildView<T, V> {\n let parentView = this.getParentView(layoutInfo)!;\n let view = parentView.getReusableView(layoutInfo.type);\n view.layoutInfo = layoutInfo;\n this._renderView(view);\n return view;\n }\n\n private _renderView(reusableView: ReusableView<T, V>) {\n if (reusableView.layoutInfo) {\n let {type, key, content} = reusableView.layoutInfo;\n reusableView.content = content || this.collection.getItem(key);\n reusableView.rendered = this._renderContent(type, reusableView.content);\n }\n }\n\n private _renderContent(type: string, content: T | null) {\n let cached = content != null ? this._renderedContent.get(content) : null;\n if (cached != null) {\n return cached;\n }\n\n let rendered = this.delegate.renderView(type, content);\n if (content) {\n this._renderedContent.set(content, rendered);\n }\n return rendered;\n }\n\n /**\n * Returns the key for the item view currently at the given point.\n */\n keyAtPoint(point: Point): Key | null {\n let rect = new Rect(point.x, point.y, 1, 1);\n let layoutInfos = rect.area === 0 ? [] : this.layout.getVisibleLayoutInfos(rect);\n\n // Layout may return multiple layout infos in the case of\n // persisted keys, so find the first one that actually intersects.\n for (let layoutInfo of layoutInfos) {\n if (layoutInfo.rect.intersects(rect)) {\n return layoutInfo.key;\n }\n }\n\n return null;\n }\n\n private relayout(context: InvalidationContext = {}) {\n // Update the layout\n this.layout.update(context);\n (this as Mutable<this>).contentSize = this.layout.getContentSize();\n\n // Constrain scroll position.\n // If the content changed, scroll to the top.\n let visibleRect = this.visibleRect;\n let contentOffsetX = context.contentChanged ? 0 : visibleRect.x;\n let contentOffsetY = context.contentChanged ? 0 : visibleRect.y;\n contentOffsetX = Math.max(0, Math.min(this.contentSize.width - visibleRect.width, contentOffsetX));\n contentOffsetY = Math.max(0, Math.min(this.contentSize.height - visibleRect.height, contentOffsetY));\n\n if (contentOffsetX !== visibleRect.x || contentOffsetY !== visibleRect.y) {\n // If the offset changed, trigger a new re-render.\n let rect = new Rect(contentOffsetX, contentOffsetY, visibleRect.width, visibleRect.height);\n this.delegate.setVisibleRect(rect);\n } else {\n this.updateSubviews();\n }\n }\n\n getVisibleLayoutInfos() {\n let isTestEnv = process.env.NODE_ENV === 'test' && !process.env.VIRT_ON;\n let isClientWidthMocked = isTestEnv && typeof HTMLElement !== 'undefined' && Object.getOwnPropertyNames(HTMLElement.prototype).includes('clientWidth');\n let isClientHeightMocked = isTestEnv && typeof HTMLElement !== 'undefined' && Object.getOwnPropertyNames(HTMLElement.prototype).includes('clientHeight');\n\n let rect: Rect;\n if (isTestEnv && !(isClientWidthMocked && isClientHeightMocked)) {\n rect = new Rect(0, 0, this.contentSize.width, this.contentSize.height);\n } else {\n rect = this._overscanManager.getOverscannedRect();\n }\n\n let layoutInfos = rect.area === 0 ? [] : this.layout.getVisibleLayoutInfos(rect);\n let map = new Map;\n for (let layoutInfo of layoutInfos) {\n map.set(layoutInfo.key, layoutInfo);\n }\n\n return map;\n }\n\n private updateSubviews() {\n let visibleLayoutInfos = this.getVisibleLayoutInfos();\n\n let removed = new Set<ChildView<T, V>>();\n for (let [key, view] of this._visibleViews) {\n let layoutInfo = visibleLayoutInfos.get(key);\n // If a view's parent changed, treat it as a delete and re-create in the new parent.\n if (!layoutInfo || view.parent !== this.getParentView(layoutInfo)) {\n this._visibleViews.delete(key);\n view.parent.reuseChild(view);\n removed.add(view); // Defer removing in case we reuse this view.\n }\n }\n\n for (let [key, layoutInfo] of visibleLayoutInfos) {\n let view = this._visibleViews.get(key);\n if (!view) {\n view = this.getReusableView(layoutInfo);\n view.parent.children.add(view);\n this._visibleViews.set(key, view);\n removed.delete(view);\n } else {\n view.layoutInfo = layoutInfo;\n\n let item = this.collection.getItem(layoutInfo.key);\n if (view.content !== item) {\n if (view.content != null) {\n this._renderedContent.delete(view.content);\n }\n this._renderView(view);\n }\n }\n }\n\n // The remaining views in `removed` were not reused to render new items.\n // They should be removed from the DOM. We also clear the reusable view queue\n // here since there's no point holding onto views that have been removed.\n // Doing so hurts performance in the future when reusing elements due to FIFO order.\n for (let view of removed) {\n view.parent.children.delete(view);\n view.parent.reusableViews.clear();\n }\n\n // Reordering DOM nodes is costly, so we defer this until scrolling stops.\n // DOM order does not affect visual order (due to absolute positioning),\n // but does matter for assistive technology users.\n if (!this._isScrolling) {\n // Layout infos must be in topological order (parents before children).\n for (let key of visibleLayoutInfos.keys()) {\n let view = this._visibleViews.get(key)!;\n view.parent.children.delete(view);\n view.parent.children.add(view);\n }\n }\n }\n\n /** Performs layout and updates visible views as needed. */\n render(opts: VirtualizerRenderOptions<T>): ReusableView<T, V>[] {\n let mutableThis: Mutable<this> = this;\n let needsLayout = false;\n let offsetChanged = false;\n let sizeChanged = false;\n let itemSizeChanged = false;\n let layoutOptionsChanged = false;\n let needsUpdate = false;\n\n if (opts.collection !== this.collection) {\n mutableThis.collection = opts.collection;\n needsLayout = true;\n }\n\n if (opts.layout !== this.layout || this.layout.virtualizer !== this) {\n if (this.layout) {\n this.layout.virtualizer = null;\n }\n\n opts.layout.virtualizer = this;\n mutableThis.layout = opts.layout;\n needsLayout = true;\n }\n\n if (opts.persistedKeys && !isSetEqual(opts.persistedKeys, this.persistedKeys)) {\n mutableThis.persistedKeys = opts.persistedKeys;\n needsUpdate = true;\n }\n\n if (!this.visibleRect.equals(opts.visibleRect)) {\n this._overscanManager.setVisibleRect(opts.visibleRect);\n let shouldInvalidate = this.layout.shouldInvalidate(opts.visibleRect, this.visibleRect);\n\n if (shouldInvalidate) {\n offsetChanged = !opts.visibleRect.pointEquals(this.visibleRect);\n sizeChanged = !opts.visibleRect.sizeEquals(this.visibleRect);\n needsLayout = true;\n } else {\n needsUpdate = true;\n }\n\n mutableThis.visibleRect = opts.visibleRect;\n }\n\n if (opts.invalidationContext !== this._invalidationContext) {\n if (opts.invalidationContext) {\n sizeChanged ||= opts.invalidationContext.sizeChanged || false;\n offsetChanged ||= opts.invalidationContext.offsetChanged || false;\n itemSizeChanged ||= opts.invalidationContext.itemSizeChanged || false;\n layoutOptionsChanged ||= opts.invalidationContext.layoutOptions != null\n && this._invalidationContext.layoutOptions != null\n && opts.invalidationContext.layoutOptions !== this._invalidationContext.layoutOptions \n && this.layout.shouldInvalidateLayoutOptions(opts.invalidationContext.layoutOptions, this._invalidationContext.layoutOptions);\n needsLayout ||= itemSizeChanged || sizeChanged || offsetChanged || layoutOptionsChanged;\n }\n this._invalidationContext = opts.invalidationContext;\n }\n\n if (opts.isScrolling !== this._isScrolling) {\n this._isScrolling = opts.isScrolling;\n if (!opts.isScrolling) {\n // Update to fix the DOM order after scrolling.\n needsUpdate = true;\n }\n }\n\n if (needsLayout) {\n this.relayout({\n offsetChanged,\n sizeChanged,\n itemSizeChanged,\n layoutOptionsChanged,\n layoutOptions: this._invalidationContext.layoutOptions\n });\n } else if (needsUpdate) {\n this.updateSubviews();\n }\n\n return Array.from(this._rootView.children);\n }\n\n getVisibleView(key: Key): ReusableView<T, V> | undefined {\n return this._visibleViews.get(key);\n }\n\n invalidate(context: InvalidationContext) {\n this.delegate.invalidate(context);\n }\n\n updateItemSize(key: Key, size: Size) {\n if (!this.layout.updateItemSize) {\n return;\n }\n\n let changed = this.layout.updateItemSize(key, size);\n if (changed) {\n this.invalidate({\n itemSizeChanged: true\n });\n }\n }\n}\n"],"names":[],"version":3,"file":"Virtualizer.module.js.map"}
package/dist/types.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Key, Collection, ItemDropTarget, LayoutDelegate } from "@react-types/shared";
1
+ import { Key, Collection, ItemDropTarget, LayoutDelegate, Node } from "@react-types/shared";
2
2
  export class Point {
3
3
  /** The x-coordinate of the point. */
4
4
  x: number;
@@ -116,63 +116,66 @@ export class Rect {
116
116
  copy(): Rect;
117
117
  }
118
118
  /**
119
- * Instances of this lightweight class are created by {@link Layout} subclasses
120
- * to represent each view in the {@link Virtualizer}. LayoutInfo objects describe
121
- * various properties of a view, such as its position and size, and style information.
122
- * The virtualizer uses this information when creating actual views to display.
119
+ * Instances of this lightweight class are created by `Layout` subclasses
120
+ * to represent each item in the `Virtualizer`. LayoutInfo objects describe
121
+ * various properties of an item, such as its position and size, and style information.
122
+ * The virtualizer uses this information when creating actual DOM elements to display.
123
123
  */
124
124
  export class LayoutInfo {
125
125
  /**
126
- * A string representing the view type. Should be `'item'` for item views.
127
- * Other types are used by supplementary views.
126
+ * The type of element represented by this LayoutInfo. Should match the `type` of the corresponding collection node.
128
127
  */
129
128
  type: string;
130
129
  /**
131
- * A unique key for this view. For item views, it should match the content key.
130
+ * A unique key for this LayoutInfo. Should match the `key` of the corresponding collection node.
132
131
  */
133
132
  key: Key;
134
133
  /**
135
- * The key for a parent layout info, if any.
134
+ * The key for a parent LayoutInfo, if any.
136
135
  */
137
136
  parentKey: Key | null;
138
137
  /**
139
- * Content for this view if it was generated by the layout rather than coming from the Collection.
138
+ * Content for this item if it was generated by the layout rather than coming from the Collection.
140
139
  */
141
140
  content: any | null;
142
141
  /**
143
- * The rectangle describing the size and position of this view.
142
+ * The rectangle describing the size and position of this element.
144
143
  */
145
144
  rect: Rect;
146
145
  /**
147
146
  * Whether the size is estimated. `false` by default.
147
+ * Items with estimated sizes will be measured the first time they are added to the DOM.
148
+ * The estimated size is used to calculate the size and position of the scrollbar.
149
+ * @default false
148
150
  */
149
151
  estimatedSize: boolean;
150
152
  /**
151
153
  * Whether the layout info sticks to the viewport when scrolling.
154
+ * @default false
152
155
  */
153
156
  isSticky: boolean;
154
157
  /**
155
- * The view's opacity. 1 by default.
158
+ * The element's opacity.
159
+ * @default 1
156
160
  */
157
161
  opacity: number;
158
162
  /**
159
- * A CSS transform string to apply to the view. `null` by default.
163
+ * A CSS transform string to apply to the element. `null` by default.
160
164
  */
161
165
  transform: string | null;
162
166
  /**
163
- * The z-index of the view. 0 by default.
167
+ * The z-index of the element. 0 by default.
164
168
  */
165
169
  zIndex: number;
166
170
  /**
167
- * Whether the layout info allows its contents to overflow its container.
171
+ * Whether the element allows its contents to overflow its container.
168
172
  * @default false
169
173
  */
170
174
  allowOverflow: boolean;
171
175
  /**
172
- * @param type A string representing the view type. Should be `'item'` for item views.
173
- Other types are used by supplementary views.
174
- * @param key The unique key for this view.
175
- * @param rect The rectangle describing the size and position of this view.
176
+ * @param type The type of element represented by this LayoutInfo. Should match the `type` of the corresponding collection node.
177
+ * @param key A unique key for this LayoutInfo. Should match the `key` of the corresponding collection node.
178
+ * @param rect The rectangle describing the size and position of this element.
176
179
  */
177
180
  constructor(type: string, key: Key, rect: Rect);
178
181
  /**
@@ -181,7 +184,7 @@ export class LayoutInfo {
181
184
  copy(): LayoutInfo;
182
185
  }
183
186
  /**
184
- * [Virtualizer]{@link Virtualizer} creates instances of the [ReusableView]{@link ReusableView} class to
187
+ * `Virtualizer` creates instances of the `ReusableView` class to
185
188
  * represent views currently being displayed.
186
189
  */
187
190
  export class ReusableView<T extends object, V> {
@@ -219,14 +222,14 @@ interface VirtualizerOptions<T extends object, V> {
219
222
  * them as you scroll. Virtualizer can present any type of view, including non-item views
220
223
  * such as section headers and footers.
221
224
  *
222
- * Virtualizer uses {@link Layout} objects to compute what views should be visible, and how
225
+ * Virtualizer uses `Layout` objects to compute what views should be visible, and how
223
226
  * to position and style them. This means that virtualizer can have its items arranged in
224
227
  * a stack, a grid, a circle, or any other layout you can think of. The layout can be changed
225
228
  * dynamically at runtime as well.
226
229
  *
227
230
  * Layouts produce information on what views should appear in the virtualizer, but do not create
228
- * the views themselves directly. It is the responsibility of the {@link VirtualizerDelegate} object
229
- * to render elements for each layout info. The virtualizer manages a set of {@link ReusableView} objects,
231
+ * the views themselves directly. It is the responsibility of the `VirtualizerDelegate` object
232
+ * to render elements for each layout info. The virtualizer manages a set of `ReusableView` objects,
230
233
  * which are reused as the user scrolls by swapping their content with cached elements returned by the delegate.
231
234
  */
232
235
  declare class Virtualizer<T extends object, V> {
@@ -260,60 +263,65 @@ declare class Virtualizer<T extends object, V> {
260
263
  updateItemSize(key: Key, size: Size): void;
261
264
  }
262
265
  /**
263
- * [Virtualizer]{@link Virtualizer} supports arbitrary layout objects, which compute what views are visible, and how
264
- * to position and style them. However, layouts do not create the views themselves directly. Instead,
265
- * layouts produce lightweight {@link LayoutInfo} objects which describe various properties of a view,
266
- * such as its position and size. The {@link Virtualizer} is then responsible for creating the actual
266
+ * Virtualizer supports arbitrary layout objects, which compute what items are visible, and how
267
+ * to position and style them. However, layouts do not render items directly. Instead,
268
+ * layouts produce lightweight LayoutInfo objects which describe various properties of an item,
269
+ * such as its position and size. The Virtualizer is then responsible for creating the actual
267
270
  * views as needed, based on this layout information.
268
271
  *
269
- * Every layout extends from the {@link Layout} abstract base class. Layouts must implement a minimum of the
270
- * two methods listed below. All other methods can be optionally overridden to implement custom behavior.
271
- *
272
- * @see {@link getVisibleLayoutInfos}
273
- * @see {@link getLayoutInfo}
272
+ * Every layout extends from the Layout abstract base class. Layouts must implement the `getVisibleLayoutInfos`,
273
+ * `getLayoutInfo`, and `getContentSize` methods. All other methods can be optionally overridden to implement custom behavior.
274
274
  */
275
- export abstract class Layout<T extends object, O = any> implements LayoutDelegate {
275
+ export abstract class Layout<T extends object = Node<any>, O = any> implements LayoutDelegate {
276
276
  /** The Virtualizer the layout is currently attached to. */
277
277
  virtualizer: Virtualizer<T, any> | null;
278
278
  /**
279
- * Returns whether the layout should invalidate in response to
280
- * visible rectangle changes. By default, it only invalidates
281
- * when the virtualizer's size changes. Return true always
282
- * to make the layout invalidate while scrolling (e.g. sticky headers).
283
- */
284
- shouldInvalidate(newRect: Rect, oldRect: Rect): boolean;
285
- /**
286
- * This method allows the layout to perform any pre-computation
287
- * it needs to in order to prepare {@link LayoutInfo}s for retrieval.
288
- * Called by the virtualizer before {@link getVisibleLayoutInfos}
289
- * or {@link getLayoutInfo} are called.
290
- */
291
- update(invalidationContext: InvalidationContext<O>): void;
292
- /**
293
- * Returns an array of {@link LayoutInfo} objects which are inside the given rectangle.
279
+ * Returns an array of `LayoutInfo` objects which are inside the given rectangle.
294
280
  * Should be implemented by subclasses.
295
281
  * @param rect The rectangle that should contain the returned LayoutInfo objects.
296
282
  */
297
283
  abstract getVisibleLayoutInfos(rect: Rect): LayoutInfo[];
298
284
  /**
299
- * Returns a {@link LayoutInfo} for the given key.
285
+ * Returns a `LayoutInfo` for the given key.
300
286
  * Should be implemented by subclasses.
301
287
  * @param key The key of the LayoutInfo to retrieve.
302
288
  */
303
289
  abstract getLayoutInfo(key: Key): LayoutInfo | null;
304
290
  /**
305
- * Returns size of the content. By default, it returns collectionView's size.
291
+ * Returns size of the content. By default, it returns virtualizer's size.
306
292
  */
307
293
  abstract getContentSize(): Size;
294
+ /**
295
+ * Returns whether the layout should invalidate in response to
296
+ * visible rectangle changes. By default, it only invalidates
297
+ * when the virtualizer's size changes. Return true always
298
+ * to make the layout invalidate while scrolling (e.g. sticky headers).
299
+ */
300
+ shouldInvalidate(newRect: Rect, oldRect: Rect): boolean;
301
+ /**
302
+ * Returns whether the layout should invalidate when the layout options change.
303
+ * By default it invalidates when the object identity changes. Override this
304
+ * method to optimize layout updates based on specific option changes.
305
+ */
306
+ shouldInvalidateLayoutOptions(newOptions: O, oldOptions: O): boolean;
307
+ /**
308
+ * This method allows the layout to perform any pre-computation
309
+ * it needs to in order to prepare LayoutInfos for retrieval.
310
+ * Called by the virtualizer before `getVisibleLayoutInfos`
311
+ * or `getLayoutInfo` are called.
312
+ */
313
+ update(invalidationContext: InvalidationContext<O>): void;
308
314
  /**
309
315
  * Updates the size of the given item.
310
316
  */
311
317
  updateItemSize?(key: Key, size: Size): boolean;
312
318
  /**
313
- * Returns a LayoutInfo for the given drop target.
319
+ * Returns a `LayoutInfo` for the given drop target.
314
320
  */
315
321
  getDropTargetLayoutInfo?(target: ItemDropTarget): LayoutInfo;
322
+ /** @private */
316
323
  getItemRect(key: Key): Rect | null;
324
+ /** @private */
317
325
  getVisibleRect(): Rect;
318
326
  }
319
327
  export interface InvalidationContext<O = any> {
@@ -321,6 +329,7 @@ export interface InvalidationContext<O = any> {
321
329
  offsetChanged?: boolean;
322
330
  sizeChanged?: boolean;
323
331
  itemSizeChanged?: boolean;
332
+ layoutOptionsChanged?: boolean;
324
333
  layoutOptions?: O;
325
334
  }
326
335
  interface VirtualizerDelegate<T extends object, V> {
@@ -1 +1 @@
1
- {"mappings":";AAYA;IACE,qCAAqC;IACrC,CAAC,EAAE,MAAM,CAAC;IAEV,qCAAqC;IACrC,CAAC,EAAE,MAAM,CAAC;gBAEE,CAAC,SAAI,EAAE,CAAC,SAAI;IAKxB;;OAEG;IACH,IAAI,IAAI,KAAK;IAIb;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO;IAI7B;;OAEG;IACH,QAAQ,IAAI,OAAO;CAGpB;AChCD;IACE,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;gBAEH,KAAK,SAAI,EAAE,MAAM,SAAI;IAKjC;;OAEG;IACH,IAAI,IAAI,IAAI;IAIZ;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,IAAI,GAAG,OAAO;IAK5B;;OAEG;IACH,IAAI,IAAI,WAEP;CACF;AC3BD,yBAAyB,SAAS,GAAG,UAAU,GAAG,YAAY,GAAG,aAAa,CAAC;AAE/E;;GAEG;AACH;IACE,yCAAyC;IACzC,CAAC,EAAE,MAAM,CAAC;IAEV,yCAAyC;IACzC,CAAC,EAAE,MAAM,CAAC;IAEV,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IAEd,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAC;gBAEH,CAAC,SAAI,EAAE,CAAC,SAAI,EAAE,KAAK,SAAI,EAAE,MAAM,SAAI;IAO/C;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,KAAK,CAEnB;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,KAAK,CAEpB;IAED;;OAEG;IACH,IAAI,UAAU,IAAI,KAAK,CAEtB;IAED;;OAEG;IACH,IAAI,WAAW,IAAI,KAAK,CAEvB;IAED;;;OAGG;IACH,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO;IAO/B;;;OAGG;IACH,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO;IAOjC;;;OAGG;IACH,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO;IAOpC;;;;OAIG;IACH,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,UAAU,GAAG,IAAI;IAU9C,MAAM,CAAC,IAAI,EAAE,IAAI;IAOjB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAK/B,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAK5B;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,IAAI;IAQjB;;;OAGG;IACH,YAAY,CAAC,KAAK,EAAE,IAAI,GAAG,IAAI;IAe/B;;OAEG;IACH,IAAI,IAAI,IAAI;CAGb;AC/KD;;;;;GAKG;AACH;IACE;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,GAAG,EAAE,GAAG,CAAC;IAET;;OAEG;IACH,SAAS,EAAE,GAAG,GAAG,IAAI,CAAC;IAEtB;;OAEG;IACH,OAAO,EAAE,GAAG,GAAG,IAAI,CAAC;IAEpB;;OAEG;IACH,IAAI,EAAE,IAAI,CAAC;IAEX;;OAEG;IACH,aAAa,EAAE,OAAO,CAAC;IAEvB;;OAEG;IACH,QAAQ,EAAE,OAAO,CAAC;IAElB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAEzB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,aAAa,EAAE,OAAO,CAAC;IAEvB;;;;;OAKG;gBACS,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI;IAc9C;;OAEG;IACH,IAAI,IAAI,UAAU;CAYnB;AChGD;;;GAGG;AACH,0BAA0B,CAAC,SAAS,MAAM,EAAE,CAAC;IAC3C,8CAA8C;IAC9C,WAAW,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC;IAE/B,0DAA0D;IAC1D,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IAE9B,kFAAkF;IAClF,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC;IAElB,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC;IAEnB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,GAAG,CAAC;IAET,QAAQ,EAAE,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/B,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;gBAElC,WAAW,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM;IAW5D;;OAEG;IACH,eAAe;IAMf,eAAe,CAAC,SAAS,EAAE,MAAM;IAajC,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC;CASlC;AAQD,wBAAuB,CAAC,SAAS,MAAM,EAAE,CAAC,CAAE,SAAQ,aAAa,CAAC,EAAE,CAAC,CAAC;IACpE,MAAM,EAAE,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC;gBAEf,WAAW,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM;CAIzF;AG1ED,6BAA6B,CAAC,SAAS,MAAM,EAAE,CAAC;IAC9C,QAAQ,EAAE,oBAAoB,CAAC,EAAE,CAAC,CAAC,CAAC;IACpC,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;IAC1B,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;CAClB;AAED;;;;;;;;;;;;;;;GAeG;AACH,0BAAyB,CAAC,SAAS,MAAM,EAAE,CAAC;IAC1C;;;OAGG;IACH,QAAQ,EAAE,oBAAoB,CAAC,EAAE,CAAC,CAAC,CAAC;IAEpC,8CAA8C;IAC9C,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;IACnC,2DAA2D;IAC3D,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3B,0CAA0C;IAC1C,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC;IAC3B,uCAAuC;IACvC,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC;IAC3B,mGAAmG;IACnG,QAAQ,CAAC,aAAa,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;gBASrB,OAAO,EAAE,mBAAmB,CAAC,EAAE,CAAC,CAAC;IAe7C,mEAAmE;IACnE,cAAc,CAAC,GAAG,EAAE,GAAG;IA0DvB;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,GAAG,GAAG,IAAI;IAqCpC,qBAAqB;IA6ErB,2DAA2D;IAC3D,MAAM,CAAC,IAAI,EAAE,yBAAyB,CAAC,CAAC,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE;IA4E/D,cAAc,CAAC,GAAG,EAAE,GAAG,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS;IAIxD,UAAU,CAAC,OAAO,EAAE,mBAAmB;IAIvC,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI;CAYpC;ACnVD;;;;;;;;;;;;GAYG;AACH,OAAO,QAAQ,cAAc,CAAC,SAAS,MAAM,EAAE,CAAC,GAAG,GAAG,CAAE,YAAW,cAAc;IAC/E,2DAA2D;IAC3D,WAAW,EAAE,YAAY,CAAC,EAAE,GAAG,CAAC,GAAG,IAAI,CAAQ;IAE/C;;;;;OAKG;IACH,gBAAgB,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,GAAG,OAAO;IAMvD;;;;;OAKG;IACH,MAAM,CAAC,mBAAmB,EAAE,oBAAoB,CAAC,CAAC;IAElD;;;;OAIG;IACH,QAAQ,CAAC,qBAAqB,CAAC,IAAI,EAAE,IAAI,GAAG,UAAU,EAAE;IAExD;;;;OAIG;IACH,QAAQ,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG,UAAU,GAAG,IAAI;IAEnD;;OAEG;IACH,QAAQ,CAAC,cAAc,IAAI,IAAI;IAE/B;;OAEG;IACH,cAAc,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO;IAE9C;;OAEG;IACH,uBAAuB,CAAC,CAAC,MAAM,EAAE,cAAc,GAAG,UAAU;IAE5D,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,GAAG,IAAI;IAIlC,cAAc,IAAI,IAAI;CAGvB;AC5ED,qCAAqC,CAAC,GAAG,GAAG;IAC1C,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,CAAC,CAAA;CAClB;AAED,8BAAqC,CAAC,SAAS,MAAM,EAAE,CAAC;IACtD,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IACjC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;IAC/C,UAAU,CAAC,GAAG,EAAE,mBAAmB,GAAG,IAAI,CAAA;CAC3C;AAED,mCAA0C,CAAC,SAAS,MAAM,EAAE,CAAC,GAAG,GAAG;IACjE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAClB,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;IAC1B,aAAa,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IAChC,WAAW,EAAE,IAAI,CAAC;IAClB,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,CAAC,CAAA;CAClB;AChBD,2BAA2B,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC;IAC/C,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;IAC/C,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAClB,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;IAC1B,mBAAmB,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IACtC,aAAa,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IAChC,aAAa,CAAC,EAAE,CAAC,CAAA;CAClB;AAED,kCAAkC,CAAC,SAAS,MAAM,EAAE,CAAC;IACnD,YAAY,EAAE,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IACnC,cAAc,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IACrC,WAAW,EAAE,IAAI,CAAC;IAClB,WAAW,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/B,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,YAAY,EAAE,MAAM,IAAI,CAAA;CACzB;AAED,oCAAoC,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,iBAAiB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAwEzH","sources":["packages/@react-stately/virtualizer/src/packages/@react-stately/virtualizer/src/Point.ts","packages/@react-stately/virtualizer/src/packages/@react-stately/virtualizer/src/Size.ts","packages/@react-stately/virtualizer/src/packages/@react-stately/virtualizer/src/Rect.ts","packages/@react-stately/virtualizer/src/packages/@react-stately/virtualizer/src/LayoutInfo.ts","packages/@react-stately/virtualizer/src/packages/@react-stately/virtualizer/src/ReusableView.ts","packages/@react-stately/virtualizer/src/packages/@react-stately/virtualizer/src/utils.ts","packages/@react-stately/virtualizer/src/packages/@react-stately/virtualizer/src/OverscanManager.ts","packages/@react-stately/virtualizer/src/packages/@react-stately/virtualizer/src/Virtualizer.ts","packages/@react-stately/virtualizer/src/packages/@react-stately/virtualizer/src/Layout.ts","packages/@react-stately/virtualizer/src/packages/@react-stately/virtualizer/src/types.ts","packages/@react-stately/virtualizer/src/packages/@react-stately/virtualizer/src/useVirtualizerState.ts","packages/@react-stately/virtualizer/src/packages/@react-stately/virtualizer/src/index.ts","packages/@react-stately/virtualizer/src/index.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null,null,"/*\n * Copyright 2020 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\nexport type {InvalidationContext} from './types';\nexport type {VirtualizerState} from './useVirtualizerState';\nexport type {RectCorner} from './Rect';\n\nexport {Layout} from './Layout';\nexport {LayoutInfo} from './LayoutInfo';\nexport {Point} from './Point';\nexport {Rect} from './Rect';\nexport {Size} from './Size';\nexport {ReusableView} from './ReusableView';\nexport {useVirtualizerState} from './useVirtualizerState';\n"],"names":[],"version":3,"file":"types.d.ts.map"}
1
+ {"mappings":";AAYA;IACE,qCAAqC;IACrC,CAAC,EAAE,MAAM,CAAC;IAEV,qCAAqC;IACrC,CAAC,EAAE,MAAM,CAAC;gBAEE,CAAC,SAAI,EAAE,CAAC,SAAI;IAKxB;;OAEG;IACH,IAAI,IAAI,KAAK;IAIb;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO;IAI7B;;OAEG;IACH,QAAQ,IAAI,OAAO;CAGpB;AChCD;IACE,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;gBAEH,KAAK,SAAI,EAAE,MAAM,SAAI;IAKjC;;OAEG;IACH,IAAI,IAAI,IAAI;IAIZ;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,IAAI,GAAG,OAAO;IAK5B;;OAEG;IACH,IAAI,IAAI,WAEP;CACF;AC3BD,yBAAyB,SAAS,GAAG,UAAU,GAAG,YAAY,GAAG,aAAa,CAAC;AAE/E;;GAEG;AACH;IACE,yCAAyC;IACzC,CAAC,EAAE,MAAM,CAAC;IAEV,yCAAyC;IACzC,CAAC,EAAE,MAAM,CAAC;IAEV,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IAEd,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAC;gBAEH,CAAC,SAAI,EAAE,CAAC,SAAI,EAAE,KAAK,SAAI,EAAE,MAAM,SAAI;IAO/C;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,KAAK,CAEnB;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,KAAK,CAEpB;IAED;;OAEG;IACH,IAAI,UAAU,IAAI,KAAK,CAEtB;IAED;;OAEG;IACH,IAAI,WAAW,IAAI,KAAK,CAEvB;IAED;;;OAGG;IACH,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO;IAO/B;;;OAGG;IACH,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO;IAOjC;;;OAGG;IACH,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO;IAOpC;;;;OAIG;IACH,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,UAAU,GAAG,IAAI;IAU9C,MAAM,CAAC,IAAI,EAAE,IAAI;IAOjB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAK/B,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAK5B;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,IAAI;IAQjB;;;OAGG;IACH,YAAY,CAAC,KAAK,EAAE,IAAI,GAAG,IAAI;IAe/B;;OAEG;IACH,IAAI,IAAI,IAAI;CAGb;AC/KD;;;;;GAKG;AACH;IACE;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,GAAG,EAAE,GAAG,CAAC;IAET;;OAEG;IACH,SAAS,EAAE,GAAG,GAAG,IAAI,CAAC;IAEtB;;OAEG;IACH,OAAO,EAAE,GAAG,GAAG,IAAI,CAAC;IAEpB;;OAEG;IACH,IAAI,EAAE,IAAI,CAAC;IAEX;;;;;OAKG;IACH,aAAa,EAAE,OAAO,CAAC;IAEvB;;;OAGG;IACH,QAAQ,EAAE,OAAO,CAAC;IAElB;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAEzB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,aAAa,EAAE,OAAO,CAAC;IAEvB;;;;OAIG;gBACS,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI;IAc9C;;OAEG;IACH,IAAI,IAAI,UAAU;CAYnB;ACnGD;;;GAGG;AACH,0BAA0B,CAAC,SAAS,MAAM,EAAE,CAAC;IAC3C,8CAA8C;IAC9C,WAAW,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC;IAE/B,0DAA0D;IAC1D,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IAE9B,kFAAkF;IAClF,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC;IAElB,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC;IAEnB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,GAAG,CAAC;IAET,QAAQ,EAAE,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/B,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;gBAElC,WAAW,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM;IAW5D;;OAEG;IACH,eAAe;IAMf,eAAe,CAAC,SAAS,EAAE,MAAM;IAajC,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC;CASlC;AAQD,wBAAuB,CAAC,SAAS,MAAM,EAAE,CAAC,CAAE,SAAQ,aAAa,CAAC,EAAE,CAAC,CAAC;IACpE,MAAM,EAAE,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC;gBAEf,WAAW,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM;CAIzF;AG1ED,6BAA6B,CAAC,SAAS,MAAM,EAAE,CAAC;IAC9C,QAAQ,EAAE,oBAAoB,CAAC,EAAE,CAAC,CAAC,CAAC;IACpC,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;IAC1B,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;CAClB;AAED;;;;;;;;;;;;;;;GAeG;AACH,0BAAyB,CAAC,SAAS,MAAM,EAAE,CAAC;IAC1C;;;OAGG;IACH,QAAQ,EAAE,oBAAoB,CAAC,EAAE,CAAC,CAAC,CAAC;IAEpC,8CAA8C;IAC9C,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;IACnC,2DAA2D;IAC3D,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3B,0CAA0C;IAC1C,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC;IAC3B,uCAAuC;IACvC,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC;IAC3B,mGAAmG;IACnG,QAAQ,CAAC,aAAa,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;gBASrB,OAAO,EAAE,mBAAmB,CAAC,EAAE,CAAC,CAAC;IAe7C,mEAAmE;IACnE,cAAc,CAAC,GAAG,EAAE,GAAG;IA0DvB;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,GAAG,GAAG,IAAI;IAqCpC,qBAAqB;IA6ErB,2DAA2D;IAC3D,MAAM,CAAC,IAAI,EAAE,yBAAyB,CAAC,CAAC,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE;IAiF/D,cAAc,CAAC,GAAG,EAAE,GAAG,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS;IAIxD,UAAU,CAAC,OAAO,EAAE,mBAAmB;IAIvC,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI;CAYpC;ACxVD;;;;;;;;;GASG;AACH,OAAO,QAAQ,cAAc,CAAC,SAAS,MAAM,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAE,YAAW,cAAc;IAC3F,2DAA2D;IAC3D,WAAW,EAAE,YAAY,CAAC,EAAE,GAAG,CAAC,GAAG,IAAI,CAAQ;IAE/C;;;;OAIG;IACH,QAAQ,CAAC,qBAAqB,CAAC,IAAI,EAAE,IAAI,GAAG,UAAU,EAAE;IAExD;;;;OAIG;IACH,QAAQ,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG,UAAU,GAAG,IAAI;IAEnD;;OAEG;IACH,QAAQ,CAAC,cAAc,IAAI,IAAI;IAE/B;;;;;OAKG;IACH,gBAAgB,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,GAAG,OAAO;IAMvD;;;;OAIG;IACH,6BAA6B,CAAC,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,GAAG,OAAO;IAIpE;;;;;OAKG;IACH,MAAM,CAAC,mBAAmB,EAAE,oBAAoB,CAAC,CAAC;IAElD;;OAEG;IACH,cAAc,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO;IAE9C;;OAEG;IACH,uBAAuB,CAAC,CAAC,MAAM,EAAE,cAAc,GAAG,UAAU;IAE5D,eAAe;IACf,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,GAAG,IAAI;IAIlC,eAAe;IACf,cAAc,IAAI,IAAI;CAGvB;ACpFD,qCAAqC,CAAC,GAAG,GAAG;IAC1C,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,aAAa,CAAC,EAAE,CAAC,CAAA;CAClB;AAED,8BAAqC,CAAC,SAAS,MAAM,EAAE,CAAC;IACtD,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IACjC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;IAC/C,UAAU,CAAC,GAAG,EAAE,mBAAmB,GAAG,IAAI,CAAA;CAC3C;AAED,mCAA0C,CAAC,SAAS,MAAM,EAAE,CAAC,GAAG,GAAG;IACjE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAClB,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;IAC1B,aAAa,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IAChC,WAAW,EAAE,IAAI,CAAC;IAClB,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,CAAC,CAAA;CAClB;ACjBD,2BAA2B,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC;IAC/C,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;IAC/C,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAClB,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;IAC1B,mBAAmB,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IACtC,aAAa,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IAChC,aAAa,CAAC,EAAE,CAAC,CAAA;CAClB;AAED,kCAAkC,CAAC,SAAS,MAAM,EAAE,CAAC;IACnD,YAAY,EAAE,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IACnC,cAAc,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IACrC,WAAW,EAAE,IAAI,CAAC;IAClB,WAAW,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/B,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,YAAY,EAAE,MAAM,IAAI,CAAA;CACzB;AAED,oCAAoC,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,iBAAiB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAwEzH","sources":["packages/@react-stately/virtualizer/src/packages/@react-stately/virtualizer/src/Point.ts","packages/@react-stately/virtualizer/src/packages/@react-stately/virtualizer/src/Size.ts","packages/@react-stately/virtualizer/src/packages/@react-stately/virtualizer/src/Rect.ts","packages/@react-stately/virtualizer/src/packages/@react-stately/virtualizer/src/LayoutInfo.ts","packages/@react-stately/virtualizer/src/packages/@react-stately/virtualizer/src/ReusableView.ts","packages/@react-stately/virtualizer/src/packages/@react-stately/virtualizer/src/utils.ts","packages/@react-stately/virtualizer/src/packages/@react-stately/virtualizer/src/OverscanManager.ts","packages/@react-stately/virtualizer/src/packages/@react-stately/virtualizer/src/Virtualizer.ts","packages/@react-stately/virtualizer/src/packages/@react-stately/virtualizer/src/Layout.ts","packages/@react-stately/virtualizer/src/packages/@react-stately/virtualizer/src/types.ts","packages/@react-stately/virtualizer/src/packages/@react-stately/virtualizer/src/useVirtualizerState.ts","packages/@react-stately/virtualizer/src/packages/@react-stately/virtualizer/src/index.ts","packages/@react-stately/virtualizer/src/index.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null,null,"/*\n * Copyright 2020 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\nexport type {InvalidationContext} from './types';\nexport type {VirtualizerState} from './useVirtualizerState';\nexport type {RectCorner} from './Rect';\n\nexport {Layout} from './Layout';\nexport {LayoutInfo} from './LayoutInfo';\nexport {Point} from './Point';\nexport {Rect} from './Rect';\nexport {Size} from './Size';\nexport {ReusableView} from './ReusableView';\nexport {useVirtualizerState} from './useVirtualizerState';\n"],"names":[],"version":3,"file":"types.d.ts.map"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-stately/virtualizer",
3
- "version": "4.2.0",
3
+ "version": "4.3.0",
4
4
  "description": "Spectrum UI components in React",
5
5
  "license": "Apache-2.0",
6
6
  "main": "dist/main.js",
@@ -22,15 +22,16 @@
22
22
  "url": "https://github.com/adobe/react-spectrum"
23
23
  },
24
24
  "dependencies": {
25
- "@react-aria/utils": "^3.26.0",
26
- "@react-types/shared": "^3.26.0",
25
+ "@react-aria/utils": "^3.28.0",
26
+ "@react-types/shared": "^3.28.0",
27
27
  "@swc/helpers": "^0.5.0"
28
28
  },
29
29
  "peerDependencies": {
30
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
30
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
31
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
31
32
  },
32
33
  "publishConfig": {
33
34
  "access": "public"
34
35
  },
35
- "gitHead": "71f0ef23053f9e03ee7e97df736e8b083e006849"
36
+ "gitHead": "4d3c72c94eea2d72eb3a0e7d56000c6ef7e39726"
36
37
  }
package/src/Layout.ts CHANGED
@@ -11,29 +11,45 @@
11
11
  */
12
12
 
13
13
  import {InvalidationContext} from './types';
14
- import {ItemDropTarget, Key, LayoutDelegate} from '@react-types/shared';
14
+ import {ItemDropTarget, Key, LayoutDelegate, Node} from '@react-types/shared';
15
15
  import {LayoutInfo} from './LayoutInfo';
16
16
  import {Rect} from './Rect';
17
17
  import {Size} from './Size';
18
18
  import {Virtualizer} from './Virtualizer';
19
19
 
20
20
  /**
21
- * [Virtualizer]{@link Virtualizer} supports arbitrary layout objects, which compute what views are visible, and how
22
- * to position and style them. However, layouts do not create the views themselves directly. Instead,
23
- * layouts produce lightweight {@link LayoutInfo} objects which describe various properties of a view,
24
- * such as its position and size. The {@link Virtualizer} is then responsible for creating the actual
21
+ * Virtualizer supports arbitrary layout objects, which compute what items are visible, and how
22
+ * to position and style them. However, layouts do not render items directly. Instead,
23
+ * layouts produce lightweight LayoutInfo objects which describe various properties of an item,
24
+ * such as its position and size. The Virtualizer is then responsible for creating the actual
25
25
  * views as needed, based on this layout information.
26
26
  *
27
- * Every layout extends from the {@link Layout} abstract base class. Layouts must implement a minimum of the
28
- * two methods listed below. All other methods can be optionally overridden to implement custom behavior.
29
- *
30
- * @see {@link getVisibleLayoutInfos}
31
- * @see {@link getLayoutInfo}
27
+ * Every layout extends from the Layout abstract base class. Layouts must implement the `getVisibleLayoutInfos`,
28
+ * `getLayoutInfo`, and `getContentSize` methods. All other methods can be optionally overridden to implement custom behavior.
32
29
  */
33
- export abstract class Layout<T extends object, O = any> implements LayoutDelegate {
30
+ export abstract class Layout<T extends object = Node<any>, O = any> implements LayoutDelegate {
34
31
  /** The Virtualizer the layout is currently attached to. */
35
32
  virtualizer: Virtualizer<T, any> | null = null;
36
33
 
34
+ /**
35
+ * Returns an array of `LayoutInfo` objects which are inside the given rectangle.
36
+ * Should be implemented by subclasses.
37
+ * @param rect The rectangle that should contain the returned LayoutInfo objects.
38
+ */
39
+ abstract getVisibleLayoutInfos(rect: Rect): LayoutInfo[];
40
+
41
+ /**
42
+ * Returns a `LayoutInfo` for the given key.
43
+ * Should be implemented by subclasses.
44
+ * @param key The key of the LayoutInfo to retrieve.
45
+ */
46
+ abstract getLayoutInfo(key: Key): LayoutInfo | null;
47
+
48
+ /**
49
+ * Returns size of the content. By default, it returns virtualizer's size.
50
+ */
51
+ abstract getContentSize(): Size;
52
+
37
53
  /**
38
54
  * Returns whether the layout should invalidate in response to
39
55
  * visible rectangle changes. By default, it only invalidates
@@ -47,31 +63,21 @@ export abstract class Layout<T extends object, O = any> implements LayoutDelegat
47
63
  }
48
64
 
49
65
  /**
50
- * This method allows the layout to perform any pre-computation
51
- * it needs to in order to prepare {@link LayoutInfo}s for retrieval.
52
- * Called by the virtualizer before {@link getVisibleLayoutInfos}
53
- * or {@link getLayoutInfo} are called.
66
+ * Returns whether the layout should invalidate when the layout options change.
67
+ * By default it invalidates when the object identity changes. Override this
68
+ * method to optimize layout updates based on specific option changes.
54
69
  */
55
- update(invalidationContext: InvalidationContext<O>) {} // eslint-disable-line @typescript-eslint/no-unused-vars
56
-
57
- /**
58
- * Returns an array of {@link LayoutInfo} objects which are inside the given rectangle.
59
- * Should be implemented by subclasses.
60
- * @param rect The rectangle that should contain the returned LayoutInfo objects.
61
- */
62
- abstract getVisibleLayoutInfos(rect: Rect): LayoutInfo[];
63
-
64
- /**
65
- * Returns a {@link LayoutInfo} for the given key.
66
- * Should be implemented by subclasses.
67
- * @param key The key of the LayoutInfo to retrieve.
68
- */
69
- abstract getLayoutInfo(key: Key): LayoutInfo | null;
70
+ shouldInvalidateLayoutOptions(newOptions: O, oldOptions: O): boolean {
71
+ return newOptions !== oldOptions;
72
+ }
70
73
 
71
74
  /**
72
- * Returns size of the content. By default, it returns collectionView's size.
75
+ * This method allows the layout to perform any pre-computation
76
+ * it needs to in order to prepare LayoutInfos for retrieval.
77
+ * Called by the virtualizer before `getVisibleLayoutInfos`
78
+ * or `getLayoutInfo` are called.
73
79
  */
74
- abstract getContentSize(): Size;
80
+ update(invalidationContext: InvalidationContext<O>) {} // eslint-disable-line @typescript-eslint/no-unused-vars
75
81
 
76
82
  /**
77
83
  * Updates the size of the given item.
@@ -79,14 +85,16 @@ export abstract class Layout<T extends object, O = any> implements LayoutDelegat
79
85
  updateItemSize?(key: Key, size: Size): boolean;
80
86
 
81
87
  /**
82
- * Returns a LayoutInfo for the given drop target.
88
+ * Returns a `LayoutInfo` for the given drop target.
83
89
  */
84
90
  getDropTargetLayoutInfo?(target: ItemDropTarget): LayoutInfo;
85
91
 
92
+ /** @private */
86
93
  getItemRect(key: Key): Rect | null {
87
94
  return this.getLayoutInfo(key)?.rect ?? null;
88
95
  }
89
96
 
97
+ /** @private */
90
98
  getVisibleRect(): Rect {
91
99
  return this.virtualizer!.visibleRect;
92
100
  }
package/src/LayoutInfo.ts CHANGED
@@ -14,74 +14,77 @@ import {Key} from '@react-types/shared';
14
14
  import {Rect} from './Rect';
15
15
 
16
16
  /**
17
- * Instances of this lightweight class are created by {@link Layout} subclasses
18
- * to represent each view in the {@link Virtualizer}. LayoutInfo objects describe
19
- * various properties of a view, such as its position and size, and style information.
20
- * The virtualizer uses this information when creating actual views to display.
17
+ * Instances of this lightweight class are created by `Layout` subclasses
18
+ * to represent each item in the `Virtualizer`. LayoutInfo objects describe
19
+ * various properties of an item, such as its position and size, and style information.
20
+ * The virtualizer uses this information when creating actual DOM elements to display.
21
21
  */
22
22
  export class LayoutInfo {
23
23
  /**
24
- * A string representing the view type. Should be `'item'` for item views.
25
- * Other types are used by supplementary views.
24
+ * The type of element represented by this LayoutInfo. Should match the `type` of the corresponding collection node.
26
25
  */
27
26
  type: string;
28
27
 
29
28
  /**
30
- * A unique key for this view. For item views, it should match the content key.
29
+ * A unique key for this LayoutInfo. Should match the `key` of the corresponding collection node.
31
30
  */
32
31
  key: Key;
33
32
 
34
33
  /**
35
- * The key for a parent layout info, if any.
34
+ * The key for a parent LayoutInfo, if any.
36
35
  */
37
36
  parentKey: Key | null;
38
37
 
39
38
  /**
40
- * Content for this view if it was generated by the layout rather than coming from the Collection.
39
+ * Content for this item if it was generated by the layout rather than coming from the Collection.
41
40
  */
42
41
  content: any | null;
43
42
 
44
43
  /**
45
- * The rectangle describing the size and position of this view.
44
+ * The rectangle describing the size and position of this element.
46
45
  */
47
46
  rect: Rect;
48
47
 
49
48
  /**
50
49
  * Whether the size is estimated. `false` by default.
50
+ * Items with estimated sizes will be measured the first time they are added to the DOM.
51
+ * The estimated size is used to calculate the size and position of the scrollbar.
52
+ * @default false
51
53
  */
52
54
  estimatedSize: boolean;
53
55
 
54
56
  /**
55
57
  * Whether the layout info sticks to the viewport when scrolling.
58
+ * @default false
56
59
  */
57
60
  isSticky: boolean;
58
61
 
59
62
  /**
60
- * The view's opacity. 1 by default.
63
+ * The element's opacity.
64
+ * @default 1
61
65
  */
62
66
  opacity: number;
63
67
 
64
68
  /**
65
- * A CSS transform string to apply to the view. `null` by default.
69
+ * A CSS transform string to apply to the element. `null` by default.
66
70
  */
67
71
  transform: string | null;
68
72
 
69
73
  /**
70
- * The z-index of the view. 0 by default.
74
+ * The z-index of the element. 0 by default.
71
75
  */
72
76
  zIndex: number;
73
77
 
74
78
  /**
75
- * Whether the layout info allows its contents to overflow its container.
79
+ * Whether the element allows its contents to overflow its container.
76
80
  * @default false
77
81
  */
78
82
  allowOverflow: boolean;
79
83
 
80
84
  /**
81
- * @param type A string representing the view type. Should be `'item'` for item views.
82
- Other types are used by supplementary views.
83
- * @param key The unique key for this view.
84
- * @param rect The rectangle describing the size and position of this view.
85
+ * @param type The type of element represented by this LayoutInfo. Should match the `type` of the corresponding collection node.
86
+ * @param key A unique key for this LayoutInfo. Should match the `key` of the corresponding collection node.
87
+ * @param rect The rectangle describing the size and position of this element.
85
88
  */
86
89
  constructor(type: string, key: Key, rect: Rect) {
87
90
  this.type = type;
@@ -17,7 +17,7 @@ import {Virtualizer} from './Virtualizer';
17
17
  let KEY = 0;
18
18
 
19
19
  /**
20
- * [Virtualizer]{@link Virtualizer} creates instances of the [ReusableView]{@link ReusableView} class to
20
+ * `Virtualizer` creates instances of the `ReusableView` class to
21
21
  * represent views currently being displayed.
22
22
  */
23
23
  export class ReusableView<T extends object, V> {
@@ -33,14 +33,14 @@ interface VirtualizerOptions<T extends object, V> {
33
33
  * them as you scroll. Virtualizer can present any type of view, including non-item views
34
34
  * such as section headers and footers.
35
35
  *
36
- * Virtualizer uses {@link Layout} objects to compute what views should be visible, and how
36
+ * Virtualizer uses `Layout` objects to compute what views should be visible, and how
37
37
  * to position and style them. This means that virtualizer can have its items arranged in
38
38
  * a stack, a grid, a circle, or any other layout you can think of. The layout can be changed
39
39
  * dynamically at runtime as well.
40
40
  *
41
41
  * Layouts produce information on what views should appear in the virtualizer, but do not create
42
- * the views themselves directly. It is the responsibility of the {@link VirtualizerDelegate} object
43
- * to render elements for each layout info. The virtualizer manages a set of {@link ReusableView} objects,
42
+ * the views themselves directly. It is the responsibility of the `VirtualizerDelegate` object
43
+ * to render elements for each layout info. The virtualizer manages a set of `ReusableView` objects,
44
44
  * which are reused as the user scrolls by swapping their content with cached elements returned by the delegate.
45
45
  */
46
46
  export class Virtualizer<T extends object, V> {
@@ -266,6 +266,7 @@ export class Virtualizer<T extends object, V> {
266
266
  let offsetChanged = false;
267
267
  let sizeChanged = false;
268
268
  let itemSizeChanged = false;
269
+ let layoutOptionsChanged = false;
269
270
  let needsUpdate = false;
270
271
 
271
272
  if (opts.collection !== this.collection) {
@@ -308,8 +309,11 @@ export class Virtualizer<T extends object, V> {
308
309
  sizeChanged ||= opts.invalidationContext.sizeChanged || false;
309
310
  offsetChanged ||= opts.invalidationContext.offsetChanged || false;
310
311
  itemSizeChanged ||= opts.invalidationContext.itemSizeChanged || false;
311
- needsLayout ||= itemSizeChanged || sizeChanged || offsetChanged;
312
- needsLayout ||= opts.invalidationContext.layoutOptions !== this._invalidationContext.layoutOptions;
312
+ layoutOptionsChanged ||= opts.invalidationContext.layoutOptions != null
313
+ && this._invalidationContext.layoutOptions != null
314
+ && opts.invalidationContext.layoutOptions !== this._invalidationContext.layoutOptions
315
+ && this.layout.shouldInvalidateLayoutOptions(opts.invalidationContext.layoutOptions, this._invalidationContext.layoutOptions);
316
+ needsLayout ||= itemSizeChanged || sizeChanged || offsetChanged || layoutOptionsChanged;
313
317
  }
314
318
  this._invalidationContext = opts.invalidationContext;
315
319
  }
@@ -327,6 +331,7 @@ export class Virtualizer<T extends object, V> {
327
331
  offsetChanged,
328
332
  sizeChanged,
329
333
  itemSizeChanged,
334
+ layoutOptionsChanged,
330
335
  layoutOptions: this._invalidationContext.layoutOptions
331
336
  });
332
337
  } else if (needsUpdate) {
package/src/types.ts CHANGED
@@ -19,6 +19,7 @@ export interface InvalidationContext<O = any> {
19
19
  offsetChanged?: boolean,
20
20
  sizeChanged?: boolean,
21
21
  itemSizeChanged?: boolean,
22
+ layoutOptionsChanged?: boolean,
22
23
  layoutOptions?: O
23
24
  }
24
25