{# demoflow-page.module — the whole demo-flow / run-sheet page as one bespoke module. Design target: the editorial reference (2026-07-14): eyebrow system, full-bleed bands, hairline path rows, initial avatars, 3-box architecture, dark discovery band. #} {% set b = module.brand %} {% set st = module.styles %} {% set L = module.labels %} {% set run = module.mode == "run" %} {# Colours: follow the THEME tokens by default; explicit style-tab colours when opted out. (The explicit colour doubles as the token fallback.) #} {% if st.use_theme_colors %} {% set primary = "var(--color-primary, " ~ st.primary.color ~ ")" %} {% set accent = "var(--color-accent, " ~ st.accent.color ~ ")" %} {% else %} {% set primary = st.primary.color %} {% set accent = st.accent.color %} {% endif %} {# Logo: explicit style-tab logo first; then brand kit — a LIGHT top bar prefers the full-colour primaryLogo, a dark one the white/knockout variant. #} {% set light_top = st.topbar == "light" %} {% if light_top %} {% set logo_src = st.logo.src or brand_settings.primaryLogo.src or brand_settings.logo.src %} {% else %} {% set logo_src = st.logo.src or brand_settings.logo.src or brand_settings.primaryLogo.src %} {% endif %}
{% if logo_src %}{{ b.brand_name }} logo{% else %}{{ b.brand_name }}{% endif %} {{ module.header.page_label }}
{% if module.header.chips %}
{% for c in module.header.chips|split(",") %}{{ c|trim }}{% endfor %}
{% endif %} {# Buttons repeater (logo bar). Falls back to the legacy single CTA for pages saved before `buttons` existed. Kept in sync with the business-case module. #} {% if module.header.buttons %}
{% for btn in module.header.buttons %}{% if btn.text %}{{ btn.text }}{% endif %}{% endfor %}
{% elif module.header.cta_label %}{{ module.header.cta_label }}{% endif %}
{% if module.hero.bg.src %}
{% endif %}
{% if module.hero.eyebrow %}

{{ module.hero.eyebrow }}

{% endif %}

{{ module.hero.title }}

{{ module.hero.intro }}
{% if module.hero.cta1_label %}{{ module.hero.cta1_label }}{% endif %} {% if module.hero.cta2_label %}{{ module.hero.cta2_label }}{% endif %}
{% if run and module.hero.side_title and module.hero.side_items %} {% endif %}
{# Every section below is one accordion field group whose `show` boolean gates it (default on). The `!= false` test keeps a section visible on pages saved before its `show` existed (undefined reads as "on"), so the restructure is backward-safe. Each section ALSO keeps its own emptiness guard, so a shown-but-empty section still renders nothing. #} {# Context strip = thread card + show/skip, one toggle for both (module.contextstrip.show). #} {% set show_context = module.contextstrip.show != false %} {% set has_thread = show_context and module.contextstrip.tl_text %} {% if has_thread %}
{{ module.contextstrip.tl_title }}

{{ module.contextstrip.tl_text }}

{% endif %} {% if show_context and (module.contextstrip.show_text or module.contextstrip.skip_text) %}
{% if module.contextstrip.show_text %}
{{ L.show_label }}

{{ module.contextstrip.show_text }}

{% endif %} {% if module.contextstrip.skip_text %}
{{ L.skip_label }}

{{ module.contextstrip.skip_text }}

{% endif %}
{% endif %} {% if not run and module.stats.show != false and module.stats.items %}
{% for s in module.stats.items %}
{{ s.stat_value }}{{ s.stat_label }}
{% endfor %}
{% endif %} {% if module.discovery.show != false and module.discovery.rows %}

{{ module.discovery.eyebrow }}

{{ module.discovery.title }}

{% if module.discovery.intro %}

{{ module.discovery.intro }}

{% endif %}
{% for r in module.discovery.rows %}
{{ r.row_label }}
{{ r.text }}
{% endfor %}
{% endif %} {% if module.acts.show != false and module.acts.items %}

{{ module.acts.eyebrow }}

{% if module.acts.title %}

{{ module.acts.title }}

{% endif %}
{% for a in module.acts.items %}
{% if a.tag %}{{ a.tag }}{% endif %}

{{ a.title }}

{{ a.text }}

{% endfor %}
{% endif %} {% if module.people.show != false and module.people.cards %}

{{ module.people.eyebrow }}

{{ module.people.title }}

{% for p in module.people.cards %} {% set parts = p.person_name|split(" ") %}
{{ parts[0][:1] }}{% if parts|length > 1 %}{{ parts[parts|length - 1][:1] }}{% endif %} {{ p.person_name }}

{{ p.line }}

{% if p.tag %}{{ p.tag }}{% endif %}
{% endfor %}
{% endif %} {% if module.runofshow.show != false and module.runofshow.items %} {# "Show assets and links" toggle (default on). When off, the link column isn't rendered AND df-steps--nolinks drops its grid track, so the step body reclaims the full width. PRESENTER OVERRIDE: any URL query string containing "present" forces the links back on regardless of the toggle (?presenter, ?present=1, ?mode=presenter) — a rep presenting reveals the deep links without editing the module. We test the RAW query string, not query_dict, because HubSpot drops valueless params from query_dict (bare ?presenter wouldn't register), whereas request.query keeps them. Server-side, no JS. #} {% set presenter = "present" in ("" ~ request.query)|lower %} {% set show_links = presenter or module.runofshow.show_links != false %}

{{ module.runofshow.eyebrow }}

{{ module.runofshow.title }}

{% if run %}
{{ L.progress_template|replace('{done}', '0')|replace('{total}', module.runofshow.items|length) }}
{% endif %}
{% endif %} {% if run and module.checklist.show != false and module.checklist.items %}

Build status

Checklist

{% endif %} {# Architecture / proposed solution. arch.mode drives what shows: outcomes = CEO consolidation statements only | diagram = the image only (rep drop-in) both = outcomes then the diagram. Legacy default (no mode) reads as "both". Each half also self-hides when its data is empty. #} {% set arch_mode = module.arch.mode or "both" %} {% set show_outcomes = arch_mode != "diagram" and module.arch.outcomes %} {% set show_diagram = arch_mode != "outcomes" and module.arch.diagram.src %} {% if module.arch.show != false and (show_outcomes or show_diagram) %}

{{ module.arch.eyebrow }}

{% if module.arch.title %}

{{ module.arch.title }}

{% endif %} {% if show_outcomes %} {% if module.arch.caption %}

{{ module.arch.caption }}

{% endif %} {% endif %} {% if show_diagram %}
{{ module.arch.diagram_alt or module.arch.diagram.alt }} {% if module.arch.diagram_caption %}
{{ module.arch.diagram_caption }}
{% endif %}
{% endif %}
{% endif %} {% if module.scorecard.show != false and (module.scorecard.fit_chips or module.scorecard.notfit_chips) %}
{% if module.scorecard.fit_chips %}

{{ module.scorecard.fit_title }}

{% for c in module.scorecard.fit_chips|split(",") %}{{ c|trim }}{% endfor %}
{% endif %} {% if module.scorecard.notfit_chips %}

{{ module.scorecard.notfit_title }}

{% for c in module.scorecard.notfit_chips|split(",") %}{{ c|trim }}{% endfor %}
{% endif %}
{% endif %} {% if run and module.guard.show != false and (module.guard.leftout_items or module.guard.nextbuild_items) %}
{% if module.guard.leftout_items %}

{{ module.guard.leftout_title }}

    {% for i in module.guard.leftout_items|split(";") %}
  • {{ i|trim }}
  • {% endfor %}
{% endif %} {% if module.guard.nextbuild_items %}

{{ module.guard.nextbuild_title }}

    {% for i in module.guard.nextbuild_items|split(";") %}
  • {{ i|trim }}
  • {% endfor %}
{% endif %}
{% endif %} {% if module.nextsteps.show != false and module.nextsteps.items %}

{{ module.nextsteps.eyebrow }}

{{ module.nextsteps.title }}

    {% for n in module.nextsteps.items %}
  1. {% if n.date %}{{ n.date }}{% endif %}

    {{ n.title }}

    {% if n.text %}

    {{ n.text }}

    {% endif %}
  2. {% endfor %}
{% endif %} {% if module.resources.show != false and module.resources.items %}

{{ module.resources.eyebrow }}

{{ module.resources.title }}

{% endif %} {% if run and module.questions.show != false and module.questions.items %}

{{ module.questions.eyebrow }}

{{ module.questions.title }}

    {% for q in module.questions.items %}
  1. {{ loop.index }}

    {{ q.text }}

  2. {% endfor %}
{% endif %} {% if module.closing.show != false and module.closing.title %}

{{ module.closing.eyebrow }}

{{ module.closing.title }}

{% if module.closing.text %}

{{ module.closing.text }}

{% endif %}
{% if module.closing.quote %}
“{{ module.closing.quote }}”
{% endif %}
{% endif %}