gestion_table_tournante_libre/src/interface/generation/Avancement.svelte
Mathieu Benoit d19394957f [ADD] interface: generation screen — settings, progress, worker, cancel
The operator launches a generation without the window freezing. The
screen sets the number of propositions, the seed, the stop count and the
history, refuses an out-of-range setting where it was typed, and asks
before a run estimated far beyond the default. The search runs in a worker
that terminate() cancels with no partial result, and the progress shows a
count, never a promised duration. The last duration lives for the session
only.
Checked: 2374 node and 391 browser tests.

--- FR ---

[ADD] interface : écran de génération — réglages, avancement, annulation

L'opérateur lance une génération sans figer la fenêtre. L'écran règle le
nombre de propositions, la graine, l'arrêt et l'historique, refuse un
réglage hors de son domaine là où il a été saisi, et demande avant un
calcul estimé bien au-delà du défaut. La recherche tourne dans un
travailleur que terminate() annule sans résultat partiel, et l'avancement
montre un compte, jamais une durée promise. La dernière durée ne vit que
le temps de la séance.
Vérifié : 2374 node et 391 navigateur.

Assisted-by: Claude Opus 5.5
2026-10-07 09:10:12 -04:00

61 lines
1.7 KiB
Svelte

<!-- © 2026 TechnoLibre (http://www.technolibre.ca)
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) -->
<script>
// L'avancement d'une génération en cours (§ 5.10) : les mouvements évalués
// sur le total, en mots et en barre — une barre de progression accessible,
// dont aria-valuenow porte les mouvements évalués —, et « Annuler la
// génération », qui appelle annuler. fait et total viennent du contrôleur
// de génération ; total est le produit du nombre de propositions et du
// compte d'arrêt, jamais nul pendant un calcul.
import { getContext } from 'svelte';
import Commande from '../primitives/Commande.svelte';
let { fait, total, annuler } = $props();
const t = getContext('t');
const largeur = $derived(total > 0 ? `${(fait / total) * 100}%` : '0%');
</script>
<div class="avancement" data-avancement>
<p>{t('generation.avancement.texte', { fait, total })}</p>
<div
class="barre"
role="progressbar"
aria-label={t('generation.avancement.barre')}
aria-valuemin="0"
aria-valuemax={total}
aria-valuenow={fait}
>
<div class="plein" style:width={largeur}></div>
</div>
<Commande cle="generation.commande.annuler" nom="annuler" executer={annuler} />
</div>
<style>
.avancement {
display: flex;
flex-direction: column;
align-items: flex-start;
gap: var(--espace-2);
}
p {
margin: 0;
}
.barre {
box-sizing: border-box;
width: min(30rem, 100%);
height: var(--espace-3);
border: 1px solid var(--couleur-page-filet);
border-radius: var(--rayon-1);
background-color: var(--couleur-page-fond);
}
.plein {
height: 100%;
background-color: var(--couleur-page-texte);
}
</style>