From c8538fb6de88a90cd9427bd1de5ade9546e1c1a5 Mon Sep 17 00:00:00 2001 From: Lucas Law Date: Thu, 16 Jul 2026 15:48:36 +0800 Subject: [PATCH 1/2] 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. --- .../a5cbb429-b363-4b8b-b07a-a2b1026120b0.json | 83 ++ ...0-a2ee-4142-a3d7-a9f537df7c52-d5ab6927.png | Bin 0 -> 48026 bytes .../Spec/stepper-playground-example.json | 45 ++ aef6db-stepper/Spec/stepper.json | 45 ++ .../c76678a0-a2ee-4142-a3d7-a9f537df7c52.json | 32 + .../example/stepper-playground-example.gts | 544 ++++++++++++++ aef6db-stepper/stepper.gts | 708 ++++++++++++++++++ 7 files changed, 1457 insertions(+) create mode 100644 aef6db-stepper/ComponentListing/a5cbb429-b363-4b8b-b07a-a2b1026120b0.json create mode 100644 aef6db-stepper/Screenshots/c76678a0-a2ee-4142-a3d7-a9f537df7c52-d5ab6927.png create mode 100644 aef6db-stepper/Spec/stepper-playground-example.json create mode 100644 aef6db-stepper/Spec/stepper.json create mode 100644 aef6db-stepper/example/StepperPlayground/c76678a0-a2ee-4142-a3d7-a9f537df7c52.json create mode 100644 aef6db-stepper/example/stepper-playground-example.gts create mode 100644 aef6db-stepper/stepper.gts diff --git a/aef6db-stepper/ComponentListing/a5cbb429-b363-4b8b-b07a-a2b1026120b0.json b/aef6db-stepper/ComponentListing/a5cbb429-b363-4b8b-b07a-a2b1026120b0.json new file mode 100644 index 00000000..76693439 --- /dev/null +++ b/aef6db-stepper/ComponentListing/a5cbb429-b363-4b8b-b07a-a2b1026120b0.json @@ -0,0 +1,83 @@ +{ + "data": { + "meta": { + "adoptsFrom": { + "name": "ComponentListing", + "module": "@cardstack/catalog/catalog-app/listing/listing" + } + }, + "type": "card", + "attributes": { + "name": "Stepper UI", + "summary": "The Stepper component provides a multi-step flow shell for first-run wizards, onboarding journeys, and setup checklists — a guideline book that walks the user through what to fill in, in what order, before they start using an app. It renders a vertical step rail (numbered dots, checkmark done states, active ring, connector lines) beside the active step's content pane, closed out by a Back / Skip / Next action bar built from boxel-ui Button. The host supplies step definitions and per-step content through named blocks while the component owns the step state machine: gating Next on per-step isComplete wired to host state, MUI-style optional steps that surface a Skip button, onStepChange enter hooks for lazy loading, and optional rail click-to-jump. It supports an inline bordered-card mode and a modal mode (scrim plus centered card) for first-run experiences, a header with kicker, title, and an outlined-circle close button, and a fully replaceable actions block. Theming routes every color, font, and radius through --stepper-* CSS custom properties with neutral Boxel-token defaults, and the @accent argument accepts any hex brand color, computing a black or white on-fill content color via getContrastColor — the same contrast pattern as boxel-ui's Avatar.", + "cardInfo": { + "name": "Stepper UI", + "notes": null, + "summary": null, + "cardThumbnailURL": null + } + }, + "relationships": { + "skills": { + "links": { + "self": null + } + }, + "tags.0": { + "links": { + "self": "../../Tag/card" + } + }, + "license": { + "links": { + "self": null + } + }, + "specs.0": { + "links": { + "self": "../Spec/stepper" + } + }, + "specs.1": { + "links": { + "self": "../Spec/stepper-playground-example" + } + }, + "specs.2": { + "links": { + "self": "../../Spec/code-snippet" + } + }, + "images.0": { + "links": { + "self": "../Screenshots/c76678a0-a2ee-4142-a3d7-a9f537df7c52-d5ab6927.png" + } + }, + "publisher": { + "links": { + "self": null + } + }, + "examples.0": { + "links": { + "self": "../example/StepperPlayground/c76678a0-a2ee-4142-a3d7-a9f537df7c52" + } + }, + "categories.0": { + "links": { + "self": "../../Category/ui-components-design" + } + }, + "cardInfo.theme": { + "links": { + "self": null + } + }, + "cardInfo.cardThumbnail": { + "links": { + "self": "../Screenshots/c76678a0-a2ee-4142-a3d7-a9f537df7c52-d5ab6927.png" + } + } + } + } +} \ No newline at end of file diff --git a/aef6db-stepper/Screenshots/c76678a0-a2ee-4142-a3d7-a9f537df7c52-d5ab6927.png b/aef6db-stepper/Screenshots/c76678a0-a2ee-4142-a3d7-a9f537df7c52-d5ab6927.png new file mode 100644 index 0000000000000000000000000000000000000000..00d4267fdb0b828d14241af9e91e52e0e0e0085f GIT binary patch literal 48026 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%0DSVDZXpX-bH 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 G@BadQ@7-$v literal 0 HcmV?d00001 diff --git a/aef6db-stepper/Spec/stepper-playground-example.json b/aef6db-stepper/Spec/stepper-playground-example.json new file mode 100644 index 00000000..a437fd31 --- /dev/null +++ b/aef6db-stepper/Spec/stepper-playground-example.json @@ -0,0 +1,45 @@ +{ + "data": { + "meta": { + "adoptsFrom": { + "name": "Spec", + "module": "@cardstack/base/spec" + } + }, + "type": "card", + "attributes": { + "ref": { + "name": "StepperPlayground", + "module": "../example/stepper-playground-example" + }, + "readMe": "## Stepper Playground\n\nA config explorer for ``. Live preview on top, knobs for `@modal` (inline vs scrim + centered card) and `@allowStepJump` below it, then the generated invocation and the full API reference. Colors, fonts, and radius come from the linked theme (cardInfo.theme) via the semantic tokens (`--primary` / `--primary-foreground`, `--foreground`, `--muted`, `--card`, `--border`, `--radius`, `--font-sans`) — link a different Theme card and the whole stepper restyles with no stepper-specific work.\n\nThe live 4-step demo's completion gating is REAL: step 1 completes when you type a name, step 2 when you pick a workspace — exactly how a product wires `isComplete` to its own state. Step 3 sets `optional: true` so a Skip button appears (MUI-style); the steps before it are linear. The last step shows the `@finishLabel` / `@onFinish` primary button, and an event line above the stage prints every `onStepChange` / `onClose` / `onFinish` as it fires.\n\nThis is the **teaching example** for the Stepper API — the generated-code panel prints the exact invocation for the current knob combination.", + "cardInfo": { + "name": null, + "notes": null, + "summary": null, + "cardThumbnailURL": null + }, + "specType": "card", + "cardTitle": "Stepper Playground", + "cardDescription": "A live config explorer for — modal and step-jump knobs over a real gated 4-step demo that follows the linked theme, with the generated invocation printed alongside. The teaching example for the Stepper API.", + "containedExamples": [] + }, + "relationships": { + "cardInfo.theme": { + "links": { + "self": null + } + }, + "linkedExamples.0": { + "links": { + "self": "../example/StepperPlayground/c76678a0-a2ee-4142-a3d7-a9f537df7c52" + } + }, + "cardInfo.cardThumbnail": { + "links": { + "self": null + } + } + } + } +} \ No newline at end of file diff --git a/aef6db-stepper/Spec/stepper.json b/aef6db-stepper/Spec/stepper.json new file mode 100644 index 00000000..e208d43b --- /dev/null +++ b/aef6db-stepper/Spec/stepper.json @@ -0,0 +1,45 @@ +{ + "data": { + "meta": { + "adoptsFrom": { + "name": "Spec", + "module": "@cardstack/base/spec" + } + }, + "type": "card", + "attributes": { + "ref": { + "name": "default", + "module": "../stepper" + }, + "readMe": "## Stepper\n\nA general multi-step flow shell — the \"guideline book\" that walks a user through a journey (a first-run wizard, an onboarding flow, a setup checklist) *before* they start using an app. Two-pane layout: a vertical step rail on the left (numbered dots, ✓ done state, active ring, connector lines) and the active step's content on the right, closed out by a Back / Skip / Next action bar built from boxel-ui `