v3 : interface Svelte — accueil, groupes, lecteur du texte en vigueur, panneau contextuel, éditeur à assistant, trustinWallet

- Accueil sobre, menu complet à gauche (Décisions, Docs de référence, Mandats,
  Protocoles), intro demandée, quatre sections, connexion Ğ1.
- Lecteur : texte en vigueur en Literata, actions contextuelles par article
  (le vote, propositions, proposer), propositions en cours sous la « surface »
  avec leur niveau d'eau, aperçus « si les bien cotées passent » / « si tout
  passe », langue du texte fr/en/es (traductions éditoriales).
- Panneau : vote pour/contre, seuil et formule (MathML), inertie et son
  changement (voté en inertie +), coquille sans vote, traduction, signalement
  de contradiction, historique des corrections.
- trustinWallet (/acces) : groupes et membres, invitations à usage unique,
  administrateurs, retours d'usage.
- Contrôles : vitest (markdown, catalogues, anti-lexique), Playwright C1–C10 + M1.
- Sections du seed portées jusqu'à l'écran.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Yvv
2026-10-21 02:58:34 +02:00
co-authored by Claude Opus 5.5
parent 67ddee28b2
commit 7a022dd35e
66 changed files with 7771 additions and 15 deletions
+322
View File
@@ -0,0 +1,322 @@
/* libreDecision v3 — tokens and base.
Two moods: « pierre » (cool stone, light) and « nuit » (well at night, dark).
Borderless: depth comes from background and shadow, never from strokes.
Radii: cards 16px · inputs 12px · pills and buttons 20px · icon holders 14px. */
@import '@fontsource-variable/nunito';
@import '@fontsource-variable/literata/opsz.css';
@import '@fontsource-variable/literata/opsz-italic.css';
:root,
[data-mood='pierre'] {
--bg: #e9eeec;
--surface: #f6f8f7;
--surface-2: #dfe6e3;
--ink: #18282a;
--ink-soft: #4e615f;
--ink-faint: #7f908d;
--water: #1f6f78;
--water-light: #8cc3c4;
--water-wash: rgb(31 111 120 / 0.08);
--moss: #4c7a4b;
--moss-wash: rgb(76 122 75 / 0.12);
--ochre: #a8661e;
--ochre-wash: rgb(168 102 30 / 0.12);
--on-water: #f6f8f7;
--shadow: 0 1px 2px rgb(20 40 40 / 0.06), 0 8px 28px rgb(20 40 40 / 0.07);
--shadow-strong: 0 2px 6px rgb(20 40 40 / 0.1), 0 18px 48px rgb(20 40 40 / 0.16);
--veil: rgb(16 30 31 / 0.28);
color-scheme: light;
}
[data-mood='nuit'] {
--bg: #0e1819;
--surface: #142224;
--surface-2: #1b2d2f;
--ink: #e2ebe8;
--ink-soft: #a2b4b0;
--ink-faint: #6e827e;
--water: #6ec1c6;
--water-light: #2d6a70;
--water-wash: rgb(110 193 198 / 0.08);
--moss: #8dbf84;
--moss-wash: rgb(141 191 132 / 0.12);
--ochre: #e0a458;
--ochre-wash: rgb(224 164 88 / 0.12);
--on-water: #0e1819;
--shadow: 0 1px 2px rgb(0 0 0 / 0.3), 0 8px 28px rgb(0 0 0 / 0.28);
--shadow-strong: 0 2px 6px rgb(0 0 0 / 0.4), 0 18px 48px rgb(0 0 0 / 0.5);
--veil: rgb(0 0 0 / 0.5);
color-scheme: dark;
}
:root {
--font-ui: 'Nunito Variable', system-ui, -apple-system, 'Segoe UI', sans-serif;
--font-text: 'Literata Variable', 'Iowan Old Style', Georgia, serif;
--r-card: 16px;
--r-input: 12px;
--r-pill: 20px;
--r-icon: 14px;
--sidebar: 15.5rem;
--panel: 27rem;
--measure: 36rem;
--ease: cubic-bezier(0.2, 0.7, 0.2, 1);
}
*,
*::before,
*::after {
box-sizing: border-box;
}
html {
-webkit-text-size-adjust: 100%;
text-size-adjust: 100%;
}
body {
margin: 0;
background: var(--bg);
color: var(--ink);
font-family: var(--font-ui);
font-size: 1rem;
line-height: 1.5;
-webkit-font-smoothing: antialiased;
transition: background-color 0.2s ease, color 0.2s ease;
}
h1,
h2,
h3 {
margin: 0;
font-weight: 600;
line-height: 1.2;
}
p {
margin: 0;
}
a {
color: var(--water);
text-decoration-thickness: 1px;
text-underline-offset: 3px;
}
button,
input,
select,
textarea {
font: inherit;
color: inherit;
}
button {
cursor: pointer;
}
:focus-visible {
outline: 2px solid var(--water);
outline-offset: 3px;
border-radius: 6px;
}
::selection {
background: var(--water-light);
color: var(--ink);
}
.visually-hidden {
position: absolute !important;
width: 1px;
height: 1px;
overflow: hidden;
clip: rect(0 0 0 0);
white-space: nowrap;
}
/* Buttons — native, custom. */
.btn {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 0.45rem;
min-height: 2.4rem;
padding: 0.5rem 1.1rem;
border: 0;
border-radius: var(--r-pill);
background: var(--surface-2);
color: var(--ink);
font-weight: 650;
font-size: 0.95rem;
text-decoration: none;
transition: transform 0.1s ease, background-color 0.15s ease, box-shadow 0.15s ease;
}
.btn:hover {
transform: translateY(-1px);
}
.btn:active {
transform: translateY(0);
}
.btn:disabled {
opacity: 0.5;
cursor: not-allowed;
transform: none;
}
.btn.primary {
background: var(--water);
color: var(--on-water);
box-shadow: 0 6px 18px rgb(31 111 120 / 0.22);
}
.btn.quiet {
background: transparent;
color: var(--ink-soft);
padding-inline: 0.6rem;
}
.btn.quiet:hover {
background: var(--water-wash);
color: var(--ink);
}
.btn.small {
min-height: 2.25rem;
padding: 0.3rem 0.8rem;
font-size: 0.88rem;
}
/* Fields — native, custom. */
.field {
display: grid;
gap: 0.35rem;
}
.field > span {
font-size: 0.82rem;
font-weight: 700;
color: var(--ink-soft);
}
.input,
.textarea,
.select {
width: 100%;
border: 0;
border-radius: var(--r-input);
background: var(--surface-2);
padding: 0.6rem 0.8rem;
min-height: 2.4rem;
box-shadow: inset 0 1px 2px rgb(0 0 0 / 0.06);
}
.textarea {
resize: vertical;
font-family: var(--font-text);
font-size: 1.02rem;
line-height: 1.65;
min-height: 9rem;
}
.input:focus-visible,
.textarea:focus-visible,
.select:focus-visible {
outline-offset: 1px;
}
.card {
background: var(--surface);
border-radius: var(--r-card);
box-shadow: var(--shadow);
}
.tag {
display: inline-flex;
align-items: center;
gap: 0.3rem;
padding: 0.1rem 0.55rem;
border-radius: var(--r-pill);
background: var(--surface-2);
color: var(--ink-soft);
font-size: 0.74rem;
font-weight: 700;
letter-spacing: 0.02em;
white-space: nowrap;
}
.tag.water {
background: var(--water-wash);
color: var(--water);
}
.tag.moss {
background: var(--moss-wash);
color: var(--moss);
}
.tag.ochre {
background: var(--ochre-wash);
color: var(--ochre);
}
.eyebrow {
font-family: var(--font-ui);
font-size: 0.74rem;
font-weight: 800;
letter-spacing: 0.14em;
text-transform: uppercase;
color: var(--water);
}
.muted {
color: var(--ink-soft);
}
.faint {
color: var(--ink-faint);
}
/* The texts of reference. */
.prose {
font-family: var(--font-text);
font-size: clamp(1.04rem, 0.98rem + 0.25vw, 1.14rem);
line-height: 1.72;
font-variation-settings: 'opsz' 14;
hyphens: auto;
}
.prose p + p,
.prose p + ul,
.prose ul + p {
margin-top: 0.75em;
}
.prose ul,
.prose ol {
margin: 0.5em 0 0;
padding-left: 1.2em;
}
.prose li + li {
margin-top: 0.25em;
}
.prose strong {
font-weight: 650;
}
.prose code {
font-family: ui-monospace, 'SFMono-Regular', Menlo, monospace;
font-size: 0.86em;
background: var(--surface-2);
padding: 0.05em 0.35em;
border-radius: 6px;
}
.diff-added {
background: var(--moss-wash);
color: var(--ink);
text-decoration: none;
border-radius: 4px;
}
.diff-removed {
background: var(--ochre-wash);
color: var(--ink-soft);
text-decoration: line-through;
text-decoration-thickness: 1px;
border-radius: 4px;
}
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}