@media print {
    /* Sans @page explicite, le navigateur applique ses propres marges de reference
       (souvent ~12-19mm par cote autour de la taille de papier par defaut) — .page-sheet
       fait exactement 794x1123px (210x297mm, A4 SANS marge, voir --page-width/
       --page-height dans tokens.css), donc ce surplus de marge navigateur le faisait
       deborder sur une deuxieme feuille physique par page logique, chacune ajoutant une
       page quasi vide au resultat final. C'etait la cause principale des "beaucoup de
       pages vides" a l'impression directe. */
    @page {
        size: A4;
        margin: 0;
    }

    .no-print {
        display: none !important;
    }

    /* Force l'impression des couleurs de fond/bordures independamment de la case
       "Graphiques d'arriere-plan" du dialogue d'impression du navigateur — aucune API web
       ne permet de cocher cette case a la place de l'utilisateur, mais cette propriete
       obtient le meme resultat visuel (couleurs preservees) quel que soit son etat. Sans
       ca, un utilisateur qui ne l'a jamais cochee (comportement par defaut sur beaucoup de
       navigateurs) perd silencieusement toutes les couleurs de fond a l'impression :
       pastilles de question, encadre "Situation", bandeau "Coup de pouce", etc. `*`
       plutot qu'un selecteur cible : n'importe quel element pourrait porter une couleur de
       fond (couleur choisie par le prof sur un bloc coup de pouce, icone, etc.). */
    * {
        print-color-adjust: exact !important;
        -webkit-print-color-adjust: exact !important;
    }

    body {
        background: white;
    }

    /* Le sidebar/topbar/formatbar sont bien caches (.no-print ci-dessus), mais
       .editor-workspace reservait quand meme leur espace (margin-left pour la sidebar
       fixe, padding genereux, min-height pleine hauteur d'ecran) — sans reset, cet
       espace persistait a l'impression et decalait/elargissait chaque page au-dela de sa
       taille reelle, contribuant lui aussi aux pages vides en trop. Le gap visuel entre
       pages (confort de defilement a l'ecran) n'a de sens qu'a l'ecran : chaque page
       porte deja son propre saut de page ci-dessous, un gap supplementaire ne ferait que
       decaler le contenu au sein de la feuille imprimee. */
    .editor-workspace {
        display: block !important;
        margin: 0 !important;
        padding: 0 !important;
        min-height: 0 !important;
    }

    .editor-pages,
    .page-wrap {
        gap: 0 !important;
    }

    .page,
    .page-sheet {
        box-shadow: none !important;
        border: none !important;
        margin: 0 !important;
        page-break-after: always;
    }

    /* Sans ca, MEME la derniere page logique force un saut de page — une feuille
       entierement vide a la toute fin de chaque impression. :last-of-type (pas
       :last-child) est essentiel : le bouton "Nouvelle page" (voir canvas.js:createPage,
       toujours re-deplace en toute derniere position dans #pages) est le veritable
       dernier enfant du conteneur — :last-child ne matcherait donc JAMAIS une
       .page-wrap. :last-of-type fonctionne car .page-wrap est un <div> et le bouton un
       <button>, deux types d'element distincts parmi les enfants de #pages. */
    .page-wrap:last-of-type .page-sheet {
        page-break-after: auto;
    }

    .no-page-break {
        page-break-inside: avoid;
    }

    .block {
        border-color: transparent !important;
        box-shadow: none !important;
    }

    .block__resize-handle,
    .block__move-handle,
    .block__rotate-handle,
    .block-reponse__tools,
    .block-table__tools,
    .block-table__col-handle,
    .block-table__row-handle,
    .block-table__row-handle-visual,
    .block-question__compile,
    /* Bouton "x" retirer une sous-question (voir question.js/CLAUDE.md "Bloc question")
       — meme categorie que .block-table__col-handle juste au-dessus : un controle
       d'edition inline, imbrique dans le contenu reel du bloc plutot qu'une barre
       d'outils flottante, mais qui n'a pas plus sa place sur une impression directe
       (Ctrl+P) que les autres. */
    .block-question__sous-remove,
    /* Meme categorie que .block-question__sous-remove juste au-dessus : le "x" de
       retrait d'une ligne d'espace de reponse (voir question.js) est lui aussi un
       controle d'edition inline, jamais destine a une impression directe. */
    .block-question__reponse-remove,
    .block-situation__compile,
    .block-situation__image-overlay,
    .block-situation__image-placeholder,
    .block-qcm__tools,
    .block-text__compile,
    .activity-title__compile,
    .block-fond__tools,
    /* Gap reel trouve en cablant le nouveau bouton "editeur de formule visuel" (voir
       mathliveEditor.js) : .block-latex-tools (text/question/situation/titre) et
       .block-notion__tools n'etaient jamais dans cette liste — seul le bouton "∑"
       individuel de chacun des 4 premiers y figurait (.block-text__compile etc.
       ci-dessus), jamais le conteneur qui l'entoure. Consequence deja reelle AVANT ce
       bouton : le bouton "inserer une formule" restait visible sur une impression
       navigateur directe (Ctrl+P), un gap pre-existant, aggrave (pas cree) par l'ajout
       d'un 2e bouton dans ces memes conteneurs — corrige ici plutot que reporte. */
    .block-latex-tools,
    .block-notion__tools,
    /* Meme classe de gap que juste au-dessus, decouverte cette fois en cablant
       .block-circuit__tools (voir circuit.js/CLAUDE.md "Circuit electrique") : AUCUN des 6
       petits boutons ronds "reglages" des blocs a modale plein ecran (figure/courbe/
       espace/solide/variation/signe) n'etait dans cette liste — seul le contenu du bloc
       lui-meme (le SVG rendu) etait deja correctement imprime, mais le bouton engrenage
       en coin de bloc restait visible sur une impression navigateur directe (Ctrl+P), pre-
       existant, pas introduit par le bloc circuit — corrige ici pour toute la famille
       plutot que pour circuit seul, meme raisonnement deja applique ci-dessus. */
    .block-figure__tools,
    .block-courbe__tools,
    .block-espace__tools,
    .block-solide__tools,
    .block-variation__tools,
    .block-signe__tools,
    .block-circuit__tools {
        display: none !important;
    }

    /* Pastille "n / total" (voir canvas.js:createPage/updatePageChrome) — memes valeurs
       visuelles que export_pdf.html:.page-number-print, uniquement revelee ici (masquee
       a l'ecran par .page-number-print-only dans editor.css). */
    .page-number-print-only {
        display: inline-flex !important;
        position: absolute;
        bottom: 10px;
        right: 22px;
        z-index: 50;
        align-items: baseline;
        gap: 2px;
        padding: 4px 14px;
        border-radius: var(--radius-pill);
        background: var(--color-surface);
        border: 1px solid var(--color-accent-soft);
        font-family: var(--font-display);
        letter-spacing: 0.02em;
    }

    .page-number-print-only--hidden {
        display: none !important;
    }

    .page-number-print-only__current {
        font-size: 14px;
        font-weight: 600;
        color: var(--color-text);
    }

    .page-number-print-only__sep {
        font-size: 12px;
        color: var(--color-text);
        margin: 0 1px;
    }

    .page-number-print-only__total {
        font-size: 12px;
        color: var(--color-text);
    }
}
