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:
@@ -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 };
|
||||
}
|
||||
Reference in New Issue
Block a user