Builder & design · guide

Widgets and blocks

Every built-in widget, when to use each, and how to build your own.

Widgets and blocks

Widgets are the building blocks of every page. WordSafe ships 60+ out of the box.

Layout widgets

WidgetUse for
SectionFull-width horizontal band with a background
ContainerConstrain width, apply padding
Columns1–6 columns with per-breakpoint stack order
GridCSS grid with named areas
SpacerPrecise vertical whitespace

Content widgets

Heading, paragraph, list, image, button, icon, divider, quote, code block, embed.

Marketing widgets

Testimonial, pricing table, feature grid, CTA banner, stats counter, logo cloud, FAQ accordion.

Dynamic widgets

Post loop, related posts, categories list, breadcrumbs, search — all wired to the CMS. Use in archive templates.

Form widgets

Contact form, booking form, newsletter opt-in, quote request. All submissions flow to Forms → Submissions and can trigger CRM automations.

Custom widgets

Create your own with a React component and a schema:

// widgets/callout.tsx
import { defineWidget } from "@wordsafe/builder";

export default defineWidget({
  name: "callout",
  label: "Callout",
  schema: {
    heading: { type: "text", default: "Heads up" },
    tone:    { type: "select", options: ["info", "warn", "success"], default: "info" },
  },
  render: ({ heading, tone }) => (
    <div className={`callout callout--${tone}`}>{heading}</div>
  ),
});

Drop it in src/widgets/, run bun run widgets:register, and it appears in the Widget library.