Demo Brand Demo Brand

Variables & inheritance

{{var.name}} resolves through the scope chain — highest priority first: site_page → site → global. The variable scope_demo is seeded at all three levels with visibly different values, and this page carries the site_page override, so you can watch the chain pick per level. All layers resolve at Tier 1 (publish).

The scope chain, live

SourceTier 1 · resolves at publish
<p><strong>{{var.scope_demo}}</strong></p>
Rendered

PAGE value (site_page scope, /variables only)

On this page the site_page row wins over both the site and global rows. Everywhere else on the site — check the home page's sanity strip — the same tag renders the SITE value, which in turn beats the global one.

SourceTier 1 · resolves at publish
<p><strong>{{global.scope_demo}}</strong></p>
Rendered

GLOBAL value (created in Globals)

{{global.name}} pins the lookup to global scope, ignoring the site and page rows entirely.

SourceTier 1 · resolves at publish
<p>Support line: <strong>{{var.phone_number}}</strong></p>
Rendered

Support line:

Fall-through: phone_number has no site or page row, so {{var.…}} walks the chain down to the global value. Globals must be created manually in the admin; site rows are auto-seeded on push.

Inline value= seeds

SourceTier 1 · resolves at publish
<p><strong>{{var.seeded_demo value="Seeded from source" type="text"}}</strong></p>
Rendered

Seeded from source

The attributes are a build-time seeding hint: on first push they create the SITE row (seed-on-create only — an AM-edited row is never overwritten, first value= wins on conflict). The engine strips them, so the tag renders the resolved value exactly like a bare tag and delivered HTML never contains value=. Verify: view this page's source — no value= anywhere.

Component precedence — inline arg → panel row → schema default

{{self.name}} (a component's own variable, valid only inside its body) resolves through its own chain. Watch the kicker line change across three renders of the same component:

SourceTier 1 · resolves at publish
{{component.demo-cta}}
Rendered

Limited time

Claim offer

No credit card required.

No instance, no args → kicker falls through to the schema default: "Limited time".

SourceTier 1 · resolves at publish
{{component.demo-cta instance="top"}}
Rendered

Panel value (instance "top")

Get instant access

30-day money back guarantee.

The "top" instance has a panel row for kicker — it beats the schema default.

SourceTier 1 · resolves at publish
{{component.demo-cta instance="top" kicker="Inline arg wins"}}
Rendered

Inline arg wins

Get instant access

30-day money back guarantee.

An inline arg is the top of the chain — it beats the "top" panel row and the default.

Variables inside variables

A variable's value may itself contain {{var.*}} / {{global.*}} references — they resolve recursively at Tier 1 (cycle-guarded, depth-capped at ~10). That is also why an SCV row or a component schema default may carry a page-context expression like {{form name="demo-lead"}} — see the form card on the tags page.