100 Commits
Author SHA1 Message Date
IliesAllaliandClaude Opus 5.5 642b6020c3 onglets : les porteurs du nom dans leur famille, proches de l'autre côté réglables
Un enfant d'un membre qui porte le nom d'un onglet entre dans cet onglet (nom de naissance d'abord,
homonymes sans lien laissés dehors), avec son couple ; l'autre parent est estompé. Nouveau réglage
d'affichage : proches de l'autre côté à 0, 1, 2 ou 3 liens, 1 par défaut. Libellés des réglages
d'affichage réécrits.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 18:12:21 +01:00
IliesAllaliandClaude Opus 5.5 ef620c9cb5 mesure : copie du lien de partage, page vie privée à jour
share_copied quand le propriétaire copie le lien, le mot de passe ou le message d'invitation
(what, seasonal pour le message de Noël), ou crée le lien d'un co-gestionnaire (manager_invite).
Rien de ce qui est copié ne part. La page vie privée (fr, en) décrit maintenant tout ce que l'app
mesure : démo, modifications comptées sans leur contenu, propositions, partage.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 19:32:10 +01:00
IliesAllaliandClaude Opus 5.5 332b5711ff mesure : proposal_sent pour toutes les propositions
L'événement ne partait que de la fenêtre d'envoi (App.jsx) : les raccourcis de la fiche passent par
handleSubmitContributionSession sans lui, d'où zéro proposal_sent en 60 jours pour deux propositions
relues. L'événement part maintenant de la fonction commune, après réponse du serveur, avec le statut
(pending, ou approved pour un co-gestionnaire).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 19:24:19 +01:00
IliesAllaliandClaude Opus 5.5 9bf55a16f3 landing : mesure d'audience des pages statiques, provenance gardée jusqu'à l'app
Les guides, l'aide, la vidéo et les pages vie privée (public/, copiés sans Vite) n'avaient aucune
mesure. src/pages.js, construit par Vite avec une empreinte et posé au build dans chaque page par
scripts/inject-pages.mjs, envoie les mêmes événements que la page d'accueil (page_viewed, scroll_depth_50
et 100, signup_cta_clicked) et video_played sur /video/. Les liens vers l'app gardent le ?source=
d'arrivée au lieu de la provenance fixe de la page. Page vie privée (fr, en) complétée.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 19:01:07 +01:00
IliesAllaliandClaude Opus 5.5 2c7e5361cc texte : l'invitation de Noël parle aussi de la voix
Le message d'invitation de décembre (SIGNUP_PROMPTS) propose d'enregistrer
une histoire de famille racontée à table, en plus des vieilles photos.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 18:09:16 +01:00
IliesAllaliandClaude Opus 5.5 98de13aaa0 deps(front): minimatch 11 pour eslint (alerte Dependabot #24)
minimatch < 11.0.1 (déni de service par amplification des globparts). Seul eslint
en dépend, outillage de dev ; Dependabot ne peut pas monter la version lui-même
(eslint demande ^10), d'où l'override. Lint, 359 tests, build, npm audit à 0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 17:29:36 +01:00
IliesAllaliandClaude Opus 5.5 1558b0dc6b 1.6.0 : changelog
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 17:23:49 +01:00
IliesAllaliandClaude Opus 5.5 43dda9c962 fix(vie): les photos d'un mariage se voient chez les deux conjoints (#209)
Le moment du couple arrivait bien chez les deux, mais ses souvenirs n'étaient cherchés
que parmi ceux de la fiche ouverte. L'onglet Vie et la fenêtre d'un moment du couple
lisent aussi les souvenirs du conjoint ; une photo du conjoint s'ouvre à son nom.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 16:41:16 +01:00
IliesAllaliandClaude Opus 5.5 69b08116cf i18n(en): Partner à la place de Spouse sur la fiche et l'arbre
Même mot que les liens de parenté depuis #204 : « spouse » suppose un mariage,
« conjoint » non.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 16:39:13 +01:00
IliesAllaliandClaude Opus 5.5 68ab7924f2 ci(images): la vraie version dans le label OCI (#207)
org.opencontainers.image.version vaut X.Y.Z sur un tag et la sortie de git describe
sur main (1.5.9-11-gd5f9da6), au lieu de « latest ».

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 16:33:25 +01:00
IliesAllaliandClaude Opus 5.5 0ef5d08fec feat(demo): « Créer mon arbre » en bouton noir de la barre, « Modifier » en clair
Dans la démo, l'inscription n'était que dans le menu du rond de profil et dans un
lien après une modification. Elle devient le bouton noir de la barre du bas ;
« Modifier » reste à côté en clair (crayon seul sur téléphone) et quitte le noir.
« Créer mon arbre » quitte le menu du rond pour ne pas apparaître deux fois.

Seulement sur l'instance qui invite à s'inscrire (SIGNUP_PROMPTS, inscription
ouverte), sans compte, et pas dans la démo intégrée à la landing (?embed).
Clic suivi : create_account_clicked, via=demo-barre.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 16:48:17 +01:00
IliesAllaliandClaude Opus 5.5 0cf851475f fix(entree): un lien de diffusion (?source=) sans session ouvre la démo
Depuis l'accueil à deux choix (18/10), un visiteur sans session arrivé par
app.parenthese.io/?source=… tombait sur « Que voulez-vous faire ? » au lieu
de l'arbre d'exemple. Tous les liens de diffusion (presse, créateurs, groupes)
sont écrits sans ?demo, dont plusieurs déjà envoyés.

Sans session et avec ?source : la démo, comme avant. Sans paramètre : l'accueil
à deux choix reste. ?account=register et les liens de famille ne changent pas.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 16:26:02 +01:00
IliesAllaliandClaude Opus 5.5 7fee10478d kinship en : 4th cousin, great-uncle, sans virgule avant « removed »
- ordinal() : il manquait le $, un cousin au 4e degré s'affichait « {n}th cousin »
- Great-uncle et great-great-uncle, la forme courante, au lieu de granduncle
- « First cousin once removed », sans virgule
- Style du dépôt (guillemets simples, sans points-virgules)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 20:41:25 +01:00
IliesAllaliandClaude Opus 5.5 0269b97efd 1.5.9 : changelog
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 15:12:39 +01:00
IliesAllaliandClaude Opus 5.5 b803f6291d Fiche : « – 1995 » ne se coupe plus après le tiret ; bouton loupe nommé « Zoomer »
Une espace insécable seule ne suffit pas : Chrome coupe après un tiret demi-cadratin. Le gluon U+2060
devant l'espace insécable garde « – 1995 » d'un bloc (vu sur la fiche de Robert, démo, 1440 px).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 13:43:45 +01:00
IliesAllaliandClaude Opus 5.5 1b13b093ba 1.5.8 : changelog
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 13:08:57 +01:00
IliesAllaliandClaude Opus 5.5 d013c8b8fc Âge : l'anniversaire compte une fois passé (#198)
L'âge d'une personne vivante était l'année en cours moins l'année de naissance : né en décembre,
on prenait un an dès janvier. Même défaut pour l'âge au décès et les âges de l'onglet Vie.
Quand les deux dates sont complètes, l'âge se compte au jour près (utils/age.js) ; une année seule
garde la différence des années.

Fixes #198

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 12:23:45 +01:00
IliesAllaliandClaude Opus 5.5 3dfc8625e9 README : OIDC, seule la mise en place réelle avec Pocket ID est citée (#153)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 10:40:39 +01:00
IliesAllaliandClaude Opus 5.5 1a65f28b21 README : OIDC n'est plus expérimental, le conteneur api doit joindre le fournisseur (#153)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 10:22:23 +01:00
IliesAllaliandClaude Opus 5.5 cc59b7190f 1.5.7 : changelog
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 08:29:07 +01:00
IliesAllaliandClaude Opus 5.5 1fae061a2d Onglet Vie : « En couple avec » sauf mariage dit, date et lieu d'un couple, prénoms en liens
Un couple naît « mariage » dès qu'un enfant a deux parents : la frise disait « Épouse X » pour tous.
Elle dit maintenant « En couple avec X », et « Mariage avec X » seulement quand c'est dit (date, lieu ou
documents de mariage, case cochée). Toucher la ligne d'un couple (administrateur) ouvre sa fiche avec
« C'était un mariage », la date (même approximative) et le lieu ; PATCH /unions accepte startPlace et
startDatePrecision. Le prénom d'un proche (conjoint, enfant, frère ou sœur, parent) ouvre sa fiche et
amène la caméra sur lui.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 08:26:24 +01:00
IliesAllaliandClaude Opus 5.5 e39c33f977 Téléphone : l'arbre d'abord à l'arrivée, la personne touchée remonte au-dessus de la fiche (#188)
Sur téléphone, la fiche de la personne de départ ne s'ouvre plus à l'arrivée : elle couvrait le bas de
l'écran et la personne avec, laissant un écran vide. La personne de départ arrive à 40 % de la hauteur
au lieu de 56 %. Toucher quelqu'un dans l'arbre le remonte dans le tiers du haut, au-dessus de la fiche,
comme le fait déjà la recherche (focusPerson). Ordinateur inchangé.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 08:15:51 +01:00
IliesAllaliandClaude Opus 5.5 cdb75655dd 1.5.6 : changelog
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 07:41:26 +01:00
IliesAllaliandClaude Opus 5.5 8c2c740efe Ouverture : arrivée lisible, à 0,95, et centrée à côté de la réglette sur téléphone
#181 faisait arriver le recul à 0,5 : les prénoms y restent dessinés mais font
6,5 px, et un arbre de 35 personnes s'ouvrait en entier, illisible. Retour à
0,95 (prénoms à 12 px), le recul s'arrête là.

Sous 768 px, la réglette de zoom reste ouverte en bas à gauche : la personne de
départ se centre dans la largeur qu'elle laisse libre au lieu du milieu de
l'écran.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 00:05:38 +01:00
IliesAllaliandClaude Opus 5.5 f8a0826dfb Notification sur téléphone : décalée seulement quand la réglette de zoom se voit (centrée sous un panneau ou une fiche)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 19:35:49 +01:00
IliesAllaliandClaude Opus 5.5 4375fb6ba3 Bandeau « Annuler » : accordé au sexe connu, sans chevaucher la réglette de zoom ; bouton de zoom caché sous la fiche
Relevés par la recette de la 1.5.5 :
- « Odette est supprimé·e » : accordé quand le sexe est connu (supprimée, supprimé), « ·e » seulement quand
  il ne l'est pas ; même chose pour le message d'échec. L'anglais ne change pas (« was deleted »).
- Sous 768 px, le bandeau (et la notification après un ajout, même classe) passait sur la réglette de zoom,
  toujours ouverte en bas à gauche : il commence maintenant à 72 px du bord.
- Sur ordinateur, le bord du bouton de zoom dépassait sous une fiche ouverte : il est caché tant que la
  fiche est là.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 19:21:16 +01:00
IliesAllaliandClaude Opus 5.5 379102d3fe Arbre : réglage « Le nom de famille sous le prénom », celui de naissance s'il est connu (#168)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 18:49:03 +01:00
IliesAllaliandClaude Opus 5.5 debe51c313 Ctrl+K (⌘K sur Mac) ouvre la recherche ; raccourcis affichés
- Ctrl+K, de n'importe où, ouvre la recherche d'une personne, ou y remet le curseur si elle est ouverte.
- La loupe dit son raccourci au survol : « Rechercher une personne (Ctrl K) », « (⌘K) » sur Mac.
- Dans le menu « Modifier », « Ctrl E » à droite de « Modifier l'arbre » (raccourci qui existait déjà
  sans être dit). Composant Kbd, caché sur écran tactile.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 18:43:26 +01:00
IliesAllaliandClaude Opus 5.5 dbc811d722 1.5.5 : changelog
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 18:32:07 +01:00
IliesAllaliandClaude Opus 5.5 fcfb7d1494 Landing : pages préchargées au survol d'un lien (speculationrules)
- Règles de préchargement dans l'accueil et les 15 guides : une page du site est préparée quand on survole
  son lien (appui sur téléphone), et s'ouvre presque tout de suite. Pages seulement, pas les fichiers ;
  l'application n'est pas concernée. Ignoré par les navigateurs qui ne connaissent pas ces règles.
- Une page préchargée ne compte pas de visite avant d'être vraiment ouverte (PostHog attend
  prerenderingchange), et l'animation du logo se joue à l'ouverture, pas pendant le préchargement.
