{{ title }}
{% if description %}
{% endif %}
{# Favicon — per-nav #}
{# 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.
#}
{# Content — HTML only (no