Skip to content

feat(gallery): add a full-screen wall of every spinner - #41

Open
evanroyrees wants to merge 7 commits into
mainfrom
feat/spinner-wall
Open

evanroyrees wants to merge 7 commits into
mainfrom
feat/spinner-wall

Conversation

@evanroyrees

@evanroyrees evanroyrees commented Oct 16, 2026 •

Copy link
Copy Markdown
Contributor

What

Adds /wall: a full-viewport, scrollable matrix of every spinner (474), so many can be seen at once without any site text, and as a showcase.

  • Tiles are bare 64px action-icon-style cells that reuse the overview previews.
  • Hover or keyboard focus shows one floating tooltip with the name, dlc.<family> and description.
  • Clicking a tile opens that spinner's configuration page; Esc or the close button returns to the overview.
  • Entry points: a header icon, a "Full-screen wall" navbar link, and a header-search entry.
  • At this size 8 spinners spilled past their tile. WALL_SCALE shrinks them, and the react-spinners dot rows get a fixed size because a transform cannot undo their wrap.
  • New test test_wall_has_every_spinner_and_none_clips checks the tile count, that no tile clips its spinner, the tooltip, and click-through. _worst_overflow now takes a selector so the overview's clip scan is reused.

Checklist

  • PR title starts with feat: / fix: / perf: / revert: (if this should ship in the next PyPI release) or chore: / docs: / ci: / test: / style: / refactor: (if not)
  • I expect release-please to open a release PR after this merges (feat/fix/perf/revert) — or I do not expect one (chore/docs/ci/…)
  • If marketing copy (README, gallery) was touched, component counts and family descriptions match the code

/wall shows one bare 64px tile per spinner on a viewport-filling
scroller. Hover or focus shows a tooltip with the name, namespace and
description, click opens the spinner's page, Esc or the close button
returns to the overview. Linked from the header, navbar and search.

Wall tiles reuse the overview previews; WALL_SCALE and a fixed size for
the react-spinners dot rows keep every spinner inside its tile, which
the new test checks.

Signed-off-by: Evan Rees <evanroyrees@gmail.com>
Hover waits 500ms before the tooltip shows, so scrolling or sweeping
across the wall stays quiet, and any scroll hides it. Keyboard focus
still shows it at once.

Signed-off-by: Evan Rees <evanroyrees@gmail.com>
Signed-off-by: Evan Rees <evanroyrees@gmail.com>
The header icon is the one entry point to the wall. It gets a CSS
tooltip (Mantine's Tooltip needs the ref React 19 does not hand it)
that shows after a short delay.

Signed-off-by: Evan Rees <evanroyrees@gmail.com>
474 live spinners meant thousands of animated layers and 160 canvas
rAF loops, over a gigabyte in the tab. Tiles start parked (no preview,
loadersz paused) and an IntersectionObserver wakes those within 300px of
the viewport and parks them again on scroll-out.

Signed-off-by: Evan Rees <evanroyrees@gmail.com>
…ewport

Profiled in headless Chrome: a clip per animated tile cost about 40% of
the frame time while scrolling, and frame time scales with the number
of live tiles. Removing the overflow clip (WALL_SCALE already keeps every
spinner inside its tile) and waking tiles within 120px instead of 300px
takes the average scroll frame from about 143ms to about 63ms.

Signed-off-by: Evan Rees <evanroyrees@gmail.com>
…en overview cards

The landing page leads with one card per library instead of one featured
spinner. A library with few spinners shows them all; more revolve in even
pages. Libraries with sections (flicker, gridora, loadersz) get a row per
section, each turning on its own. Only the active card's visible page
renders.

The overview below it was the heavy part of the page (every card live, over
a gigabyte after scrolling), so cards now park until they are near the
viewport, the way the wall's tiles do: running animations on the landing
page go from about 2900 to under 100.

Signed-off-by: Evan Rees <evanroyrees@gmail.com>

This branch has not been deployed

No deployments
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.

1 participant