Supprime la couche de formes libres, déplace la navigation de page dans le panneau gauche
Build and deploy / test-python (push) Successful in 7m43s
Build and deploy / test-js (push) Successful in 57s
Build and deploy / lint-python (push) Successful in 5m29s
Build and deploy / lint-js (push) Failing after 1m16s
Build and deploy / build-and-push (push) Skipped
Build and deploy / deploy (push) Skipped
Build and deploy / sonarqube (push) Failing after 5m42s

Formes libres (rectangle/cercle/triangle/trait) retirées de bout en
bout (bibliothèque, rendu, panneau Propriétés, grille d'accroche,
JS/CSS associés) — fonctionnalité non retenue.

La bande de vignettes visuelles des pages au-dessus du canevas est
remplacée par une section "Pages" dans le panneau de gauche (liste
simple : ajouter/renommer/réordonner (haut/bas)/supprimer), à la
place de l'ex-catégorie "Mise en page" de la bibliothèque. La route
document_edit ne rend plus qu'une seule page (celle affichée) au
chargement, au lieu de toutes les pages pour alimenter les anciennes
vignettes.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
william
2026-09-21 14:40:33 +02:00
co-authored by Claude Sonnet 5
parent 57c4de3d8a
commit 8dc4b35dcf
11 changed files with 220 additions and 597 deletions
+67 -171
View File
@@ -260,12 +260,6 @@ body.objectEditBody > main.content {
margin-bottom: 10px;
}
.docShapesGrid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 8px;
}
.docLibItem {
border: 1px solid var(--doc-border);
border-radius: 10px;
@@ -279,14 +273,6 @@ body.objectEditBody > main.content {
box-shadow: var(--doc-glow);
}
.docLibItem--shape {
padding: 10px 8px;
display: flex;
flex-direction: column;
align-items: center;
gap: 6px;
}
.docLibItem--row {
padding: 9px 10px;
display: flex;
@@ -315,10 +301,6 @@ body.objectEditBody > main.content {
flex-shrink: 0;
}
.docLibIcon--rectangle::before { content: "▭"; }
.docLibIcon--cercle::before { content: "○"; }
.docLibIcon--triangle::before { content: "△"; }
.docLibIcon--trait::before { content: "―"; }
.docLibIcon--paragraphe::before { content: "¶"; }
.docLibIcon--image::before { content: "🖼"; }
.docLibIcon--bouton::before { content: "⬚"; }
@@ -387,8 +369,7 @@ body.objectEditBody > main.content {
/* Enfant qui reçoit le HTML rendu (voir #docPage vs #docPageContent dans
document-editor.js — le rafraîchissement du canevas ne remplace QUE ce
contenu, jamais .docPage elle-même, pour que .docSnapGridOverlay,
sa voisine, survive à chaque rafraîchissement). */
contenu, jamais .docPage elle-même). */
.docPageContent {
display: flex;
flex-direction: column;
@@ -447,17 +428,6 @@ body.objectEditBody > main.content {
box-shadow: inset -3px 0 0 0 var(--doc-accent);
}
.docShape[data-element-id] {
padding: 0;
margin: 0;
border-radius: 0;
}
.docShape[data-element-id].docSelected {
outline: 2px solid var(--doc-accent);
background: transparent;
}
.docText {
outline: none;
}
@@ -1096,27 +1066,6 @@ img.docImage {
padding: 10px;
}
/* ---- grille d'accroche (formes libres) — voir docs/plan/PLAN.md,
"grille d'accroche réelle" : visible en overlay pendant le déplacement
d'une forme (voir .docPage--dragging-shape ci-dessous), jamais
décorative. */
.docSnapGridOverlay {
position: absolute;
inset: 0;
pointer-events: none;
z-index: 1;
opacity: 0;
transition: opacity 0.1s ease;
background-image:
linear-gradient(to right, rgb(255 95 46 / 12%) 1px, transparent 1px),
linear-gradient(to bottom, rgb(255 95 46 / 12%) 1px, transparent 1px);
background-size: var(--doc-snap-size, 8px) var(--doc-snap-size, 8px);
}
.docPage.docPage--dragging-shape .docSnapGridOverlay {
opacity: 1;
}
.docZoomPill {
position: absolute;
bottom: 24px;
@@ -1213,125 +1162,53 @@ img.docImage {
white-space: nowrap;
}
/* ---- Bande de VIGNETTES MINIATURES des pages, au-dessus de la page
ET centrée dans le conteneur du milieu (.docCanvasArea, jamais toute
la largeur de l'éditeur par-dessus les panneaux latéraux — retour
utilisateur du 21/09/2026 : "je préfère avoir des miniatures ...
centré dans le conteneur du milieu"). Chaque vignette affiche un
VRAI rendu réduit du contenu de sa page (voir .docPageThumbInner plus
bas, et rendered_pages côté serveur dans routes/document/
document_edit.py) — jamais une carte générique numéro/titre. Masquée
en Mode Aperçu (voir la règle .docEditor3--preview plus bas), qui a
sa propre navigation via .docPageNavPill ci-dessus. ---- */
.docPageThumbs {
width: 100%;
display: flex;
justify-content: center;
align-items: flex-end;
flex-wrap: wrap;
gap: 16px;
padding: 4px 20px 28px;
flex-shrink: 0;
}
.docPageThumbCard {
/* ---- Section "Pages" du panneau GAUCHE (retour utilisateur du
21/09/2026 : "une section qui s'ajoute dans le panneau de gauche pour
ajouter une page et naviguer entre elles", à la place de l'ex-
catégorie "Mise en page"/formes libres, supprimée) — une simple liste
(pas de vignette visuelle), toujours visible en tête du panneau. ---- */
.docPageSection {
display: flex;
flex-direction: column;
align-items: center;
gap: 6px;
flex-shrink: 0;
border: none;
background: none;
padding: 0;
cursor: pointer;
font-family: inherit;
gap: 8px;
}
.docPageThumbCard.is-dragging {
opacity: 0.4;
}
.docPageThumbCard:focus-visible {
outline: 2px solid var(--doc-accent);
outline-offset: 2px;
border-radius: 10px;
}
.docPageThumbFrame {
/* <span> (jamais <div>, invalide comme enfant direct d'un <button> —
voir templates/document/document_edit.html) : display:block requis
pour que width/aspect-ratio s'appliquent normalement. */
display: block;
position: relative;
width: 132px;
aspect-ratio: 4 / 3;
border: 2px solid var(--doc-border);
border-radius: 10px;
overflow: hidden;
background: var(--doc-card);
box-shadow: 0 2px 6px rgb(0 0 0 / 20%);
transition: border-color 0.15s ease, transform 0.15s ease;
}
.docPageThumbCard:hover .docPageThumbFrame {
border-color: var(--doc-accent);
transform: translateY(-2px);
}
.docPageThumbCard.is-active .docPageThumbFrame {
border-color: var(--doc-accent);
box-shadow: 0 0 0 2px var(--doc-accent);
}
/* Astuce "scale inverse" pour une vraie vignette : le contenu est rendu
à sa largeur RÉELLE (voir .docPage, 760px) puis réduit visuellement —
jamais un second moteur de rendu séparé pour les miniatures, c'est le
MÊME rendu que le canevas principal, juste redimensionné en CSS. Le
cadre (.docPageThumbFrame) le rogne verticalement s'il dépasse — un
support de formation "page" est proche d'un format diapositive, ce
recadrage reste représentatif. */
.docPageThumbInner {
position: absolute;
top: 0;
left: 0;
width: 760px;
transform: scale(0.1737);
transform-origin: top left;
pointer-events: none;
}
.docPageThumbDelete {
position: absolute;
top: 4px;
right: 4px;
display: none;
align-items: center;
justify-content: center;
width: 18px;
height: 18px;
border-radius: 50%;
border: none;
background: rgb(11 14 20 / 65%);
color: #fff;
font-size: 10px;
cursor: pointer;
}
.docPageThumbCard:hover .docPageThumbDelete {
.docPageList {
display: flex;
flex-direction: column;
gap: 4px;
}
.docPageThumbDelete:hover {
background: var(--doc-quiz-danger-border);
.docPageListItem {
display: flex;
align-items: center;
justify-content: space-between;
gap: 8px;
padding: 7px 8px;
border: 1px solid var(--doc-border);
border-radius: 8px;
background: var(--doc-card);
cursor: pointer;
}
.docPageThumbs.docPageTabs--single .docPageThumbDelete {
display: none;
.docPageListItem:hover {
border-color: var(--doc-accent);
}
.docPageThumbLabel {
max-width: 132px;
font-size: 12px;
.docPageListItem.is-active {
border-color: var(--doc-accent);
box-shadow: 0 0 0 1px var(--doc-accent);
}
.docPageListItem:focus-visible {
outline: 2px solid var(--doc-accent);
outline-offset: 1px;
}
.docPageListTitle {
flex: 1;
min-width: 0;
font-size: 12.5px;
font-weight: 600;
color: var(--doc-muted);
overflow: hidden;
@@ -1339,11 +1216,11 @@ img.docImage {
white-space: nowrap;
}
.docPageThumbCard.is-active .docPageThumbLabel {
.docPageListItem.is-active .docPageListTitle {
color: var(--doc-text);
}
.docPageThumbLabel[contenteditable="true"] {
.docPageListTitle[contenteditable="true"] {
outline: none;
border-bottom: 1px solid var(--doc-accent);
cursor: text;
@@ -1351,21 +1228,41 @@ img.docImage {
color: var(--doc-text);
}
.docPageThumbAddCard .docPageThumbFrame {
.docPageListActions {
display: flex;
align-items: center;
gap: 2px;
flex-shrink: 0;
}
.docPageListActions button {
width: 20px;
height: 20px;
border: none;
border-radius: 5px;
background: transparent;
color: var(--doc-muted);
font-size: 11px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
border-style: dashed;
color: var(--doc-muted);
font-size: 24px;
font-weight: 700;
box-shadow: none;
}
.docPageThumbAddCard:hover .docPageThumbFrame {
.docPageListActions button:hover:not(:disabled) {
background: var(--doc-bg-2);
color: var(--doc-text);
}
.docPageListActions button:disabled {
opacity: 0.3;
cursor: default;
}
.docPageListDelete:hover:not(:disabled) {
color: var(--doc-quiz-danger-border);
}
/* ---- RIGHT SIDEBAR : Propriétés ---- */
.docField {
display: flex;
@@ -1606,8 +1503,7 @@ img.docImage {
.docEditor3.docEditor3--preview .docSidebarLeft,
.docEditor3.docEditor3--preview .docSidebarRight,
.docEditor3.docEditor3--preview .docBottomNav,
.docEditor3.docEditor3--preview .docZoomPill,
.docEditor3.docEditor3--preview .docPageThumbs {
.docEditor3.docEditor3--preview .docZoomPill {
display: none;
}