- CSP de la landing (deploy/nginx.conf) : empreinte des règles, et nouvelle empreinte du script du logo.
  Le mot-clé 'inline-speculation-rules' ne suffisait pas à Chrome.
- Test : chaque script en ligne des pages a son empreinte dans la CSP, chaque page a ses règles.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 18:05:12 +01:00
IliesAllaliandClaude Opus 5.5 2b81a2a2d8 Zones de tap d'au moins 44 px sur écran tactile, sans changement visible
Croix de la recherche (36 px) et de la fiche (40 px), onglets de la fiche (34 px de haut), petits boutons,
« + » en pastilles, ajout et retrait d'un lien : une zone invisible déborde autour de chacun sur écran
tactile (pointer: coarse) jusqu'à 44 × 44 px. Rien ne bouge à l'œil, et rien ne change à la souris.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 17:44:50 +01:00
IliesAllaliandClaude Opus 5.5 8ef87c7163 Ouverture d'un arbre : la caméra recule de la personne de départ vers sa famille
À la première ouverture d'un arbre, la caméra part serrée sur la personne de
départ et recule en 1,1 s (ease-out quint) jusqu'à la vue d'arrivée. Chaque
personne apparaît quand elle entre dans le champ, la personne de départ dès la
première image. Le premier geste (glisser, molette, recherche) arrête le recul.

