react-window 2.0.1 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -9
- package/dist/react-window.cjs +1 -1
- package/dist/react-window.cjs.map +1 -1
- package/dist/react-window.js +322 -317
- package/dist/react-window.js.map +1 -1
- package/docs/assets/CellComponent.example-B6rd3A81.js +2 -0
- package/docs/assets/{CellComponent.example-e4JJmmZM.js.map → CellComponent.example-B6rd3A81.js.map} +1 -1
- package/docs/assets/{ComponentProps-DMkeake1.js → ComponentProps-DjtQqosW.js} +2 -2
- package/docs/assets/{ComponentProps-DMkeake1.js.map → ComponentProps-DjtQqosW.js.map} +1 -1
- package/docs/assets/ContinueLink-BgDdBmAq.js +2 -0
- package/docs/assets/{ContinueLink-CbPhCk1k.js.map → ContinueLink-BgDdBmAq.js.map} +1 -1
- package/docs/assets/{FixedRowHeightsRoute-D8GuxxOL.js → FixedRowHeightsRoute-D2uTbdlK.js} +2 -2
- package/docs/assets/{FixedRowHeightsRoute-D8GuxxOL.js.map → FixedRowHeightsRoute-D2uTbdlK.js.map} +1 -1
- package/docs/assets/{FormattedCode-CAmuOSRw.js → FormattedCode-Bgu5KYpx.js} +2 -2
- package/docs/assets/{FormattedCode-CAmuOSRw.js.map → FormattedCode-Bgu5KYpx.js.map} +1 -1
- package/docs/assets/{GettingStartedRoute-zN9jVy3e.js → GettingStartedRoute-DFMvu5xc.js} +2 -2
- package/docs/assets/{GettingStartedRoute-zN9jVy3e.js.map → GettingStartedRoute-DFMvu5xc.js.map} +1 -1
- package/docs/assets/Grid-BmNZGHKY.js +2 -0
- package/docs/assets/Grid-BmNZGHKY.js.map +1 -0
- package/docs/assets/{Header-BYp8JKXz.js → Header-D5XYa_k5.js} +2 -2
- package/docs/assets/{Header-BYp8JKXz.js.map → Header-D5XYa_k5.js.map} +1 -1
- package/docs/assets/{HorizontalListsRoute-rNcKbQ1k.js → HorizontalListsRoute-BshOgFUz.js} +2 -2
- package/docs/assets/{HorizontalListsRoute-rNcKbQ1k.js.map → HorizontalListsRoute-BshOgFUz.js.map} +1 -1
- package/docs/assets/{ImperativeApiRoute-DntU9ReR.js → ImperativeApiRoute-BAWsk-vD.js} +2 -2
- package/docs/assets/{ImperativeApiRoute-DntU9ReR.js.map → ImperativeApiRoute-BAWsk-vD.js.map} +1 -1
- package/docs/assets/{ImperativeApiRoute-DD9Z7HWg.js → ImperativeApiRoute-DQIcyOMg.js} +2 -2
- package/docs/assets/ImperativeApiRoute-DQIcyOMg.js.map +1 -0
- package/docs/assets/List-C7ANWJ5i.js +2 -0
- package/docs/assets/List-C7ANWJ5i.js.map +1 -0
- package/docs/assets/{LoadingSpinner-Z5HQViRD.js → LoadingSpinner-C5G0kF8B.js} +2 -2
- package/docs/assets/{LoadingSpinner-Z5HQViRD.js.map → LoadingSpinner-C5G0kF8B.js.map} +1 -1
- package/docs/assets/{PageNotFound-B0nx-Cz_.js → PageNotFound-CmFn1Y8A.js} +2 -2
- package/docs/assets/{PageNotFound-B0nx-Cz_.js.map → PageNotFound-CmFn1Y8A.js.map} +1 -1
- package/docs/assets/{PlatformRequirementsRoute-C00ZSzCF.js → PlatformRequirementsRoute-DrlH5Zzd.js} +2 -2
- package/docs/assets/{PlatformRequirementsRoute-C00ZSzCF.js.map → PlatformRequirementsRoute-DrlH5Zzd.js.map} +1 -1
- package/docs/assets/PropsRoute-Du5tQlP4.js +2 -0
- package/docs/assets/{PropsRoute-D9jETWHk.js.map → PropsRoute-Du5tQlP4.js.map} +1 -1
- package/docs/assets/PropsRoute-Y6h__YZK.js +2 -0
- package/docs/assets/{PropsRoute-D77WXdPD.js.map → PropsRoute-Y6h__YZK.js.map} +1 -1
- package/docs/assets/{RTLGridsRoute-C49T7mLs.js → RTLGridsRoute-Bh6j-Do_.js} +2 -2
- package/docs/assets/{RTLGridsRoute-C49T7mLs.js.map → RTLGridsRoute-Bh6j-Do_.js.map} +1 -1
- package/docs/assets/{RenderingGridRoute-pTuxJ89O.js → RenderingGridRoute-BiAH8mBy.js} +2 -2
- package/docs/assets/{RenderingGridRoute-pTuxJ89O.js.map → RenderingGridRoute-BiAH8mBy.js.map} +1 -1
- package/docs/assets/{ScratchpadRoute-AXfI00Be.js → ScratchpadRoute-NKLpLi0x.js} +2 -2
- package/docs/assets/{ScratchpadRoute-AXfI00Be.js.map → ScratchpadRoute-NKLpLi0x.js.map} +1 -1
- package/docs/assets/{Select-C5ovWBbK.js → Select-DYzOjrIR.js} +2 -2
- package/docs/assets/{Select-C5ovWBbK.js.map → Select-DYzOjrIR.js.map} +1 -1
- package/docs/assets/{SupportRoute-C1V_AF9b.js → SupportRoute-B3HtlCgf.js} +2 -2
- package/docs/assets/{SupportRoute-C1V_AF9b.js.map → SupportRoute-B3HtlCgf.js.map} +1 -1
- package/docs/assets/{TabularDataRoute-B79B4UDS.js → TabularDataRoute-Dw2CznU_.js} +2 -2
- package/docs/assets/{TabularDataRoute-B79B4UDS.js.map → TabularDataRoute-Dw2CznU_.js.map} +1 -1
- package/docs/assets/{VariableRowHeightsRoute-Bf7uZQG0.js → VariableRowHeightsRoute-BtjBfaPU.js} +2 -2
- package/docs/assets/{VariableRowHeightsRoute-Bf7uZQG0.js.map → VariableRowHeightsRoute-BtjBfaPU.js.map} +1 -1
- package/docs/assets/arePropsEqual-J86giKVT.js +2 -0
- package/docs/assets/arePropsEqual-J86giKVT.js.map +1 -0
- package/docs/assets/{index-B_YQ7rlN.js → index-6dOV2kLd.js} +3 -3
- package/docs/assets/{index-B_YQ7rlN.js.map → index-6dOV2kLd.js.map} +1 -1
- package/docs/assets/{useCitiesByState-azL1M3ue.js → useCitiesByState-aLkpFxPh.js} +2 -2
- package/docs/assets/{useCitiesByState-azL1M3ue.js.map → useCitiesByState-aLkpFxPh.js.map} +1 -1
- package/docs/assets/{useContacts-BItVOkyi.js → useContacts-QMK0xyhD.js} +2 -2
- package/docs/assets/{useContacts-BItVOkyi.js.map → useContacts-QMK0xyhD.js.map} +1 -1
- package/docs/index.html +1 -1
- package/docs/stats.html +1 -1
- package/package.json +1 -1
- package/docs/assets/CellComponent.example-e4JJmmZM.js +0 -2
- package/docs/assets/ContinueLink-CbPhCk1k.js +0 -2
- package/docs/assets/Grid-DH-j7ODh.js +0 -2
- package/docs/assets/Grid-DH-j7ODh.js.map +0 -1
- package/docs/assets/ImperativeApiRoute-DD9Z7HWg.js.map +0 -1
- package/docs/assets/List-C4KHYcVU.js +0 -2
- package/docs/assets/List-C4KHYcVU.js.map +0 -1
- package/docs/assets/PropsRoute-D77WXdPD.js +0 -2
- package/docs/assets/PropsRoute-D9jETWHk.js +0 -2
- package/docs/assets/arePropsEqual-D3jAKwxp.js +0 -2
- package/docs/assets/arePropsEqual-D3jAKwxp.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as s}from"./index-B_YQ7rlN.js";import{i as t}from"./useContacts-BItVOkyi.js";function n({contacts:n,columnIndex:e,rowIndex:o,style:r}){const c=n[o][t(e)];return s.jsx("div",{className:"truncate",style:r,children:c})}export{n as C};
|
|
2
|
-
//# sourceMappingURL=CellComponent.example-e4JJmmZM.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{r as e,j as t}from"./index-B_YQ7rlN.js";import{u as o,a as n,b as l}from"./arePropsEqual-D3jAKwxp.js";function r({cellComponent:r,cellProps:i,className:s,columnCount:a,columnWidth:c,defaultHeight:d=0,defaultWidth:u=0,dir:f,gridRef:m,onCellsRendered:x,onResize:h,overscanCount:g=3,rowCount:p,rowHeight:v,style:S,...C}){const I=o(i),w=e.useMemo(()=>e.memo(r,n),[r]),[z,b]=e.useState(null),E=function(t,o){const[n,l]=e.useState("rtl"===o);return e.useLayoutEffect(()=>{t&&(o||l(function(e){let t=e;for(;t;){if(t.dir)return"rtl"===t.dir;t=t.parentElement}return!1}(t)))},[o,t]),n}(z,f),{getCellBounds:O,getEstimatedSize:R,startIndex:T,scrollToIndex:y,stopIndex:j}=l({containerElement:z,defaultContainerSize:u,direction:"horizontal",isRtl:E,itemCount:a,itemProps:I,itemSize:c,onResize:h,overscanCount:g}),{getCellBounds:H,getEstimatedSize:P,startIndex:$,scrollToIndex:L,stopIndex:N}=l({containerElement:z,defaultContainerSize:d,direction:"vertical",itemCount:p,itemProps:I,itemSize:v,onResize:h,overscanCount:g});e.useImperativeHandle(m,()=>({get element(){return z},scrollToCell({behavior:e="auto",columnAlign:t="auto",columnIndex:o,rowAlign:n="auto",rowIndex:l}){L({align:n,behavior:e,containerScrollOffset:z?.scrollTop??0,index:l}),y({align:t,behavior:e,containerScrollOffset:z?.scrollLeft??0,index:o})},scrollToColumn({align:e="auto",behavior:t="auto",index:o}){y({align:e,behavior:t,containerScrollOffset:z?.scrollLeft??0,index:o})},scrollToRow({align:e="auto",behavior:t="auto",index:o}){L({align:e,behavior:t,containerScrollOffset:z?.scrollTop??0,index:o})}}),[z,y,L]),e.useEffect(()=>{T>=0&&j>=0&&$>=0&&N>=0&&x&&x({columnStartIndex:T,columnStopIndex:j,rowStartIndex:$,rowStopIndex:N})},[x,T,j,$,N]);const W=e.useMemo(()=>{const t=[];if(a>0&&p>0)for(let o=$;o<=N;o++){const n=H(o);for(let l=T;l<=j;l++){const r=O(l);t.push(e.createElement(w,{...I,columnIndex:l,key:`${o}-${l}`,rowIndex:o,style:{position:"absolute",left:E?void 0:0,right:E?0:void 0,transform:`translate(${E?-r.scrollOffset:r.scrollOffset}px, ${n.scrollOffset}px)`,height:p>1?n.size:"100%",width:r.size}}))}}return t},[w,I,a,T,j,O,H,E,p,$,N]);return t.jsx("div",{...C,className:s,dir:f,ref:b,style:{width:"100%",height:"100%",...S,maxHeight:"100%",maxWidth:"100%",flexGrow:1,overflow:"auto"},children:t.jsx("div",{className:s,style:{position:"relative",height:P(),width:R()},children:W})})}export{r as G};
|
|
2
|
-
//# sourceMappingURL=Grid-DH-j7ODh.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Grid-DH-j7ODh.js","sources":["../../lib/components/grid/Grid.tsx","../../lib/core/useIsRtl.ts","../../lib/utils/isRtl.ts"],"sourcesContent":["import {\n memo,\n useEffect,\n useImperativeHandle,\n useMemo,\n useState,\n type ReactNode\n} from \"react\";\nimport { useIsRtl } from \"../../core/useIsRtl\";\nimport { useVirtualizer } from \"../../core/useVirtualizer\";\nimport { useMemoizedObject } from \"../../hooks/useMemoizedObject\";\nimport type { Align } from \"../../types\";\nimport { arePropsEqual } from \"../../utils/arePropsEqual\";\nimport type { GridProps } from \"./types\";\n\nexport function Grid<CellProps extends object>({\n cellComponent: CellComponentProp,\n cellProps: cellPropsUnstable,\n className,\n columnCount,\n columnWidth,\n defaultHeight = 0,\n defaultWidth = 0,\n dir,\n gridRef,\n onCellsRendered,\n onResize,\n overscanCount = 3,\n rowCount,\n rowHeight,\n style,\n ...rest\n}: GridProps<CellProps>) {\n const cellProps = useMemoizedObject(cellPropsUnstable);\n const CellComponent = useMemo(\n () => memo(CellComponentProp, arePropsEqual),\n [CellComponentProp]\n );\n\n const [element, setElement] = useState<HTMLDivElement | null>(null);\n\n const isRtl = useIsRtl(element, dir);\n\n const {\n getCellBounds: getColumnBounds,\n getEstimatedSize: getEstimatedWidth,\n startIndex: columnStartIndex,\n scrollToIndex: scrollToColumnIndex,\n stopIndex: columnStopIndex\n } = useVirtualizer({\n containerElement: element,\n defaultContainerSize: defaultWidth,\n direction: \"horizontal\",\n isRtl,\n itemCount: columnCount,\n itemProps: cellProps,\n itemSize: columnWidth,\n onResize,\n overscanCount\n });\n\n const {\n getCellBounds: getRowBounds,\n getEstimatedSize: getEstimatedHeight,\n startIndex: rowStartIndex,\n scrollToIndex: scrollToRowIndex,\n stopIndex: rowStopIndex\n } = useVirtualizer({\n containerElement: element,\n defaultContainerSize: defaultHeight,\n direction: \"vertical\",\n itemCount: rowCount,\n itemProps: cellProps,\n itemSize: rowHeight,\n onResize,\n overscanCount\n });\n\n useImperativeHandle(\n gridRef,\n () => ({\n get element() {\n return element;\n },\n\n scrollToCell({\n behavior = \"auto\",\n columnAlign = \"auto\",\n columnIndex,\n rowAlign = \"auto\",\n rowIndex\n }: {\n behavior?: ScrollBehavior;\n columnAlign?: Align;\n columnIndex: number;\n rowAlign?: Align;\n rowIndex: number;\n }) {\n scrollToRowIndex({\n align: rowAlign,\n behavior,\n containerScrollOffset: element?.scrollTop ?? 0,\n index: rowIndex\n });\n scrollToColumnIndex({\n align: columnAlign,\n behavior,\n containerScrollOffset: element?.scrollLeft ?? 0,\n index: columnIndex\n });\n },\n\n scrollToColumn({\n align = \"auto\",\n behavior = \"auto\",\n index\n }: {\n align?: Align;\n behavior?: ScrollBehavior;\n index: number;\n }) {\n scrollToColumnIndex({\n align,\n behavior,\n containerScrollOffset: element?.scrollLeft ?? 0,\n index\n });\n },\n\n scrollToRow({\n align = \"auto\",\n behavior = \"auto\",\n index\n }: {\n align?: Align;\n behavior?: ScrollBehavior;\n index: number;\n }) {\n scrollToRowIndex({\n align,\n behavior,\n containerScrollOffset: element?.scrollTop ?? 0,\n index\n });\n }\n }),\n [element, scrollToColumnIndex, scrollToRowIndex]\n );\n\n useEffect(() => {\n if (\n columnStartIndex >= 0 &&\n columnStopIndex >= 0 &&\n rowStartIndex >= 0 &&\n rowStopIndex >= 0 &&\n onCellsRendered\n ) {\n onCellsRendered({\n columnStartIndex,\n columnStopIndex,\n rowStartIndex,\n rowStopIndex\n });\n }\n }, [\n onCellsRendered,\n columnStartIndex,\n columnStopIndex,\n rowStartIndex,\n rowStopIndex\n ]);\n\n const cells = useMemo(() => {\n const children: ReactNode[] = [];\n if (columnCount > 0 && rowCount > 0) {\n for (let rowIndex = rowStartIndex; rowIndex <= rowStopIndex; rowIndex++) {\n const rowBounds = getRowBounds(rowIndex);\n for (\n let columnIndex = columnStartIndex;\n columnIndex <= columnStopIndex;\n columnIndex++\n ) {\n const columnBounds = getColumnBounds(columnIndex);\n\n children.push(\n <CellComponent\n {...(cellProps as CellProps)}\n columnIndex={columnIndex}\n key={`${rowIndex}-${columnIndex}`}\n rowIndex={rowIndex}\n style={{\n position: \"absolute\",\n left: isRtl ? undefined : 0,\n right: isRtl ? 0 : undefined,\n transform: `translate(${isRtl ? -columnBounds.scrollOffset : columnBounds.scrollOffset}px, ${rowBounds.scrollOffset}px)`,\n height: rowCount > 1 ? rowBounds.size : \"100%\",\n width: columnBounds.size\n }}\n />\n );\n }\n }\n }\n return children;\n }, [\n CellComponent,\n cellProps,\n columnCount,\n columnStartIndex,\n columnStopIndex,\n getColumnBounds,\n getRowBounds,\n isRtl,\n rowCount,\n rowStartIndex,\n rowStopIndex\n ]);\n\n return (\n <div\n {...rest}\n className={className}\n dir={dir}\n ref={setElement}\n style={{\n width: \"100%\",\n height: \"100%\",\n ...style,\n maxHeight: \"100%\",\n maxWidth: \"100%\",\n flexGrow: 1,\n overflow: \"auto\"\n }}\n >\n <div\n className={className}\n style={{\n position: \"relative\",\n height: getEstimatedHeight(),\n width: getEstimatedWidth()\n }}\n >\n {cells}\n </div>\n </div>\n );\n}\n","import { useLayoutEffect, useState, type HTMLAttributes } from \"react\";\nimport { isRtl } from \"../utils/isRtl\";\n\nexport function useIsRtl(\n element: HTMLElement | null,\n dir: HTMLAttributes<HTMLElement>[\"dir\"]\n) {\n const [value, setValue] = useState(dir === \"rtl\");\n\n useLayoutEffect(() => {\n if (element) {\n if (!dir) {\n setValue(isRtl(element));\n }\n }\n }, [dir, element]);\n\n return value;\n}\n","export function isRtl(element: HTMLElement) {\n let currentElement: HTMLElement | null = element;\n while (currentElement) {\n if (currentElement.dir) {\n return currentElement.dir === \"rtl\";\n }\n\n currentElement = currentElement.parentElement;\n }\n\n return false;\n}\n"],"names":["Grid","cellComponent","CellComponentProp","cellProps","cellPropsUnstable","className","columnCount","columnWidth","defaultHeight","defaultWidth","dir","gridRef","onCellsRendered","onResize","overscanCount","rowCount","rowHeight","style","rest","useMemoizedObject","CellComponent","useMemo","memo","arePropsEqual","element","setElement","useState","isRtl","value","setValue","useLayoutEffect","currentElement","parentElement","useIsRtl","getCellBounds","getColumnBounds","getEstimatedSize","getEstimatedWidth","startIndex","columnStartIndex","scrollToIndex","scrollToColumnIndex","stopIndex","columnStopIndex","useVirtualizer","containerElement","defaultContainerSize","direction","itemCount","itemProps","itemSize","getRowBounds","getEstimatedHeight","rowStartIndex","scrollToRowIndex","rowStopIndex","useImperativeHandle","scrollToCell","behavior","columnAlign","columnIndex","rowAlign","rowIndex","align","containerScrollOffset","scrollTop","index","scrollLeft","scrollToColumn","scrollToRow","useEffect","cells","children","rowBounds","columnBounds","push","createElement","key","position","left","right","transform","scrollOffset","height","size","width","jsx","ref","maxHeight","maxWidth","flexGrow","overflow"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ImperativeApiRoute-DD9Z7HWg.js","sources":["../../lib/components/grid/useGridRef.ts","../../src/routes/grid/ImperativeApiRoute.tsx"],"sourcesContent":["import { useRef } from \"react\";\nimport type { GridImperativeAPI } from \"./types\";\n\n/**\n * Convenience hook to return a properly typed ref for the Grid component.\n */\nexport const useGridRef = useRef as typeof useRef<GridImperativeAPI>;\n","import { useMemo, useState } from \"react\";\nimport { Grid, useGridRef, type Align } from \"react-window\";\nimport { Block } from \"../../components/Block\";\nimport { Box } from \"../../components/Box\";\nimport { Button } from \"../../components/Button\";\nimport { Callout } from \"../../components/Callout\";\nimport { FormattedCode } from \"../../components/code/FormattedCode\";\nimport { Header } from \"../../components/Header\";\nimport { Select, type Option } from \"../../components/Select\";\nimport { CellComponent } from \"./examples/CellComponent.example\";\nimport { columnWidth } from \"./examples/columnWidth.example\";\nimport type { Contact } from \"./examples/Grid.example\";\nimport { COLUMN_KEYS } from \"./examples/shared\";\nimport { useContacts } from \"./hooks/useContacts\";\nimport { LoadingSpinner } from \"../../components/LoadingSpinner\";\n\nconst EMPTY_OPTION: Option<string> = {\n label: \"\",\n value: \"\"\n};\n\nconst ALIGNMENTS: Option<Align>[] = (\n [\"auto\", \"center\", \"end\", \"smart\", \"start\"] satisfies Align[]\n).map((value) => ({\n label: `align: ${value}`,\n value\n}));\nALIGNMENTS.unshift(EMPTY_OPTION as Option<Align>);\n\nconst BEHAVIORS: Option<ScrollBehavior>[] = (\n [\"auto\", \"instant\", \"smooth\"] satisfies ScrollBehavior[]\n).map((value) => ({\n label: `behavior: ${value}`,\n value\n}));\nBEHAVIORS.unshift(EMPTY_OPTION as Option<ScrollBehavior>);\n\nconst COLUMNS: Option<string>[] = COLUMN_KEYS.map((key) => ({\n label: key,\n value: key\n})).sort((a, b) => a.label.localeCompare(b.label));\n\nexport default function GridImperativeApiRoute() {\n const contacts = useContacts();\n\n const titleOptions = useMemo<Option<string>[]>(() => {\n const options: Option<string>[] = [];\n if (contacts) {\n contacts\n .reduce((array, contact) => {\n if (!array.includes(contact.title)) {\n array.push(contact.title);\n }\n return array;\n }, new Array<string>())\n .sort()\n .forEach((title) => {\n options.push({\n label: title,\n value: title\n });\n });\n\n options.unshift(EMPTY_OPTION);\n }\n\n return options;\n }, [contacts]);\n\n const [align, setAlign] = useState<Option<Align> | undefined>();\n const [behavior, setBehavior] = useState<\n Option<ScrollBehavior> | undefined\n >();\n const [column, setColumn] = useState<Option<string>>(EMPTY_OPTION);\n const [title, setTitle] = useState<Option<string>>(EMPTY_OPTION);\n\n const gridRef = useGridRef(null);\n\n const scrollToRow = () => {\n const grid = gridRef.current;\n if (grid) {\n const columnIndex = column?.value\n ? COLUMN_KEYS.indexOf(column.value as keyof Contact)\n : undefined;\n\n const rowIndex = title?.value\n ? contacts.findIndex((row) => row.title === title.value)\n : undefined;\n\n if (columnIndex !== undefined && rowIndex !== undefined) {\n grid.scrollToCell({\n behavior: behavior?.value,\n columnAlign: align?.value,\n columnIndex,\n rowAlign: align?.value,\n rowIndex\n });\n } else if (columnIndex !== undefined) {\n grid.scrollToColumn({\n align: align?.value,\n behavior: behavior?.value,\n index: columnIndex\n });\n } else if (rowIndex !== undefined) {\n grid.scrollToRow({\n align: align?.value,\n behavior: behavior?.value,\n index: rowIndex\n });\n }\n }\n };\n\n return (\n <Box direction=\"column\" gap={4}>\n <Header section=\"Grids\" title=\"Imperative API\" />\n <div>\n Grid provides an imperative API for responding to events. The\n recommended way to access this API is to use the exported ref hook:\n </div>\n <FormattedCode url=\"/generated/code-snippets/useGridRefImport.json\" />\n <div>Attach the ref during render:</div>\n <FormattedCode url=\"/generated/code-snippets/useGridRef.json\" />\n <div>And call API methods in an event handler:</div>\n <FormattedCode url=\"/generated/code-snippets/gridRefClickEventHandler.json\" />\n <div>The form below uses the imperative API to scroll the list:</div>\n <Box direction=\"row\" gap={4}>\n <Select\n className=\"flex-1\"\n onChange={setAlign}\n options={ALIGNMENTS}\n placeholder=\"Align\"\n value={align}\n />\n <Select\n className=\"flex-1\"\n onChange={setBehavior}\n options={BEHAVIORS}\n placeholder=\"Scroll behavior\"\n value={behavior}\n />\n </Box>\n <Box direction=\"row\" gap={4}>\n <Select\n className=\"flex-1\"\n onChange={setTitle}\n options={titleOptions}\n placeholder=\"Job title\"\n value={title}\n />\n <Select\n className=\"flex-1\"\n onChange={setColumn}\n options={COLUMNS}\n placeholder=\"Column\"\n value={column}\n />\n <Button\n className=\"shrink-0\"\n disabled={!column.value && !title.value}\n onClick={scrollToRow}\n >\n Scroll\n </Button>\n </Box>\n <Block className=\"h-50\" data-focus-within=\"bold\">\n {!contacts.length && <LoadingSpinner />}\n <Grid\n cellComponent={CellComponent}\n cellProps={{ contacts }}\n columnCount={COLUMNS.length}\n columnWidth={columnWidth}\n gridRef={gridRef}\n rowCount={contacts.length}\n rowHeight={25}\n />\n </Block>\n <div>\n The Grid API also provides <code>scrollToColumn</code> and{\" \"}\n <code>scrollToRow</code> methods for single-axis scrolling.\n </div>\n <Callout intent=\"primary\">\n <strong className=\"text-sky-300\">Note</strong> If you are passing the\n ref to another component or hook, use the ref callback function instead.\n </Callout>\n <FormattedCode url=\"/generated/code-snippets/useGridCallbackRef.json\" />\n </Box>\n );\n}\n"],"names":["useGridRef","useRef","EMPTY_OPTION","label","value","ALIGNMENTS","map","unshift","BEHAVIORS","COLUMNS","COLUMN_KEYS","key","sort","a","b","localeCompare","GridImperativeApiRoute","contacts","useContacts","titleOptions","useMemo","options","reduce","array","contact","includes","title","push","Array","forEach","align","setAlign","useState","behavior","setBehavior","column","setColumn","setTitle","gridRef","jsxs","Box","direction","gap","children","jsx","Header","section","FormattedCode","url","Select","className","onChange","placeholder","Button","disabled","onClick","grid","current","columnIndex","indexOf","rowIndex","findIndex","row","scrollToCell","columnAlign","rowAlign","scrollToColumn","index","scrollToRow","Block","length","LoadingSpinner","Grid","cellComponent","CellComponent","cellProps","columnCount","columnWidth","rowCount","rowHeight","Callout","intent"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{r as e,j as t}from"./index-B_YQ7rlN.js";import{u as o,a as s,b as n}from"./arePropsEqual-D3jAKwxp.js";function r({className:r,defaultHeight:i=0,listRef:a,onResize:l,onRowsRendered:u,overscanCount:c=3,rowComponent:d,rowCount:m,rowHeight:f,rowProps:p,style:x,...h}){const g=o(p),v=e.useMemo(()=>e.memo(d,s),[d]),[w,C]=e.useState(null),{getCellBounds:z,getEstimatedSize:I,scrollToIndex:R,startIndex:j,stopIndex:y}=n({containerElement:w,defaultContainerSize:i,direction:"vertical",itemCount:m,itemProps:g,itemSize:f,onResize:l,overscanCount:c});e.useImperativeHandle(a,()=>({get element(){return w},scrollToRow({align:e="auto",behavior:t="auto",index:o}){R({align:e,behavior:t,containerScrollOffset:w?.scrollTop??0,index:o})}}),[w,R]),e.useEffect(()=>{j>=0&&y>=0&&u&&u({startIndex:j,stopIndex:y})},[u,j,y]);const E=e.useMemo(()=>{const t=[];if(m>0)for(let o=j;o<=y;o++){const s=z(o);t.push(e.createElement(v,{...g,key:o,index:o,style:{position:"absolute",left:0,transform:`translateY(${s.scrollOffset}px)`,height:s.size,width:"100%"}}))}return t},[v,z,m,g,j,y]);return t.jsx("div",{...h,className:r,ref:C,style:{...x,maxHeight:"100%",flexGrow:1,overflowY:"auto"},children:t.jsx("div",{className:r,style:{height:I(),position:"relative",width:"100%"},children:E})})}export{r as L};
|
|
2
|
-
//# sourceMappingURL=List-C4KHYcVU.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"List-C4KHYcVU.js","sources":["../../lib/components/list/List.tsx"],"sourcesContent":["import {\n memo,\n useEffect,\n useImperativeHandle,\n useMemo,\n useState,\n type ReactNode\n} from \"react\";\nimport { useVirtualizer } from \"../../core/useVirtualizer\";\nimport { useMemoizedObject } from \"../../hooks/useMemoizedObject\";\nimport type { Align } from \"../../types\";\nimport { arePropsEqual } from \"../../utils/arePropsEqual\";\nimport type { ListProps } from \"./types\";\n\nexport function List<RowProps extends object>({\n className,\n defaultHeight = 0,\n listRef,\n onResize,\n onRowsRendered,\n overscanCount = 3,\n rowComponent: RowComponentProp,\n rowCount,\n rowHeight,\n rowProps: rowPropsUnstable,\n style,\n ...rest\n}: ListProps<RowProps>) {\n const rowProps = useMemoizedObject(rowPropsUnstable);\n const RowComponent = useMemo(\n () => memo(RowComponentProp, arePropsEqual),\n [RowComponentProp]\n );\n\n const [element, setElement] = useState<HTMLDivElement | null>(null);\n\n const {\n getCellBounds,\n getEstimatedSize,\n scrollToIndex,\n startIndex,\n stopIndex\n } = useVirtualizer({\n containerElement: element,\n defaultContainerSize: defaultHeight,\n direction: \"vertical\",\n itemCount: rowCount,\n itemProps: rowProps,\n itemSize: rowHeight,\n onResize,\n overscanCount\n });\n\n useImperativeHandle(\n listRef,\n () => ({\n get element() {\n return element;\n },\n\n scrollToRow({\n align = \"auto\",\n behavior = \"auto\",\n index\n }: {\n align?: Align;\n behavior?: ScrollBehavior;\n index: number;\n }) {\n scrollToIndex({\n align,\n behavior,\n containerScrollOffset: element?.scrollTop ?? 0,\n index\n });\n }\n }),\n [element, scrollToIndex]\n );\n\n useEffect(() => {\n if (startIndex >= 0 && stopIndex >= 0 && onRowsRendered) {\n onRowsRendered({\n startIndex,\n stopIndex\n });\n }\n }, [onRowsRendered, startIndex, stopIndex]);\n\n const rows = useMemo(() => {\n const children: ReactNode[] = [];\n if (rowCount > 0) {\n for (let index = startIndex; index <= stopIndex; index++) {\n const bounds = getCellBounds(index);\n\n children.push(\n <RowComponent\n {...(rowProps as RowProps)}\n key={index}\n index={index}\n style={{\n position: \"absolute\",\n left: 0,\n transform: `translateY(${bounds.scrollOffset}px)`,\n height: bounds.size,\n width: \"100%\"\n }}\n />\n );\n }\n }\n return children;\n }, [RowComponent, getCellBounds, rowCount, rowProps, startIndex, stopIndex]);\n\n return (\n <div\n {...rest}\n className={className}\n ref={setElement}\n style={{\n ...style,\n maxHeight: \"100%\",\n flexGrow: 1,\n overflowY: \"auto\"\n }}\n >\n <div\n className={className}\n style={{\n height: getEstimatedSize(),\n position: \"relative\",\n width: \"100%\"\n }}\n >\n {rows}\n </div>\n </div>\n );\n}\n"],"names":["List","className","defaultHeight","listRef","onResize","onRowsRendered","overscanCount","rowComponent","RowComponentProp","rowCount","rowHeight","rowProps","rowPropsUnstable","style","rest","useMemoizedObject","RowComponent","useMemo","memo","arePropsEqual","element","setElement","useState","getCellBounds","getEstimatedSize","scrollToIndex","startIndex","stopIndex","useVirtualizer","containerElement","defaultContainerSize","direction","itemCount","itemProps","itemSize","useImperativeHandle","scrollToRow","align","behavior","index","containerScrollOffset","scrollTop","useEffect","rows","children","bounds","push","createElement","key","position","left","transform","scrollOffset","height","size","width","jsx","ref","maxHeight","flexGrow","overflowY"],"mappings":"6GAcO,SAASA,GAA8BC,UAC5CA,EAAAC,cACAA,EAAgB,EAAAC,QAChBA,EAAAC,SACAA,EAAAC,eACAA,EAAAC,cACAA,EAAgB,EAChBC,aAAcC,EAAAC,SACdA,EAAAC,UACAA,EACAC,SAAUC,EAAAC,MACVA,KACGC,IAEH,MAAMH,EAAWI,EAAkBH,GAC7BI,EAAeC,EAAAA,QACnB,IAAMC,EAAAA,KAAKV,EAAkBW,GAC7B,CAACX,KAGIY,EAASC,GAAcC,EAAAA,SAAgC,OAExDC,cACJA,EAAAC,iBACAA,EAAAC,cACAA,EAAAC,WACAA,EAAAC,UACAA,GACEC,EAAe,CACjBC,iBAAkBT,EAClBU,qBAAsB5B,EACtB6B,UAAW,WACXC,UAAWvB,EACXwB,UAAWtB,EACXuB,SAAUxB,EACVN,WACAE,kBAGF6B,EAAAA,oBACEhC,EACA,KAAA,CACE,WAAIiB,GACF,OAAOA,CACT,EAEA,WAAAgB,EAAYC,MACVA,EAAQ,OAAAC,SACRA,EAAW,OAAAC,MACXA,IAMAd,EAAc,CACZY,QACAC,WACAE,sBAAuBpB,GAASqB,WAAa,EAC7CF,SAEJ,IAEF,CAACnB,EAASK,IAGZiB,EAAAA,UAAU,KACJhB,GAAc,GAAKC,GAAa,GAAKtB,GACvCA,EAAe,CACbqB,aACAC,eAGH,CAACtB,EAAgBqB,EAAYC,IAEhC,MAAMgB,EAAO1B,EAAAA,QAAQ,KACnB,MAAM2B,EAAwB,GAC9B,GAAInC,EAAW,EACb,IAAA,IAAS8B,EAAQb,EAAYa,GAASZ,EAAWY,IAAS,CACxD,MAAMM,EAAStB,EAAcgB,GAE7BK,EAASE,KACPC,EAAAA,cAAC/B,EAAA,IACML,EACLqC,IAAKT,EACLA,QACA1B,MAAO,CACLoC,SAAU,WACVC,KAAM,EACNC,UAAW,cAAcN,EAAOO,kBAChCC,OAAQR,EAAOS,KACfC,MAAO,UAIf,CAEF,OAAOX,GACN,CAAC5B,EAAcO,EAAed,EAAUE,EAAUe,EAAYC,IAEjE,OACE6B,EAAAA,IAAC,MAAA,IACK1C,EACJb,YACAwD,IAAKpC,EACLR,MAAO,IACFA,EACH6C,UAAW,OACXC,SAAU,EACVC,UAAW,QAGbhB,SAAAY,EAAAA,IAAC,MAAA,CACCvD,YACAY,MAAO,CACLwC,OAAQ7B,IACRyB,SAAU,WACVM,MAAO,QAGRX,SAAAD,KAIT"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as i,B as r}from"./index-B_YQ7rlN.js";import{C as o}from"./ContinueLink-CbPhCk1k.js";import{C as e}from"./ComponentProps-DMkeake1.js";import"./LoadingSpinner-Z5HQViRD.js";import"./Header-BYp8JKXz.js";function s(){return i.jsxs(r,{direction:"column",gap:4,children:[i.jsx(e,{section:"Grids",url:"/generated/js-docs/Grid.json"}),i.jsx(o,{to:"/grid/imperative-api",title:"imperative api"})]})}export{s as default};
|
|
2
|
-
//# sourceMappingURL=PropsRoute-D77WXdPD.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as i,B as s}from"./index-B_YQ7rlN.js";import{C as t}from"./ContinueLink-CbPhCk1k.js";import{C as o}from"./ComponentProps-DMkeake1.js";import"./LoadingSpinner-Z5HQViRD.js";import"./Header-BYp8JKXz.js";function e(){return i.jsxs(s,{direction:"column",gap:4,children:[i.jsx(o,{section:"Lists",url:"/generated/js-docs/List.json"}),i.jsx(t,{to:"/list/imperative-api",title:"imperative api"})]})}export{e as default};
|
|
2
|
-
//# sourceMappingURL=PropsRoute-D9jETWHk.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as e,b as t,r as i,Y as n}from"./index-B_YQ7rlN.js";function o({children:i,className:n,...o}){return e.jsx(t,{children:e.jsx("div",{className:`border-lg bg-black/30 text-slate-300 rounded-lg p-2 ${n}`,...o,children:i})})}function r(e){if(void 0!==e)switch(typeof e){case"number":return e;case"string":if(e.endsWith("px"))return parseFloat(e)}}let s=null;function c({containerElement:e,direction:t,isRtl:i,scrollOffset:n}){if("horizontal"===t&&i)switch(function(e=!1){if(null===s||e){const e=document.createElement("div"),t=e.style;t.width="50px",t.height="50px",t.overflow="scroll",t.direction="rtl";const i=document.createElement("div"),n=i.style;return n.width="100px",n.height="100px",e.appendChild(i),document.body.appendChild(e),e.scrollLeft>0?s="positive-descending":(e.scrollLeft=1,s=0===e.scrollLeft?"negative":"positive-ascending"),document.body.removeChild(e),s}return s}()){case"negative":return-n;case"positive-descending":if(e){const{clientWidth:t,scrollLeft:i,scrollWidth:n}=e;return n-t-i}}return n}function l(e,t="Assertion error"){if(!e)throw console.error(t),Error(t)}function a({cachedBounds:e,itemCount:t,itemSize:i}){if(0===t)return 0;if("number"==typeof i)return t*i;{const i=e.get(0===e.size?0:e.size-1);l(void 0!==i,"Unexpected bounds cache miss");return t*((i.scrollOffset+i.size)/e.size)}}function u({cachedBounds:e,containerScrollOffset:t,containerSize:i,itemCount:n,overscanCount:o}){const r=n-1;let s=0,c=-1,l=0;for(;l<r;){const i=e.get(l);if(i.scrollOffset+i.size>t)break;l++}for(s=l,s=Math.max(0,s-o);l<r;){const n=e.get(l);if(n.scrollOffset+n.size>=t+i)break;l++}return c=Math.min(r,l),c=Math.min(n-1,c+o),s<0?[0,-1]:[s,c]}function d({itemCount:e,itemProps:t,itemSize:n}){return i.useMemo(()=>function({itemCount:e,itemProps:t,itemSize:i}){const n=new Map;return{get(o){for(l(o<e,`Invalid index ${o}`);n.size-1<o;){const e=n.size;let r;switch(typeof i){case"function":r=i(e,t);break;case"number":r=i}if(0===e)n.set(e,{size:r,scrollOffset:0});else{const t=n.get(e-1);l(void 0!==t,`Unexpected bounds cache miss for index ${o}`),n.set(e,{scrollOffset:t.scrollOffset+t.size,size:r})}}const r=n.get(o);return l(void 0!==r,`Unexpected bounds cache miss for index ${o}`),r},set(e,t){n.set(e,t)},get size(){return n.size}}}({itemCount:e,itemProps:t,itemSize:n}),[e,t,n])}function f({containerElement:e,containerStyle:t,defaultContainerSize:o=0,direction:s,isRtl:f=!1,itemCount:h,itemProps:m,itemSize:g,onResize:v,overscanCount:z}){const[p,b]=i.useState([0,-1]),[S,w]=[Math.min(h-1,p[0]),Math.min(h-1,p[1])],{height:C=o,width:x=o}=function({box:e,defaultHeight:t,defaultWidth:o,disabled:s,element:c,mode:l,style:a}){const{styleHeight:u,styleWidth:d}=i.useMemo(()=>({styleHeight:r(a?.height),styleWidth:r(a?.width)}),[a?.height,a?.width]),[f,h]=i.useState({height:t,width:o}),m=s||"only-height"===l&&void 0!==u||"only-width"===l&&void 0!==d||void 0!==u&&void 0!==d;return n(()=>{if(null===c||m)return;const t=new ResizeObserver(e=>{for(const t of e){const{contentRect:e,target:i}=t;c===i&&h(t=>t.height===e.height&&t.width===e.width?t:{height:e.height,width:e.width})}});return t.observe(c,{box:e}),()=>{t?.unobserve(c)}},[e,m,c,u,d]),i.useMemo(()=>({height:u??f.height,width:d??f.width}),[f,u,d])}({defaultHeight:"vertical"===s?o:void 0,defaultWidth:"horizontal"===s?o:void 0,element:e,mode:"vertical"===s?"only-height":"only-width",style:t}),y=i.useRef({height:0,width:0}),O="vertical"===s?C:x,E=function({containerSize:e,itemSize:t}){let i;"string"==typeof t?(l(t.endsWith("%"),`Invalid item size: "${t}"; string values must be percentages (e.g. "100%")`),l(void 0!==e,"Container size must be defined if a percentage item size is specified"),i=e*parseInt(t)/100):i=t;return i}({containerSize:O,itemSize:g});i.useLayoutEffect(()=>{if("function"==typeof v){const e=y.current;e.height===C&&e.width===x||(v({height:C,width:x},{...e}),e.height=C,e.width=x)}},[C,v,x]);const M=d({itemCount:h,itemProps:m,itemSize:E}),k=i.useCallback(e=>M.get(e),[M]),B=i.useCallback(()=>a({cachedBounds:M,itemCount:h,itemSize:E}),[M,h,E]),R=i.useCallback(t=>{const i=c({containerElement:e,direction:s,isRtl:f,scrollOffset:t});return u({cachedBounds:M,containerScrollOffset:i,containerSize:O,itemCount:h,overscanCount:z})},[M,e,O,s,f,h,z]);n(()=>{b(R(("vertical"===s?e?.scrollTop:e?.scrollLeft)??0))},[e,s,R]),n(()=>{if(!e)return;const t=()=>{b(t=>{const{scrollLeft:i,scrollTop:n}=e,o=c({containerElement:e,direction:s,isRtl:f,scrollOffset:"vertical"===s?n:i}),r=u({cachedBounds:M,containerScrollOffset:o,containerSize:O,itemCount:h,overscanCount:z});return r[0]===t[0]&&r[1]===t[1]?t:r})};return e.addEventListener("scroll",t),()=>{e.removeEventListener("scroll",t)}},[M,e,O,s,h,z]);const L=function(e){const t=i.useRef(()=>{throw new Error("Cannot call an event handler while rendering.")});return n(()=>{t.current=e},[e]),i.useCallback(e=>t.current?.(e),[t])}(({align:t="auto",behavior:i="auto",containerScrollOffset:n,index:o})=>{let r=function({align:e,cachedBounds:t,index:i,itemCount:n,itemSize:o,containerScrollOffset:r,containerSize:s}){const c=a({cachedBounds:t,itemCount:n,itemSize:o}),l=t.get(i),u=Math.max(0,Math.min(c-s,l.scrollOffset)),d=Math.max(0,l.scrollOffset-s+l.size);switch("smart"===e&&(e=r>=d&&r<=u?"auto":"center"),e){case"start":return u;case"end":return d;case"center":return l.scrollOffset<=s/2?0:l.scrollOffset+l.size/2>=c-s/2?c-s:l.scrollOffset+l.size/2-s/2;default:return r>=d&&r<=u?r:r<d?d:u}}({align:t,cachedBounds:M,containerScrollOffset:n,containerSize:O,index:o,itemCount:h,itemSize:E});if(e)if(r=c({containerElement:e,direction:s,isRtl:f,scrollOffset:r}),"function"==typeof e.scrollTo)"horizontal"===s?e.scrollTo({left:r,behavior:i||void 0}):e.scrollTo({behavior:i||void 0,top:r});else{const e=R(r);e[0]===S&&e[1]===w||b(e)}});return{getCellBounds:k,getEstimatedSize:B,scrollToIndex:L,startIndex:S,stopIndex:w}}function h(e){return i.useMemo(()=>e,Object.values(e))}function m(e,t){if(e===t)return!0;if(!!e!=!!t)return!1;if(l(void 0!==e),l(void 0!==t),Object.keys(e).length!==Object.keys(t).length)return!1;for(const i in e)if(!Object.is(t[i],e[i]))return!1;return!0}function g(e,t){const{style:i,...n}=e,{style:o,...r}=t;return m(i,o)&&m(n,r)}export{o as B,g as a,f as b,h as u};
|
|
2
|
-
//# sourceMappingURL=arePropsEqual-D3jAKwxp.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"arePropsEqual-D3jAKwxp.js","sources":["../../src/components/Block.tsx","../../lib/utils/parseNumericStyleValue.ts","../../lib/utils/getRTLOffsetType.ts","../../lib/utils/adjustScrollOffsetForRtl.ts","../../lib/utils/assert.ts","../../lib/core/getEstimatedSize.ts","../../lib/core/getStartStopIndices.ts","../../lib/core/useCachedBounds.ts","../../lib/core/createCachedBounds.ts","../../lib/core/useVirtualizer.ts","../../lib/hooks/useResizeObserver.ts","../../lib/core/useItemSize.ts","../../lib/hooks/useStableCallback.ts","../../lib/core/getOffsetForIndex.ts","../../lib/hooks/useMemoizedObject.ts","../../lib/utils/shallowCompare.ts","../../lib/utils/arePropsEqual.ts"],"sourcesContent":["import type { HTMLAttributes, PropsWithChildren } from \"react\";\nimport { ErrorBoundary } from \"./ErrorBoundary\";\n\nexport function Block({\n children,\n className,\n ...rest\n}: PropsWithChildren<HTMLAttributes<HTMLDivElement> & { className?: string }>) {\n return (\n <ErrorBoundary>\n <div\n className={`border-lg bg-black/30 text-slate-300 rounded-lg p-2 ${className}`}\n {...rest}\n >\n {children}\n </div>\n </ErrorBoundary>\n );\n}\n","import type { CSSProperties } from \"react\";\n\nexport function parseNumericStyleValue(\n value: CSSProperties[\"height\"]\n): number | undefined {\n if (value !== undefined) {\n switch (typeof value) {\n case \"number\": {\n return value;\n }\n case \"string\": {\n if (value.endsWith(\"px\")) {\n return parseFloat(value);\n }\n break;\n }\n }\n }\n}\n","export type RTLOffsetType =\n | \"negative\"\n | \"positive-descending\"\n | \"positive-ascending\";\n\nlet cachedRTLResult: RTLOffsetType | null = null;\n\n// TRICKY According to the spec, scrollLeft should be negative for RTL aligned elements.\n// Chrome does not seem to adhere; its scrollLeft values are positive (measured relative to the left).\n// Safari's elastic bounce makes detecting this even more complicated wrt potential false positives.\n// The safest way to check this is to intentionally set a negative offset,\n// and then verify that the subsequent \"scroll\" event matches the negative offset.\n// If it does not match, then we can assume a non-standard RTL scroll implementation.\nexport function getRTLOffsetType(recalculate: boolean = false): RTLOffsetType {\n if (cachedRTLResult === null || recalculate) {\n const outerDiv = document.createElement(\"div\");\n const outerStyle = outerDiv.style;\n outerStyle.width = \"50px\";\n outerStyle.height = \"50px\";\n outerStyle.overflow = \"scroll\";\n outerStyle.direction = \"rtl\";\n\n const innerDiv = document.createElement(\"div\");\n const innerStyle = innerDiv.style;\n innerStyle.width = \"100px\";\n innerStyle.height = \"100px\";\n\n outerDiv.appendChild(innerDiv);\n\n document.body.appendChild(outerDiv);\n\n if (outerDiv.scrollLeft > 0) {\n cachedRTLResult = \"positive-descending\";\n } else {\n outerDiv.scrollLeft = 1;\n if (outerDiv.scrollLeft === 0) {\n cachedRTLResult = \"negative\";\n } else {\n cachedRTLResult = \"positive-ascending\";\n }\n }\n\n document.body.removeChild(outerDiv);\n\n return cachedRTLResult;\n }\n\n return cachedRTLResult;\n}\n","import type { Direction } from \"../core/types\";\nimport { getRTLOffsetType } from \"./getRTLOffsetType\";\n\nexport function adjustScrollOffsetForRtl({\n containerElement,\n direction,\n isRtl,\n scrollOffset\n}: {\n containerElement: HTMLElement | null;\n direction: Direction;\n isRtl: boolean;\n scrollOffset: number;\n}) {\n // TRICKY According to the spec, scrollLeft should be negative for RTL aligned elements.\n // This is not the case for all browsers though (e.g. Chrome reports values as positive, measured relative to the left).\n // So we need to determine which browser behavior we're dealing with, and mimic it.\n if (direction === \"horizontal\") {\n if (isRtl) {\n switch (getRTLOffsetType()) {\n case \"negative\": {\n return -scrollOffset;\n }\n case \"positive-descending\": {\n if (containerElement) {\n const { clientWidth, scrollLeft, scrollWidth } = containerElement;\n return scrollWidth - clientWidth - scrollLeft;\n }\n break;\n }\n }\n }\n }\n return scrollOffset;\n}\n","export function assert(\n expectedCondition: unknown,\n message: string = \"Assertion error\"\n): asserts expectedCondition {\n if (!expectedCondition) {\n console.error(message);\n\n throw Error(message);\n }\n}\n","import type { CachedBounds, SizeFunction } from \"./types\";\nimport { assert } from \"../utils/assert\";\n\nexport function getEstimatedSize<Props extends object>({\n cachedBounds,\n itemCount,\n itemSize\n}: {\n cachedBounds: CachedBounds;\n itemCount: number;\n itemSize: number | SizeFunction<Props>;\n}) {\n if (itemCount === 0) {\n return 0;\n } else if (typeof itemSize === \"number\") {\n return itemCount * itemSize;\n } else {\n const bounds = cachedBounds.get(\n cachedBounds.size === 0 ? 0 : cachedBounds.size - 1\n );\n assert(bounds !== undefined, \"Unexpected bounds cache miss\");\n\n const averageItemSize =\n (bounds.scrollOffset + bounds.size) / cachedBounds.size;\n\n return itemCount * averageItemSize;\n }\n}\n","import type { CachedBounds } from \"./types\";\n\nexport function getStartStopIndices({\n cachedBounds,\n containerScrollOffset,\n containerSize,\n itemCount,\n overscanCount\n}: {\n cachedBounds: CachedBounds;\n containerScrollOffset: number;\n containerSize: number;\n itemCount: number;\n overscanCount: number;\n}): [number, number] {\n const maxIndex = itemCount - 1;\n\n let startIndex = 0;\n let stopIndex = -1;\n let currentIndex = 0;\n\n while (currentIndex < maxIndex) {\n const bounds = cachedBounds.get(currentIndex);\n\n if (bounds.scrollOffset + bounds.size > containerScrollOffset) {\n break;\n }\n\n currentIndex++;\n }\n\n startIndex = currentIndex;\n startIndex = Math.max(0, startIndex - overscanCount);\n\n while (currentIndex < maxIndex) {\n const bounds = cachedBounds.get(currentIndex);\n\n if (\n bounds.scrollOffset + bounds.size >=\n containerScrollOffset + containerSize\n ) {\n break;\n }\n\n currentIndex++;\n }\n\n stopIndex = Math.min(maxIndex, currentIndex);\n stopIndex = Math.min(itemCount - 1, stopIndex + overscanCount);\n\n return startIndex < 0 ? [0, -1] : [startIndex, stopIndex];\n}\n","import { useMemo } from \"react\";\nimport { createCachedBounds } from \"./createCachedBounds\";\nimport type { CachedBounds, SizeFunction } from \"./types\";\n\nexport function useCachedBounds<Props extends object>({\n itemCount,\n itemProps,\n itemSize\n}: {\n itemCount: number;\n itemProps: Props;\n itemSize: number | SizeFunction<Props>;\n}): CachedBounds {\n return useMemo(\n () =>\n createCachedBounds({\n itemCount,\n itemProps,\n itemSize\n }),\n [itemCount, itemProps, itemSize]\n );\n}\n","import { assert } from \"../utils/assert\";\nimport type { Bounds, CachedBounds, SizeFunction } from \"./types\";\n\nexport function createCachedBounds<Props extends object>({\n itemCount,\n itemProps,\n itemSize\n}: {\n itemCount: number;\n itemProps: Props;\n itemSize: number | SizeFunction<Props>;\n}): CachedBounds {\n const cache = new Map<number, Bounds>();\n\n return {\n get(index: number) {\n assert(index < itemCount, `Invalid index ${index}`);\n\n while (cache.size - 1 < index) {\n const currentIndex = cache.size;\n\n let size: number;\n switch (typeof itemSize) {\n case \"function\": {\n size = itemSize(currentIndex, itemProps);\n break;\n }\n case \"number\": {\n size = itemSize;\n break;\n }\n }\n\n if (currentIndex === 0) {\n cache.set(currentIndex, {\n size,\n scrollOffset: 0\n });\n } else {\n const previousRowBounds = cache.get(currentIndex - 1);\n assert(\n previousRowBounds !== undefined,\n `Unexpected bounds cache miss for index ${index}`\n );\n\n cache.set(currentIndex, {\n scrollOffset:\n previousRowBounds.scrollOffset + previousRowBounds.size,\n size\n });\n }\n }\n\n const bounds = cache.get(index);\n assert(\n bounds !== undefined,\n `Unexpected bounds cache miss for index ${index}`\n );\n\n return bounds;\n },\n set(index: number, bounds: Bounds) {\n cache.set(index, bounds);\n },\n get size() {\n return cache.size;\n }\n };\n}\n","import {\n useCallback,\n useLayoutEffect,\n useRef,\n useState,\n type CSSProperties\n} from \"react\";\nimport { useIsomorphicLayoutEffect } from \"../hooks/useIsomorphicLayoutEffect\";\nimport { useResizeObserver } from \"../hooks/useResizeObserver\";\nimport { useStableCallback } from \"../hooks/useStableCallback\";\nimport type { Align } from \"../types\";\nimport { adjustScrollOffsetForRtl } from \"../utils/adjustScrollOffsetForRtl\";\nimport { getEstimatedSize as getEstimatedSizeUtil } from \"./getEstimatedSize\";\nimport { getOffsetForIndex } from \"./getOffsetForIndex\";\nimport { getStartStopIndices as getStartStopIndicesUtil } from \"./getStartStopIndices\";\nimport type { Direction, SizeFunction } from \"./types\";\nimport { useCachedBounds } from \"./useCachedBounds\";\nimport { useItemSize } from \"./useItemSize\";\n\nexport function useVirtualizer<Props extends object>({\n containerElement,\n containerStyle,\n defaultContainerSize = 0,\n direction,\n isRtl = false,\n itemCount,\n itemProps,\n itemSize: itemSizeProp,\n onResize,\n overscanCount\n}: {\n containerElement: HTMLElement | null;\n containerStyle?: CSSProperties;\n defaultContainerSize?: number;\n direction: Direction;\n isRtl?: boolean;\n itemCount: number;\n itemProps: Props;\n itemSize: number | string | SizeFunction<Props>;\n onResize:\n | ((\n size: { height: number; width: number },\n prevSize: { height: number; width: number }\n ) => void)\n | undefined;\n overscanCount: number;\n}) {\n const [indices, setIndices] = useState([0, -1]);\n\n // Guard against temporarily invalid indices that may occur when item count decreases\n // Cached bounds object will be re-created and a second render will restore things\n const [startIndex, stopIndex] = [\n Math.min(itemCount - 1, indices[0]),\n Math.min(itemCount - 1, indices[1])\n ];\n\n const { height = defaultContainerSize, width = defaultContainerSize } =\n useResizeObserver({\n defaultHeight:\n direction === \"vertical\" ? defaultContainerSize : undefined,\n defaultWidth:\n direction === \"horizontal\" ? defaultContainerSize : undefined,\n element: containerElement,\n mode: direction === \"vertical\" ? \"only-height\" : \"only-width\",\n style: containerStyle\n });\n\n const prevSizeRef = useRef<{ height: number; width: number }>({\n height: 0,\n width: 0\n });\n\n const containerSize = direction === \"vertical\" ? height : width;\n\n const itemSize = useItemSize({ containerSize, itemSize: itemSizeProp });\n\n useLayoutEffect(() => {\n if (typeof onResize === \"function\") {\n const prevSize = prevSizeRef.current;\n\n if (prevSize.height !== height || prevSize.width !== width) {\n onResize({ height, width }, { ...prevSize });\n\n prevSize.height = height;\n prevSize.width = width;\n }\n }\n }, [height, onResize, width]);\n\n const cachedBounds = useCachedBounds({\n itemCount,\n itemProps,\n itemSize\n });\n\n const getCellBounds = useCallback(\n (index: number) => cachedBounds.get(index),\n [cachedBounds]\n );\n\n const getEstimatedSize = useCallback(\n () =>\n getEstimatedSizeUtil({\n cachedBounds,\n itemCount,\n itemSize\n }),\n [cachedBounds, itemCount, itemSize]\n );\n\n const getStartStopIndices = useCallback(\n (scrollOffset: number) => {\n const containerScrollOffset = adjustScrollOffsetForRtl({\n containerElement,\n direction,\n isRtl,\n scrollOffset\n });\n\n return getStartStopIndicesUtil({\n cachedBounds,\n containerScrollOffset,\n containerSize,\n itemCount,\n overscanCount\n });\n },\n [\n cachedBounds,\n containerElement,\n containerSize,\n direction,\n isRtl,\n itemCount,\n overscanCount\n ]\n );\n\n useIsomorphicLayoutEffect(() => {\n const scrollOffset =\n (direction === \"vertical\"\n ? containerElement?.scrollTop\n : containerElement?.scrollLeft) ?? 0;\n\n setIndices(getStartStopIndices(scrollOffset));\n }, [containerElement, direction, getStartStopIndices]);\n\n useIsomorphicLayoutEffect(() => {\n if (!containerElement) {\n return;\n }\n\n const onScroll = () => {\n setIndices((prev) => {\n const { scrollLeft, scrollTop } = containerElement;\n\n const scrollOffset = adjustScrollOffsetForRtl({\n containerElement,\n direction,\n isRtl,\n scrollOffset: direction === \"vertical\" ? scrollTop : scrollLeft\n });\n\n const next = getStartStopIndicesUtil({\n cachedBounds,\n containerScrollOffset: scrollOffset,\n containerSize,\n itemCount,\n overscanCount\n });\n\n if (next[0] === prev[0] && next[1] === prev[1]) {\n return prev;\n }\n\n return next;\n });\n };\n\n containerElement.addEventListener(\"scroll\", onScroll);\n\n return () => {\n containerElement.removeEventListener(\"scroll\", onScroll);\n };\n }, [\n cachedBounds,\n containerElement,\n containerSize,\n direction,\n itemCount,\n overscanCount\n ]);\n\n const scrollToIndex = useStableCallback(\n ({\n align = \"auto\",\n behavior = \"auto\",\n containerScrollOffset,\n index\n }: {\n align?: Align;\n behavior?: ScrollBehavior;\n containerScrollOffset: number;\n index: number;\n }) => {\n let scrollOffset = getOffsetForIndex({\n align,\n cachedBounds,\n containerScrollOffset,\n containerSize,\n index,\n itemCount,\n itemSize\n });\n\n if (containerElement) {\n scrollOffset = adjustScrollOffsetForRtl({\n containerElement,\n direction,\n isRtl,\n scrollOffset\n });\n\n if (typeof containerElement.scrollTo === \"function\") {\n if (direction === \"horizontal\") {\n containerElement.scrollTo({\n left: scrollOffset,\n behavior: behavior || undefined\n });\n } else {\n containerElement.scrollTo({\n behavior: behavior || undefined,\n top: scrollOffset\n });\n }\n } else {\n // Special case for environments like jsdom that don't implement scrollTo\n const next = getStartStopIndices(scrollOffset);\n if (next[0] !== startIndex || next[1] !== stopIndex) {\n setIndices(next);\n }\n }\n }\n }\n );\n\n return {\n getCellBounds,\n getEstimatedSize,\n scrollToIndex,\n startIndex,\n stopIndex\n };\n}\n","import { useMemo, useState, type CSSProperties } from \"react\";\nimport { parseNumericStyleValue } from \"../utils/parseNumericStyleValue\";\nimport { useIsomorphicLayoutEffect } from \"./useIsomorphicLayoutEffect\";\n\nexport function useResizeObserver({\n box,\n defaultHeight,\n defaultWidth,\n disabled: disabledProp,\n element,\n mode,\n style\n}: {\n box?: ResizeObserverBoxOptions;\n defaultHeight?: number;\n defaultWidth?: number;\n disabled?: boolean;\n element: HTMLElement | null;\n mode?: \"only-height\" | \"only-width\";\n style?: CSSProperties;\n}) {\n const { styleHeight, styleWidth } = useMemo(\n () => ({\n styleHeight: parseNumericStyleValue(style?.height),\n styleWidth: parseNumericStyleValue(style?.width)\n }),\n [style?.height, style?.width]\n );\n\n const [state, setState] = useState<{\n height: number | undefined;\n width: number | undefined;\n }>({\n height: defaultHeight,\n width: defaultWidth\n });\n\n const disabled =\n disabledProp ||\n (mode === \"only-height\" && styleHeight !== undefined) ||\n (mode === \"only-width\" && styleWidth !== undefined) ||\n (styleHeight !== undefined && styleWidth !== undefined);\n\n useIsomorphicLayoutEffect(() => {\n if (element === null || disabled) {\n return;\n }\n\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { contentRect, target } = entry;\n if (element === target) {\n setState((prevState) => {\n if (\n prevState.height === contentRect.height &&\n prevState.width === contentRect.width\n ) {\n return prevState;\n }\n\n return {\n height: contentRect.height,\n width: contentRect.width\n };\n });\n }\n }\n });\n resizeObserver.observe(element, { box });\n\n return () => {\n resizeObserver?.unobserve(element);\n };\n }, [box, disabled, element, styleHeight, styleWidth]);\n\n return useMemo(\n () => ({\n height: styleHeight ?? state.height,\n width: styleWidth ?? state.width\n }),\n [state, styleHeight, styleWidth]\n );\n}\n","import { assert } from \"../utils/assert\";\nimport type { SizeFunction } from \"./types\";\n\nexport function useItemSize<Props extends object>({\n containerSize,\n itemSize: itemSizeProp\n}: {\n containerSize: number;\n itemSize: number | string | SizeFunction<Props>;\n}) {\n let itemSize: number | SizeFunction<Props>;\n switch (typeof itemSizeProp) {\n case \"string\": {\n assert(\n itemSizeProp.endsWith(\"%\"),\n `Invalid item size: \"${itemSizeProp}\"; string values must be percentages (e.g. \"100%\")`\n );\n assert(\n containerSize !== undefined,\n \"Container size must be defined if a percentage item size is specified\"\n );\n\n itemSize = (containerSize * parseInt(itemSizeProp)) / 100;\n break;\n }\n default: {\n itemSize = itemSizeProp;\n break;\n }\n }\n\n return itemSize;\n}\n","import { useCallback, useRef } from \"react\";\nimport { useIsomorphicLayoutEffect } from \"./useIsomorphicLayoutEffect\";\n\n// Forked from useEventCallback (usehooks-ts)\nexport function useStableCallback<Args, Return>(\n fn: (args: Args) => Return\n): (args: Args) => Return {\n const ref = useRef<typeof fn>(() => {\n throw new Error(\"Cannot call an event handler while rendering.\");\n });\n\n useIsomorphicLayoutEffect(() => {\n ref.current = fn;\n }, [fn]);\n\n return useCallback((args: Args) => ref.current?.(args), [ref]) as (\n args: Args\n ) => Return;\n}\n","import type { Align } from \"../types\";\nimport { getEstimatedSize } from \"./getEstimatedSize\";\nimport type { CachedBounds, SizeFunction } from \"./types\";\n\nexport function getOffsetForIndex<Props extends object>({\n align,\n cachedBounds,\n index,\n itemCount,\n itemSize,\n containerScrollOffset,\n containerSize\n}: {\n align: Align;\n cachedBounds: CachedBounds;\n index: number;\n itemCount: number;\n itemSize: number | SizeFunction<Props>;\n containerScrollOffset: number;\n containerSize: number;\n}) {\n const estimatedTotalSize = getEstimatedSize({\n cachedBounds,\n itemCount,\n itemSize\n });\n\n const bounds = cachedBounds.get(index);\n const maxOffset = Math.max(\n 0,\n Math.min(estimatedTotalSize - containerSize, bounds.scrollOffset)\n );\n const minOffset = Math.max(\n 0,\n bounds.scrollOffset - containerSize + bounds.size\n );\n\n if (align === \"smart\") {\n if (\n containerScrollOffset >= minOffset &&\n containerScrollOffset <= maxOffset\n ) {\n align = \"auto\";\n } else {\n align = \"center\";\n }\n }\n\n switch (align) {\n case \"start\": {\n return maxOffset;\n }\n case \"end\": {\n return minOffset;\n }\n case \"center\": {\n if (bounds.scrollOffset <= containerSize / 2) {\n // Too near the beginning to center-align\n return 0;\n } else if (\n bounds.scrollOffset + bounds.size / 2 >=\n estimatedTotalSize - containerSize / 2\n ) {\n // Too near the end to center-align\n return estimatedTotalSize - containerSize;\n } else {\n return bounds.scrollOffset + bounds.size / 2 - containerSize / 2;\n }\n }\n case \"auto\":\n default: {\n if (\n containerScrollOffset >= minOffset &&\n containerScrollOffset <= maxOffset\n ) {\n return containerScrollOffset;\n } else if (containerScrollOffset < minOffset) {\n return minOffset;\n } else {\n return maxOffset;\n }\n }\n }\n}\n","import { useMemo } from \"react\";\n\nexport function useMemoizedObject<Type extends object>(\n unstableObject: Type\n): Type {\n return useMemo(() => {\n return unstableObject;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, Object.values(unstableObject));\n}\n","import { assert } from \"./assert\";\n\nexport function shallowCompare<Type extends object>(\n a: Type | undefined,\n b: Type | undefined\n) {\n if (a === b) {\n return true;\n }\n\n if (!!a !== !!b) {\n return false;\n }\n\n assert(a !== undefined);\n assert(b !== undefined);\n\n if (Object.keys(a).length !== Object.keys(b).length) {\n return false;\n }\n\n for (const key in a) {\n if (!Object.is(b[key], a[key])) {\n return false;\n }\n }\n\n return true;\n}\n","import type { CSSProperties } from \"react\";\nimport { shallowCompare } from \"./shallowCompare\";\n\n// Custom comparison function for React.memo()\n// It knows to compare individual style props and ignore the wrapper object.\n// See https://react.dev/reference/react/memo#memo\nexport function arePropsEqual(\n prevProps: { style: CSSProperties },\n nextProps: { style: CSSProperties }\n): boolean {\n const { style: prevStyle, ...prevRest } = prevProps;\n const { style: nextStyle, ...nextRest } = nextProps;\n\n return (\n shallowCompare(prevStyle, nextStyle) && shallowCompare(prevRest, nextRest)\n );\n}\n"],"names":["Block","children","className","rest","ErrorBoundary","jsx","parseNumericStyleValue","value","endsWith","parseFloat","cachedRTLResult","adjustScrollOffsetForRtl","containerElement","direction","isRtl","scrollOffset","recalculate","outerDiv","document","createElement","outerStyle","style","width","height","overflow","innerDiv","innerStyle","appendChild","body","scrollLeft","removeChild","getRTLOffsetType","clientWidth","scrollWidth","assert","expectedCondition","message","console","error","Error","getEstimatedSize","cachedBounds","itemCount","itemSize","bounds","get","size","getStartStopIndices","containerScrollOffset","containerSize","overscanCount","maxIndex","startIndex","stopIndex","currentIndex","Math","max","min","useCachedBounds","itemProps","useMemo","cache","Map","index","set","previousRowBounds","createCachedBounds","useVirtualizer","containerStyle","defaultContainerSize","itemSizeProp","onResize","indices","setIndices","useState","box","defaultHeight","defaultWidth","disabled","disabledProp","element","mode","styleHeight","styleWidth","state","setState","useIsomorphicLayoutEffect","resizeObserver","ResizeObserver","entries","entry","contentRect","target","prevState","observe","unobserve","useResizeObserver","prevSizeRef","useRef","parseInt","useItemSize","useLayoutEffect","prevSize","current","getCellBounds","useCallback","getEstimatedSizeUtil","getStartStopIndicesUtil","scrollTop","onScroll","prev","next","addEventListener","removeEventListener","scrollToIndex","fn","ref","args","useStableCallback","align","behavior","estimatedTotalSize","maxOffset","minOffset","getOffsetForIndex","scrollTo","left","top","useMemoizedObject","unstableObject","Object","values","shallowCompare","a","b","keys","length","key","is","arePropsEqual","prevProps","nextProps","prevStyle","prevRest","nextStyle","nextRest"],"mappings":"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"}
|