Skip to content
Vitops
GuidesComponentsPackagesThemeReferenceChangelog

Start here

VitopsInstallationYour design systemYour config

Live preview

Theme previewAnimation libraryIconsPatterns

Components

OverviewCSS classesWeb componentsAstro componentsBricks elements

Packages

@getvitops/cli@getvitops/astro@getvitops/vite@getvitops/generator@getvitops/core@getvitops/utils@getvitops/emdash@getvitops/create

Reference

Config referenceOutput formatsColour systemType & space scalesComponent patternsIconsConsent gateConversion trackingSearchLegal documentsCSS class vocabularyBricks elements

Releases

Changelog

Bricks elements

Every repo-owned Bricks element, its controls, defaults, seeded children and keywords, for driving the Bricks Builder UI.

Generated page. Rendered from this project’sdesign-system.json by @getvitops/generator — the same bundlevitops docs prints against your own config. Don’t edit it by hand.

How they appear in the builderConfiguring layoutSplit — vitops-split · nestableCentered — vitops-centered · nestableCarousel — vitops-carousel · nestableDismissable — vitops-dismissable · nestableEntries — vitops-entries · nestableImage Compare — vitops-image-compare · nestableSite Nav — vitops-sitenav · not nestableSplit Link — vitops-split-link · nestableSplit Panel — vitops-split-panel · nestableColor Scheme Toggle — vitops-color-scheme-toggle · not nestableCopy Button — vitops-copy-button · not nestableIcon — vitops-icon · not nestableMulti Field — vitops-multi-field · not nestable

Context for driving the Bricks Builder UI (e.g. Claude for Chrome). Every section below is generated from the element’s own source, so this reference always matches the elements currently deployed. See also the CSS class vocabulary in /css/classes.md and the integration guidance in /bricks/index.md.

How they appear in the builder

  • The elements register from dist/bricks/load.php and group under a “Vitops” category pinned to the top of the element panel. Insert one by searching its label (e.g. “Split”, “Carousel”) or any of its keywords (listed per element).
  • Two rendering families:
    • Web-component elements render a Lit custom element (<wc-*>, <wc-copy>, …) from dist/elements.js and progressively enhance. A few (Image Compare, Split Panel) show their children stacked in the builder canvas until the client-side upgrade runs — that is expected, not broken.
    • CSS-pattern elements (Split, Centered, Menu, Split Link) render plain markup styled by the framework CSS — no JS dependency.
  • Nestable elements accept child elements dropped into them; some seed starter children (listed as “Seeded children”). Non-nestable elements are configured entirely through their controls.

Configuring layout

Some layout is set through controls; some through CSS classes typed into the element’s built-in “CSS classes” field (called out per element as modifier classes). Responsive suffixes on those classes engage from a container breakpoint: -sm = 30rem, -md = 48rem, -lg = 64rem, -xl = 80rem.

Each control below lists its type, default/placeholder, any select options, and the CSS custom property it writes (when it drives one). Info notes flagged Note: carry the modifier-class and structural guidance from the element itself.


Split — vitops-split · nestable

A nestable flex row rendering the framework’s .split (layout.css) — equal columns by default. Set a ratio by adding a class in the CSS-classes field: split-1-2 / 2-1 / 1-3 / 3-1 / 1-4 / 4-1 / 2-3 / 3-2, each with an optional sm-/md-/lg-/xl- PREFIX to engage the ratio from a container breakpoint. flex-col stacks the columns below that breakpoint; split-reverse (also breakpoint-prefixable) swaps the two panels. Reversing puts visual order out of step with DOM order, so keep focusable content in only one of the two columns.

The .split base rides on the built-in “CSS classes” setting (defaulted below) so it shows in the builder canvas (assembled from settings) and the frontend.

Controls

  • HTML tag (select, default div) — Options: div, section, article, aside, main, header, footer, nav.
  • Note: Equal columns by default. Add a class in “CSS classes” for a ratio: split-1-2, 2-1, 1-3, 3-1, 1-4, 4-1, 2-3, 3-2 (prefix with sm-/md-/lg-/xl- to engage it from a breakpoint). Add flex-col to stack the columns below that breakpoint, and split-reverse to swap the two panels — when reversing, keep focusable content in only one column so the tab order stays linear.

Base CSS class: split (applied automatically; add ratio/modifier classes alongside it in the element’s “CSS classes” field).

