WebberUI

Blueprint Process Section

An engineering-blueprint take on the how-it-works layout — on graph paper, each step is a numbered, annotated station, and as you scroll the dashed leader lines, dimension callouts, and section marks are drawn in order as SVG stroke animations.

Loading preview…
npx shadcn@latest add https://webberui.com/r/blueprint-process-section.json

Playground

Tune the props live — the code snippet updates as you go, so you can dial in the look you want before copying it.

22
0.65
0.14
0
<BlueprintProcessSection />

Installation

npx shadcn@latest add https://webberui.com/r/blueprint-process-section.json

Or, once registries are configured in components.json, install it as @webberui/blueprint-process-section.

Usage

Describe the process as a steps array; the component numbers each step as station 01…n automatically and draws the rail, leader lines, dimension callouts, and section marks in order as it scrolls into the viewport.

import { BlueprintProcessSection } from "@/components/ui/blueprint-process-section";

<BlueprintProcessSection
  eyebrow="How it works"
  title="Four steps to the drawing"
  description="Follow the rail station by station, the way you would read an engineering blueprint."
  steps={[
    { title: "Survey and requirements", description: "Start measuring from semantic tokens." },
    { title: "Tracing and prototype", description: "Turn the sketch into a running prototype." },
    { title: "Assembly and integration", description: "The source lands straight in your project." },
    { title: "Ship and sign-off", description: "reduced-motion support is built in." },
  ]}
/>;

Nested scroll container

If the component sits inside a custom overflow-y-auto container, pass that container's ref to root so viewport detection uses the container (rather than the whole window) as its basis:

const scrollerRef = React.useRef<HTMLDivElement>(null);

<div ref={scrollerRef} className="h-[300px] overflow-y-auto">
  <BlueprintProcessSection root={scrollerRef} steps={steps} />
</div>;

Labels and icons

Each step can override the tag on its dimension callout plate (STEP 0n by default) and bring in a lucide icon through icon:

import { Ruler } from "lucide-react";

<BlueprintProcessSection
  steps={[
    { title: "Survey", tag: "A-01", icon: <Ruler />, description: "…" },
  ]}
/>;

Props

BlueprintProcessSection

PropTypeDefaultDescription
stepsBlueprintStep[]List of steps, numbered automatically in order as stations 01…n
eyebrowReact.ReactNodeEngineering-style eyebrow above the heading block (monospace)
titleReact.ReactNodeMain section title
descriptionReact.ReactNodeSection description
gridSizenumber22Spacing of the graph-paper grid lines (px)
drawDurationnumber0.65Duration of drawing a single annotation (seconds)
staggernumber0.14Interval between the annotations drawn in order within one station (seconds)
delaynumber0Delay before a station starts once it enters the viewport (seconds)
oncebooleantruePlay the drawing animation only the first time the element enters the viewport
rootReact.RefObject<HTMLElement | null>Ref of the nested scroll container, used as the root for viewport detection
classNamestringCustom classes for the outer section

BlueprintStep

FieldTypeDescription
titleReact.ReactNodeStep title
descriptionReact.ReactNodeStep description (optional)
tagstringShort label on the dimension callout plate (optional, STEP 0n by default)
iconReact.ReactNodeSmall icon before the title (optional)
idstringCustom key / identifier (optional, defaults to the index)

How it works

  • Each station measures the real pixel dimensions of its own row with a ResizeObserver, and the annotation layer <svg> maps coordinates 1:1 through its viewBox, so circles and tick marks never distort when scaled.
  • The rail, dimension callouts, and section marks appear one by one as pathLength draws from 0 to 1; the dashed leader lines instead expand from the node toward the drawing frame with scaleX, which preserves the dash pattern (pathLength would override strokeDasharray).
  • The rail runs through the full height of a row and joins seamlessly between rows, with short cap lines added at the top of the first row and the bottom of the last, so it reads as one continuous measurement datum line.
  • The graph-paper ground switches its light/dark grid line color through the CSS variable --wb-grid, and the grid spacing is controlled by gridSize.

Accessibility

  • The steps are laid out semantically as <ol> / <li> with <h3> titles, so the reading order is the station order; the annotation layer (rail, leader lines, dimensions, section marks) is decorative (aria-hidden) and does not interfere with screen readers.
  • Node numbers, labels, and section codes are all drawn inside the decorative <svg>; the semantics are carried by the list order and the headings, so nothing is announced twice.
  • When the user has "reduce motion" enabled at the system level, all annotations are shown directly in their final state with no drawing animation, and the content and layout are completely unchanged.

On this page