From 5a5529251002985c33b2dcd243810d2505be3d1a Mon Sep 17 00:00:00 2001 From: Daniel Lu Date: Wed, 22 Apr 2026 13:52:10 -0700 Subject: [PATCH 1/3] fix: ensure virtualized Table loader width is updated if table width changes --- .../stories/Table.stories.tsx | 67 +++++++++++++++++++ .../react-stately/src/layout/TableLayout.ts | 11 +++ 2 files changed, 78 insertions(+) diff --git a/packages/react-aria-components/stories/Table.stories.tsx b/packages/react-aria-components/stories/Table.stories.tsx index 03f353256db..8d4a049d1af 100644 --- a/packages/react-aria-components/stories/Table.stories.tsx +++ b/packages/react-aria-components/stories/Table.stories.tsx @@ -1152,6 +1152,73 @@ export const OnLoadMoreTableVirtualizedResizeWrapperStory: StoryObj { + let list = useAsyncList({ + async load({signal, cursor}) { + if (cursor) { + cursor = cursor.replace(/^http:\/\//i, 'https://'); + await new Promise(resolve => setTimeout(resolve, args.delay)); + } + let res = await fetch(cursor || 'https://swapi.py4e.com/api/people/?search=', {signal}); + let json = await res.json(); + return { + items: json.results, + cursor: json.next + }; + } + }); + + return ( +
+ + + + Name + Height + Mass + Birth Year + + renderEmptyLoader({isLoading: list.loadingState === 'loading'})}> + + {(item) => ( + + {item.name} + {item.height} + {item.mass} + {item.birth_year} + + )} + + + + + +
+
+
+ ); +}; + +export const VirtualizedTableLoaderWidthTestStory: StoryObj = { + render: VirtualizedTableLoaderWidthTest, + name: 'virtualized table, loader dynaimc width', + args: {delay: 10000}, + parameters: { + description: { + data: 'resizing the table should also resize the loader element width' + } + } +}; + interface Launch { id: number, mission_name: string, diff --git a/packages/react-stately/src/layout/TableLayout.ts b/packages/react-stately/src/layout/TableLayout.ts index a9fc643b8ad..dca6d1fdfba 100644 --- a/packages/react-stately/src/layout/TableLayout.ts +++ b/packages/react-stately/src/layout/TableLayout.ts @@ -361,6 +361,17 @@ export class TableLayout exten }; } + protected buildLoader(node: GridNode, x: number, y: number): LayoutNode { + let layoutNode = super.buildLoader(node, x, y); + let collection = this.virtualizer!.collection as TableCollection; + + // use the same approach as buildRow to get the proper width of the loader, otherwise + // we get a outdated loader width + layoutNode.layoutInfo.rect.width = this.layoutNodes.get(collection.head?.key ?? 'header')!.layoutInfo.rect.width; + layoutNode.validRect = layoutNode.layoutInfo.rect.intersection(this.requestedRect); + return layoutNode; + } + protected buildNode(node: GridNode, x: number, y: number): LayoutNode { switch (node.type) { case 'headerrow': From a8ce08e94ff6cf3846ac17f635d9b0b6dfb26bd6 Mon Sep 17 00:00:00 2001 From: Daniel Lu Date: Wed, 22 Apr 2026 14:03:17 -0700 Subject: [PATCH 2/3] fix weird scroll behavior when multiple pages loaded --- packages/react-aria-components/stories/Table.stories.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-aria-components/stories/Table.stories.tsx b/packages/react-aria-components/stories/Table.stories.tsx index 8d4a049d1af..7acc7c1b5cf 100644 --- a/packages/react-aria-components/stories/Table.stories.tsx +++ b/packages/react-aria-components/stories/Table.stories.tsx @@ -1177,7 +1177,7 @@ const VirtualizedTableLoaderWidthTest = (args: {delay: number}): JSX.Element => headingHeight: 25, loaderHeight: 30 }}> - +
Name Height From 1a06fdb1ee20eb5e291b65ffbed3697da96d23b1 Mon Sep 17 00:00:00 2001 From: Daniel Lu Date: Wed, 22 Apr 2026 14:04:52 -0700 Subject: [PATCH 3/3] typo --- packages/react-aria-components/stories/Table.stories.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-aria-components/stories/Table.stories.tsx b/packages/react-aria-components/stories/Table.stories.tsx index 7acc7c1b5cf..5409b9d9d5e 100644 --- a/packages/react-aria-components/stories/Table.stories.tsx +++ b/packages/react-aria-components/stories/Table.stories.tsx @@ -1210,7 +1210,7 @@ const VirtualizedTableLoaderWidthTest = (args: {delay: number}): JSX.Element => export const VirtualizedTableLoaderWidthTestStory: StoryObj = { render: VirtualizedTableLoaderWidthTest, - name: 'virtualized table, loader dynaimc width', + name: 'virtualized table, loader dynamic width', args: {delay: 10000}, parameters: { description: {