Seeded children: Column 1, Column 2.

Keywords: split, columns, ratio, flex, container, layout.


Centered — vitops-centered · nestable

A nestable container that renders the framework’s named-track grid, .centered (src/css/layout.css). Children auto-place in the reading measure track; a child widens by adding breakout / spotlight / fullbleed (+ responsive -sm/-md/-lg/-xl) in its own Bricks “CSS classes” field.

The framework classes ride on the built-in “CSS classes” setting (defaulted below): a nestable element’s root is assembled from settings in the builder canvas, so classes added only in render()/set_root_attributes() never appear there — _cssClasses does.

Controls

  • HTML tag (select, default div) — Options: div, section, article, aside, main, header, footer, nav.
  • Measure (reading width) (number+units, default 65ch) — Bound to --width-measure.
  • Breakout width (number+units, default 90ch) — Bound to --width-breakout.
  • Spotlight width (number+units, default 120ch) — Bound to --width-spotlight.
  • Gutter (text, placeholder clamp(1rem, 4cqi, 3rem)) — Bound to --gutter.

Base CSS class: centered rhythm (applied automatically; add ratio/modifier classes alongside it in the element’s “CSS classes” field).

Keywords: centered, measure, grid, container, layout, track.


Carousel — vitops-carousel · nestable

Renders the Lit component (src/web-components/WCCarousel.ts) around a .carousel__track scroll container. Each direct child of the element is a slide.

Without JS the .carousel classes still yield a working scroll-snap carousel with a visible scrollbar, a “scroll for more” hint and — in Chromium — native prev/next buttons and dot navigation, so the builder canvas stays functional. Where those pseudo-elements are missing (Firefox, older Safari) the component builds real buttons and dots styled to match.

The .carousel base rides on the built-in “CSS classes” setting (defaulted below) so it applies in the canvas and the frontend. Add modifier classes there: carousel--scroll-buttons, carousel--scroll-markers, carousel--auto-pages, carousel--inert, carousel--force-stop, carousel--no-scrollbar, carousel--markers-below.

Note the slide track here is a

