Avant, la famille d'un conjoint (ses parents, sa fratrie, ses ancêtres)
était posée au premier créneau libre, souvent au bout de l'arbre, et la
filiation devenait une pastille « Voir ». L'arbre se lisait comme plusieurs
arbres reliés par des pastilles.
Maintenant chaque famille de conjoint est construite entière depuis son
ancêtre le plus haut et collée au conjoint, de son côté, en poussant les
voisins pour faire la place. Le conjoint est tourné vers l'extérieur de sa
fratrie ; sa propre fratrie est dessinée en miroir s'il faut qu'il finisse
au bout, contre le couple ; un enfant déjà dessiné ailleurs garde une place
fantôme dans l'ordre de sa fratrie pour le centrage. Les lignées de la
personne de référence sont dessinées d'abord (le sang gagne) ; une famille
reliée deux fois (cousins, deux grandes lignées) n'est dessinée qu'une fois,
l'autre filiation reste une pastille si son fil croiserait une famille ; une
famille qu'il faudrait pousser de plus d'un écran est posée à part. L'ordre
des lignées ne dépend plus des effectifs (rangée, année, identifiant).
Les lignes de fratrie s'emboîtent : la ligne d'une famille qui en entoure
une autre passe au-dessus (_railLift posé par le placement, plus de hachage),
plus aucune superposition.
Mesuré par le banc (tools/layout-bench) : pastilles 4 → 2 sur une famille
réelle de 385 personnes, 78 → 12 sur une descendance fictive de 1 454 ;
les 14 archétypes passent leurs invariants, Marc et Nadia et l'issue #67
sans aucune pastille ni croisement.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Le banc mesure maintenant le code de production (computeBlockLayout), sans
écran, en quatre étages lus dans l'ordre et jamais additionnés :
- invariants qui doivent valoir zéro (chevauchement, couple non adjacent,
fratrie coupée ou hors de l'ordre choisi, rangée différente de la génération
de parenté recalculée ici, années de naissance qui redescendent) ;
- défauts comptés sur la géométrie vraiment dessinée (renvois, lignes de
fratrie au-dessus d'un portrait étranger, croisements, lignes et foyers plus
larges qu'un écran, proches de la référence visibles dans un écran) ;
- quatorze archétypes (ordre d'une fratrie, issue #67, branche courte, Marc et
Nadia, petit conjoint, fratrie de douze, remariage, cousins, oncle et nièce,
parent seul, adoption, deux familles, belle-famille, trois familles
enchaînées) rendus en texte, témoins dans __snapshots__/archetypes, testés
par vitest ; deux échecs connus (belle-famille, trois-belles-familles) en
attendant la règle « le sang de la référence garde son enfant » ;
- stabilité : retirer une feuille ne devrait déplacer que son foyer.
Les modèles ELK écartés en septembre, elk-common et l'ancienne mesure sur
segments droits sont supprimés, avec la dépendance elkjs. Le générateur
d'arbres fictifs (gen-fr.mjs) entre dans le dépôt ; les arbres réels restent
dans fixtures/, ignoré par git.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
La génération était comptée depuis le haut de chaque branche (profondeur sous
l'ancêtre le plus ancien documenté). Une branche courte mariée dans une branche
longue n'était tirée vers le bas qu'à une seule personne : ses parents, frères et
cousins restaient en haut, 3 à 6 rangées au-dessus de leur vraie génération
(26 % des personnes sur un arbre de 385, 35 % sur une descendance fictive de
1 454). L'issue #67 en était le symptôme en petit.
Les conjoints sont soudés, puis chaque foyer est visité en largeur depuis le
foyer de la personne de référence (rootPersonId, sinon la personne la plus
entourée) : parents une rangée au-dessus, enfants une rangée en dessous. Une
filiation en conflit (cousins de degrés différents, oncle et nièce) est comptée
dans generationConflicts et dessinée telle quelle. Une famille non reliée est
calée par ses années de naissance, sinon posée en haut.
Vérifié sans écran : sur les arbres de test, rangée dessinée = génération de
parenté pour 100 % des personnes hors conflits, et les médianes des années de
naissance montent de 25 à 35 ans par rangée. Sur le tracé réel, croisements
51 → 22 (descendance fictive), 129 → 25 (pres2020), 362 → 115 (royal92).
Closes#67
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Sur telephone, la banniere « Mettre a jour l'arbre » descend sous le champ de
recherche et passait devant ses resultats : on ne pouvait plus toucher une
personne trouvee. La recherche ouverte passe devant la banniere et le bouton
« Creer mon arbre », les panneaux d'ajout restent devant.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sur l'arbre, un clic ou un tap sur le cadre « + photo » (portrait vide,
propriétaire) ouvre le sélecteur de fichiers tout de suite, dans le geste
de l'utilisateur, puis la fenêtre de recadrage. La fiche s'ouvre aussi.
- renderers : zones « + photo » enregistrées au dessin, comme les pastilles de renvoi
- hook de clic : la zone passe avant la sélection de la personne
- administrateur avec Immich configuré en modification : le menu des sources
s'ouvre dans la fiche, comme le badge
- PersonCard : l'effet qui lit la config Immich ne dépend plus de l'identité
de onImmichChange (recréée à chaque rendu, il refermait le menu)
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Le cadre suivait le format de la photo : une photo couchee donnait toujours un
cadre couche. Le recadrage propose maintenant les cinq formes de l'arbre, en
dessin, et la forme choisie est gardee avec le cadrage (avatarCrop.shape, sans
migration). L'arbre la respecte ; sans choix, rien ne change.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Dans « Mes arbres », l'arbre en cours s'affichait grisé comme un élément désactivé. Il garde maintenant sa couleur normale, avec une coche terracotta, et reste non cliquable.
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
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>
- Rangées : le calage des ancêtres sans parents tourne jusqu'à stabilité. Un enfant descendu par son
conjoint fait descendre ses parents et sa fratrie, au lieu de pendre plusieurs rangées sous eux.
- Couples : quand les deux conjoints ont leurs parents dans l'arbre et sont chacun du côté de la famille
de l'autre, on les intervertit (même place, l'union au milieu). Les deux fils ne se croisent plus.
- Fil : les conjoints des frères et sœurs ne comptent plus comme une autre famille dans le test du renvoi.
Un petit conjoint collé à un frère faisait passer le fil en pastille « Voir les parents ».
Co-Authored-By: Claude Opus 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>
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>