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.
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:
${ 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
props { slug } reads the bare form.