v2 : correctifs QA — overlays posés, accueil jamais orphelin, finitions mobiles

- overlays Nuxt UI (UModal/USlideover) : géométrie posée en CSS
  (assets/css/overlays.css) — les utilitaires tailwind attendus par @nuxt/ui
  ne sont pas générés (UnoCSS ne scanne pas node_modules) : drawer mobile et
  modales de confirmation se rendaient hors écran
- a11y : title/description sur les 3 overlays (DialogTitle/Description
  rendus, warnings reka-ui éteints), fermeture du drawer ancrée et testée
- suppression du collectif actif : bascule sur un collectif restant —
  jamais d'accueil orphelin (test store ajouté, 343 vitest verts)
- observatoire : la route « transmis » entre dans les barres (base 100 %)
- overflows mobiles à zéro : formules KaTeX (défilement), table vigueur
  (défilement < 768px), pill cible (retour à la ligne), inputs decider et
  mandat (border-box)
- vérifié navigateur : drawer, modale, 14 routes sans débordement,
  zéro erreur console

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Yvv
2026-08-11 20:11:54 +02:00
co-authored by Claude Fable 5
parent 38fd053e87
commit 3301b764f7
14 changed files with 194 additions and 9 deletions
@@ -219,6 +219,10 @@ function saveMeasure(index: number) {
border-collapse: collapse;
font-size: 0.875rem;
}
@media (max-width: 768px) {
/* la table ne sait pas rétrécir sous la largeur de son contenu : elle défile */
.vig__table { display: block; overflow-x: auto; }
}
.vig__table th {
text-align: left;
font-size: 0.8125rem;
@@ -91,7 +91,11 @@ async function removeConfirmed() {
</li>
</ul>
<UModal v-model:open="confirmOpen">
<UModal
v-model:open="confirmOpen"
:title="confirmEntry ? `Supprimer « ${confirmEntry.name} » ?` : 'Supprimer'"
description="Ce geste supprime uniquement la copie locale, sur cette machine."
>
<template #content>
<div class="confirm">
<h3 class="confirm__title">Supprimer « {{ confirmEntry?.name }} » ?</h3>
@@ -332,7 +332,7 @@ const currentCurve = computed(() => curvePath(M.value, G.value))
.lab { display: flex; flex-direction: column; gap: 1rem; }
.lab__formula { padding: clamp(0.9rem, 3vw, 1.4rem); overflow-x: auto; }
.lab__tex { text-align: center; }
.lab__tex { text-align: center; max-width: 100%; overflow-x: auto; }
.lab__tex :deep(.lab__tex-fallback) {
font-family: monospace;
font-size: 0.8125rem;
@@ -120,7 +120,7 @@ const OBJECTION_STATUS = { open: 'ouverte', withdrawn: 'levée', integrated: 'in
.vi__target {
font-size: 0.75rem; font-weight: 700; color: var(--mood-tertiary);
background: color-mix(in srgb, var(--mood-tertiary) 12%, transparent);
padding: 1px 8px; border-radius: var(--r-pill); white-space: nowrap;
padding: 1px 8px; border-radius: var(--r-pill); overflow-wrap: anywhere;
}
.vi__engages {
margin: 0; display: flex; flex-wrap: wrap; align-items: baseline; gap: 0.4rem;
@@ -7,7 +7,7 @@ import { computeMyImpact, detectBimodality, medianByElement, resolveDerived } fr
import { useCollectiveStore } from '~/stores/collective'
import { useDecisionsStore } from '~/stores/decisions'
import {
CRYSTALLIZE_ACTION, CRYSTALLIZE_CARD, CRYSTALLIZE_CHOICES, EXPLORE_DISCLAIMER,
CRYSTALLIZE_ACTION, CRYSTALLIZE_CARD, CRYSTALLIZE_CHOICES, CRYSTALLIZE_MODAL_DESC, EXPLORE_DISCLAIMER,
EXPLORE_LABEL, FROZEN_BANNER, IMPACT_CARD_TITLE, IMPACT_DISCLAIMER,
MEDIAN_EXPLANATION, PARAM_CONSTRAINT_LABEL,
} from '~/lexicon'
@@ -297,7 +297,12 @@ function fullIndexOf(key: string): number {
Cristallisée par {{ crystallizer }} le {{ new Date(session.crystallizedAt).toLocaleDateString('fr-FR') }}.
</p>
<UModal v-model:open="showCrystal" :title="CRYSTALLIZE_ACTION">
<UModal
v-model:open="showCrystal"
:title="CRYSTALLIZE_ACTION"
:description="CRYSTALLIZE_MODAL_DESC"
:ui="{ header: 'ldov-header', title: 'ldov-title', description: 'ldov-desc', close: 'ldov-close', body: 'ldov-body' }"
>
<template #body>
<div class="vp__modal">
<p v-if="medianFull" class="vp__modal-median">