{# Page title and meta #} {{ title }} {% if description %} {% endif %} {# Favicon — module-specific, fallback to default #} {# Public page CSS — wrapper layout only (content CSS comes from DB) #} {# Page-specific CSS — from Page.css (source of truth in DB), served as /static/pages/.css?v=. This single file already contains EVERYTHING the page needs: content.css (theme variables + shared atoms) + used blocks/*.css (hero, cta, features, flex-shell, ...) + used fx/*.css (ocean-swell-shore, vinyl-grooves, ...) + custom page CSS (from GrapesJS Style Manager) Assembled at save time by word/css_builder.py and frozen in Page.css. The public page does NOT load any CSS from the editor/ directory directly — so updating an effect or block in a future version of the constructor cannot change an already-published page. page_css_url is built by the route handler via ensure_css_file() — includes ?v= for cache-busting. None for pages without any CSS. #} {% if page_css_url %} {% endif %} {# .core-engine-lib-word-blocks is the single scope wrapper for the whole page content — all content classes (.btn, .hero, .card, ...) are defined under this class. The same class is added to the iframe inside the editor (see GrapesLoader._applyScopeClass), so styles work identically in the editor and on the public page. #}
{# Header — title + date (optional) #} {% if title %}
{% if logo %} {% endif %}

{{ title }}

{% if datetime %} {% endif %}
{% endif %} {# Content — HTML only (no