Skip to content

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

Merged
lucaslyl merged 2 commits into
cs-12106-tsp-uxfrom
cs-12161-stepper-ui-component
Jul 17, 2026
Merged

Stepper: general multi-step flow shell as a first-class catalog component#659
lucaslyl merged 2 commits into
cs-12106-tsp-uxfrom
cs-12161-stepper-ui-component

Conversation

@lucaslyl

@lucaslyl lucaslyl commented Jul 16, 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

@lucaslyl lucaslyl self-assigned this Jul 16, 2026
@lucaslyl
lucaslyl requested review from a team and removed request for a team July 16, 2026 07:43
…nent

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.
@lucaslyl
lucaslyl force-pushed the cs-12161-stepper-ui-component branch from fe7f9eb to c8538fb Compare July 16, 2026 07:48
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 merged commit e6f9774 into cs-12106-tsp-ux Jul 17, 2026
2 of 4 checks passed
lucaslyl added a commit that referenced this pull request Jul 17, 2026
…nent (#659) (#661)

* 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.
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