- Un grand arbre s'ouvre à 0,5 au lieu de 0,95 : on voit la famille autour,
  les prénoms restent lisibles.
- Ensuite (arbre modifié, autre onglet de famille), rien ne s'anime : l'arbre
  s'affiche net. Avant, la cascade se rejouait à chaque modification.
- Un portrait qui entre part de 92 % de sa taille en fondu, en 360 ms (30 % en
  700 ms avant).
- Mouvements réduits : pas de recul, un fondu de 200 ms.

Avant, la cascade partait des générations les plus anciennes : sur un grand
arbre ouvert sur la personne de départ, l'écran restait vide près de 3 s.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 17:18:29 +01:00
IliesAllaliandClaude Opus 5.5 154f8219c5 Barre des familles : elle ne s'écarte que si la fiche monte jusqu'à elle
La fiche, posée en bas à gauche, ne couvre le haut que si son contenu est long.
Une fiche courte poussait la barre à droite pour rien.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 17:16:11 +01:00
IliesAllaliandClaude Opus 5.5 1925624e2a Onglet Vie : blocs gris seulement quand aucune date n'est connue ; les dates connues restent affichées pendant le chargement
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 17:02:05 +01:00
IliesAllaliandClaude Opus 5.5 5b9e4e2685 Blocs gris pendant le chargement, à la place de « Chargement… » et d'un faux vide
- Onglet Vie : pendant le premier chargement, la place de la frise au lieu de « Pas encore de date
  connue », qui s'affichait puis disparaissait une seconde plus tard.
