{# The shell every page is wrapped in. Rendered by sw.js, not by the build, so editing this file changes every page without regenerating any of them. Context: title, content (safe HTML fragment), mark (bookmark or null). Bootstrap is the whole stylesheet. The fragments carry semantic USFM classes and no Bootstrap ones, so the body text is styled by Reboot; the chrome here is what uses the framework. #} {% block title %}{{ title | safe }}{% endblock %} {# Vendored rather than linked from a CDN: sw.js only caches same-origin responses, so a CDN stylesheet would leave the app unstyled offline. #} {# History entries are whole books, and htmx keeps its history cache in localStorage -- a couple of them would blow the quota. Turned off: going back re-requests the fragment, which the worker answers from its cache. #} {# The bundle carries Popper, which the navbar collapse and the modal do not need -- but a dropdown or tooltip added later would, and this is one file in the precache either way. Deferred scripts run in order, so `bootstrap` is defined by the time app.js runs. #} {# htmx is not deferred: hx-boost has to be in place before the first click. #} {# Boosted links swap only the fragment, so the navbar, the modal and the scripts above survive navigation and never reload. #} {# col-xl-8 keeps a line of verse near a readable measure instead of running the full width of a desktop window. #}
{% block content %}{% endblock %}
{# Chrome, so it is written once here instead of built in JavaScript on every page. app.js only fills in the reference and shows it. #}