Variante C validée : une seule pilule en bas à droite (+ et compte), le
zoom reste à gauche. Le « Plus » et le second crayon disparaissent.
- « + » : Ajouter (souvenir, personne, mot ou dessin) et Corriger
(proposer des changements, modifier l'arbre, modifier la démo).
- Rond du compte : identité, propositions à relire (pastille), arbres,
paramètres, aide et langue sur une ligne, déconnexion. Sans compte :
se connecter, créer mon arbre, aide, langue.
- Téléphone (moins de 768 px ou pointeur grossier) : feuille qui monte
du bas, voile, poignée glissable. Ordinateur : popover ancré à la pilule.
- Barre d'annotation mobile conservée ; « Ajouter » et « Plus » ne font
plus qu'un bouton.
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Onze connexions avec vérification bcrypt dépassaient parfois 5 s sur la CI : quatre échecs le 18/10 sans lien avec les changements.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Le test de fumee supprime son arbre a la fin : le controle partait d'une base
sans arbre. Il cree maintenant un compte, un arbre et une personne par l'API.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Avec l'onglet Infos qui n'affiche que les champs remplis (#93), vider un champ pour le retaper le faisait disparaître sous les doigts, et la frappe partait dans le champ suivant.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sous 420 px, « Ajouter un souvenir » et « Ajouter une personne » passaient
sur deux lignes : « Souvenir » et « Personne » tiennent sur une ligne. Le
libellé complet reste en aria-label et en title.
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
- La CI joue les commandes de sauvegarde et de restauration du README sur une
vraie installation compose (base videe, medias effaces) et verifie comptes,
arbres, personnes, migrations et fichiers (tools/docker-restore-check.sh).
- README : restauration avec --if-exists, sinon pg_restore echoue sur une
base vide. Sauvegarde avant chaque mise a jour, dite clairement.
- Image tout-en-un : copie de la base dans /data/backups avant d'appliquer une
migration (5 gardees), demarrage arrete si la copie echoue.
- backup.sh : l'empreinte d'une archive de medias gardee disparaissait avec la
rotation des fichiers d'empreintes, elle est recalculee.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Un fichier abime pouvait marier une personne a elle-meme ou faire de
quelqu'un son propre ancetre, ce que l'API refuse partout ailleurs. Le
controle se fait en memoire pendant l'import (les validateurs relisent tout
l'arbre a chaque lien), et la reponse compte les relations ecartees
(relationsSkipped).
Premier test de la route d'import.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
La purge des visites de plus d'un an ne passait qu'a l'ouverture de l'onglet
Visites par un administrateur : un arbre jamais consulte gardait tout. Elle
passe aussi a l'enregistrement d'une visite, au plus une fois par heure, pour
tous les arbres.
A la suppression d'un compte, ses visites d'autres arbres gardaient son
identifiant dans la cle du visiteur : elles restent comptees, sous une cle
anonyme.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Un reseau mobile qui decroche laissait l'app en chargement pour toujours.
30 s par appel, 5 min pour un envoi de fichier (corps de plus de 100 Ko),
3 min pour un import GEDCOM. Le message dit que le serveur ne repond pas.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Positions des noeuds et ensembles de recherche ou de chemin etaient recalcules
60 fois par seconde meme quand rien ne bougeait. Ils ne le sont plus que pour
une image a redessiner (ensemble de recherche construit a son changement).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Une erreur au milieu laissait un etat partiel, et un nouvel essai du client
recreait des doublons.
- Lot d'annotations : creations, modifications, suppressions et trace.
- Moments : session de contribution, moment, souvenirs rattaches et trace ;
modification et suppression d'un moment avec ses souvenirs.
- Reordonnancement des souvenirs d'une personne.
- La famille ne rattache a son moment que des souvenirs libres : elle ne
detache plus un souvenir du moment d'un administrateur.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Un fichier dont chaque fiche cite une note ou une source enorme faisait relire
ce texte pour chaque personne : environ 35 min de calcul pour 20 000 fiches,
0,1 s maintenant (memo par noeud, pour la duree de l'import).
- La lecture des medias ne descend que dans les branches qui menent a un
fichier, avec un budget par personne et une profondeur bornee.
- Les niveaux au-dela de 99 (limite de la norme) sont ignores : une chaine de
sources faisait deborder la pile.
- Les notes ne sont calculees que pour une personne creee, pas reutilisee.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
La hauteur venait du contenu : une photo réelle a une taille propre et le portrait grandissait jusqu'à écraser les champs nom. Taille calculée depuis la hauteur des deux champs.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
L'invité a le crayon du propriétaire dans la barre du bas, avant « Plus ».
Le bandeau du mode contribution dit « Vous proposez » (« Vous proposez des
changements » sur ordinateur), sur une seule ligne, avec « Envoyer ».
Le propriétaire ne voit aucun changement.
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Conflit dans PersonCard : hasChanges vient maintenant de l'état de saisie rattaché à la personne (#91), lastNameMissing est gardé.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Le cadrage (centre et zoom) est stocké dans Person.avatarCrop (JSON, nullable),
l'original reste sur disque et le cadrage s'applique à l'affichage (canevas et fiche).
Route PUT /trees/:id/persons/:personId/avatar/crop, réservée aux administrateurs.
La suppression et le nouvel envoi remettent le cadrage à zéro.
Migration additive (colonne nullable, sans défaut), testée sur base vide et sur base avec données.
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
- Fiche en modification : le portrait prend la hauteur des champs Prénom et Nom (écart compris), carré (align-self stretch + aspect-ratio 1)
- Landing, téléphone (≤ 820 px) : symbole du logo seul, nom accessible « Parenthèse, accueil » conservé
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Un administrateur, en mode modification, peut modifier un souvenir depuis la visionneuse : crayon à droite du titre (visible au survol sur ordinateur, toujours visible sur écran tactile), formulaire Titre et Moment de sa vie, texte de la citation réécrit dans caption et dans le fichier citation.txt.
Route PATCH /trees/:id/persons/:personId/media/:mediaId, réservée aux administrateurs. Pas de migration : la date vient du moment de vie rattaché. La légende séparée n'existe pas en base et n'est pas ajoutée.
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
- Fiche : pastille Édition retirée ; case « Je ne connais pas son prénom » sur une ligne pleine largeur ; badge caméra « Changer la photo » sur le portrait (même choix de source)
- Landing : « Se connecter » en bouton blanc sans contour, icône de profil ; sur téléphone, icône ronde seule avec aria-label
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
- Fiche : nom, puis une ligne « surnom · repères de vie · âge » (point médian, sans pastille d'âge)
- Portrait vide : icône seule, avec aria-label et title « Ajouter une photo »
- Partage : message replié (copie directe, « Voir ou modifier le message »), sur-titre retiré
- Landing : « Se connecter » en bouton secondaire à gauche de « Créer mon arbre », masqué sur téléphone
- Bannière « Votre arbre est créé. » dans la DA (carte pz, Newsreader, bouton pilule)
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
En changeant de fiche sans enregistrer, le premier rendu de la nouvelle fiche voyait encore les
modifications de l'ancienne. DateField initialise son texte à ce moment-là et le gardait : la date
tapée pour une personne s'affichait sur l'autre, et partait avec elle si on enregistrait.
Les modifications en cours sont maintenant rattachées à la personne qu'elles concernent.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sous deux rayons d'écart, deux coins de 24 px ne tenaient pas : le fil faisait une petite marche.
Le tronc descend jusqu'à la barre et un S vertical au départ et à l'arrivée rejoint l'enfant.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Nom de famille facultatif : une personne garde au moins un prénom ou un nom
(API, contributions, fiche, formulaire). Contributions : seule une personne
sans aucun nom est ignorée.
- Case « Je ne connais pas son prénom » visible seulement si le prénom est vide
(ou cochée), placée sous le champ Prénom.
- Panneau d'ajout : sans sur-titres en capitales.
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
- Backend : prénom du compte facultatif à l'inscription (colonne users.firstName,
migration additive), renvoyé à l'inscription, à la connexion et sur GET /auth/me
- Accueil sans session : deux choix (J'ai reçu un lien, Se connecter) et
Créer mon arbre en lien, à la place de la démo (variante B validée)
- Porte : mot de passe puis prénom facultatif pour un nouveau venu ; compte
connecté non rattaché : bandeau avec son prénom, sans champ prénom, et
« Ce n'est pas mon compte » (déconnexion, retour à la porte du même arbre)
- Sur-titre « Arbre partagé » retiré de la porte
- Compte déjà rattaché : inchangé, la racine ouvre l'arbre directement
Vérifié : vitest front 154/154, back 228/228 (sans .env local, le test CORS
attend localhost:5173), tsc back, eslint front, vite build, landing test et build.
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
- Prénom inconnu : case « Je ne connais pas son prénom » à l'ajout et en
modification. Enregistré comme prénom vide, affiché « Prénom inconnu »
en italique (arbre, fiche, recherche). Pas de migration.
- Export GEDCOM : « 1 NAME /Nom/ » sans prénom. Import : prénom absent
= vide (au lieu de « ? »).
- Cliquer une personne pendant un ajout ferme le panneau d'ajout ; sa
saisie reste en mémoire comme à la fermeture par la croix.
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Remplace le virage quadratique par une accolade à coins arrondis de rayon fixe
(24 px) : un tronc depuis l'union, une barre de fratrie, puis une descente
vers chaque enfant. Un enfant à l'aplomb de l'union descend droit. Le chemin
surligné (sélection, survol) passe par la même géométrie que la fratrie.
Tests unitaires de traceSibship (un chemin et un stroke par fratrie, même
géométrie pour un enfant seul, pas de virage à l'aplomb).
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>