- Propositions à relire, co-gestionnaires, visites, paramètres de l'arbre, sources de recherche : des
  lignes grises à la forme de ce qui arrive, au lieu d'un « Chargement… ».
- Composant Skeleton : rien avant 300 ms (une réponse rapide ne fait pas clignoter), aucun mouvement,
  libellé pour les lecteurs d'écran.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 16:42:15 +01:00
IliesAllaliandClaude Opus 5.5 291dde8073 Aperçus flous (BlurHash) pendant le chargement des photos et des portraits
Les photos partent en taille réelle, sans miniature : sur un réseau lent, une vignette restait un carré
vide et un portrait montrait ses initiales. Chaque photo et chaque portrait a maintenant un aperçu flou
aux bonnes couleurs (une chaîne de 28 caractères), affiché jusqu'à l'arrivée de l'image, sans fondu.

- Base : media_items.blurhash et persons.avatarBlurhash (migration additive 20261027_001).
- API : calculé à l'envoi d'une photo et d'un portrait (sharp, 32 px), publié dans le graphe ; les autres
  chemins (Immich, import GEDCOM, propositions acceptées) et les photos d'avant sont rattrapés en tâche de
  fond (lots de 25, puis une passe par minute). Un fichier illisible reçoit un aperçu vide.
- Navigateur : vignettes de la fiche, de la frise et du gestionnaire de souvenirs, portrait de la fiche,
  portraits et souvenirs dessinés sur l'arbre.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 16:17:58 +01:00
IliesAllaliandClaude Opus 5.5 ec4b0a1428 outils(layout-bench) : temps et empreinte du placement, temps d'ouverture d'un arbre
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 16:10:26 +01:00
IliesAllaliandClaude Opus 5.5 d7eac40cff perf(onglets): liste des familles calculée dans un worker
Quand l'arbre affiché est celui de la famille de départ, il ne dépend pas de
la liste des onglets : il s'affiche tout de suite, la liste est calculée dans
galaxy/familyTabsWorker.js et la barre suit, sans geler la page. Les pastilles
prennent le nom et le compte de leur onglet à l'arrivée de la liste.

Calcul sur place comme avant dans un autre onglet, à l'arrivée par le lien
d'un onglet, sans Worker ou si le worker échoue (couples de l'arbre affiché
remis). Une demande en cours est abandonnée dès qu'une autre part.

Royal92 (3 010 personnes) : arbre utilisable en 1,6 s au lieu de 8,7 s,
barre des onglets à 6 s sans bloquer (médianes de 3, machine chargée).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 16:08:04 +01:00
IliesAllaliandClaude Opus 5.5 c78a102d08 « Terminé » à la hauteur du « + » (46 px), retour de Patch
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 15:59:06 +01:00
IliesAllaliandClaude Opus 5.5 14f62aee90 perf(placement): ouverture des gros arbres deux fois plus rapide
- elkLayout : le rang des nœuds est tenu à jour à chaque ajout au lieu d'être
  reconstruit pour chaque chaîne (quadratique sur un gros arbre)
- blockLayout : fusion des contours en un tri par rangée au lieu d'insérer
  les intervalles un à un
- la famille de départ n'est plus placée deux fois (liste des onglets puis
  affichage) : takeRootLayout reprend le placement et ses couples
- chemin de parenté au survol : adjacence et index des personnes en cache,
  file lue par index

