{# TEXT BLOCK — Simple narrative prose. Context: align — Optional alignment for this component's copy; empty means inherit the container's, by ordinary CSS inheritance (#127) subtitle — Optional sub-heading rendered above the prose text_content — Paragraph HTML or plain text figure_html — A rendered ImageBlock to place with the prose; empty for none figure_wrap — "left" or "right" to float it, on paper only; empty otherwise figure_width — Its display width, which a float needs aside_html — A rendered Aside, a callout (#343); empty for none aside_side — "left" or "right" to float it, on paper only; empty otherwise aside_width — Its width: a third of the column on paper measure_px — The longest line in px where the cell is wider than the measure (#358), else empty, so a column that fits gains no byte measure_place — How a capped block sits: centre or right by its alignment #} {% from "common/notes.html" import marked with context %} {% if subtitle %}

{{ subtitle | escape_html }}

{% endif %} {# A figure the prose wraps round (#189). It precedes the prose so a float shortens the prose's lines; on paper it floats to its wrap side, and in an email it simply sits above, placed by its own align. #} {% if figure_html %}
{{ figure_html }}
{% endif %} {# An aside (#343) is the second float a text block hosts, on the figure's terms: beside the prose on paper, a callout above it in an email. #} {% if aside_html %}
{{ aside_html }}
{% endif %} {# A DIV, not a p, and that is the fix for #130. This element carries the component's own font, size, colour, leading and alignment, and the field inside it is raw HTML whose documented shape is the caller's own paragraph tags. A p cannot contain a p: the parser auto-closes this one the moment the caller's opens, the copy becomes its SIBLING, and it inherits from the containing cell instead — which is the label typeface, not the body one. A div may legally contain paragraphs, so the styling element becomes a real ancestor. `Card.body` and `Footer.disclaimer` were already divs; this brings the last three raw-HTML surfaces into line with them. #}
{{ marked(text_parts, true) | prose }}