La feuille de la fiche (PersonCard) se ferme en glissant sa poignée ou son en-tête vers le bas, comme le menu de la barre. Le geste est factorisé : logique pure dans utils/sheetDrag.js, hook dans hooks/useSheetDrag.js, utilisé aussi par NavMenu (poignée, seuil de 70 px inchangé).
- Le geste part seulement de la poignée et de l'en-tête. Jamais d'un champ de saisie, d'un libellé ni pendant une sélection de texte. Le contenu des onglets défile comme avant.
- La feuille suit le doigt (transform), ne monte jamais au-delà de sa position de repos.
- Fermeture au-delà d'un tiers de la hauteur, ou sur un lâcher rapide vers le bas. Sinon retour court.
- La fermeture passe par le même chemin que la croix (enregistrement automatique compris). Si l'enregistrement est refusé, la fiche revient et affiche son erreur.
- Mode feuille seulement (PHONE_QUERY et largeur de la feuille CSS). Sur ordinateur, rien ne change.
- prefers-reduced-motion respecté.
Tests : logique du geste (zones, direction, seuil, vitesse) en vitest. Recette Playwright iPhone 13 émulé, gestes tactiles CDP : fermeture par la poignée, retour après un petit glisser, lâcher rapide, défilement du contenu sans fermer, pas de geste depuis un champ, enregistrement puis fermeture, ordinateur inchangé, croix.
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Il n'était caché que dans le bloc téléphone : sur ordinateur on lisait « Ajouter un souvenir Souvenir ».
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Un mariage sans date tombait tout en bas de l'onglet Vie, apres le deces du
conjoint, ce qui ne voulait rien dire. Il se place maintenant juste avant le
premier enfant du couple, sinon avant la fin de l'union ou le deces du
conjoint. Aucune annee n'est inventee : colonne vide et « date inconnue ».
Seul ce qui n'a aucun repere reste en bas, et tout moment sans date le dit.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 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>
Les modifications en cours d'une fiche ne sont plus perdues quand on
change de personne, ferme la fiche, sort du mode modification, ouvre
un souvenir, ajoute une personne ou envoie les contributions.
- La fiche enregistre par le même chemin que « Enregistrer » (onSave),
pour la personne quittée. Un échec ou une validation la garde ouverte
avec le message d'erreur.
- Invité en contribution : les changements vont dans le brouillon, puis
partent avec « Envoyer ».
- Un petit message confirme l'enregistrement. Rien n'est enregistré
quand rien n'a changé, ni en démo.
- Un second enregistrement pendant l'envoi reçoit la même promesse
(utils/saveOnLeave.js), sans double appel.
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
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>
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>
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>
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>
- Démo : le bouton « Se connecter » ouvre la connexion, plus l'inscription
- Porte de l'arbre : quand la personne est connectée, un bandeau dit quel
compte est ouvert et qu'il faut taper une fois le mot de passe reçu avec
le lien. Il reste affiché au retour d'une connexion faite depuis la porte.
- Landing : lien « Se connecter » dans la navigation et le pied de page
(vers ?account=login, sans source, le rendu au build n'a pas de window)
- Libellés de la porte et de l'inscription, en français et en anglais
Vérifié : vitest 154/154, eslint frontend, vite build, landing (test et
build). La landing n'a pas de configuration eslint dans le dépôt.
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Le surnom était enregistré en base mais perdu au chargement de l'arbre :
mapRemotePersonToLocal ne le recopiait pas, donc ni l'arbre, ni la fiche,
ni la recherche ne le voyaient.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Chaque enfant avait son propre chemin depuis l'union, avec un rayon de virage
propre : sous une union nombreuse, 3 ou 4 brins se séparaient juste sous le
point d'union. Le tracé est maintenant un tronc unique, puis une barre de
fratrie qui distribue vers chaque enfant ; le rayon des virages est commun à
chaque côté, et tout part dans un seul stroke (pas de brins doublés en alpha).
Un enfant presque sous l'union descend de la barre, sans second brin depuis
l'union. Le chemin en surbrillance (path highlight) reste tracé enfant par enfant.
Vérifié à l'écran sur un arbre de test à 6 enfants (avant/après dans
_bmad-output/parenthese/renvoi/faisceau-*.png).
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
- API : nickname accepté à la création, à la modification et dans les
propositions de contribution (trim, vide = null, 120 caractères max)
- Mode direct et circuit des contributions : même validation, avant/après
- Édition et ajout : champ « Surnom » facultatif
- Arbre : surnom en italique sous le nom, coupé avec … au-delà de 150 px
- Recherche : trouve une personne par son surnom (libellé « Surnom »)
- Démo : surnoms sur Marie et Robert
Vérifié : lint, tests (front 159, back 224), builds (front, back tsc, landing).
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Une filiation vers un enfant placé sous l'autre lignée devenait un renvoi
(pastilles) dès que l'écart union → enfant dépassait 360 px, même quand le fil
ne croisait personne. Le critère est maintenant géométrique : le fil file sur la
ligne de la fratrie entre l'aplomb de l'union et l'enfant ; il ne devient renvoi
que si une personne d'une autre famille se trouve sur cette ligne. Frères et
sœurs et conjoint(e)s de l'enfant ne comptent pas.
Tests : cas à fratrie voisine (fil conservé), et filCroiseAutreFamille sur des
nœuds synthétiques (autre famille, fratrie seule, conjoint, autre génération).
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
- Deux parents d'un même enfant sans couple enregistré sont reliés en pointillés au lieu
d'avoir chacun un « Inconnu » (couple propre au dessin, rien en base) ; le tri de la
fratrie le reconnaît.
- Barre d'édition mobile : X, « Ajouter » et « Plus » (dessin, texte, sticker, photo).
Les outils s'ouvrent depuis « Plus » avec un retour, la corbeille n'apparaît que s'il y a
quelque chose à effacer, l'outil actif en aplat. La barre ne passe plus sous le zoom.
- Bandeau d'édition : sur téléphone, seul le bouton reste, le texte se coupait.
- Dates : au-delà de 4 chiffres les barres se posent seules (12031950 → 12/03/1950), le
message n'apparaît qu'en quittant le champ.
- Ajouter une personne : plus d'erreur « prénom » en quittant le champ vide, le bouton
reste actif et le dit à l'appui.
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
- Champ de date de la fiche et du formulaire « Ajouter quelqu'un » : une annee seule
(1950) ou une date complete (12/03/1950), une aide si le texte n'en est pas une.
L'annee seule s'affiche « 1950 » et non plus « 1 janvier 1950 ».
- Statut « Decede(e) » sans date : persons.isDeceased (migration additive), « 1908–? »
sous le portrait, « Date inconnue » dans la fiche, en bas de la frise. Import de
« 1 DEAT Y », export en « 1 DEAT Y ». Une date de deces retire le drapeau.
- Parents : plus de « (null) » quand l'union n'a pas de type.
Closes#77
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>