, not a
    : Bricks children are blocks, so the list semantics the Astro component emits are not available on this platform. The CSS targets > *, so everything else is identical.

    Controls

    • Autoplay interval (ms) (number, placeholder 0) — Milliseconds between slides. Leave empty / 0 to disable. Autoplay implies looping.
    • Loop (checkbox) — Clone the slides at both ends for a seamless infinite strip. Off by default: it triples the markup and duplicates every image.
    • Accessible label (aria-label) (text)
    • Slide media aspect ratio (text, placeholder 16 / 9) — Sets –carousel-slide-aspect, the ratio each slide’s media box takes. Keeps slide heights equal whatever the image.
    • Scroll hint (text, placeholder Scroll for more) — Shown beside the strip and dimmed once the visitor scrolls. Clear to omit it.
    • Note: Add modifier classes in “CSS classes”: carousel–scroll-buttons, carousel–scroll-markers, carousel–auto-pages, carousel–inert, carousel–force-stop, carousel–no-scrollbar, carousel–markers-below. Each direct child is a slide.

    Base CSS class: carousel carousel--scroll-buttons carousel--scroll-markers (applied automatically; add ratio/modifier classes alongside it in the element’s “CSS classes” field).

    Seeded children: Slide 1, Slide 2, Slide 3.

    Keywords: carousel, slider, slides, gallery, scroll.


    Dismissable — vitops-dismissable · nestable

    Renders the Lit component (src/web-components/WCDismissable.ts): a light-DOM progressive-enhancement wrapper. A click on any descendant marked data-dismiss (e.g. the seeded close button) fades the wrapper out and removes it. Optional duration auto-dismisses after N ms; exit sets the fade time.

    Without JS the wrapper is an inert unknown tag and its content still renders, so the builder canvas stays functional.

    Controls

    • Auto-dismiss after (ms) (number) — Leave empty to require a click on a [data-dismiss] element.
    • Fade-out time (ms) (number)
    • Note: Any child with a data-dismiss attribute acts as a close trigger. The seeded button already has it.

    Seeded children: Content, Close (×).

    Keywords: dismiss, close, banner, notice, alert.


    Entries — vitops-entries · nestable

    Renders the Lit component (src/web-components/WCEntries.ts): an adaptive data display that enhances a series of heading +

    pairs into a table / column projection based on container width. Without JS the heading +
    pairs render stacked (semantic), so the builder canvas stays functional.

    Slotted content structure (add via Code / HTML children):

    Group title

    Label
    Value
    …
    (repeat)

    Controls

    • Breakpoint (text, placeholder 40rem) — Container width below which the projected/table view engages.
    • Column projection (table) (checkbox) — Project heading +
      pairs into a table.
    • Singular (one row at a time) (checkbox) — With projection + narrow: show one row with nav.
    • Note: Add children as heading +
      pairs: an

      group title followed by a
      of
      Label
      Value
      pairs. Use a Code / HTML element for the
      .

    Seeded children: Group title.

    Keywords: entries, data, table, definition, list, dl.


    Image Compare — vitops-image-compare · nestable

    Renders the Lit component (src/web-components/WCImageCompare.ts): a before/after comparison slider. Author fills the two seeded slots (slot=“before” / slot=“after”) — typically an Image element in each.

    Nestable: the live slider appears on the frontend; the builder canvas shows the two images stacked (upgrade happens client-side via dist/elements.js).

    Controls

    • Initial position (%) (number, default 50, range 0–100)
    • Vertical split (checkbox)
    • Discrete (step) dragging (checkbox)
    • Keyboard step (%) (number)
    • Before label (text, placeholder Before)
    • After label (text, placeholder After)

    Seeded children: Before, After.

    Keywords: image, compare, before, after, slider.


    Site Nav — vitops-sitenav · not nestable

    The site’s primary navigation, generated from a WordPress menu. Two presentations from one markup tree, switched purely by container width — no JS beyond the native Popover API:

    • Mobile (below the chosen breakpoint, .sitenav–bp-{sm,md,lg,xl}): a hamburger button (a Popover API invoker) opens a slide-in DRAWER — its own sibling [popover] element. Light-dismiss, Esc, and focus handling come free from the platform. Inside the drawer, branch items are native

    ACCORDIONS. • Desktop (≥ the breakpoint): the hamburger + drawer chrome fall away and the same list lays out inline as a NAVBAR; branch submenus promote to hover/focus/click pop-out DROPDOWNS. See sitenav.css.

    Each branch item is a SPLIT-LINK: a real parent that navigates, flush with a separate

    disclosure whose is only the caret toggle. The link sits OUTSIDE the summary (a sibling of
    ), so there is no interactive control nested inside the summary’s button role — valid HTML and axe-clean (no nested-interactive). The submenu lives inside
    and reveals as an accordion (mobile) or a dropdown (desktop).

    Per-breakpoint depth caps: “Desktop depth” / “Mobile depth” limit how deep the tree shows at each breakpoint. PHP resolves the caps into sitenav__item--desktop-branch / --mobile-branch classes on the boundary nodes; sitenav.css then hides just the caret + submenu at the capped breakpoint, leaving the parent link — so a 3-tier desktop megamenu collapses to a 2-tier tap-through on mobile.

    “Menu” was this element’s former name; it was renamed to Site Nav so “Menu” can name a more generic interactive dropdown. Non-nestable: the tree comes from the WP menu, so render() drives all markup and runs in the builder canvas too.

    Controls

    • WordPress menu (select, placeholder Select a menu)
    • Note: No WordPress menus found. Create one under Appearance → Menus.
    • Accessible label (text, placeholder Primary) — aria-label for the
      landmark.
    • Navbar breakpoint (select, default md — 48rem) — Container width at/above which the drawer becomes an inline navbar with pop-out dropdowns. Below it, a hamburger opens a drawer with accordions. Options: sm — 30rem, md — 48rem, lg — 64rem, xl — 80rem.
    • Drawer side (select, default Inline-end (right)) — Edge the mobile drawer slides in from. Options: Inline-start (left), Inline-end (right).
    • Toggle label (accessible name) (text, placeholder Menu) — aria-label for the mobile hamburger button.
    • Desktop depth (number, default 3, range 1–∞) — Levels shown at/above the breakpoint. Empty = unlimited.
    • Mobile depth (number, default 2, range 1–∞) — Levels shown below the breakpoint; deeper toggles/markers are hidden. Empty = unlimited.

    Keywords: sitenav, site nav, nav, navigation, navbar, drawer, header, menu, megamenu.


    Split Link — vitops-split-link · nestable

    A “split button”: a primary flush with a

Built with the design system it documents.

@getvitops on npm