Objects
Objects are the data your Liquid templates read: the firm, the signed-in client (customer), the page being viewed, the section being rendered. Read a property with a dot and its snake_case name:
<a href="{{ firm.url }}">{{ firm.name | escape }}</a>
Some objects are available everywhere, some only in certain templates, and some only come from other objects (a menu's links are link objects). Each section below says where its object is available.
Reading this reference
Types
| Type | Meaning |
|---|---|
string |
Text. Escape it with escape before you output it in HTML, unless the property says it's HTML. |
HTML |
A string of sanitized HTML. Output it as is, without escape. |
number |
An integer or a decimal. Money amounts are in major units: 49.0 is 49 dollars. |
boolean |
true or false. |
array of X |
A list you can loop over with for, and count with .size. |
X or nil |
The value can be missing. nil is falsy, so {% if firm.logo_url %} checks for it. |
Missing values. A property that doesn't exist, or an object that isn't available in the current template, is nil. It renders as nothing and doesn't raise an error.
Relative URLs. Properties named url or …_url that point at the firm's own pages are paths, such as /contact. Image URLs and firm.url are absolute.
Overview
| Object | Type | Available in |
|---|---|---|
firm |
firm |
Everywhere |
settings |
Theme settings | Everywhere |
routes |
routes |
Everywhere |
customer |
customer or nil |
Everywhere |
request |
request |
Everywhere |
flash |
flash or nil |
Everywhere |
template, page_title, page_description, canonical_url |
string |
Everywhere |
content_for_header, content_for_layout |
HTML |
Layouts |
form_authenticity_token |
string |
Everywhere |
linklists |
Menus by handle | Everywhere |
practice_areas |
array of practice_area |
Everywhere |
team |
team |
Everywhere |
blog |
blog |
Everywhere |
intake_form |
intake_form |
Everywhere |
practice_area |
practice_area |
The practice_area template |
article |
article |
The article template |
page |
page |
Site pages (index, page and page.* templates) |
reset_password |
reset_password |
customers/reset_password template |
invitation |
invitation or nil |
customers/activate_account template |
section |
section |
Section files |
block |
block |
Loops over section.blocks |
form |
form |
Inside {% form %} |
area, article_category, article_tag, metafields, team_member, linklist, link, font, color_scheme |
Reached through other objects and settings |
firm
The firm whose site is being rendered. It only exposes public details.
Available: everywhere, as firm.
| Property | Type | Description |
|---|---|---|
id |
string |
The firm's unique ID. |
name |
string |
The firm's name. |
description |
string or nil |
The firm's short description. |
url |
string |
The site's absolute address, e.g. https://learn.example.com. |
host |
string |
The host the site is served on: the firm's primary custom domain once it's verified, otherwise its platform subdomain. |
logo_url |
string or nil |
Absolute URL of the logo. |
favicon_url |
string or nil |
Absolute URL of the favicon. |
og_image_url |
string or nil |
Absolute URL of the default social sharing image. |
currency |
string |
The firm's currency as an ISO 4217 code, e.g. USD. Use the money filter rather than formatting amounts yourself. |
country |
string or nil |
The firm's country as a two-letter code, e.g. FR. |
locale |
string |
The locale used to format numbers, money and dates, e.g. en-US. |
timezone |
string or nil |
The firm's time zone, e.g. Europe/Paris. The local_date filter uses it. |
contact_email |
string or nil |
The public contact email address. |
phone |
string or nil |
The office phone number, as the firm typed it. |
phone_url |
string or nil |
The phone as a tel: link with only + and digits, e.g. tel:+14155550100. Use it as the href. |
address_line_1, address_line_2 |
string or nil |
The office address, e.g. 450 Sutter Street, Suite 400 and San Francisco, CA 94108. |
address |
string or nil |
Both address lines joined with , , e.g. for a map link. |
office_hours |
string or nil |
The office hours, e.g. Monday to Friday, 9am – 6pm. |
legal_name |
string |
The name for the copyright line: the firm's legal name, or its name when none is set. |
established |
number or nil |
The year the firm was established, e.g. 1994. |
portal_enabled |
boolean |
Whether the firm's client portal is on. Show sign-in and account links only when it is. |
has_privacy_policy |
boolean |
Whether the firm has written a privacy policy. |
has_terms_of_use |
boolean |
Whether the firm has written terms of use. |
social_links |
array of social link |
The firm's social media profiles, in the order the firm set. |
powered_by |
powered-by badge | The platform badge. Some plans require it. |
{% if firm.logo_url %}
<img src="{{ firm.logo_url }}" alt="{{ firm.name | escape }}">
{% else %}
<span>{{ firm.name | escape }}</span>
{% endif %}
The office details are set in Firm settings → General, so they stay the same whichever theme is live. Leave out any that are empty:
{% if firm.phone %}<a href="{{ firm.phone_url }}">{{ firm.phone | escape }}</a>{% endif %}
{% if firm.address %}<address>{{ firm.address_line_1 | escape }}<br>{{ firm.address_line_2 | escape }}</address>{% endif %}
<p>© {{ 'now' | date: '%Y' }} {{ firm.legal_name | escape }}</p>
Social link
| Property | Type | Description |
|---|---|---|
type |
string |
One of youtube, x, facebook, instagram, linkedin, github, or website when no type was saved. Use it to pick an icon. |
label |
string or nil |
The link text the firm entered. |
url |
string |
The profile's absolute URL. |
{% for link in firm.social_links %}
<a href="{{ link.url }}" target="_blank" rel="noopener noreferrer">
{{ link.label | default: link.type | escape }}
</a>
{% endfor %}
Powered-by badge
| Property | Type | Description |
|---|---|---|
visible |
boolean |
Whether the firm's plan shows the badge. Render it when this is true. |
text |
string |
The badge text. |
url |
string |
Where the badge links to. |
{% if firm.powered_by.visible %}
<a href="{{ firm.powered_by.url }}">{{ firm.powered_by.text | escape }}</a>
{% endif %}
settings
The theme-wide settings declared in config/settings_schema.json, by setting id, with the values the firm saved in the theme editor (or each setting's default). Section and block settings work the same way, as section.settings and block.settings.
Available: everywhere, as settings.
The value's type depends on the setting's type:
| Setting type | Value |
|---|---|
text, textarea, select, radio |
string or nil |
richtext, inline_richtext |
HTML or nil |
color |
string: a hex colour such as #0f172a |
checkbox |
boolean |
range, number |
number or nil |
url |
string or nil: a path such as /contact. Links to site pages follow route changes. |
video_url, image_picker |
string or nil: an absolute URL |
font_picker |
font or nil |
link_list |
linklist or nil |
color_scheme_group |
array of color_scheme |
color_scheme |
color_scheme: a deleted scheme falls back to the setting's default, then to the first scheme |
See Settings for how to declare each type.
<h1 style="font-family: {{ settings.heading_font.family }}">{{ section.settings.heading | escape }}</h1>
routes
URLs of the platform pages a theme links to. Use these instead of hard-coded paths, so your theme keeps working if a path changes. Every property is a string path.
Available: everywhere, as routes.
| Property | Description |
|---|---|
root_url |
The home page. |
contact_url |
The firm's contact page, wherever it now lives. |
privacy_policy_url |
The privacy policy. Check firm.has_privacy_policy before linking to it. |
terms_of_use_url |
The terms of use. Check firm.has_terms_of_use before linking to it. |
signin_url |
The sign-in page. It keeps the current ?redirect=, so signing in returns the visitor where they were going. |
signup_url |
The sign-in page: clients join the portal by invitation, so there is no public sign-up. Kept for older themes; it keeps the current ?redirect= too. |
forgot_password_url |
The page that sends a password reset link. |
signout_url |
Sign-out. It only accepts POST: use the customer_logout form, or a form with form_authenticity_token. |
account_url |
The customer's account settings. |
practice_areas_url |
The list of the firm's published practice areas (/practice-areas). |
blog_url |
The blog's latest articles (/blog). |
intake_url |
The intake form (/intake), or nil while the firm hasn't turned it on. Hide your link to it when it's nil. |
<a href="{{ routes.contact_url }}">Contact us</a>
customer
The signed-in client, or nil for visitors who aren't signed in.
Available: everywhere, as customer.
| Property | Type | Description |
|---|---|---|
id |
string |
The customer's unique ID. |
first_name |
string or nil |
First name. |
last_name |
string or nil |
Last name. |
name |
string |
Full name. |
email |
string |
Email address. |
avatar_url |
string or nil |
Absolute URL of the profile picture. |
{% if customer %}
<a href="{{ routes.account_url }}">My account</a>
{% form 'customer_logout' %}<button type="submit">Sign out</button>{% endform %}
{% else %}
<a href="{{ routes.signin_url }}">Sign in</a>
{% endif %}
request
The current request.
Available: everywhere, as request.
| Property | Type | Description |
|---|---|---|
path |
string |
The path, starting with /, e.g. /contact. |
url |
string |
The absolute URL, without the query string. |
host |
string |
The host the visitor used. |
locale |
string |
Same as firm.locale. |
design_mode |
boolean |
true while the page is shown inside the theme editor. Use it to keep editor previews static, e.g. to stop autoplay. |
redirect |
string or nil |
Where signing in or signing up should send the visitor afterwards. It's always a path on the same site. |
flash
The success or error message from the visitor's last action, such as signing out or resetting a password, or nil.
Available: everywhere, as flash.
| Property | Type | Description |
|---|---|---|
type |
string |
success or error. |
message |
string |
The message to show. |
{% if flash %}
<p role="status" class="alert alert-{{ flash.type }}">{{ flash.message | escape }}</p>
{% endif %}
Page metadata
Available: everywhere.
| Object | Type | Description |
|---|---|---|
template |
string |
The template being rendered, e.g. index, page, page.contact, customers/login, 404. |
page_title |
string |
The title for <title>, e.g. the page name and the firm name. |
page_description |
string or nil |
The description for the meta description tag. |
canonical_url |
string |
The page's canonical absolute URL. |
content_for_header already outputs the meta description, canonical and social sharing tags, so you only need these to show them somewhere else.
<body class="template-{{ template | replace: '/', '-' | replace: '.', '-' }}">
content_for_header and content_for_layout
Available: in layouts.
| Object | Type | Description |
|---|---|---|
content_for_header |
HTML |
Required in <head>: meta tags, structured data, section styles and platform scripts. |
content_for_layout |
HTML |
Required in <body>: the template's sections. |
content_for_header also prints the page's structured data for search engines (JSON-LD): the firm as a LegalService and the WebSite on the homepage, a BlogPosting on articles, a Service on practice group pages and a BreadcrumbList on the rest. Don't add your own JSON-LD for these types, or search engines see them twice. Client portal pages (customers/* templates) are marked noindex.
<head>
{{ content_for_header }}
</head>
<body>
{% sections 'header-group' %}
<main id="main-content">{{ content_for_layout }}</main>
</body>
form_authenticity_token
Available: everywhere, as a string.
The security token a form needs when it posts to the platform. {% form %} adds it for you; use it only in a form you write by hand.
<form method="post" action="{{ routes.signout_url }}">
<input type="hidden" name="_token" value="{{ form_authenticity_token }}">
<button type="submit">Sign out</button>
</form>
linklists
The firm's menus, built under Navigation, by handle. Hyphenated handles can also be read with underscores. Every firm has main-menu and footer.
Available: everywhere. Each value is a linklist.
{% for link in linklists['main-menu'].links %}
<a href="{{ link.url }}">{{ link.title | escape }}</a>
{% endfor %}
Prefer a link_list setting, so the firm chooses which menu a section shows.
The firm can mark a link "Hide from signed-in clients" in Navigation. While a client is signed in, that link (with its child links) isn't in the menu at all, so your markup needs nothing for it.
practice_areas
The firm's published practice areas, in the firm's order. Firms write them under Firm settings → Practice areas: each is a practice group with its own page at /practice-areas/{handle}, and its areas (sub-practices) are sections of that page.
Available: everywhere, as an array of practice_area. It's empty when the firm hasn't published any.
{% for group in practice_areas %}
<a href="{{ group.url }}">{{ group.name | escape }}</a>
{% for area in group.areas %}<a href="{{ area.url }}">{{ area.name | escape }}</a>{% endfor %}
{% endfor %}
practice_area
A published practice group.
Available: as items of practice_areas, and as practice_area on the practice_area template (the group's own page).
| Property | Type | Description |
|---|---|---|
id |
string |
The group's ID. |
name |
string |
Its name, e.g. Family & Estate. |
handle |
string |
The last part of its address, e.g. family-estate. |
url |
string |
Its page, e.g. /practice-areas/family-estate. |
summary |
string or nil |
One line, for cards and menus. |
content |
HTML |
The group's text (sanitized). May be empty. |
image_url |
string or nil |
Its image, 1600×1200. |
card_image_url |
string or nil |
Its image, 1200×900, for cards. |
lead |
team_member or nil |
The person who leads it, while they're on the team page. |
areas |
array of area |
Its published areas, in order. |
seo_title, seo_description |
string or nil |
The firm's search title and description, if set. |
metafields |
metafields |
The firm's custom fields for practice groups, by key. Every firm starts with intro, highlights and representative_matters. |
area
One area (sub-practice) of a practice group, shown as a section of the group's page.
Available: as items of practice_area.areas.
| Property | Type | Description |
|---|---|---|
id |
string |
The area's ID. |
name |
string |
Its name. |
handle |
string |
Its anchor on the group's page, unique within the group. Put it on the area's element as id. |
url |
string |
The group's page with the anchor, e.g. /practice-areas/family-estate#probate. |
summary |
string or nil |
One line. |
content |
HTML |
Its text (sanitized). May be empty. |
metafields |
metafields |
The firm's custom fields for practice areas, by key. |
{% for area in practice_area.areas %}
<section id="{{ area.handle }}">
<h2>{{ area.name | escape }}</h2>
{{ area.content }}
</section>
{% endfor %}
intake_form
The firm's intake form, which prospective clients fill in to tell the firm about their matter. The firm sets it up in its admin (Intake → Intake form); each submission becomes a lead there. Draw it with {% form 'intake' %} in your intake template (Counsel's main-intake section is the reference).
| Property | Type | |
|---|---|---|
enabled |
boolean |
Whether the form is on (false without the website on the firm's plan too). /intake is a 404 while it's false. |
url |
string |
/intake. |
intro |
string or nil |
Text the firm wrote to go above the form (plain text: use escape). |
ask_phone |
boolean |
Whether to show a phone field (phone). |
ask_practice_area |
boolean |
Whether to show a practice area picker (practice_area_id). |
practice_areas |
array |
The published practice areas to pick from, each with id and name. Empty when ask_practice_area is false. |
questions |
array |
The firm's own questions, in order: key, label, type (text, textarea or select), required and options (the choices of a select). Post each answer as answers[{{ question.key }}]. |
{% form 'intake' %}
<input type="text" name="company_website" class="hidden" tabindex="-1" autocomplete="off">
<input type="text" name="name" required>
<input type="email" name="email" required>
{% for question in intake_form.questions %}
<label for="q-{{ question.key }}">{{ question.label | escape }}</label>
<input id="q-{{ question.key }}" type="text" name="answers[{{ question.key }}]" value="{{ form.values.answers[question.key] | escape }}"{% if question.required %} required{% endif %}>
{% assign field = 'answers.' | append: question.key %}
{% if form.errors[field] %}<p>{{ form.errors[field] | escape }}</p>{% endif %}
{% endfor %}
<button type="submit">Send</button>
{% endform %}
Keep the hidden company_website field: it's a spam trap, and submissions that fill it are dropped.
blog
The firm's blog. Firms write articles under Website → Blog, each optionally in one category and with any number of tags. Only live articles appear: published, with a publish date that has passed. On plans without the blog every list is empty.
Available: everywhere, as blog. On the blog template it is the page being shown: /blog (?page=2 for older articles), a category's archive at /blog/category/{handle}, or a tag's at /blog/tag/{handle}. Elsewhere it holds the blog's first page.
| Property | Type | Description |
|---|---|---|
url |
string |
/blog. |
articles |
array of article |
This page's articles, newest first, 12 per page (on an archive, only its category's or tag's). |
category |
article_category or nil |
The category on its archive. |
tag |
article_tag or nil |
The tag on its archive. |
pagination |
object | current_page, total_pages, and previous_url / next_url (nil on the first or last page). previous_url leads to newer articles. |
latest_articles |
array of article |
The 12 newest articles, on any page. |
featured_articles |
array of article |
The 12 newest featured articles. |
categories |
array of article_category |
Categories with at least one live article, by name. |
tags |
array of article_tag |
Tags on at least one live article, by name. |
{% for article in blog.articles %}
<a href="{{ article.url }}">{{ article.title | escape }}</a>
{% endfor %}
{% if blog.pagination.next_url %}<a href="{{ blog.pagination.next_url }}">Older</a>{% endif %}
article
A live blog article.
Available: as items of the blog lists, and as article on the article template (the article's page at /blog/{handle}).
| Property | Type | Description |
|---|---|---|
id |
string |
The article's ID. |
title |
string |
Its title. |
subtitle |
string or nil |
One or two sentences under the title; use it as the excerpt on cards. |
handle |
string |
The last part of its address. |
url |
string |
Its page, e.g. /blog/estate-tax-thresholds. |
content |
HTML |
Its text (sanitized). May be empty. |
image_url |
string or nil |
Its featured image, 1600×900. |
card_image_url |
string or nil |
Its featured image, 1200×900, for cards. |
featured |
boolean |
Whether the firm featured it. |
published_at |
string |
When it went live (ISO 8601); format it with local_date. |
reading_time |
number |
Minutes to read it, at least 1. |
category |
article_category or nil |
Its category. |
tags |
array of article_tag |
Its tags, by name. |
author |
team_member or nil |
Its author, while they're on the team page. |
author_name |
string or nil |
Its author's name, always (also after they've left the firm). |
seo_title, seo_description |
string or nil |
The firm's search title and description, if set. |
metafields |
metafields |
The firm's custom fields for articles, by key. |
article_category
A blog category, with its archive at /blog/category/{handle}.
Available: as article.category, items of blog.categories, and blog.category.
| Property | Type | Description |
|---|---|---|
id |
string |
The category's ID. |
name |
string |
Its name. |
handle |
string |
The last part of its address. |
url |
string |
Its archive, e.g. /blog/category/estate-planning. |
description |
string or nil |
Plain text; escape it. |
articles_count |
number |
Its live articles. |
seo_title, seo_description |
string or nil |
The firm's search title and description, if set. |
metafields |
metafields |
The firm's custom fields for article categories, by key. |
article_tag
A blog tag, with its archive at /blog/tag/{handle}.
Available: as items of article.tags and blog.tags, and blog.tag.
| Property | Type | Description |
|---|---|---|
name |
string |
The tag. |
handle |
string |
The last part of its address. |
url |
string |
Its archive, e.g. /blog/tag/tax. |
articles_count |
number |
Its live articles. |
metafields
A practice group's or area's custom fields. Firms add their own under Firm settings → Custom fields, each with a key, so your theme can show more than the standard properties without the platform knowing about it. Read one as metafields.<key>. A key the firm hasn't added, or a field left empty, gives nil ([] for a list), so check before printing and document the keys your theme reads.
Available: as practice_area.metafields, area.metafields, article.metafields and article_category.metafields.
| Field type | Value |
|---|---|
| Text, Long text | string. Escape it. |
| Rich text | HTML (sanitized): print it without escape. |
| Number | number |
| Yes / No | true, or nil when off |
| Date | string, YYYY-MM-DD |
| Link | string, an http(s) URL |
| Dropdown | string, the chosen choice's value |
| List | array of rows, each keyed by its sub-fields' keys, e.g. {label, value} |
Every firm starts with three practice group fields, which the bundled themes read:
| Key | Type | Row keys |
|---|---|---|
intro |
Long text | |
highlights |
List | label, value |
representative_matters |
List | title, result (may be nil) |
{% if practice_area.metafields.intro != blank %}
<p>{{ practice_area.metafields.intro | escape }}</p>
{% endif %}
{% for item in practice_area.metafields.highlights %}
<dt>{{ item.label | escape }}</dt><dd>{{ item.value | escape }}</dd>
{% endfor %}
team
The firm members shown on the firm's team page (switched on with On website on the Team page; each member fills in their own website profile under My account), in the firm's order. Featured people have a full profile; the others are the supporting team. People have no page of their own: link to them on your team page with #{{ person.handle }}.
Available: everywhere, as team.
| Property | Type | Description |
|---|---|---|
members |
array of team_member |
Everyone. |
featured |
array of team_member |
The featured people. |
supporting |
array of team_member |
Everyone else. |
size |
number |
How many people there are. |
team_member
One person on the team page.
Available: as items of team.members, team.featured and team.supporting, as practice_area.lead and as article.author.
| Property | Type | Description |
|---|---|---|
id |
string |
The person's user ID. |
name |
string |
Full name. |
first_name |
string |
Their first name. |
handle |
string |
Their anchor on the team page, e.g. priya-raman. |
title |
string or nil |
E.g. Partner. |
focus |
string or nil |
A few words on their work, e.g. Family law. |
bio |
HTML |
Their biography (sanitized). May be empty. |
admissions |
string or nil |
Bar admissions. |
education |
string or nil |
Degrees. |
email, phone, linkedin_url |
string or nil |
Public contact details. |
photo_url |
string or nil |
Portrait, 800×1000. |
thumb_url |
string or nil |
Square, 160×160. |
featured |
boolean |
Whether they have a full profile. |
{% for person in team.featured %}
<article id="{{ person.handle }}">
{% if person.photo_url %}<img src="{{ person.photo_url }}" alt="{{ person.name | escape }}">{% endif %}
<h3>{{ person.name | escape }}</h3>
{{ person.bio }}
</article>
{% endfor %}
page
A page of the firm's site, written under Pages.
Available: as page on every site page (the index, page and page.* templates).
| Property | Type | Description |
|---|---|---|
id |
string |
The page's ID. |
handle |
string |
Its address without the slash, e.g. family-law. |
title |
string |
The page's title. |
url |
string |
Its path, e.g. /family-law (/ for the homepage). |
template |
string |
The template it uses. |
is_homepage |
boolean |
Whether it's the homepage. |
content |
HTML |
The text the firm wrote for the page (sanitized). May be empty. |
seo_title, seo_description |
string |
The firm's search title and description, if set. |
published_at |
string |
When it was first published (ISO 8601). |
Pages don't nest: each one is at its own address, and the firm groups them into dropdowns in Navigation (see linklists).
<h1>{{ page.title | escape }}</h1>
<div class="rte">{{ page.content }}</div>
reset_password
Available: as reset_password in the customers/reset_password template.
| Property | Type | Description |
|---|---|---|
token |
string |
The reset token from the email link. Send it back in a hidden token field. |
email |
string |
The email address from the link. Send it back in a hidden email field. |
See the reset_customer_password form in the Liquid reference.
invitation
Available: as invitation in the customers/activate_account template, the page a client's invitation email opens. It's nil once the link has expired or been used: tell them to ask the firm for a new one, or to sign in.
| Property | Type | Description |
|---|---|---|
token |
string |
The invitation token. Send it back in a hidden token field. |
first_name |
string |
The invited client's first name. |
email |
string |
The email address they'll sign in with. |
{% if invitation %}
{% form 'activate_customer_password' %}
<input type="hidden" name="token" value="{{ invitation.token | escape }}">
…
{% endform %}
{% else %}
<a href="{{ routes.signin_url }}">Sign in</a>
{% endif %}
See the activate_customer_password form in the Liquid reference.
section
The section being rendered.
Available: as section inside a section file (sections/*.liquid).
| Property | Type | Description |
|---|---|---|
id |
string |
The section's unique ID on the page. |
type |
string |
The section file's name, e.g. hero for sections/hero.liquid. |
index |
number |
The section's position on the page, starting at 1. Use it to load only the first images eagerly. |
settings |
Settings | The section's settings by id, typed like settings. |
blocks |
array of block |
The section's blocks, in order. |
<img src="{{ section.settings.image }}" alt=""
loading="{% if section.index == 1 %}eager{% else %}lazy{% endif %}">
block
One block of a section.
Available: as each item of section.blocks.
| Property | Type | Description |
|---|---|---|
id |
string |
The block's unique ID. |
type |
string |
The block type, as declared in the section's schema. |
settings |
Settings | The block's settings by id, typed like settings. |
theme_attributes |
HTML |
The block's animation (data-animate="…", when the firm picked one) and, in the theme editor, the attributes that let the editor select the block. Output them on the block's outermost element. |
shopify_attributes |
HTML |
Same as theme_attributes, so markup written for Shopify keeps working. |
{% for block in section.blocks %}
{% case block.type %}
{% when 'heading' %}
<h2 {{ block.theme_attributes }}>{{ block.settings.text | escape }}</h2>
{% when 'button' %}
<a href="{{ block.settings.link }}" {{ block.theme_attributes }}>{{ block.settings.label | escape }}</a>
{% endcase %}
{% endfor %}
form
The state of the form being rendered.
Available: as form inside {% form %}…{% endform %}. See Forms for each form type and its fields.
| Property | Type | Description |
|---|---|---|
type |
string |
The form type, e.g. contact. |
posted_successfully |
boolean |
Whether this form was just submitted successfully. |
errors |
Object | The first error message for each field, by field name, after a failed submission. Empty otherwise. |
values |
Object | What was entered, by field name, after a failed submission, so you can fill the fields again. Passwords are never included. |
{% form 'contact' %}
<input type="email" name="email" value="{{ form.values.email | escape }}">
{% if form.errors.email %}<p class="error">{{ form.errors.email | escape }}</p>{% endif %}
{% endform %}
linklist
A menu.
Available: as values of linklists, and as the value of a link_list setting. Output on its own, a linklist prints its handle.
| Property | Type | Description |
|---|---|---|
handle |
string |
The menu's handle, e.g. main-menu. |
title |
string |
The menu's name. |
links |
array of link |
The top-level links. |
levels |
number |
0 for an empty menu, 1 for a flat one, 2 when a link has child links. |
link
One link of a menu. Links to draft or deleted pages, and to practice groups or areas that aren't public, are left out.
Available: as items of linklist.links and link.links.
| Property | Type | Description |
|---|---|---|
title |
string |
The link text. |
url |
string |
Where the link goes. |
type |
string |
What the link points at: home_link, page_link, auth_link (sign in / sign up), practice_areas_link (all practice areas), practice_area_link (a practice group), area_link (an area on its group's page), blog_link (the blog), article_category_link (a blog category), article_link (an article) or http_link (a custom URL). For example, open a mega menu of practice_areas for a practice_areas_link. |
active |
boolean |
Whether the link points at the current page. |
child_active |
boolean |
Whether one of its child links points at the current page. |
current |
boolean |
active or child_active. |
links |
array of link |
Child links. |
levels |
number |
0 without child links, 1 with them. |
{% for link in section.settings.menu.links %}
<a href="{{ link.url }}" {% if link.current %}aria-current="page"{% endif %}>{{ link.title | escape }}</a>
{% if link.links.size > 0 %}
<ul>
{% for child in link.links %}
<li><a href="{{ child.url }}">{{ child.title | escape }}</a></li>
{% endfor %}
</ul>
{% endif %}
{% endfor %}
font
A font chosen with a font_picker setting. Output on its own, a font prints its CSS font-family stack.
Available: as the value of a font_picker setting.
| Property | Type | Description |
|---|---|---|
key |
string |
The font's identifier, as stored in the setting. |
label |
string |
The font's display name. |
family |
string |
The CSS font-family stack, with fallbacks. |
stylesheet_url |
string or nil |
The stylesheet that loads the font, or nil for system fonts. Prefer the font_face filter. |
{{ settings.body_font | font_face }}
<style>
body { font-family: {{ settings.body_font.family }}; }
</style>
color_scheme
One colour scheme: a named set of colours. Output on its own, a colour scheme prints its ID.
Available: as items of a color_scheme_group setting, and as the value of a color_scheme setting.
| Property | Type | Description |
|---|---|---|
id |
string |
The scheme's ID, e.g. scheme-1. |
settings |
Object | The scheme's colours, by the IDs in the group's definition. Each is a hex colour string. |
<section class="color-{{ section.settings.color_scheme }}">
…
</section>
The platform already outputs a .color-<id> class for each scheme, setting the scheme's colours as --theme-* CSS variables. See Settings.
Still need help?
Send a request to the Mattersimple team and we'll reply by email.