Placement identique (empreinte des positions, arêtes et onglets) sur royal92,
pres2020, asc-23, asc-61, desc-3, desc-5. Royal92 (3 010 personnes) :
9,3 s -> 4,6 s avant que l'arbre réponde (médiane de 3, machine chargée).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 15:58:28 +01:00
IliesAllaliandClaude Opus 5.5 c712ca8a15 Souvenir sur téléphone : glisser la photo vers le bas le ferme, comme la fiche
- Même geste et mêmes seuils que la fiche (useSheetDrag) : la carte suit le doigt, se ferme passé un tiers ou sur un
  lâcher rapide, revient sinon ; tirée vers le haut, elle résiste. Zone : la photo seulement (.mv-photo-box), la
  légende garde ses boutons et son défilement. Coupé pendant l'identification et quand la carte a défilé
  (nouvelle option canStart du hook).
- L'entrée de la carte ne garde plus sa valeur finale sur téléphone (fill-mode backwards), sinon elle l'emportait sur
  le transform du glisser. Fond plein sous la carte collée en bas (sous 560 px).
- Un toucher simple sur la photo montre toujours les prénoms ; un glisser n'en déclenche pas.

Planche validée par Patch le 27/10 : _bmad-output/parenthese/motion/2026-10-27-glisser-souvenir/

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 15:41:45 +01:00
IliesAllaliandClaude Opus 5.5 16e765c231 Téléphone, mode édition : onglets en haut, « Terminé » en toutes lettres, une seule sortie
- Les onglets de familles restaient abaissés sous un message qui avait lui-même été descendu (68 px) : la bulle
  « Vous proposez » couvrait « Famille X / Famille Y ». Ils restent sur la première ligne, à côté de la loupe.
  Recherche ouverte en mode édition : ils passent sous la bulle.
- La croix à côté du « + » devient « Terminé », le mot qu'emploie déjà la barre pour sortir du dessin. Plus de
  rotation au survol ; pression à 0,97.
- Quand « Terminé » est là, la bulle du haut n'a plus sa propre croix : une seule sortie.

Patch, 27/10 : planche _bmad-output/parenthese/motion/2026-10-27-barre-edition/

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 15:35:09 +01:00
IliesAllaliandClaude Opus 5.5 b978b96864 Tests du client : ceux du délai maximal remis, ceux de l'idempotence à la suite
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 15:15:37 +01:00
IliesAllaliandClaude Opus 5.5 0132ecb342 Envois de la famille sans doublon : en-tête Idempotency-Key
Sur un réseau faible, une proposition, un souvenir, une photo posée sur l'arbre ou un moment pouvait être
créé deux fois : la réponse se perdait (délai dépassé), la personne renvoyait, le serveur recréait tout.

- Navigateur (api/client.js) : un envoi qui n'a pas abouti garde sa clé, et le même envoi refait (même
  adresse, même contenu) la réutilise. Une réussite libère la clé.
- Serveur (lib/idempotency.ts) : sur les quatre routes de création, une clé déjà vue par la même personne
  renvoie la réponse du premier envoi ; deux essais simultanés n'en traitent qu'un ; un échec n'est pas gardé.
  En mémoire, 24 h, 5 000 clés au plus.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 15:14:32 +01:00
IliesAllaliandClaude Opus 5.5 2aab008766 Visages sur la photo : rien par défaut, ronds fins à la demande
- Les ronds des personnes identifiées ne restent plus posés sur les visages. Ils apparaissent au survol de la photo
  (ordinateur), quand on touche la photo (téléphone, un second toucher les cache), ou pour une seule personne quand
  on survole ou focalise son prénom sous la photo. Toujours visibles pendant l'identification.
- Rond plus large (34 px) et plus fin (1,5 px) : il entoure le visage au lieu de le couvrir.
- Sur téléphone, les prénoms ne s'affichent plus en permanence par-dessus la photo.

Planche validée par Patch le 27/10 (option A) : _bmad-output/parenthese/motion/2026-10-27-visages/

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 14:26:08 +01:00
IliesAllaliandClaude Opus 5.5 dbc6338f9b Souvenirs et moments supprimés : Annuler, comme pour une personne
Un hook commun (hooks/useUndoable.js) porte les trois suppressions annulables : bandeau 6 s,
Ctrl+Z, requête envoyée à la fin du délai ou à la fermeture de la page.
- Souvenir (gestionnaire de souvenirs) : il n'y avait aucune confirmation, la suppression était immédiate.
- Moment (onglet Vie) : plus de « Supprimer / Garder ».

Corrige deux défauts de #169 :
- Les tableaux du graphe étaient mutés en place (splice, push), alors que les index par personne
  (getPersonById, getPersonMedias) ne se reconstruisent qu'au remplacement du tableau. Nouveau
  replaceGraph() dans mockData, utilisé pour la suppression et l'ajout d'une personne en démo.
- Le rechargement après l'envoi vidait la sélection : une fiche ouverte pendant le délai se fermait.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 14:16:30 +01:00
IliesAllaliandClaude Opus 5.5 913de99f9e Souvenir : grandit depuis sa vignette à l'ouverture, et la visionneuse respecte les mouvements réduits
- Une vignette de la fiche touchée est retenue un court instant (utils/openOrigin.js) ; la visionneuse part de là,
  même largeur, et grandit jusqu'à sa place en 280 ms, transform seul, sans fondu. Le point de départ suit
  l'ancrage de la fenêtre : centre sur ordinateur, bord bas sur téléphone (pz-overlay en place-items: end).
