- Sur une chaîne de remariage où l'enfant de la lignée est à un bout, toute la suite de conjoints (ex-époux
compris) part du côté de la belle-famille et l'enfant reste du côté de ses frères et sœurs.
- La rangée des parents n'est plus réservée que sur la moitié de l'enfant : la carte de famille peut se
poser juste au-dessus du conjoint.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- Un cluster se range du côté où son conjoint se trouve dans la lignée principale (seconde passe si la
première construction l'avait mis de l'autre côté) ; le couple se tourne vers sa famille.
- La carte de famille se pose au plus près au-dessus du conjoint, en préférant le côté de sa famille.
- La carte inverse réserve sa place sous l'écho du conjoint dans le cluster (plus de chevauchement).
- La reconstruction d'un cluster ne laisse aucune trace (clusters imbriqués, chaînes posées, arêtes
externes) : 0 chevauchement sur l'arbre réel, 8 à 0 sur asc-3.
- Bandeau à l'écran avec le nom et la taille de la famille où l'on est.
- Carte des familles : bascule nette sous une échelle, sans fondu ni glissement ; famille principale au
milieu, familles par alliance en colonne de leur côté, traits de bloc à bloc avec les prénoms du mariage.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Retours de Patch : pas d'animation, familles rangées comme sur le schéma, lien
plus naturel, bloc calculé dans l'arbre et non dessiné par-dessus.
- Le placement donne à chaque famille sa place réelle et sa place sur la
carte (autour de la famille principale, en coordonnées de l'arbre).
- Passé le seuil de dézoom, une famille par alliance se replie net en son
bloc, qui glisse de sa place réelle vers sa place sur la carte à mesure
qu'on dézoome ; plus bas, la famille principale se replie aussi. Plus de
fondu, plus de clic sur les blocs.
- Les traits entre familles vont de bord à bord, avec les deux prénoms du
mariage. Le pont d'une carte de famille est un fil plein.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Maquette J retenue par Patch le 19/10 (« quand on dézoome pas mal, une
famille devient un gros bloc »). Entre les échelles 0,3 et 0,2 l'arbre
s'efface et les tuiles apparaissent : une par famille (la lignée principale
et chaque cluster), de taille constante à l'écran, avec le nom, six
portraits et le nombre de personnes ; un trait par mariage entre familles,
avec le prénom de la personne qui relie. Les tuiles se rangent autour de la
famille principale à distance d'écran fixe, quel que soit l'éloignement réel
des familles sur la toile. Un clic sur une tuile s'approche de la famille
(même mécanique que les pastilles). Le placement expose `result.families`.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Patch a écarté le plan arrière (« beaucoup trop d'infos, 150 personnes en
plus, illisible ») et retenu la maquette A. Une belle-famille plus large que
deux écrans devient un cluster dessiné à part, sur les mêmes rangées, par le
même placement. À sa place, au-dessus du conjoint, une carte de famille
(nom, quatre portraits, nombre de personnes) reliée à lui par un pont en
pointillé. Dans le cluster, le conjoint apparaît dans sa fratrie (écho de
la même personne) avec, sous lui, la carte inverse de la lignée qu'il a
rejointe. Un clic sur une carte mène de l'autre côté (même mécanique que
les pastilles). Le fil des parents vers le conjoint du plan principal est
masqué, il va à l'écho.
Nouveau type de nœud « family » dans le placement et le rendu, deux
constantes de carte, deux textes anglais. Le plan arrière et son calque
sont retirés.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Maquette F retenue par Patch le 19/10 au soir. Une belle-famille plus large
que deux écrans ne se colle plus devant : elle passe sur un plan arrière,
dessinée par le même placement, à l'échelle 0,55, ancrée pour que la place
fantôme de son conjoint coïncide avec lui (ses parents juste au-dessus de
lui, en retrait). Le plan avant garde ses rangées compactes.
Rendu : le plan arrière est dessiné d'abord sur un calque (couples, fils,
nœuds à leur échelle), composé sous le plan avant à 42 % avec un léger flou.
Le rayon des nœuds, la hauteur des lignes de fratrie et le culling suivent
l'échelle du nœud. Les filiations du plan arrière et le fil des parents
arrière vers leur enfant avant ne comptent ni pour les renvois ni pour les
niveaux de lignes.
Banc : le plan avant seul est mesuré, le nombre de personnes en arrière est
compté. Famille réelle de 385 : 202 personnes derrière, plan avant à 0
croisement et 7 fils de plus d'un écran (contre 9 et 15). Prototype : pas
encore de survol, d'échange des plans ni de masquage sous les portraits.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Retours de Patch sur l'arbre réel (385 personnes) : de longs fils et des
parents séparés de leurs enfants.
- La plus grande lignée est construite d'abord (sinon une petite branche
aspirait toute la lignée principale comme « famille du conjoint »).
- Pour remonter au sommet d'une famille, on passe par le sang de la
référence quand un membre en est : on retombe sur la lignée principale,
rien à attacher, la seconde filiation reste un renvoi.
- Une famille reliée deux fois dont le fil devrait traverser plus d'un écran
devient une pastille.
- La belle-famille change de côté si l'autre côté la rapproche d'un écran
ou plus ; le couple se retourne avec elle.
- Si une belle-famille est poussée loin par les descendants du couple, le
couple se décale au bord de sa rangée d'enfants, de son côté.
- Au-dessus de chaque couple, la place de ses propres parents est réservée :
les parents du conjoint se posent à côté, pas dessus.
- Les parents qui évitent un obstacle sur leur rangée restent au-dessus de
leurs enfants plutôt que de sauter de l'autre côté.
Témoins des 14 archétypes relus. Banc : arbre réel, pastilles 0,
croisements 9 ; arbre fictif de 265, pastilles 0, croisements 1.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Retour de Patch sur un arbre de 265 personnes : les familles « posées à
part » (trop loin pour être collées) faisaient une rangée d'îlots reliés
par des pastilles. Plus aucune famille n'est posée à part : une famille
collée garde son fil, aussi long soit-il.
La belle-famille part de sa place idéale (parents juste au-dessus de
l'enfant) et est poussée vers l'extérieur : sur les rangées de l'enfant et
en dessous (sa fratrie et leurs descendants), au-delà de tout ce qui est
déjà posé, jamais sous la ligne d'une fratrie ; sur les rangées au-dessus
(ses ancêtres, de petits couples), au premier trou libre, à côté des autres
ancêtres. Plusieurs belles-familles du même côté s'emboîtent comme des
parenthèses. Une rangée de lignes de fratrie peut prendre cinq niveaux.
Banc : famille réelle de 385, pastilles 2 → 0 ; descendance fictive de
1 454, pastilles 17 → 0 ; les 14 archétypes passent leurs invariants.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Retour de Patch sur un arbre de 265 personnes : dans un remariage, la fille
de la seconde union partait au bout de la fratrie entière et la ligne de son
union passait au-dessus des enfants de la première.
- Les enfants de chaque union restent groupés dans l'ordre des unions ; une
belle-famille va du côté de son union, jamais au-delà des demi-frères.
- La chaîne se cale pour que chaque union soit au plus près au-dessus de son
groupe : on garde, parmi les alignements possibles, celui où les lignes
débordent le moins au-dessus des autres groupes.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Retours de Patch sur un arbre de 102 personnes : une famille de conjoint se
glissait dans un trou du contour entre deux frères, et celle d'un enfant du
milieu se posait entre lui et ses frères, sa ligne passant au-dessus d'eux.
- La famille d'un conjoint est construite par la chaîne de l'enfant puis
posée par le bloc du dessus, au-delà de toute l'étendue de la fratrie,
jamais dans un trou.
- L'enfant dont le conjoint amène sa famille va au bout de sa fratrie, de
son côté (l'ordre de naissance s'efface pour lui, choix de Patch), et sa
belle-famille se colle à lui sans survoler personne.
- Le côté est hérité de la lignée : toutes les belles-familles d'une branche
vont du côté où la branche est au bord de l'arbre.
- Le couple ne se tourne vers la belle-famille que si elle est vraiment
attachée (un cousin marié garde son orientation naturelle).
- Le fil d'une famille collée est toujours dessiné ; pastille seulement pour
une famille posée à part.
- Niveaux des lignes de fratrie : une ligne qui en contient une autre passe
au-dessus ; entre deux lignes qui se chevauchent, celle dont l'union est à
l'extérieur passe au-dessus (son fil n'entre qu'une fois, à l'enfant collé).
Banc : sur l'arbre de 102 personnes, pastilles 2 → 0 et croisements 3 → 0 ;
famille réelle de 385, pastilles 4 → 2 ; témoins des archétypes relus.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
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>
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>