{# The two figures on the Architecture page — one set of coordinates, both languages. Same contract as `_diagram.html`: every word arrives as a parameter, so the Chinese page does not fork the geometry. The difference is where the words come from. `_diagram.html` reads `t.diagram`, which is site chrome carried in `build.py`; these are page copy, so the page that shows a figure passes its own labels, the way `introduction.html` holds its own prose. No classes anywhere. Colour and size are SVG presentation attributes, and `data-accent` marks what the surrounding prose is pointing at — the same hook `brand.css` already styles for the request figure. `role="img"` is what picks up the frame in `brand.css`, GAP 2. #} {# Four boxes on the left, four on the right, four arrows between them: the whole surface an app touches. The rows are paired on purpose — each contact point is one row, so "four places" is something the reader counts rather than something the caption asserts. #} {% macro boundary(t) %} {{ t.app }} routers/*.py {{ t.routers }} page.html {{ t.page }} _board.html {{ t.partial }} brand.css {{ t.brand }} import extends {% raw %}{% from %}{% endraw %} {{ t.override }} FJKIT fjkit.Templates page() · stream() ui/shell.html {{ t.shell }} ui/layout · data · form · table {{ t.vocab }} dist/fjkit-<pack>.css {{ t.css }} {% endmacro %} {# Two ways in, one template, two ways out. The accented box is the whole point of the picture: a full GET and an htmx swap meet at one file, so the page and the fragment it swaps cannot describe different things. `@render(..., partial=...)` is what guarantees it. #} {% macro render_path(t) %} GET /tasks tasks_page() POST /tasks create_task() · hx-post tasks/_board.html {{ t.only }} {{ t.only_2 }} {{ t.document }} {{ t.document_2 }} {{ t.fragment }} {{ t.fragment_2 }} {% endmacro %}