Files
parenthese/frontend/src/styles/pz.css
T
IliesAllaliandClaude Haiku 5.5 d4416ef2ee barre : partager, souvenir propriétaire, aide pour tous, nettoyage
- Rond du compte : « Partager l'arbre » ouvre la fenêtre « La famille
  participe » (propriétaire).
- « Propositions à relire » ouvre la même fenêtre et la fait défiler
  jusqu'à la section (ancre #contrib-propositions).
- « Un souvenir » disponible pour le propriétaire, même parcours que
  le membre (choix de la personne, puis souvenirs).
- Aide : HELP_URL passé à tous les rôles.
- Suppression de .pz-lang--nav (plus aucune référence).

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
2026-10-19 01:11:05 +02:00

266 lines
17 KiB
CSS

/* ============================================================
Parenthèse · composants de la DA (accent terracotta, validé le 24/09/2026)
Base commune des écrans refaits : accueil, compte, fenêtres, menus, fiche.
============================================================ */
:root {
--pz-bg: #fbfaf7;
--pz-surface: #ffffff;
--pz-ink: #2a2622;
--pz-ink-2: #4f4841;
--pz-muted: #6b645d;
--pz-faint: #9a948d;
--pz-line: #ebe6df;
--pz-line-soft: #f2eee8;
--pz-a50: #fcf3ef;
--pz-a100: #f8e4db;
--pz-a200: #f4d6c9;
--pz-a300: #edb6a4;
--pz-a500: #d2694a;
--pz-a700: #93402a;
--pz-a800: #7a3421;
--pz-danger: #b3261e;
--pz-danger-bg: #fbeae8;
--pz-success: #2f6e3a;
--pz-success-bg: #e6f2e4;
--pz-shadow: 0 1px 2px rgba(42, 38, 34, .05), 0 8px 24px rgba(42, 38, 34, .07);
--pz-shadow-lg: 0 30px 80px rgba(42, 38, 34, .22), 0 2px 6px rgba(42, 38, 34, .06);
--pz-serif: 'Newsreader', Georgia, 'Times New Roman', serif;
--pz-sans: 'DM Sans', system-ui, -apple-system, sans-serif;
--pz-ease: cubic-bezier(.23, 1, .32, 1);
--pz-ease-drawer: cubic-bezier(.32, .72, 0, 1);
--pz-ease-pop: cubic-bezier(.34, 1.4, .64, 1);
--pz-r-s: 10px;
--pz-r-m: 14px;
--pz-r-l: 22px;
}
/* ── Typo ─────────────────────────────────────────────────────── */
/* Pas de mot ni de signe seul en fin de paragraphe (fenêtres, fiche, accueil, écrans d'accès).
Les noms de l'arbre sont dessinés sur le canvas, ces règles ne les touchent pas.
Longhand : ne réactive pas le retour à la ligne là où white-space: nowrap est posé. */
h1, h2, h3, h4 { text-wrap-style: balance; }
p, li, blockquote, figcaption, dd, .pz-sub, .pz-small, .pz-hint, .pz-error, .pz-success { text-wrap-style: pretty; }
.pz-eyebrow { font: 500 12px/1.3 var(--pz-sans); letter-spacing: .1em; text-transform: uppercase; color: var(--pz-muted); margin: 0; }
.pz-title { font: 400 30px/1.1 var(--pz-serif); letter-spacing: -.01em; color: var(--pz-ink); margin: 0; text-wrap: balance; }
.pz-title em { font-style: italic; font-weight: 300; }
.pz-title-lg { font: 300 clamp(36px, 5vw, 48px)/1.04 var(--pz-serif); letter-spacing: -.02em; color: var(--pz-ink); margin: 0; text-wrap: balance; }
.pz-title-lg em { font-style: italic; }
.pz-sub { font: 400 15px/1.55 var(--pz-sans); color: var(--pz-ink-2); margin: 0; }
.pz-small { font: 400 13px/1.5 var(--pz-sans); color: var(--pz-muted); margin: 0; }
.pz-small a, .pz-sub a { color: var(--pz-a700); text-underline-offset: 3px; }
/* ── Boutons ──────────────────────────────────────────────────── */
.pz-btn {
display: inline-flex; align-items: center; justify-content: center; gap: 8px;
min-height: 46px; padding: 0 22px; border: 0; border-radius: 999px; cursor: pointer;
font: 500 15px/1 var(--pz-sans); text-decoration: none; white-space: nowrap;
transition: transform 140ms var(--pz-ease), background-color 180ms ease, color 180ms ease, box-shadow 180ms ease, opacity 180ms ease;
-webkit-tap-highlight-color: transparent;
}
.pz-btn:active:not(:disabled) { transform: scale(.97); }
.pz-btn:disabled { opacity: .45; cursor: not-allowed; }
.pz-btn:focus-visible { outline: 2px solid var(--pz-a500); outline-offset: 3px; }
.pz-btn--primary { background: var(--pz-ink); color: #fff; }
.pz-btn--accent { background: var(--pz-a700); color: #fff; }
.pz-btn--secondary { background: var(--pz-surface); color: var(--pz-ink); box-shadow: inset 0 0 0 1px var(--pz-line); }
.pz-btn--soft { background: var(--pz-a100); color: var(--pz-a800); }
.pz-btn--ghost { background: transparent; color: var(--pz-ink-2); padding: 0 14px; }
.pz-btn--danger { background: var(--pz-danger); color: #fff; }
.pz-btn--danger-ghost { background: transparent; color: var(--pz-danger); padding: 0 14px; }
.pz-btn--sm { min-height: 36px; padding: 0 14px; font-size: 13.5px; }
.pz-btn--block { width: 100%; }
.pz-btn--icon { width: 40px; min-height: 40px; padding: 0; }
@media (hover: hover) and (pointer: fine) {
.pz-btn--primary:hover:not(:disabled) { background: #3d3731; }
.pz-btn--accent:hover:not(:disabled) { background: var(--pz-a800); }
.pz-btn--secondary:hover:not(:disabled) { box-shadow: inset 0 0 0 1px var(--pz-a300); background: var(--pz-a50); }
.pz-btn--soft:hover:not(:disabled) { background: var(--pz-a200); }
.pz-btn--ghost:hover:not(:disabled) { background: var(--pz-line-soft); color: var(--pz-ink); }
.pz-btn--danger:hover:not(:disabled) { background: #93201a; }
.pz-btn--danger-ghost:hover:not(:disabled) { background: var(--pz-danger-bg); }
}
.pz-link { background: none; border: 0; padding: 0; cursor: pointer; font: 500 14px var(--pz-sans); color: var(--pz-a700); text-decoration: underline; text-underline-offset: 3px; }
/* ── Champs ───────────────────────────────────────────────────── */
.pz-field { display: grid; gap: 7px; }
.pz-field > label, .pz-label { font: 500 13px/1.3 var(--pz-sans); color: var(--pz-ink-2); }
.pz-input, .pz-field input:not([type=checkbox]):not([type=radio]), .pz-field textarea, .pz-field select {
width: 100%; min-height: 46px; padding: 11px 14px; box-sizing: border-box;
font: 400 15px/1.4 var(--pz-sans); color: var(--pz-ink);
background: var(--pz-surface); border: 1px solid var(--pz-line); border-radius: var(--pz-r-s);
transition: border-color 160ms ease, box-shadow 160ms ease; appearance: none;
}
.pz-field textarea { min-height: 96px; resize: vertical; }
/* Champ de date : une année seule ou une date complète (DateField) */
.pz-date { display: grid; align-content: start; gap: 4px; min-width: 0; }
.pz-date input[aria-invalid="true"] { border-color: var(--pz-a500); }
.pz-date-hint { font: 400 12px/1.35 var(--pz-sans); color: var(--pz-a700); }
.pz-input::placeholder, .pz-field input::placeholder, .pz-field textarea::placeholder { color: var(--pz-faint); }
.pz-input:focus, .pz-field input:focus, .pz-field textarea:focus, .pz-field select:focus {
outline: none; border-color: var(--pz-a500); box-shadow: 0 0 0 3px var(--pz-a100);
}
.pz-hint { font: 400 12.5px/1.45 var(--pz-sans); color: var(--pz-muted); margin: 0; }
.pz-error {
display: flex; gap: 8px; align-items: flex-start; padding: 11px 14px; border-radius: var(--pz-r-s);
background: var(--pz-danger-bg); color: var(--pz-danger); font: 500 13.5px/1.45 var(--pz-sans);
}
.pz-success {
display: flex; gap: 8px; align-items: flex-start; padding: 11px 14px; border-radius: var(--pz-r-s);
background: var(--pz-success-bg); color: var(--pz-success); font: 500 13.5px/1.45 var(--pz-sans);
}
.pz-row2 { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
@media (max-width: 480px) { .pz-row2 { grid-template-columns: 1fr; } }
/* ── Cartes, tags, séparateurs ────────────────────────────────── */
.pz-card { background: var(--pz-surface); border: 1px solid var(--pz-line); border-radius: var(--pz-r-l); box-shadow: var(--pz-shadow); }
.pz-tag {
display: inline-flex; align-items: center; gap: 6px; padding: 5px 10px; border-radius: 999px;
font: 500 12px/1 var(--pz-sans); color: var(--pz-ink-2); background: var(--pz-bg); border: 1px solid var(--pz-line);
}
.pz-tag--accent { background: var(--pz-a100); color: var(--pz-a700); border-color: transparent; }
.pz-tag--dot::before { content: ""; width: 6px; height: 6px; border-radius: 50%; background: var(--pz-a500); }
.pz-divider { display: flex; align-items: center; gap: 12px; font: 400 12.5px var(--pz-sans); color: var(--pz-faint); }
.pz-divider::before, .pz-divider::after { content: ""; flex: 1; height: 1px; background: var(--pz-line); }
/* ── Onglets ──────────────────────────────────────────────────── */
.pz-tabs { display: flex; gap: 4px; padding: 4px; background: var(--pz-bg); border: 1px solid var(--pz-line); border-radius: 999px; }
.pz-tab {
flex: 1; min-height: 34px; padding: 0 12px; border: 0; border-radius: 999px; background: transparent; cursor: pointer;
font: 500 13.5px var(--pz-sans); color: var(--pz-muted); transition: background-color 160ms ease, color 160ms ease;
}
.pz-tab[aria-selected="true"], .pz-tab.is-active { background: var(--pz-surface); color: var(--pz-ink); box-shadow: 0 1px 2px rgba(42, 38, 34, .08); }
/* ── Fenêtres ─────────────────────────────────────────────────── */
.pz-overlay {
position: fixed; inset: 0; z-index: 2000; display: grid; place-items: center; padding: 16px;
background: rgba(42, 38, 34, .32); backdrop-filter: blur(3px); -webkit-backdrop-filter: blur(3px);
animation: pz-fade 180ms ease both;
}
.pz-modal {
position: relative; width: min(100%, 520px); max-height: calc(100dvh - 32px); overflow: auto;
background: var(--pz-surface); border-radius: var(--pz-r-l); box-shadow: var(--pz-shadow-lg);
padding: 28px; display: grid; gap: 20px; align-content: start;
animation: pz-rise 220ms var(--pz-ease) both;
}
.pz-modal--wide { width: min(100%, 680px); }
/* Les enfants d'une grille ne débordent pas (textes longs, liens) */
.pz-modal > *, .pz-screen-card > * { min-width: 0; }
.pz-modal-head { display: grid; gap: 6px; padding-right: 36px; }
.pz-modal-close { position: absolute; top: 16px; right: 16px; }
.pz-modal-actions { display: flex; justify-content: flex-end; gap: 8px; flex-wrap: wrap; }
.pz-modal-actions--split { justify-content: space-between; align-items: center; }
@keyframes pz-fade { from { opacity: 0; } to { opacity: 1; } }
@keyframes pz-rise { from { opacity: 0; transform: translateY(10px) scale(.985); } to { opacity: 1; transform: none; } }
@media (max-width: 560px) {
.pz-overlay { place-items: end center; padding: 0; }
.pz-modal { width: 100%; max-height: 92dvh; border-radius: 26px 26px 0 0; padding: 24px 20px calc(20px + env(safe-area-inset-bottom)); animation: pz-sheet 380ms var(--pz-ease-drawer) both; }
@keyframes pz-sheet { from { transform: translateY(100%); } to { transform: none; } }
}
/* ── Écran plein (accueil, compte, accès) ─────────────────────── */
.pz-screen {
position: fixed; inset: 0; overflow: auto; background: var(--pz-bg);
display: grid; place-items: center; padding: 32px 16px;
background-image: radial-gradient(circle at 50% 0%, var(--pz-a50), transparent 60%);
}
.pz-screen-inner { width: min(100%, 440px); display: grid; gap: 22px; }
.pz-screen-logo { justify-self: center; height: 26px; width: auto; display: block; }
.pz-screen-card { padding: 30px; display: grid; gap: 20px; }
.pz-screen-close { position: fixed; top: 20px; right: 20px; z-index: 1; }
@media (max-width: 480px) { .pz-screen-close { top: 12px; right: 12px; } }
@media (max-width: 480px) { .pz-screen-card { padding: 24px 20px; } }
/* ── Menus ────────────────────────────────────────────────────── */
.pz-menu {
min-width: 240px; padding: 6px; background: var(--pz-surface); border: 1px solid var(--pz-line);
border-radius: var(--pz-r-m); box-shadow: var(--pz-shadow-lg); display: grid; gap: 2px;
animation: pz-rise 160ms var(--pz-ease) both;
}
.pz-menu-item {
display: flex; align-items: center; gap: 10px; width: 100%; min-height: 40px; padding: 8px 12px;
border: 0; border-radius: 10px; background: transparent; cursor: pointer; text-align: left;
font: 500 14px/1.3 var(--pz-sans); color: var(--pz-ink);
}
.pz-menu-item svg { color: var(--pz-muted); flex: none; }
.pz-menu-item.is-active { background: var(--pz-a50); color: var(--pz-a700); }
.pz-menu-item--danger { color: var(--pz-danger); }
.pz-menu-item--danger svg { color: var(--pz-danger); }
@media (hover: hover) and (pointer: fine) { .pz-menu-item:hover { background: var(--pz-line-soft); } .pz-menu-item.is-active:hover { background: var(--pz-a100); } }
.pz-menu-sep { height: 1px; margin: 4px 6px; background: var(--pz-line); }
.pz-menu-label { padding: 8px 12px 4px; font: 500 11.5px var(--pz-sans); letter-spacing: .08em; text-transform: uppercase; color: var(--pz-faint); }
/* ── Le rond qui attend (motion validée le 25/09/2026) ────────── */
/* Le rond se divise en trois points qui respirent, puis se referme avec un léger rebond. */
.pz-mark { display: block; overflow: visible; }
.pz-mark-par path { fill: var(--pz-ink); stroke: var(--pz-ink); stroke-width: 48.1; stroke-linejoin: round; }
.pz-mark-c { fill: var(--pz-a500); transform-box: fill-box; transform-origin: center; }
.pz-mark-p { transition: transform 420ms var(--pz-ease); }
.pz-mark-s { transform-box: fill-box; transform-origin: center; transition: transform 420ms var(--pz-ease); }
.pz-mark.is-loading .pz-mark-p0 { transform: translateX(-300px); }
.pz-mark.is-loading .pz-mark-p2 { transform: translateX(300px); }
.pz-mark.is-loading .pz-mark-s { transform: scale(.27); }
.pz-mark.is-loading .pz-mark-c { animation: pz-souffle 1200ms ease-in-out 420ms infinite; }
.pz-mark.is-loading .pz-mark-p1 .pz-mark-c { animation-delay: 580ms; }
.pz-mark.is-loading .pz-mark-p2 .pz-mark-c { animation-delay: 740ms; }
.pz-mark.is-merging .pz-mark-p, .pz-mark.is-merging .pz-mark-s { transition-duration: 560ms; transition-timing-function: var(--pz-ease-pop); }
@keyframes pz-souffle { 0%, 100% { opacity: 1; transform: none; } 50% { opacity: .32; transform: scale(.78); } }
.pz-boot {
position: fixed; inset: 0; z-index: 3000; display: grid; place-items: center;
background: var(--pz-bg); transition: opacity 200ms ease;
}
.pz-boot .pz-mark { width: 64px; height: auto; transition: transform 200ms var(--pz-ease); }
.pz-boot.is-out { opacity: 0; pointer-events: none; }
.pz-boot.is-out .pz-mark { transform: scale(.96); }
/* Bouton en attente : le libellé reste en place (largeur figée), les points prennent sa place */
.pz-busy { display: inline-grid; place-items: center; }
.pz-busy > * { grid-area: 1 / 1; }
.pz-busy-lbl { display: inline-flex; align-items: center; gap: 8px; transition: opacity 160ms ease, filter 160ms ease, transform 160ms var(--pz-ease); }
.pz-dots { display: inline-flex; gap: 5px; opacity: 0; transition: opacity 160ms ease; }
.pz-dots i { width: 6px; height: 6px; border-radius: 50%; background: currentColor; }
.pz-busy.is-busy .pz-busy-lbl { opacity: 0; filter: blur(2px); transform: scale(.98); }
.pz-busy.is-busy .pz-dots { opacity: 1; }
.pz-busy.is-busy .pz-dots i { animation: pz-souffle 1200ms ease-in-out infinite; }
.pz-busy.is-busy .pz-dots i:nth-child(2) { animation-delay: 160ms; }
.pz-busy.is-busy .pz-dots i:nth-child(3) { animation-delay: 320ms; }
/* un bouton qui attend n'est pas un bouton grisé */
button:disabled:has(.pz-busy.is-busy) { opacity: 1; cursor: progress; }
.pz-sr { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }
@media (prefers-reduced-motion: reduce) {
.pz-overlay, .pz-modal, .pz-menu { animation: pz-fade 160ms ease both !important; }
.pz-btn:active:not(:disabled) { transform: none; }
/* les points apparaissent sur place et clignotent en fondu, sans déplacement */
.pz-mark-p, .pz-mark-s, .pz-boot .pz-mark { transition-duration: 1ms !important; }
.pz-mark.is-loading .pz-mark-c, .pz-busy.is-busy .pz-dots i { animation-name: pz-fade-pulse !important; }
.pz-busy.is-busy .pz-busy-lbl { filter: none; transform: none; }
}
@keyframes pz-fade-pulse { 0%, 100% { opacity: 1; } 50% { opacity: .35; } }
/* ── Choix de la langue « FR · EN » (LanguageSwitch.jsx) ──────── */
/* Discret : deux codes, la langue courante en appui. Menus du compte et « Plus », barre d'actions hors connexion, écrans d'accès. */
.pz-lang { display: inline-flex; align-items: center; gap: 1px; }
.pz-lang .pz-lang-opt {
min-height: 30px; min-width: 0; padding: 0 8px; border: 0; border-radius: 999px; background: transparent; cursor: pointer;
font: 500 12.5px/1 var(--pz-sans); letter-spacing: .06em; color: var(--pz-faint);
transition: background-color 160ms ease, color 160ms ease;
-webkit-tap-highlight-color: transparent;
}
.pz-lang .pz-lang-opt.is-active { color: var(--pz-ink); background: var(--pz-line-soft); cursor: default; }
.pz-lang .pz-lang-opt:focus-visible { outline: 2px solid var(--pz-a500); outline-offset: 2px; }
@media (hover: hover) and (pointer: fine) { .pz-lang .pz-lang-opt:not(.is-active):hover { color: var(--pz-ink); background: var(--pz-line-soft); } }
.pz-lang-sep { font: 400 12px/1 var(--pz-sans); color: var(--pz-faint); user-select: none; }
/* Ligne de menu : libellé à gauche, choix à droite */
.pz-lang-row {
display: flex; align-items: center; justify-content: space-between; gap: 10px; min-height: 40px; padding: 4px 6px 4px 12px;
font: 500 14px/1.3 var(--pz-sans); color: var(--pz-ink);
}
.pz-lang-row-label { display: inline-flex; align-items: center; gap: 10px; }
.pz-lang-row-label svg { color: var(--pz-muted); flex: none; }
/* Dans la barre d'actions, séparé des boutons par un filet */
/* Sous les écrans d'accès et de connexion */
.pz-lang--screen { justify-self: center; }