Defined in assets/theme.css, all driven by the design-token CSS variables(so theme settings, dark mode, and section style overrides apply):
page-section/page-section--alt— Use: Section outer band (alt = tinted surface)container— Use: Max-width content column (--container-width)grid grid--cols-2/3/4— Use: Responsive card gridstext-center mb-1+page-subtitle— Use: The standard section heading pairfeature-card,testimonial-card— Use: General card skinsbtn-primary,btn-outline— Use: Buttons (honour--button-*overrides)space-card,location-cardmarkup — Use: Copy from the snippets, don't re-invent — theirdata-*/class contracts feed the listing JSempty-state— Use: Friendly "nothing here" block
- Empty lists are truthy — test
{% if Things.size > 0 %}, never{% if Things %}. .size, not.lengthon lists.- Membership tests on arrays: use the loop-with-flag pattern (see Recipe 4) — it works everywhere and survives Fluid/Liquid dialect differences.
{% assign %}inside a{% for %}persists after the loop within the same file — that's what makes the loop-with-flag pattern work.- Filters that return markup (
attr_icon,attr_icon_key) must be piped through| raw.