Skip to main content

By scope

The last two rows differ. The page’s own section list is removed on entry to a component or layout, so a stray {sections} cannot duplicate the page. Named groups are retained, so a layout can compose the header and footer. Props passed to a component take precedence over a global of the same name.

storefront

The complete object. It contains no products, cart or user. presentment_rates_json duplicates presentment_rates because Slurp has no json filter. oauth_google and oauth_github duplicate oauth_providers because {if} cannot test array membership.

section

settings and blocks are always present, including on a leaf block. id and type are present only when they pass the identifier check. Guard them before printing. Values in settings have already been merged against the schema: unknown keys dropped, numbers clamped to min and max, richtext sanitized, invalid colours and links replaced by the default.
A section template with no section { } schema receives the merchant’s raw saved state, with string values sanitized but nothing else validated. Declare a schema.

block

The same shape as a section’s block entries. In a block template, section resolves outward to the enclosing section.

theme.settings

Values from config/settings_schema.json merged with the merchant’s saved values. Saved values take precedence. Keys the schema does not declare are retained, which is the opposite of section settings behaviour.

page_seo

Either {} or:
Always present, so ${ page_seo.title ?? theme.settings.default_title } is safe.

params

Route parameters as strings. Each is also injected at the top level, where it cannot overwrite storefront, theme or params.
pages/products/[slug].slurp
A page declaring props { slug } reads the bare form.

platform

See Platform assets.