{t('inertia.explain')}
{#each unit.inertiaChanges as c (c.at + c.to)}{t(`inertia.history.${c.cause}`, { from: level(c.from), to: level(c.to), date: i18n.date(c.at) })}
@@ -195,6 +196,19 @@ font-weight: 700; font-size: 0.9rem; } + /* On a phone: every gesture big enough for a finger (lot U2). */ + @media (max-width: 899px) { + details > summary { + padding-block: 0.75rem; + } + details[open] > summary { + margin-bottom: 0; + } + .btn, + .link { + min-height: 2.75rem; + } + } @media (prefers-reduced-motion: reduce) { .levels button { transition: none; diff --git a/web/src/lib/components/OrderLine.svelte b/web/src/lib/components/OrderLine.svelte index fcdabfd..d134b0f 100644 --- a/web/src/lib/components/OrderLine.svelte +++ b/web/src/lib/components/OrderLine.svelte @@ -2,7 +2,8 @@ // The order of a section, at its end (ADR 0009; Yvv, 2026-11-02: « la répétition de // "ordonnancement" est nulle. Il faudrait que ce soit en fin de section »): one line, never // the list of its articles again — the handle that marks an order, « Ordre de la section », - // its weight in notches, its state, the orders proposed. « Le vote » unfolds here the vote + // its weight in notches, its state, the orders proposed and the changes of its inertia + // proposed (lot U2: found here, where their vote unfolds). « Le vote » unfolds here the vote // of any of its versions (the list whole); « Réordonner » puts handles on the articles of // the section, in place. import type { Snippet } from 'svelte'; @@ -37,6 +38,7 @@ const p = $derived(unit.inForce); const proposed = $derived(unit.proposals.filter((x) => x.status === 'open' && x.kind === 'order')); + const inertia = $derived(unit.proposals.filter((x) => x.status === 'open' && x.kind === 'inertia')); // Any version of the module unfolds here: its order in force, an order proposed, a change of its inertia. const shown = $derived([p, ...unit.proposals.filter((x) => x.status === 'open')].find((x) => x?.id === vote) ?? null); const votes = $derived((p?.tally.for ?? 0) + (p?.tally.against ?? 0)); @@ -53,6 +55,10 @@ {@const first = proposed[0]} {/if} + {#if inertia.length && !reordering} + {@const first = inertia[0]} + + {/if} {#if !reordering} {#if p}{/if} diff --git a/web/src/lib/components/QuorumSetting.svelte b/web/src/lib/components/QuorumSetting.svelte index 080f78b..b4da047 100644 --- a/web/src/lib/components/QuorumSetting.svelte +++ b/web/src/lib/components/QuorumSetting.svelte @@ -110,4 +110,10 @@ font-weight: 700; font-size: 0.9rem; } + /* On a phone: « Fixer ce quorum » and « Revenir au défaut » as tall as the field (lot U2). */ + @media (max-width: 899px) { + .btn { + min-height: 2.75rem; + } + } diff --git a/web/src/lib/components/Reorder.svelte b/web/src/lib/components/Reorder.svelte index f202b97..784bb53 100644 --- a/web/src/lib/components/Reorder.svelte +++ b/web/src/lib/components/Reorder.svelte @@ -6,7 +6,8 @@ // or uses its arrows; with the keyboard, the up and down arrows move the article that has // the focus, and the new place is said. Then « Proposer cet ordre »: the order goes to the // vote (ADR 0009, `POST /units/{id}/order`) and its vote unfolds at once, here. An order - // already proposed is voted, never proposed twice. + // already proposed is voted, never proposed twice. While the order is the one in force, + // the button stays off and says why, beside it (lot U2, UX-lecteur.md). import { tick, untrack } from 'svelte'; import { flip } from 'svelte/animate'; import { api } from '$lib/api'; @@ -141,10 +142,7 @@ } async function submit() { - if (unchanged) { - error = t('order.edit.unchanged'); - return; - } + if (unchanged) return; if (existing) { ondone(existing.id); return; @@ -192,8 +190,15 @@ {#if existing && !unchanged}{t('order.edit.exists')}
{/if} {#if error}{error}
{/if}{t('order.edit.unchanged')}
{/if} - +{summary}
- {i18n.plural('docs.inForce', doc.inForce.length)} · {i18n.plural('docs.open', doc.open.length)} + {i18n.plural('docs.inForce', doc.inForce.length)} · {#if headSeeds}{i18n.plural('docs.seeds', headSeeds)}{' · '}{/if}{i18n.plural('docs.open', openArticles)} {#if view.doc.publication.state === 'done'} · {t('doc.published')}{:else if view.doc.publication.state === 'pending'} · {t('doc.publish.pending')}{/if} ·
@@ -517,13 +523,15 @@ .new { margin-top: 1.4rem; } - /* On a phone: the three readings on one line that scrolls, the targets big enough for a finger. */ + /* On a phone: the three readings go to the line rather than hide « Si tout passe » off the + edge (lot U2); each row fills the width, the targets big enough for a finger. */ @media (max-width: 899px) { .seg.views { - flex-wrap: nowrap; - max-width: 100%; - overflow-x: auto; - scrollbar-width: none; + display: flex; + gap: 2px; + } + .seg.views button { + flex: 1 1 auto; } .seg button { min-height: 2.75rem;