Skip to content

Turn the download page into a stepped installation flow - #23

Merged
BeckettFrey merged 4 commits into
mainfrom
installation-page
Aug 24, 2026
Merged

Turn the download page into a stepped installation flow#23
BeckettFrey merged 4 commits into
mainfrom
installation-page

Conversation

@BeckettFrey

@BeckettFrey BeckettFrey commented Aug 24, 2026

Copy link
Copy Markdown
Member

/download becomes /installation, the single download panel becomes a four-step sequence, and the "Getting Started" help topic — which described the same install a page away — is folded into it.

Step Panel Content
A Check your machine OS / memory / disk requirements, plus the managed-device IT note
B Download a build The existing OS selector and release card
C Get set up Post-download install steps for the OS picked in step B
D Tell us how it went Optional feedback form — intuitiveness rating, hardest step, free-text issues

A wizard, not a stacked page

Only the active step is expanded; the rest collapse to a titled row. Navigation lives entirely on the connectors between the cards — the pulsing chevron below the open step goes forward, the quieter one above it goes back. The rail is both the ordering signal and the only way to move.

Collapsed headings are inert on purpose. Two competing navigation affordances is how a visitor loses track of which step they're actually on.

Every state sits on the card surface the features page already uses, so a collapsed step reads as an object rather than a rule across the page; the active step is that same surface turned up, not the only one present. The check slot stays occupied throughout — before a step is finished it holds that step's letter, which becomes the check on completion. Letters rather than numbers: the rail is what counts progress, and a number in the heading invites disagreeing with it.

Opening and closing

Panels ease grid-template-rows between 0fr and 1fr — the one way to animate to a content-determined height without measuring it in JS or inventing a max-height the content will outgrow. inert does what hidden used to for focus and the accessibility tree, while the body stays laid out so the server-rendered version numbers remain in the HTML.

Pressing continue centres the opened panel below the navbar. This can't be a scrollIntoView: two panels resize at once, so the target's height and its distance down the page are both still changing when the scroll starts, and one scroll issued at that moment aims at geometry that won't exist by the time it arrives. The destination is recomputed every frame and the scroll eases toward whatever it currently is, converging as the panels settle. Decay is time-based, so it behaves the same at 60Hz and 120Hz, and any real scroll input cancels it.

Two related fixes fall out of the same problem: connectors are a fixed height (their three roles had different footprints and shifted the column on every step change), and the flow sets overflow-anchor: none, because collapsing a panel above the viewport made the browser adjust scrollTop to keep its own chosen anchor still — a second hand on the wheel that read as the scrollbar twitching.

Removing the Getting Started help topic

The topic covered step A through step C from a page that couldn't know which build you'd taken, and it had already drifted from reality: it described dragging from a relative path and pointed at a download nav item that no longer exists. Deleting the entry removes both its card on /help and its route, so /help/getting-started now redirects to /installation alongside /download. The home page's two CTAs that pointed at it now point at the install flow (the hero CTA, and the bottom row's "Getting Started" button, which merged into the adjacent install CTA), and the footer's "Tutorials" link becomes "Install Guide".

Notes for review

  • SEO/no-JS preserved. Collapsed bodies stay mounted and laid out rather than being unmounted, so the server-rendered version numbers are still in the HTML even while the download step sits behind the gate.
  • OS selection is lifted into InstallFlowClient because it spans two cards — the build you take and the instructions for installing it. Step C can't describe a platform you didn't download.
  • Step titles are named once in INSTALL_STEPS. Each is shown both as a panel heading and as the destination its connector announces; they drifted apart the first time they were separate strings. The feedback form's "which step gave you the most trouble?" options derive from INSTALL_STEP_ORDER for the same reason.
  • The feedback form composes a mailto: rather than posting anywhere — this site has no backend to receive form posts, and a form that silently discarded what someone wrote would be worse than no form. Swapping in a real endpoint is a change to handleSubmit alone. Worth a decision: if you'd rather this posted to an API route or a GitHub issue prefill, say so.
  • Motion respects prefers-reduced-motion — the chevron glide, the pulse halo, and the transitions that move things all stop, while the ones that only recolour or fade stay. The button keeps its ring, fill, and label, so it's no less obviously a control.
  • Both redirects are permanent (declared in next.config.ts), so existing links and anything indexed keep working. Nav, footer, home/features CTAs, the revalidation cron path, and CONTRIBUTING.md were all updated.

