534 Commits
Author SHA1 Message Date
IliesAllaliandClaude Opus 5.5 7a6a3a0942 Arbre sans personne de départ : ouverture sur le portrait le plus proche du centre
Le cadrage de l'étape 5 s'appuyait sur la personne de départ, absente de
certains arbres réels : on retombait sur l'arbre entier illisible.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 19:03:37 +02:00
IliesAllaliandClaude Opus 5.5 9e810fd844 Famille arrivée par le lien : accueil, ajout guidé, mode d'emploi
Replays du 24/09 : personne ne trouvait comment ajouter. Pour qu'une
grand-mère s'en sorte seule depuis un lien :

- arbre ouvert zoomé sur la personne de départ quand il est trop grand
  pour être lisible en entier, sans fiche ouverte par-dessus
- carte d'accueil de deux phrases, une seule fois par arbre
- barre du bas en toutes lettres : Ajouter un souvenir, Ajouter une
  personne, Plus (dessin, mode d'emploi, compte)
- « Pour qui ? » : recherche par prénom avec portraits, puis les souvenirs
  de la personne ; panneau simplifié pour la famille
- une personne ajoutée part tout de suite à l'envoi (prénom, un mot)
- fiche ouverte sur Souvenirs avec le bouton, dates en toutes lettres
- bandeau d'envoi masqué tant qu'il n'y a rien à envoyer
- portraits de l'arbre perdus après un rechargement sans nouveau
  placement : horodatage stable et images rechargées à chaque données
- page parenthese.io/aide/ avec captures de l'arbre de démo, liée depuis
  l'accueil, le menu Plus et le message d'invitation

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 18:51:45 +02:00
IliesAllaliandClaude Opus 5.5 5fc0c08c1c Journal des visites, recherche qui mène à la personne, croix de retour à l'arbre
- Visites : chaque ouverture de l'arbre est notée (prénom facultatif demandé avec le mot de passe, appareil, compte), sans adresse IP, effacée après un an ; onglet Visites dans les paramètres, réservé aux administrateurs
- Recherche : un résultat choisi recentre l'arbre sur la personne, la liste se replie
- Écran de compte ouvert depuis l'arbre : croix pour y revenir
- Enfant presque sous l'union : trait direct au lieu d'un petit S
- Page vie privée : paragraphe sur les visites

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 18:44:07 +02:00
IliesAllaliandClaude Opus 5.5 8a63943497 Arbre : conjoints isolés en petit, renvoi vers les parents, fil en accolade
- Conjoint marié sans parent ni enfant dans l'arbre : petit portrait collé à son partenaire, sans emplacement de nœud ni orbite
- Enfant placé sous l'autre lignée : pastilles « Voir les parents » et « Voir <prénom> » cliquables au lieu du trait qui traverse l'arbre
- Fil terracotta clair en accolade arrondie, union marquée du rond terracotta

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 18:07:56 +02:00
IliesAllaliandClaude Opus 5.5 92a4e5e1b9 Invitation de la famille : mot de passe toujours à jour, message prêt à copier
Le panneau du propriétaire affichait la copie gardée par le navigateur où le
mot de passe avait été défini : changé depuis un autre appareil, il montrait
l'ancien. Le serveur garde maintenant le mot de passe de partage chiffré
(AES-256-GCM, clé dérivée de JWT_SECRET) dans une table à part, pour ne pas
toucher la version des accès déjà ouverts.

- GET /trees/:id/access/passwords : le mot de passe en vigueur, admin seulement
- POST .../remember : arbres d'avant, le propriétaire saisit celui déjà donné,
  vérifié contre les hash, retenu sans rien changer aux accès
- rotation à deux mots de passe distincts : plus de valeur lisible
- anciennes copies locales effacées à l'ouverture du panneau
- message d'invitation (lien, mot de passe, une phrase) modifiable et à copier

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 17:18:18 +02:00
IliesAllaliandClaude Opus 5.5 8bfc78b2f5 Contributions fiables : prénom, mot d'accompagnement, liens gardés
- Prénom demandé à l'envoi d'une contribution et d'un souvenir, retenu
  sur l'appareil pour la fois suivante (submittedByLabel). Le propriétaire
  lit « par Camille » au lieu de « par Contributeur ».
- Mot d'accompagnement enregistré (ContributionSession.comment, migration
  additive) et affiché à la relecture.
