Lot U3 : l'interface de l'Acte d'engagement (Yvv, 03/11) — avant le texte, hors vote, « Info ouverture doc de réf. » (OpeningInfo, lib/opening.ts) : le paragraphe d'Yvv mot pour mot à la place de doc.empty.seeds (sa première phrase tant qu'aucun article n'est en vigueur, puis « entrent en vigueur » où « y » n'avait plus rien à reprendre), le cran d'ouverture des Propositions d'amorce, du titre, de l'ordre de chaque section et des autres articles (avant tout changement voté) et le quorum de chaque cran, lus dans l'API ; une séparation (un filet de la couleur de la clé de voûte, jamais une bordure) ; plus les titres « Introduction » et « Engagements fondamentaux » dans le texte. Les informations de F1, F1.1, F1.2, N1, N1.1 et O1 là où elles servent : vote.permanent, vote.rival, vote.others.rule, formula.Tprime, formula.round, formula.B.wot, formula.G, settings.share.note, settings.usual.quorum, settings.gradient, order.edit.effect ; les termes définis de T3c (« à la participation habituelle », « quorum de l'article », « part exigée », « repose sur moins de N propositions votées depuis un an »), plus de « comme d'habitude ». « Proposition d'amorce » (Starter proposal, Propuesta de arranque). Le mot d'Yvv pour qui n'est pas invité, à l'accueil sans session (à la place du bouton Ğ1 tant que la connexion Ğ1 n'est pas active) et sur « Se connecter » (signin.g1.pending sans redite). Réordonner : la ligne sous le pointeur lue dans la mise en page (offsetTop), pas là où animate:flip la montre — une poignée tirée sur plusieurs lignes ne revient plus en arrière ; le pointeur capturé par la liste. API : seedFeatured sur chaque version (seul changement sous crates/). C1, C3, C20, C27, C35, C38 suivent les mots

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Yvv
2026-11-03 22:28:41 +01:00
co-authored by Claude Opus 5.5
parent 9d478d668a
commit 8528a269fc
20 changed files with 434 additions and 88 deletions
+52
View File
@@ -0,0 +1,52 @@
// « Info ouverture doc de réf. » (lot U3; Yvv, 2026-11-03: « un petit chapitre qui explicite les
// réglages initiaux de l'auteur, notamment Quorum et Inertie »): what the chapter says is read in
// the data of the document, never written in. Pure: the component only says it.
import type { DocView, Inertia, Unit } from './types';
/**
* The level a module opened at: the one before the first change voted. A change of the seed's own
* settings (an amendment, « réglage de départ du texte ») is the author's, part of the opening.
*/
export function openedAt(u: Unit): Inertia {
const voted = u.inertiaChanges.find((c) => c.cause === 'vote');
return voted?.from ?? u.inertia;
}
/** A Proposition d'amorce (ADR 0011): put forward by the seed, open or in force since. */
export function isAmorce(u: Unit): boolean {
return [u.inForce, ...u.proposals].some((p) => p?.seedFeatured === true);
}
/** An article the seed wrote (the author's): not one a member proposed since. */
function fromSeed(u: Unit): boolean {
return [u.inForce, ...u.proposals].some((p) => p?.origin === 'seed');
}
const levels = (units: (Unit | null | undefined)[]): Inertia[] =>
[...new Set(units.filter((u): u is Unit => !!u).map(openedAt))].sort((a, b) => a - b);
export interface OpeningLevels {
amorce: Inertia[];
title: Inertia[];
orders: Inertia[];
others: Inertia[];
}
/** The levels at the opening, by kind of module, each said once, lowest first. */
export function openingLevels(view: Pick<DocView, 'units' | 'modules'>): OpeningLevels {
const seeded = view.units.filter(fromSeed);
return {
amorce: levels(seeded.filter(isAmorce)),
title: levels([view.modules.title]),
orders: levels(view.modules.orders),
others: levels(seeded.filter((u) => !isAmorce(u))),
};
}
/** The quorum of each level, 1 to 5 (ADR 0013): said once when they are all the same. */
export function quorumsOf(quorums: number[] | undefined): { same: number | null; list: number[] } | null {
if (!quorums?.length) return null;
const first = quorums[0] ?? 0;
return { same: quorums.every((q) => q === first) ? first : null, list: quorums };
}