{# Polices servies par le site : voir public/fonts/salam.css. Les quatre fontes du premier écran sont préchargées pour qu'elles ne dépendent pas de cette feuille — sans quoi rien ne démarre avant son arrivée. #} {# defer : le moteur bloquait l'analyse du document pendant 349 ms. Il démarre de lui-même dès que le DOM est prêt (support.js, __dcBoot). #} {# Le badge reCAPTCHA flotte en bas à droite de toutes les pages qui chargent le service. Google autorise à le masquer à condition d'afficher la mention et les deux liens sur le formulaire — c'est fait sur les trois pages concernées. #} {# React et ReactDOM sont servis par le site. support.js consulte cette table avant d'aller les chercher sur unpkg.com : un nom de domaine de moins a resoudre sur le chemin critique. Elle doit etre lue avant lui, d'ou ce script en clair. #} {# Les surcharges de page repassent par SeoService : sans cela, og:title et og:description restaient figés sur les valeurs globales du site. #} {%- set meta = seo_meta(page_seo|default({})) %} {{ meta.title }} {%- if gsc_verification %}{% endif %} {#- Données structurées communes à toutes les pages publiques. Organization + LocalBusiness partout ; Service sur les pages de service ; BreadcrumbList sur les pages internes ; Person sur le blog (l'accueil l'émet déjà via son propre bloc json_ld). #} {%- set route = app.request.attributes.get('_route') %} {{ json_ld(jsonld_organization()) }} {{ json_ld(jsonld_local_business()) }} {%- if service is defined %} {{ json_ld(jsonld_service(service.title, service.citable, salam_url ~ service.path)) }} {%- endif %} {%- if route in ['blog', 'blog_article'] %} {{ json_ld(jsonld_person()) }} {%- endif %} {%- set crumbs = [{ name: 'Accueil', url: salam_url ~ '/' }] %} {%- if service is defined %}{% set crumbs = crumbs|merge([{ name: 'Services' }]) %}{% endif %} {%- if route == 'blog_article' %}{% set crumbs = crumbs|merge([{ name: 'Blog', url: salam_url ~ '/blog/' }]) %}{% endif %} {%- if route == 'realisation_show' %}{% set crumbs = crumbs|merge([{ name: 'Réalisations', url: salam_url ~ '/nos-realisations/' }]) %}{% endif %} {%- if app.request.pathInfo != '/' %} {%- set crumbs = crumbs|merge([{ name: service is defined ? service.h1 : page_seo.title|default(meta.title), url: meta.canonical }]) %} {%- endif %} {{ json_ld(jsonld_breadcrumb(crumbs)) }} {% block json_ld %}{% endblock %} {%- if gtm_id or ga_id %} {%- endif %} {%- if gtm_id %} {%- endif %} {%- if ga_id %} {%- endif %} {# reCAPTCHA n'est PAS chargé ici : il coûtait 1,1 Mo sur chaque page, accueil compris, pour un service dont seules trois pages ont besoin. Les pages porteuses d'un formulaire l'incluent elles-mêmes : devis.html.twig, ctic.html.twig et service/seo.html.twig. #} {% include 'components/header-scroll.html.twig' %} {%- if gtm_id %}{% endif %} {% block dc %}{% endblock %} {% include 'components/chatbot-widget.html.twig' %} {% include 'components/cookie-banner.html.twig' %} {# Les liens vers une page décochée dans le back-office restent visibles : le visiteur qui clique tombe sur la page « introuvable », ce qui est voulu. Pour les masquer à nouveau, réinclure ici components/hide-inactive-links.html.twig, qui fait ce travail. #} {{ encore_entry_script_tags('app') }}