diff --git a/src/_includes/layouts/use-case.njk b/src/_includes/layouts/use-case.njk index d3a0372a73..edcb7c0171 100644 --- a/src/_includes/layouts/use-case.njk +++ b/src/_includes/layouts/use-case.njk @@ -9,10 +9,33 @@ sitemapPriority: 0.7 problem hero sub-headline (the pain in one line) customerPain { heading, intro[], cards[ {icon,title,detail} ] } outcomeFirst { heading, intro, dimensions[ {label,title,detail} ] } + howItWorks { heading, intro, designPattern{}, diagram{}, pieces[], architecture, docsCta{} } whyItMatters { heading, intro, points[ {title,detail} ] } competition { heading, intro, traps[ {label,title,detail} ] } comparison { without[ {title,detail} ], with[ {title,detail} ] } + howItWorks answers "how does FlowFuse build this", which the pain, outcome + and comparison blocks deliberately do not. It is the bridge from the + marketing narrative into the product docs, so keep it high level here and + push every detail into a docs link. + + designPattern { kind, name, detail, docsUrl } + kind is the pattern family, e.g. "Hardware pattern" or + "Software pattern". name is the specific pattern chosen + for this use case. + diagram { src, alt, caption, width, height, placeholder } + End-to-end architecture drawing. src may be a placeholder + while the real diagram is commissioned; set + diagram.placeholder to true to render the placeholder + treatment and keep it visibly unfinished. width/height + default to 1200x630 and only exist to reserve the box, so + override them when the real asset is a different shape. + pieces [ {icon, title, detail, docsUrl} ] + The problem broken into the individual components that get + built. Order them the way you would build them. + architecture slug of a /use-cases/ architecture page this sits on + docsCta { label, url } + Legacy fall-back front-matter (simple skeleton, still supported): gap[], workflow[], outcomes[] @@ -23,11 +46,17 @@ sitemapPriority: 0.7 {% set nav = [] %} {% if customerPain %}{% set nav = nav.concat([{ id: "customer-pain", label: "Customer Pain" }]) %}{% endif %} {% if outcomeFirst %}{% set nav = nav.concat([{ id: "outcome-first", label: "Outcome First" }]) %}{% endif %} +{% if howItWorks %}{% set nav = nav.concat([{ id: "how-it-works", label: "How It Works" }]) %}{% endif %} {% if whyItMatters %}{% set nav = nav.concat([{ id: "why-it-matters", label: "Why It Matters" }]) %}{% endif %} {% if competition %}{% set nav = nav.concat([{ id: "competition", label: "Why Off-the-Shelf Fails" }]) %}{% endif %} {% if comparison %}{% set nav = nav.concat([{ id: "with-without", label: "With / Without FlowFuse" }]) %}{% endif %} {% if aiBuildLayer %}{% set nav = nav.concat([{ id: "ai-build-layer", label: "Build It With AI" }]) %}{% endif %} +{# --- section eyebrow numbers, derived from nav so they cannot drift --- + Pages omit blocks freely, so a hardcoded "03" desyncs from the nav as soon + as an earlier block is missing. Look the number up instead. #} +{% macro secNum(id) %}{%- for item in nav -%}{%- if item.id == id -%}{%- if loop.index < 10 -%}0{%- endif -%}{{ loop.index }}{%- endif -%}{%- endfor -%}{% endmacro %} +
01 · Customer pain
+{{ secNum("customer-pain") }} · Customer pain
02 · Outcome first
+{{ secNum("outcome-first") }} · Outcome first
{{ outcomeFirst.intro }}
{{ secNum("how-it-works") }} · How it works
+{{ howItWorks.intro }}
+ {% endif %} + + {% if howItWorks.designPattern %} +{{ howItWorks.designPattern.detail }}
+ {% if howItWorks.designPattern.docsUrl %} + + Read the pattern in the docs + {% include "components/icons/arrow-right.svg" %} + + {% endif %} +{{ piece.detail }}
+ {% if piece.docsUrl %} + + Docs + {% include "components/icons/arrow-right.svg" %} + + {% endif %} +03 · Why this is important
+{{ secNum("why-it-matters") }} · Why this is important
{{ whyItMatters.intro }}
04 · Why off-the-shelf doesn't work
+{{ secNum("competition") }} · Why off-the-shelf doesn't work
{{ competition.intro }}
05 · With / without FlowFuse
+{{ secNum("with-without") }} · With / without FlowFuse
06 · Build it with AI
+{{ secNum("ai-build-layer") }} · Build it with AI
{{ aiBuildLayer.intro }}