- Une personne ajoutée par la famille garde ses liens : identifiant
  provisoire « tmp:… » remplacé par le vrai id à l'application ; un lien
  vers une personne refusée est écarté au lieu de faire échouer la
  relecture. Frère ou sœur : parents calculés aussi pour la famille.
- Soumission et relecture en transaction, appliquées dans l'ordre
  personnes, unions, liens : tout ou rien.
- Bouton « Ajouter une personne » pour la famille sur ordinateur ; après
  l'ajout, le panneau se ferme et un message confirme que la personne est
  dans les modifications ; il ne réapparaît plus au retour en édition.
- Relecture : les liens se lisent « Léon, enfant de Marc ».

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 13:52:23 +02:00
IliesAllaliandClaude Opus 5.5 66752aa1b6 Souvenirs de la famille : envoyés en attente, visibles après relecture
Un membre de la famille (lien de partage ou membre non administrateur)
peut maintenant envoyer une photo, une vidéo, une voix ou une citation.
Le serveur la stocke « en attente » et crée une contribution d'une ligne,
qui arrive dans « Propositions à relire » avec l'aperçu de la photo.
Accepter la rend visible, refuser la masque. En mode « application
immédiate », elle est visible tout de suite.

- Migration additive : MediaItem.status (approved par défaut, tout
  l'existant reste visible), MediaItem.contributionSessionId, valeur
  « media » dans ContributionEntityType.
- Graphe, statistiques, ordre des souvenirs : souvenirs acceptés seuls.
- Relecture d'une session contenant un dessin : ne plante plus
  (l'annotation tombait dans la branche des liens).
- App : message « Merci, c'est envoyé » après un envoi en attente ;
  réordonner, supprimer et changer la photo de profil réservés au
  propriétaire (le serveur les refuse aux autres).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 13:20:12 +02:00
IliesAllaliandClaude Opus 5.5 84ac4e1171 Un seul mot de passe de partage : regarder et proposer
Le déverrouillage ouvre toujours en contributeur, quel que soit le mot de
passe tapé : les deux mots de passe déjà envoyés aux familles continuent
de marcher. Les jetons et accès « visitor » existants peuvent proposer
sans rien ressaisir. La rotation accepte un mot de passe unique, écrit
dans les deux colonnes (pas de migration). Côté app, un nouvel arbre
reçoit un seul mot de passe, gardé dans le navigateur du propriétaire,
et le panneau de partage n'affiche plus qu'un champ, avec Copier.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 12:57:13 +02:00
IliesAllaliandClaude Opus 5.5 52573cdc9f Landing : visuel du hero ramené à ~1,3 fois sa taille d'origine
Débordement limité à 80 px à droite, hauteur 480 à 560 px.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 12:29:08 +02:00
IliesAllaliandClaude Opus 5.5 98b3b39940 Arrivée du logo sur la landing, une fois par visite
Les parenthèses s'ouvrent, le rond se pose, le nom suit (700 ms). Le logo
de l'en-tête passe en SVG en ligne (tracés du logo validé, nom arrondi au
dixième). La décision « première page de la session » est prise dans le
<head> avant le premier affichage : pas de clignotement, HTML prérendu
inchangé. Rien si « réduire les animations » est activé.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 12:23:24 +02:00
IliesAllaliandClaude Opus 5.5 6d2f681307 Landing : visuel du hero agrandi sur ordinateur
Le canvas déborde sur la marge droite jusqu'au bord de l'écran (garde de 24 px)
et monte à 700 px de haut. Environ 1,7 fois plus grand en 1920 px, sans coupure
de 1024 à 1920 px ; mobile et tablette inchangés.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 12:21:36 +02:00
IliesAllaliandClaude Opus 5.5 7be0748042 Guides : FAQ cousinade, gratuité Geneanet et MyHeritage, typographie
Cousinade : quatre questions ajoutées (qui inviter, budget, repas, activités), title
recentré sur la recherche. Comparatif : ce qui est gratuit et payant chez Geneanet et
MyHeritage, d'après leurs pages tarifs officielles au 25/09/2026. Deux-points et
« galaxie » retirés du texte des anciens guides, espaces insécables avant ? ! ; et
dans les guillemets.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 12:21:36 +02:00
IliesAllaliandClaude Opus 5.5 afe4a6a6d1 Le rond qui attend : le symbole du logo devient l'indicateur de chargement
Pendant une attente, le rond se divise en trois points qui respirent,
puis se referme avec un léger rebond quand c'est prêt.

- App : écran de démarrage (BootLoader, visible seulement au-delà de 400 ms,
  au moins 900 ms pour ne pas clignoter), remplace « Chargement de l'arbre
  généalogique... ».
- App : les boutons en attente (Création…, Envoi…, Un instant…) montrent
  trois points à la place du libellé, largeur figée, texte gardé pour les
  lecteurs d'écran (PzBusy).
- Landing : chargement de la démo intégrée.
- Réduire les animations : points sur place, fondu seul.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 12:12:58 +02:00
IliesAllali 629bde5dbc Merge branch 'seo/integration' 2026-09-25 12:08:26 +02:00
IliesAllaliandClaude Opus 5.5 f356d1c932 SEO : pieds de page des guides unifiés, restes de Bradford retirés
Chaque page statique liste désormais tous les guides, y compris les deux nouveaux.
Retire la déclaration Bradford et la palette cosmos de Tailwind, l'alias @fonts
de Vite et les .ttf Bradford du frontend, plus utilisés nulle part.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 12:07:00 +02:00
IliesAllali 066f3d4935 Merge branch 'seo/4-comment-faire' into seo/integration 2026-09-25 12:02:33 +02:00
IliesAllali b93f651e8c Merge branch 'seo/3-modele-vierge' into seo/integration 2026-09-25 12:02:32 +02:00
IliesAllali af750c6509 Merge branch 'seo/2-guides-da' into seo/integration 2026-09-25 12:02:32 +02:00
IliesAllali c1bcb57ed5 Merge branch 'seo/1-landing' into seo/integration 2026-09-25 12:02:31 +02:00
IliesAllaliandClaude Opus 5.5 38d1bc4568 Page modèles d'arbre généalogique à remplir, 5 PDF A4 vierges
Nouvelle page /arbre-genealogique-a-remplir/ (point 3 de l'audit SEO) :
modèles 3 générations, 3 générations avec photos, 4 générations paysage,
5 générations en éventail et arbre dessiné, avec aperçus WebP, section
pour les remplir, renvoi vers la version en ligne et FAQ (JSON-LD).
Gabarits et script de génération Playwright dans landing/modeles/.
Entrée ajoutée au sitemap et au tableau GUIDES de la landing.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 11:49:11 +02:00
IliesAllaliandClaude Opus 5.5 5f1c3d41f0 Guide « comment faire un arbre généalogique » (audit SEO point 4)
Nouvelle page statique /comment-faire-un-arbre-genealogique/ : sept étapes,
section papier, logiciel ou en ligne, place de Parenthèse, FAQ reprenant
les questions Google, JSON-LD Article, HowTo et FAQPage. Balisage aligné
sur la nouvelle DA des guides (polices, logo, theme-color). Ajout au
sitemap et au tableau GUIDES de la landing.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 11:43:48 +02:00
IliesAllaliandClaude Opus 5.5 ffc2db759c Guides statiques : passage à la DA terracotta
Les 5 pages de landing/public reprennent les tokens, typos et boutons de la
landing (fond grège, encre, accent terracotta, Newsreader + DM Sans chargées
par Google Fonts). Logo du header remplacé par /logo.svg, theme-color à
#FBFAF7. Suppression des polices Bradford de landing/public/fonts, qui
n'étaient plus référencées que par guides.css.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 11:42:37 +02:00
IliesAllaliandClaude Opus 5.5 70af00e636 Landing prérendue à la compilation et textes orientés arbre généalogique
- Textes de la landing (pastille, lede, H2 des étapes, de la démo et des guides, Pour qui)
  et métadonnées og/twitter/JSON-LD sans « galaxie »
- npm run build fait le build client, un build SSR (src/entry-server.jsx, renderToString)
  puis scripts/prerender.mjs injecte le HTML dans dist/index.html ; hydrateRoot côté client
- Rendu serveur sans accès window : source et isMobile posés après montage
- noscript rend visibles les blocs data-reveal sans JavaScript
- App : robots.txt en Allow pour que la meta noindex soit lue

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 11:41:47 +02:00
IliesAllaliandClaude Opus 5.5 5b5636e1be Refonte de la direction artistique : accent terracotta, landing, app et démo
- Landing refaite : nouvelle palette claire, Newsreader et DM Sans, logo validé,
  sections (garanties, trois gestes, démo, pour qui, engagements, guides, bloc final).
  Illustration du hero conservée et recolorée, portraits alignés sur les âges.
- App : couleurs et typographie passées à la nouvelle DA, structure et fonctionnalités inchangées.
  Composants communs dans src/styles/pz.css.
- Refaits de zéro : fiche d'une personne (souvenirs, infos, liens, panneau mobile),
  connexion, création de compte, liste des arbres, accès par mot de passe, recherche,
  barre d'actions, menu du compte, zoom, et toutes les fenêtres (compte, création d'arbre,
  contributions, envoi, sortie d'édition, brouillon, ajout de personne, souvenirs, visionneuse,
  paramètres de l'arbre).
- Arbre : chaque personne garde sa forme de cadre tirée au hasard, cadre vertical pour une photo carrée.
- Démo : photos d'époque libres de droits hébergées dans public/demo (sources et licences
  dans sources.json et CREDITS.md), famille Dupont crédible, Isabelle née à Fort-de-France.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 11:21:04 +02:00
IliesAllali cf74644309 Merge pull request #3 from IliesAllali/dependabot/npm_and_yarn/backend/multi-4d0f74f969
Bump @vitest/mocker and vitest in /backend
2026-09-24 17:35:30 +02:00
dependabot[bot] 4b3de5a125 Bump @vitest/mocker and vitest in /backend
Bumps [@vitest/mocker](https://github.com/vitest-dev/vitest/tree/HEAD/packages/mocker) to 5.0.1 and updates ancestor dependency [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest). These dependencies need to be updated together.


Updates `@vitest/mocker` from 3.2.7 to 5.0.1
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md)
- [Commits](https://github.com/vitest-dev/vitest/commits/v5.0.1/packages/mocker)

Updates `vitest` from 3.2.7 to 5.0.1
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md)
- [Commits](https://github.com/vitest-dev/vitest/commits/v5.0.1/packages/vitest)

---
updated-dependencies:
- dependency-name: "@vitest/mocker"
  dependency-version: 5.0.1
  dependency-type: indirect
- dependency-name: vitest
  dependency-version: 5.0.1
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-09-24 15:22:19 +00:00
IliesAllali 9edf63849c Merge pull request #2 from IliesAllali/dependabot/npm_and_yarn/backend/multi-add08351bd
Bump esbuild and tsx in /backend
2026-09-24 17:20:17 +02:00
dependabot[bot] 51425f1c56 Bump esbuild and tsx in /backend
Bumps [esbuild](https://github.com/evanw/esbuild) to 0.28.2 and updates ancestor dependency [tsx](https://github.com/privatenumber/tsx). These dependencies need to be updated together.


Updates `esbuild` from 0.27.3 to 0.28.2
- [Release notes](https://github.com/evanw/esbuild/releases)
- [Changelog](https://github.com/evanw/esbuild/blob/main/CHANGELOG.md)
- [Commits](https://github.com/evanw/esbuild/compare/v0.27.3...v0.28.2)

Updates `tsx` from 4.21.0 to 4.23.15
- [Release notes](https://github.com/privatenumber/tsx/releases)
- [Changelog](https://github.com/privatenumber/tsx/blob/master/release.config.cjs)
- [Commits](https://github.com/privatenumber/tsx/compare/v4.21.0...v4.23.15)

---
updated-dependencies:
- dependency-name: esbuild
  dependency-version: 0.28.2
  dependency-type: indirect
- dependency-name: tsx
  dependency-version: 4.23.15
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-09-24 12:26:07 +00:00
IliesAllaliandClaude Opus 5.5 b8f42ee160 Dépendances : correctifs de sécurité, @fastify/jwt 10
npm audit fix sur les trois paquets, @fastify/jwt 9 → 10 (fast-jwt 6,
faille critique), ignoreTrailingSlash passé dans routerOptions
(avertissement FSTDEP022 à chaque démarrage).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-24 14:24:42 +02:00
IliesAllaliandClaude Opus 5.5 f63b15af36 Landing : bouton du header aligné sur « Créer mon arbre », accent sur Parenthèse
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-24 14:24:42 +02:00
IliesAllaliandClaude Opus 5.5 4c0d281919 Landing : les événements émis avant l'init de PostHog sont mis en file
Depuis le chargement différé de PostHog, page_viewed partait au premier
rendu, avant init(), et était jeté au lieu d'attendre dans la file.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-24 14:11:55 +02:00
IliesAllaliandClaude Opus 5 73db745a04 Schéma Prisma aligné sur les migrations
La clé étrangère et l'index sur le dernier arbre ouvert, et la valeur par défaut de
user_tree_accesses.updatedAt, existaient en base sans être déclarés dans le schéma.
Aucune migration : le schéma décrit désormais la base telle que les migrations la créent.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-14 16:30:28 +02:00
IliesAllaliandClaude Opus 5 0c4cc20c97 Suppression des données par les utilisateurs, CI et auto-hébergement vérifié
Utilisateurs
- Suppression de compte depuis l'écran « Votre compte », confirmée par mot de passe :
  arbres possédés et médias effacés, email retiré des contributions, sessions fermées partout.
- Suppression d'arbre définitive, en base et sur le disque.
- Ajout d'un frère ou d'une sœur relié aux parents existants ; relations parent et enfant
  corrigées en mode démo.
- Liste d'attente retirée (route, envoi d'emails, dépendance Resend).

Projet ouvert
- CI : front, landing, backend avec vérification des migrations, test Docker de bout en bout.
- Déploiement lancé seulement après une CI réussie sur main.
- Image API : CLI Prisma installée à part pour que les migrations tournent au démarrage.
- SECURITY.md, CONTRIBUTING.md, modèles d'issue et de pull request.
- Migration renommée avec un nom descriptif, contenu identique.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-14 16:22:26 +02:00
IliesAllaliandClaude Opus 5 e8e2485dcd Parenthèse
Galaxie familiale : personnes, unions et filiations, photos, vidéos et voix sur chaque personne,
partage par lien avec consultation sans compte et contributions validées par le propriétaire.
Auto-hébergeable avec Docker. Licence PolyForm Noncommercial 1.0.0.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-14 15:49:05 +02:00