Skip to content

Stepper: general multi-step flow shell as a first-class catalog component#661

Merged
lucaslyl merged 1 commit into
mainfrom
cs-12161-stepper-to-main
Jul 17, 2026
Merged

Stepper: general multi-step flow shell as a first-class catalog component#661
lucaslyl merged 1 commit into
mainfrom
cs-12161-stepper-to-main

Conversation

@lucaslyl

@lucaslyl lucaslyl commented Jul 17, 2026

Copy link
Copy Markdown
Contributor

Linear: CS-12161

Important

Stacked PR — based on cs-12106-tsp-ux (#657). Merge #657 first; GitHub will retarget this PR to main automatically. Do not merge this one ahead of it.

What

aef6db-stepper/ packages a general Stepper — the multi-step "guideline book" shell that walks a user through a journey (first-run wizard, onboarding) before they start using an app — so any product can reuse it. This PR contains only the new component package; refactoring the Table Seating Planner's setup wizard onto it will follow as a separate PR.

  • Vertical step rail (numbered dots, ✓ done state, active ring, connectors) + active step's content pane + Back / Skip / Next action bar built from boxel-ui <Button>
  • Host supplies steps + content via <:step as |step api|>; the component owns the state machine: per-step isComplete gating wired to host state, MUI-style optional steps (Skip is per-step opt-in, not global), onStepChange enter hooks, optional rail click-to-jump
  • @modal mode (scrim + centered card) or inline bordered card; header with kicker/title and an outlined-circle ✕, hideable via @showClose
  • Responsive: narrow containers stack the panes via a container query (rail becomes a horizontal strip); tall step content scrolls inside .stepper-content instead of clipping the action bar

Theming

Styling is driven by the theme system. Every visual value resolves --stepper-* knob → theme semantic token → neutral default. --primary / --primary-foreground (authored by themes as a contrast pair) drive the accent fills, their on-fill content, and the Next button; --foreground / --muted / --muted-foreground / --card / --border / --radius / --font-sans drive the rest — link a Theme card and the stepper restyles with no stepper-specific work. One-off brand overrides go through the --stepper-accent / --stepper-accent-fg pair on a host class.

Packaging

  • example/stepper-playground-example.gts + instance — live gated 4-step demo, knobs for @modal / @allowStepJump, generated invocation, full API reference
  • Specs for the component and the playground, a ComponentListing ("Stepper UI") linking specs/example/tag/category/screenshot

Testing

  • pnpm run lint in packages/catalog (eslint, ember-template-lint, glint lint:types) all green; prettier clean
  • Exercised live in the host: completion gating, optional-step Skip, finish button, close, theme-token flow (linked theme restyles fills/buttons/radius/fonts), narrow-container layout, tall-content scrolling

…nent (#659)

* Stepper: general multi-step flow shell as a first-class catalog component

aef6db-stepper/ packages a general stepper: a vertical step rail +
content pane + Back/Skip/Next action bar (boxel-ui Button), with
per-step isComplete gating, MUI-style optional steps, onStepChange
enter hooks, optional modal mode, and an outlined-circle close button.

Theming resolves --stepper-* knob -> theme semantic token (--primary/
--primary-foreground pair for fills, on-fill content, and the Next
button; --foreground/--muted/--card/--border/--radius/--font-sans for
the rest) -> neutral Boxel defaults. @accent (hex) computes a black/
white on-fill color via getContrastColor, the Avatar pattern. Narrow
containers stack the panes via a container query and tall step content
scrolls inside .stepper-content instead of clipping the action bar.

Ships with a StepperPlayground teaching example (live gated demo +
generated invocation), Specs for both, a ComponentListing, and a
screenshot.

* Stepper: drop the @accent arg — theming is fully theme-token driven

The accent fills and their on-fill content come from the theme's
--primary / --primary-foreground pair (or the --stepper-accent /
--stepper-accent-fg knobs for a one-off brand override); a JS arg that
interpolated a color into an inline style added an injection surface
and a second way to do what the theme system already does. Docs (Spec
READMEs, playground reference, listing summary) updated to match.
@lucaslyl lucaslyl self-assigned this Jul 17, 2026
@lucaslyl

Copy link
Copy Markdown
Contributor Author

The CLI POSTed a 950-file /_atomic batch, and after approximately 90 seconds, the realm server returned an actual 500 “Write Error.” This indicates a server-side write failure rather than a client timeout. The submissions realm on staging is now missing the Example instances from that batch:

https://realms-staging.stack.cards/submissions/aef6db-stepper/ComponentListing/a5cbb429-b363-4b8b-b07a-a2b1026120b0.json

I’ll merge this PR to unblock the other tasks, then investigate the atomic upload issue.

@lucaslyl
lucaslyl merged commit b669e1a into main Jul 17, 2026
2 of 3 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.

1 participant