Developers
Start building
Themes/Preview states in the Customizer

Preview states in the Customizer

Declare your own data states for your components and switch them live from the Customizer's Data picker: empty carts, sample reviews, any state your theme defines.

On this page

Merchants design pages against states, not only live data: an empty cart, a shopper with no orders yet, a product with no reviews. The Data button in the Customizer's toolbar switches those states per domain, and the canvas updates in place without a reload. The platform ships domains for its own data (cart, orders, addresses), and your theme can declare its own for any component.

The merchant's view

The preview toolbar has these related controls:

  • Signed in / Guest sets the canvas's sign-in state. Guest hides even a real session, so signed-out pages stay designable. Signed in fills a missing session with a sample customer, so account pages render.
  • Data has one row per domain. Platform rows come first, and theme rows appear under From your theme. A dot on the button marks any choice other than the default. Rows that only apply to signed-in shoppers are dimmed in Guest mode.

Choices stay while the merchant navigates inside the canvas, and a change applies at once: theme domains re-render, and platform domains reload the page's data.

Built-in domains

KeyOptions (the first is the default)
cartWith items / Empty
ordersSample orders / No orders yet
addressesSample address / None saved

The platform applies these on the server, so your components receive the shaped data (an empty order list, a sample cart) through the usual SDK hooks with no code of their own.

Declare your own domains

Create src/preview-scenarios.ts in your theme and default-export the domains:

src/preview-scenarios.ts
import { definePreviewScenarios } from '@poltura/theme-sdk/editor';

export default definePreviewScenarios([
  {
    key: 'reviews',
    label: 'Reviews',
    options: [
      { value: 'live', label: 'Live data' },
      { value: 'sample', label: 'Sample' },
      { value: 'empty', label: 'None' },
    ],
  },
]);

The first option is the default. Set requiresAuth: true on a domain to dim its row while the merchant previews the Guest state.

Read the active state in a component

import { usePreviewScenario } from '@poltura/theme-sdk/editor';

export function ReviewCount({ count }: { count: number }) {
  const shown = usePreviewScenario('reviews') === 'empty' ? 0 : count;
  return <p>{shown} reviews</p>;
}

Outside the Customizer the hook always returns the domain's default (its first option), so branching on it never changes what shoppers see. You need no guard around it.

The shipped themes carry a working example. Each declares the reviews domain in src/preview-scenarios.ts. Reviews from @poltura/theme-sdk/product reads it and renders live, sample or empty reviews. The Catalog, Editorial, Essential, Launch and Pop themes draw it in src/blocks/product-reviews.tsx.

Rules

An entry that breaks a rule is skipped without an error, so the picker never breaks:

  • Keys and option values use lowercase letters, digits, - and _, start with a letter or a digit, and are at most 32 characters long.
  • A key must be unique and must not be a built-in key (cart, orders, addresses).
  • A domain needs at least two valid options. Options after the sixth are ignored.
  • Only the first 12 domains are used.
  • Labels are cut to 40 characters.

How it works

The storefront merges your declarations with the platform's domains and reports them to the Customizer when the canvas loads. The picker shows whatever arrives, so a new domain needs no admin change. The choices travel as a preview_data URL parameter that follows the merchant through the canvas. When a choice changes, the Customizer tells the canvas, which rewrites that parameter in place and reloads the data. The page itself never reloads.

Sample data renders only inside the Customizer's preview. A shopper who adds preview_data to a storefront URL gets live data.

Next

Last updated