{# The shell diagram — one SVG, both languages. Same contract as `_diagram.html`: the geometry lives here once, and every word that is prose comes from `t.shell`, which `build.py` carries per language. Block names, tag names and file names stay literal — they are code, and code is not translated. Everything sits inside one `data-lit="true"` group, which is what lets `data-accent` reach `--primary` in brand.css. Accent marks the slots an app fills; the rest is what the shell owns. No classes anywhere in it. #} ui/shell.html — {{ t.shell.file }} {# ------------------------------------------------------------- head #} <head> <title>{% raw %}{% block title %}{% endraw %} · {% raw %}{% block site_title %}{% endraw %} {{ t.shell.theme }} dist/fjkit-<style>.css · vendor/htmx · vendor/basecoat · js/errors.js {% raw %}{% block stylesheets %}{% endraw %} {% raw %}{% block head %}{% endraw %} — {{ t.shell.head_note }} {# ------------------------------------------------------------- body #} <body> {# the aside, which comes first in the body and is empty unless filled #} {% raw %}{% block sidebar %}{% endraw %} {{ t.shell.sidebar_1 }} {{ t.shell.sidebar_2 }} {{ t.shell.sidebar_3 }} {# the wrapper: header, main, footer #} <div> — {{ t.shell.wrapper }} <header> {% raw %}{% block brand %}{% endraw %} {% raw %}{% block nav %}{% endraw %} {% raw %}{% block header_actions %}{% endraw %} <main> — {% raw %}{% block content %}{% endraw %} {{ t.shell.content_note }} <footer> — {% raw %}{% block footer %}{% endraw %} {# the toaster, which is why a swap can raise a message #} {% raw %}{% block toasts %}{% endraw %} — {{ t.shell.toast_note }}