Skip to content

Arv/no space yes content wrapper#48

Merged
arv merged 2 commits into
mainfrom
arv/no-space-yes-content-wrapper
Jul 6, 2026
Merged

Arv/no space yes content wrapper#48
arv merged 2 commits into
mainfrom
arv/no-space-yes-content-wrapper

Conversation

@arv

@arv arv commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

No description provided.

@arv arv requested review from 0xcadams and Copilot July 6, 2026 15:16
@arv arv enabled auto-merge July 6, 2026 15:16
@arv arv added this pull request to the merge queue Jul 6, 2026

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR refactors the virtualized list rendering model from top/bottom spacer elements to a single content wrapper that uses paddingTop / paddingBottom (spaceBefore / spaceAfter), and updates stick-to-bottom behavior to be driven by DOM observation (ResizeObservers) rather than framework-provided “content deps”.

Changes:

  • Replace “spacers” with a padded content wrapper across core docs, demos, and tests.
  • Rework stick-to-bottom (core + React + Solid bindings) to lazily wire DOM observers and remove explicit content-growth dependency plumbing.
  • Add/adjust unit + e2e tests to validate DOM-driven stick-to-bottom behavior and updated “space” semantics.

Reviewed changes

Copilot reviewed 21 out of 21 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
src/solid/create-zero-virtualizer.test.ts Updates test wording to match padding-based “spaceAfter” semantics.
src/solid/create-stick-to-bottom.ts Removes explicit deps and relies on DOM-driven attachment.
src/react/use-zero-virtualizer.ts Updates public docs to describe wrapper padding model.
src/react/use-zero-virtualizer.test.ts Updates tests for wrapper-based stick-to-bottom + adds ResizeObserver stubbing.
src/react/use-stick-to-edge.ts Removes explicit deps and wires stick-to-bottom per commit.
src/core/virtualizer.ts Adjusts anchoring/hold behavior to target content wrapper; updates docs/comments.
src/core/virtualizer.test.ts Renames/updates snapshot test descriptions for “space” terminology.
src/core/types.ts Updates anchoring mode docs for wrapper-margin hold behavior.
src/core/stick-to-bottom.ts Replaces content-change API with DOM-driven ensure() and ResizeObserver wiring.
src/core/index.ts Exports contentWrapper and removes contentGrowthDeps.
src/core/dom.ts Introduces contentWrapper() helper and updates related docs.
README.md Updates usage examples and documentation to wrapper-padding + DOM-driven stick-to-bottom.
demo/solid/ItemRow.tsx Removes spacer component from Solid demo.
demo/solid/App.tsx Switches Solid demo rendering to wrapper padding.
demo/shared/App.module.css Removes spacer styles now that spacers are gone.
demo/react/WindowList.tsx Switches window-scroller demo to wrapper padding.
demo/react/list-shared.ts Updates docs/comments from “spacers” to “space estimates/padding”.
demo/react/ItemRow.tsx Removes spacer component from React demo.
demo/react/e2e/tests/stick.spec.ts Adds e2e coverage for DOM-driven stick-to-bottom on wrapper growth.
demo/react/e2e/tests/scroll.spec.ts Updates wording from “spacer” to “padding” in assertions/comments.
demo/react/App.tsx Switches React demo rendering to wrapper padding.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +108 to +124
scrollTarget.addEventListener('scroll', measure, {passive: true});
const observer = new ResizeObserver(repin);
observer.observe(content, {box: 'border-box'});
let removeWindowResize: (() => void) | null = null;
if (scroller === document.scrollingElement) {
// A ResizeObserver on the scrolling element tracks the document (its
// content), not the viewport — use the window resize event instead.
window.addEventListener('resize', repin);
removeWindowResize = () => window.removeEventListener('resize', repin);
} else {
observer.observe(scroller, {box: 'border-box'});
}
cleanup = () => {
scrollTarget.removeEventListener('scroll', measure);
observer.disconnect();
removeWindowResize?.();
};
Comment on lines +169 to +172
() => {
const scroller = virtualizer.scrollElement;
return scroller && contentWrapper(scroller);
},
Merged via the queue into main with commit e6cd788 Jul 6, 2026
9 checks passed
@arv arv deleted the arv/no-space-yes-content-wrapper branch July 6, 2026 15:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants