Skip to content

fix(ui): narrow-window wrapping, reduced motion, dialog focus and Pi click animation - #160

Merged
RealZST merged 6 commits into
mainfrom
fix/ui-polish-batch
Oct 18, 2026
Merged

RealZST merged 6 commits into
mainfrom
fix/ui-polish-batch

Conversation

@RealZST

@RealZST RealZST commented Oct 18, 2026 •

Copy link
Copy Markdown
Owner

Six small frontend fixes, one commit each.

  • Onboarding agent row wraps into two even rows (9 + 8) when the viewport is narrower than the row plus margins. With 17 agents the row is 908px, wider than the desktop window's 900px minimum, so both ends were cut off. Computed from AGENT_ORDER, icons stay 44px.
  • Extensions filter bar, Extensions header, Marketplace header wrap on narrow windows instead of being clipped off the right edge. They sit above the scroll containers, so unlike the lists below there was no way to reach what did not fit.
  • Reduced motion: the mascot prefers-reduced-motion block lost to the more specific per-part animation rules, so every hover and click animation still played with the setting on. Both declarations now carry !important. Verified with the media feature emulated: 83 live animations before, 0 after.
  • Audit page reuses extensionDisplayName instead of its own copy of the hook-name shortening. No output change.
  • Update dialogs (desktop and web) trap focus and close on Escape via the existing useFocusTrap / useEscape hooks, like the shared Modal already does. Tests added for both.
  • Pi mascot click replays the pi.dev hero animation: the π vanishes, four Tetris pieces fall in, the bottom row flashes and clears, the rest settles into the π. Timed from pi.dev's own constants (18 fps, seven eased frames per piece) on one 3s clock. Afterwards the blocks ease back into the hover state with the hover's own curve.

Checked at 1280 / 988 / 900 / 760 / 560 px, light and dark theme.

🤖 Generated with Claude Code

RealZST and others added 6 commits October 18, 2026 20:46
With 17 agents the welcome row is 908px wide, wider than the desktop
window's 900px minimum, so both ends were cut off. The row now keeps a
single line while the viewport leaves 40px on each side and otherwise
splits into two even rows (9 + 8), computed from AGENT_ORDER so new
agents need no further change. Icons stay 44px.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The Extensions filter bar, the Extensions header and the Marketplace
header sit above their scroll containers, so whatever did not fit was
clipped off the right edge with no way to reach it (unlike the lists
below, which scroll). They now wrap: the dropdowns and search box move
to their own right-aligned line, and the header buttons keep their
labels on one line instead of breaking mid-text before overflowing.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The reduced-motion block in mascot.css lists every mascot, but its
`.mascot-x.is-clicked *` selectors lose to the per-part animation rules
such as `.mascot-pi.is-clicked .pi-depth`, so with "Reduce motion" on
the hover and click animations played anyway (83 of them across the 17
mascots). Both declarations now carry `!important`. Only static state
changes remain on click (Gemini's glow, Cursor's shadow), which is not
motion.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The Audit page carried its own copy of the hook-name shortening that
extensionDisplayName already implements; the output is identical.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The two update dialogs declared aria-modal but let Tab wander behind
the backdrop and ignored Escape; the shared Modal already handles both
through useFocusTrap and useEscape. They now use the same hooks, keeping
their own markup because the plain backdrop is what lets the window be
dragged from it. Escape behaves like the header ✕.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Clicking the Pi card now plays the game of Tetris from pi.dev's hero,
cell for cell and frame for frame: the π vanishes, the turquoise bar,
blue leg, coral bar and yellow leg fall in one after another, the yellow
leg completes the bottom row, which flashes three times and is cleared,
and the rest settles one cell down into the π. Upstream runs 18 fps with
seven eased frames per piece, so every track is step-end on one 3s
clock. The old slide-together-and-puff click is gone with its smoke.

The tail of each track eases from the settled π into the hover resting
offset with the hover's own curve and stagger, so a click while hovering
ends with the blocks picked up again gradually. The agent card clips the
mascot at the card's top edge so the pieces fall in from it.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@RealZST
RealZST merged commit a7eab3e into main Oct 18, 2026
3 checks passed
@RealZST
RealZST deleted the fix/ui-polish-batch branch October 18, 2026 14:08
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