Skip to content

feat(website): fit the hero to one screen and animate how a call reaches the app - #80

Merged
V3RON merged 1 commit into
mainfrom
claude/website-hero-animation-jz8e8x
Sep 21, 2026
Merged

V3RON merged 1 commit into
mainfrom
claude/website-hero-animation-jz8e8x

Conversation

@V3RON

@V3RON V3RON commented Sep 21, 2026

Copy link
Copy Markdown
Contributor

The hero filled an arbitrary amount of the page and told you what Appduct does without showing it. It now fits the first viewport and carries a diagram of a call travelling into a running app.

Layout

min-height: calc(100svh - var(--sl-nav-height) - 3rem) — the nav plus the content panel's own padding — with the copy on the left, the diagram on the right, and the install line on a rule at the bottom of the fold. The landing page's own install paragraph is gone, since the hero rail now carries it.

The diagram

One inline SVG on a fixed viewBox, driven by a small requestAnimationFrame timeline: an eight-second loop of three beats, each 2.65s.

Per beat, one source sends one call — login("u_42") from a test run, seed_cart({items:3}) from the terminal, open_screen("checkout") from an agent. The call text appears in that source's box, a dot runs its wire, passes under the appduct service box and into the app, and the app reacts: signs the user in, fills the cart and its badge, or switches to a checkout screen. Then the app returns to its resting state and the next source takes a turn.

The phone lists the three registered tools and lights the one being called. That is the part worth seeing — nothing outside that list is reachable.

Details worth knowing while reviewing:

  • Constant speed, not constant duration. Travel time is pathLength / SPEED, so the two outer sources (whose wires are ~70% longer) take proportionally longer instead of racing.
  • The dot is painted before the service box and the app in the SVG paint order, so their fills hide it as it crosses. That is why the diagram defines solid equivalents (--d-line, --d-wash, …) of the theme's alpha hairlines rather than using --cs-line directly — an alpha fill would let the dot show through. The solids match the theme values exactly over the page background, and theme.css is untouched.
  • One live colour: everything active uses --cs-accent, which differs per theme (#8232ff light, #b789ff dark) so the signal reads at the same weight on white and on black.
  • prefers-reduced-motion renders a single landed call as a still frame; nothing moves and no rAF loop starts.
  • Below 50rem the scene is hidden. At that width it scales to ~0.6 and its mono labels fall under 6px, so the copy and install line carry the hero on a phone instead.
  • The SVG has role="img" with a <title>/<desc> describing the whole exchange, so the animation is not the only way to get the point.

Verification

pnpm build (17 pages, link validation passing) and pnpm typecheck (astro check, 0 errors) both clean. Checked the built site in a browser at 1440, 1280 and 390 wide, in light and dark, with no console errors.

Design was prototyped and reviewed before implementation; this PR is that prototype ported into Hero.astro.

🤖 Generated with Claude Code

https://claude.ai/code/session_01Xa9xqNnaSWwsVEitpGKPWu


Generated by Claude Code

…hes the app

The hero filled an arbitrary amount of the page and said what Appduct does
without showing it. It now sizes itself to the first viewport — 100svh less
the nav and the content panel's padding — with the copy on the left, a
diagram on the right, and the install line on a rule at the bottom of the
fold.

The diagram runs an eight-second loop of three beats. In each one a source
(a test run, a terminal, an agent) sends one call along its wire, the dot
passes under the appduct service box and into the app, the app reacts —
signs a user in, fills a cart, opens checkout — and then returns to its
resting state so the next source can take a turn. The phone lists the three
registered tools and lights the one being called, which is the part worth
seeing: nothing outside that list is reachable.

The dot travels at a constant speed, so the two outer sources simply take
longer to arrive. Everything live is the theme accent, and the diagram
carries solid equivalents of the theme's alpha hairlines because the dot
relies on the boxes being opaque to hide behind them. Under prefers-reduced-
motion it renders one landed call and nothing moves; below 50rem the scene
is hidden, since at that scale its mono labels fall under 6px.

The landing page's own install line is gone, now that the hero rail carries
it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Xa9xqNnaSWwsVEitpGKPWu
@V3RON
V3RON merged commit bdf9bfd into main Sep 21, 2026
10 checks passed
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