Checks

lint, typecheck, format:check, and next build all pass. /installation prerenders with the 1d revalidate intact.

/download becomes /installation, and the single download panel becomes a
four-step sequence: check your machine, download a build, get set up, and
an optional feedback step.

The steps are a wizard rather than a stacked page. Only the active step is
expanded; the rest collapse to a titled row. Navigation lives entirely on
the connectors between the cards -- the pulsing chevron below the open step
goes forward, the quieter one above it goes back -- so the rail is both the
ordering signal and the only way to move. Collapsed headings are inert on
purpose: two competing navigation affordances is how a visitor loses track
of which step they are on.

Collapsed bodies stay mounted behind `hidden` rather than being unmounted,
so the server-rendered version numbers are still in the HTML for crawlers
and no-JS readers even while the download step sits behind the gate.

The OS selection is lifted into InstallFlowClient because it spans two
cards: the build you take and the instructions for installing it. Step
titles are named once in INSTALL_STEPS, since each is shown both as a panel
heading and as the destination its connector announces, and the two drifted
apart the first time they were separate strings.

The feedback form composes a mailto rather than posting anywhere -- this
site has no backend to receive form posts, and a form that discarded what
someone wrote would be worse than no form.

/download permanently redirects to /installation, so existing links and
anything indexed keep working.
@vercel

vercel Bot commented Aug 24, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
voxkit-web Ready Ready Preview Aug 24, 2026 11:32pm

The steps opened and closed by toggling the `hidden` attribute, which is an
instant `display: none` with nothing to transition. The body now eases
`grid-template-rows` between `0fr` and `1fr` -- the one way to animate to a
content-determined height without measuring it in JavaScript or inventing a
max-height that content will outgrow. `inert` takes over what `hidden` was
doing for focus and the accessibility tree, and the body stays laid out so
the server-rendered version numbers remain in the HTML.

Pressing continue now centres the opened panel in the space below the
navbar. This cannot be a scrollIntoView: two panels resize at once, so the
target's height and its distance down the page are both still changing when
the scroll starts, and a single scroll issued at the start of that is aiming
at geometry that will not exist by the time it arrives. Instead the
destination is recomputed every frame and the scroll eases towards whatever
it currently is, converging as the panels settle. Decay is time-based so it
behaves the same at 60Hz and 120Hz, and any real scroll input cancels it.

Two related fixes fall out of the same problem. Connectors are now a fixed
height, because their three roles had different footprints and shifted the
column on every step change. And the flow sets `overflow-anchor: none`:
collapsing a panel above the viewport made the browser adjust scrollTop to
keep its own chosen anchor still, which fought the flow's scrolling and read
as the scrollbar twitching.

The feedback form gains the hardest-step and duration questions. The
step options are derived from INSTALL_STEP_ORDER so renaming a step relabels
the question, and "I gave up" is on the duration list because someone who
abandoned the install is who the form most needs to hear from.
Collapsed steps were lighter than the card surface used everywhere else on
the site, so an unopened step read as a rule on the page rather than an
object. Every state now sits on the features page's tile treatment, with the
active step the same surface turned up rather than the only one present.

The check slot also stays occupied: before a step is finished it shows that
step's letter, which turns into the check on completion. Letters rather than
numbers -- the rail is what counts progress, and a number in the heading
invites disagreeing with it.

Drop the "how long did the whole thing take" question from the feedback form.
The topic covered the same ground as the installation page's first
three steps -- requirements, download, per-OS setup -- from a page that
could not know which build you had taken. It had already drifted: it
still described dragging from a relative path and named a `download`
nav item that no longer exists.

Deleting the entry removes both its card on /help and its route, so it
redirects to /installation alongside /download. The home page's two
CTAs pointing at it now point at the install flow, and the footer's
"Tutorials" link becomes "Install Guide".
@BeckettFrey
BeckettFrey merged commit ce33087 into main Aug 24, 2026
5 checks passed
@BeckettFrey
BeckettFrey deleted the installation-page branch August 24, 2026 23:42
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