- Ouverte autrement (photo de l'arbre, liste), la visionneuse ne change pas. Fermeture inchangée, d'un coup.
- Mouvements réduits : la carte n'avait pas la classe .pz-modal et jouait sa montée quand même ; elle s'affiche
  désormais d'un coup.

Planche validée par Patch le 27/10 : _bmad-output/parenthese/motion/2026-10-27-souvenir/

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 13:42:58 +01:00
IliesAllaliandClaude Opus 5.5 3a18ac9eab Fiche : apparaît d'un coup sur ordinateur, feuille en 240 ms, résistance vers le haut, coins continus
- Ordinateur : plus d'entrée animée (fondu et flou de 260 ms) ; on ouvre une fiche des dizaines de fois par visite.
- Téléphone : la feuille monte en 240 ms au lieu de 400 ; en mouvements réduits, fondu court seulement sur téléphone.
- Geste des feuilles (fiche et menu de la barre) : tirée vers le haut, la feuille cède de moins en moins (40 px au plus)
  et revient au lâcher, au lieu de buter net. Logique pure sheetOffset, testée. Une ombre pleine comble le dessous.
- Coins continus (corner-shape: squircle) sur la fiche, le portrait et les vignettes, seulement là où le navigateur
  les dessine ; ailleurs rien ne change.

Planche validée par Patch le 27/10 : _bmad-output/parenthese/motion/2026-10-27-fiche/

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 12:57:34 +01:00
IliesAllaliandClaude Opus 5.5 a2a2a81a12 Suppression d'une personne annulable : Annuler à la place de la confirmation
La personne disparaît tout de suite et un bandeau propose « Annuler » (ou Ctrl+Z) pendant 6 s.
La requête ne part qu'à la fin du délai, ou à la fermeture de la page (fetch keepalive).
Un rechargement de l'arbre pendant le délai ne fait pas revenir la personne.
Démo : même bandeau, retour à l'état d'avant.

Corrige au passage la recherche, qui gardait des résultats périmés après un ajout ou une
suppression (le tableau des personnes est modifié sur place).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 12:15:17 +01:00
IliesAllaliandClaude Opus 5.5 59d3c89b1c 1.5.4 : changelog
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 16:24:53 +01:00
IliesAllaliandClaude Opus 5.5 b9f301619b 1.5.3 : changelog
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 14:19:20 +01:00
IliesAllaliandClaude Opus 5.5 1af0e6842e Déploiement : le contrôle des dépendances backend ne charge plus @prisma/client, qui n'existe qu'après generate depuis Prisma 7
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 14:03:06 +01:00
IliesAllali 3bfacc5b1a Déploiement : commande forcée pour la clé de GitHub, qui ne peut plus que déployer un commit de main 2026-10-26 12:24:54 +01:00
IliesAllaliandClaude Opus 5.5 00aff350f1 1.5.2 : changelog, #154 et #156 ajoutées
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 11:44:30 +01:00
IliesAllali dcc5fe74f7 1.5.2 : changelog 2026-10-26 11:38:49 +01:00
IliesAllali bb6ec09fd1 Premiers visages : import de initialsOf, la fonction locale s'appelait elle-même ; test du panneau sans aperçu 2026-10-26 11:28:47 +01:00
IliesAllali 01ed08d26f Noms en chinois, arabe, hébreu : une seule initiale, lieu et surnom isolés du sens de la ligne 2026-10-26 11:20:32 +01:00
IliesAllali 5b21021aca Propositions : une suppression en conflit garde son mot (« Suppression, à vérifier ») ; « suggestion » en anglais 2026-10-26 11:18:27 +01:00
IliesAllali b6eaa6da78 Dates : marques diacritiques retirées par \p{M}, lisible 2026-10-26 11:18:00 +01:00
IliesAllali 8875f2baf0 Dates : ordre et séparateur de la région du navigateur (fr-CA, en-US…), mois en lettres accepté (#152) 2026-10-26 11:08:22 +01:00
IliesAllali fdc4254cdd Propositions : étiquette posée sur le bord de la carte, « À vérifier » remplace l'action en cas de conflit ; bulle du compteur ronde 2026-10-26 11:08:21 +01:00
IliesAllali 3c4eef1c92 Dates : en anglais, l'ordre jour/mois suit la région du navigateur (#152) 2026-10-26 11:08:21 +01:00
IliesAllaliandClaude Opus 5.5 b753e91fb4 Notification après un ajout ou un envoi : sa vraie largeur sur téléphone (plus quatre lignes dans une pilule), sans animation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 10:52:41 +01:00
IliesAllaliandClaude Opus 5.5 1f7ed7d96f Fiche : les « + » des proches en pastilles, comme « + Surnom » en modification
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 00:12:26 +01:00
IliesAllaliandClaude Opus 5.5 c530875775 1.5.1 : changelog daté
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 22:44:19 +01:00
IliesAllali 4829fd77f4 Merge remote-tracking branch 'origin/main' into feat/propositions-fantomes
# Conflicts:
#	CHANGELOG.md
#	frontend/src/App.jsx
2026-10-25 22:38:47 +01:00
IliesAllaliandClaude Opus 5.5 f034adf761 Famille : la fenêtre d'envoi ne s'ouvre plus après chaque ajout, la personne est sur l'arbre en brouillon
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 22:32:35 +01:00
IliesAllaliandClaude Opus 5.5 ba6e4cbdf2 1.5.1 : changelog
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 21:06:35 +01:00
IliesAllaliandClaude Opus 5.5 54535cb596 Molette : plus d'erreur console à chaque cran (preventDefault dans un écouteur passif, déjà fait par l'écouteur natif)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 20:38:38 +01:00
IliesAllaliandClaude Opus 5.5 1d04f9ac3d Famille : après l'envoi, l'arbre est relu (plus de photo affichée comme acceptée) et le message dit que c'est en pointillés
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 20:37:00 +01:00
IliesAllaliandClaude Opus 5.5 2f60df2ed9 Relecture depuis l'arbre : une proposition déjà relue le dit, et l'arbre se remet à jour
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 20:35:34 +01:00
IliesAllaliandClaude Opus 5.5 82c895d10a Revue de droits 1.5.1 : photos refusées libérées après la relecture, citations lues dans le JSON décodé, contenu normalisé à l'envoi, plafond tenu sous verrou
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 20:27:35 +01:00
IliesAllaliandClaude Opus 5.5 73be6a7cfd Compteurs d'édition (sans contenu de l'arbre) : personne ajoutée et par où, proposition envoyée ou relue, modifications enregistrées, doublon ouvert
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 20:21:41 +01:00
IliesAllaliandClaude Opus 5.5 5ebfa8337d Ajouter un proche depuis la fiche : créer depuis la recherche d'un lien, frère ou sœur, « + » en lecture, panneau prérempli, alerte de doublon
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 20:20:27 +01:00
IliesAllaliandClaude Opus 5.5 6e42a1f12d Erreurs : la photo posée sur l'arbre dit pourquoi elle échoue ; « Mettre à jour l'arbre » garde dans le brouillon ce qui n'a pas été enregistré
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 20:16:02 +01:00
IliesAllaliandClaude Opus 5.5 0c74adb012 Fantômes : propositions en attente, brouillon et envois de la famille dessinés sur l'arbre ; acceptation ou refus depuis le fantôme
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 20:14:58 +01:00
IliesAllaliandClaude Opus 5.5 ddc2231a8a Relecture : une ancienne annotation incomplète est écartée, pas la relecture entière
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 20:05:48 +01:00
IliesAllaliandClaude Opus 5.5 eebb8f2cb1 Propositions de la famille : photos posées sur l'arbre en attente de relecture, annotations posées par le serveur à l'acceptation, état d'une proposition
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 20:04:13 +01:00
IliesAllaliandClaude Opus 5.5 d89da4c7f8 Chercher quelqu'un : la famille ajoute en proposition ; marque « à vérifier » sur le coin
Un membre crée ou complète une personne trouvée : ça part dans ses modifications,
le propriétaire valide. Lieux, « à vérifier » et source suivent la personne proposée.
Le « ? » passe à cheval sur le coin du portrait, il ne cache plus le visage.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 20:03:58 +01:00
IliesAllaliandClaude Opus 5.5 01aeb69aff 1.5.0 : changelog
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 19:26:05 +01:00
IliesAllali b9faa2a4b4 Merge branch 'feat/cogestion-145' into feat/bouton-icone
# Conflicts:
#	CHANGELOG.md
2026-10-25 18:31:39 +01:00
IliesAllali 83e8282d94 Merge remote-tracking branch 'origin/main' into feat/cogestion-145
# Conflicts:
#	CHANGELOG.md
#	backend/src/app.ts
#	frontend/src/i18n/en/index.js
2026-10-25 18:30:28 +01:00
IliesAllaliandClaude Opus 5.5 b61ce5c8ad Icône de l'arbre (un emoji, dans les menus, le compte et la page d'invitation) et bouton « Modifier » pour qui gère l'arbre
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 18:22:48 +01:00
IliesAllaliandClaude Opus 5.5 7c9ea3c95e Chercher quelqu'un : créer la personne trouvée, rattachée à un proche
« Ajouter à l'arbre » s'ouvre sur Nouvelle personne : lien (parent, enfant, conjoint,
frère ou sœur) et proche dans l'arbre, par le même chemin qu'« Ajouter quelqu'un ».
Dates, lieux, sexe, source en note, à vérifier. « Déjà dans l'arbre » complète une fiche.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 18:15:03 +01:00
IliesAllaliandClaude Opus 5.5 f9fefd83e1 Chercher quelqu'un : recherche repliée après résultats, cartes plus complètes
La recherche tient en une ligne au-dessus des résultats. Chaque carte donne les
années de vie, l'âge au décès, des phrases accordées au sexe et la raison de sa note.
WikiTree limité au même nom de famille ; flèche des liens collée au texte.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 17:51:43 +01:00
IliesAllaliandClaude Opus 5.5 d0ab96d634 Pastilles : emoji entier en initiale (arbre, compte, personne) ; fiche : message clair quand les droits ont été retirés
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 17:35:31 +01:00
IliesAllaliandClaude Opus 5.5 bff3f54b00 Chercher quelqu'un ailleurs : panneau à droite de l'arbre
Entrée « Quelqu'un ailleurs » dans le menu +. On tape un nom, une année et un lieu.
Liens préremplis vers Gallica, FranceArchives, Mémoire des hommes, Léonore, Geneanet,
Open Archives, WikiTree, FreeBMD et FamilySearch, ouverts par le navigateur.
Le serveur interroge les décès INSEE depuis 1970 (matchID) et WikiTree quand
SEARCH_SOURCES les nomme ; MATCHID_TOKEN au-delà d'une centaine de recherches.
Un résultat ajouté ne remplit que les champs vides, passe la personne à vérifier
et garde la source dans sa note.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 17:33:41 +01:00
IliesAllaliandClaude Opus 5.5 aa50123e9f Paramètres : cinq onglets qui tiennent à 360 px
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 17:20:19 +01:00
IliesAllaliandClaude Opus 5.5 9221f8b63f CHANGELOG : 1.5.0, co-gestion et correctifs de la fiche
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 17:05:11 +01:00
IliesAllaliandClaude Opus 5.5 07d69896ae Co-gestion (#145), écrans : onglet Gestion, page du lien d'invitation, Quitter pour le co-gestionnaire, avertissement à la suppression du compte, Immich caché
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 16:57:57 +01:00
IliesAllaliandClaude Opus 5.5 ac9c33d43f Co-gestion (#145), revue de droits : Immich réservé au propriétaire, retrait qui coupe aussi l'accès par le partage, rattachement OIDC sur l'adresse du compte
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 16:57:11 +01:00
IliesAllaliandClaude Opus 5.5 5be134e0e6 Co-gestion d'un arbre (#145) : invitations, rattachement OIDC sur email vérifié, compte ouvert par invitation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 16:57:11 +01:00
IliesAllaliandClaude Opus 5.5 befe8fe19a « À vérifier » : drawPortrait, et un test qui échoue si la marque repasse sous la découpe du cadre
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 16:57:10 +01:00
IliesAllaliandClaude Opus 5.5 230ec2ae05 Fiche : « Modifier » d'un clic pour l'administrateur ; « à vérifier » entier sur un cadre rond ; arbre jusqu'en bas de l'écran sur iPad
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 16:36:41 +01:00
IliesAllaliandClaude Opus 5.5 387029f4e7 1.4.0 : changelog
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 16:29:36 +02:00
IliesAllaliandClaude Opus 5.5 aa22ff1422 Souvenirs en orbite recadrés, plus étirés dans leur carré
Retour de Patch du 23/10 sur l'arbre d'Anaïs : les vignettes de souvenirs autour des portraits
étaient « souvent tassées horizontalement ou verticalement ». drawMediaContent étirait la photo
dans le carré quel que soit son format ; elle passe par drawImageCover, le recadrage centré
des portraits.

Vérifié ailleurs, rien à corriger : fiche, liste et gestion des souvenirs, onglet Vie, moments,
propositions et Immich sont déjà en object-fit cover, la visionneuse en contain, les photos
posées sur l'arbre gardent leur rapport.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 16:05:04 +02:00
IliesAllali 8fe2f53b34 Merge remote-tracking branch 'origin/main' into feat/a-verifier 2026-10-23 15:27:25 +02:00
IliesAllali 93a5e41794 Merge remote-tracking branch 'origin/main' into fix/annotations-ancrees
# Conflicts:
#	frontend/src/App.jsx
#	frontend/src/components/Galaxy.jsx
2026-10-23 15:24:46 +02:00
IliesAllali fb176c0cc6 Merge remote-tracking branch 'origin/main' into feat/a-verifier 2026-10-23 15:18:38 +02:00
IliesAllali d579c4a34b Merge remote-tracking branch 'origin/main' into fix/annotations-ancrees 2026-10-23 15:18:35 +02:00