From 97b92e3f84498c7fd3f0be184192fc874de87659 Mon Sep 17 00:00:00 2001
From: IliesAllali
Date: Sun, 18 Oct 2026 22:20:20 +0200
Subject: [PATCH 1/4] =?UTF-8?q?fix:=20fiche,=20partage,=20landing=20et=20b?=
=?UTF-8?q?anni=C3=A8re=20de=20cr=C3=A9ation?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 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
---
frontend/src/App.css | 33 +++++++++----------
frontend/src/App.jsx | 4 +--
frontend/src/components/ContributionPanel.jsx | 18 +++++++---
frontend/src/components/PersonCard.css | 7 ++--
frontend/src/components/PersonCard.jsx | 22 ++++++++++---
frontend/src/components/SettingsPanels.css | 5 ++-
frontend/src/i18n/en/contribution.js | 5 +--
landing/src/App.jsx | 14 ++++++--
landing/src/index.css | 4 +++
9 files changed, 76 insertions(+), 36 deletions(-)
diff --git a/frontend/src/App.css b/frontend/src/App.css
index feb77a8..5ce57fb 100644
--- a/frontend/src/App.css
+++ b/frontend/src/App.css
@@ -544,31 +544,28 @@
left: 20px;
z-index: 1200;
max-width: 340px;
- padding: 12px 14px;
+ padding: 18px 20px 20px;
display: grid;
- gap: 8px;
- border-radius: 14px;
- border: 1px solid rgba(42, 38, 34, 0.14);
- background: rgba(242, 239, 234, 0.95);
- box-shadow: 0 6px 24px rgba(52, 48, 44, 0.18);
- color: #2a2622;
- font-size: 13px;
- line-height: 1.45;
+ gap: 10px;
+ border-radius: var(--pz-r-l);
+ border: 1px solid var(--pz-line);
+ background: var(--pz-surface);
+ box-shadow: var(--pz-shadow);
+ color: var(--pz-ink-2);
+ font: 400 14px/1.5 var(--pz-sans);
}
.tree-created-prompt strong {
- color: #2A2622;
- font-size: 14px;
+ color: var(--pz-ink);
+ font: 400 21px/1.15 var(--pz-serif);
+ letter-spacing: -.01em;
}
-.tree-created-prompt button {
+.tree-created-prompt .pz-btn {
justify-self: start;
- border: 1px solid #efc7b8;
- border-radius: 8px;
- background: #ffffff;
- color: #2a2622;
- padding: 6px 10px;
- cursor: pointer;
+ min-height: 38px;
+ padding: 0 18px;
+ font-size: 14px;
}
.settings-card {
diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx
index b4a9e04..3dfd6b7 100644
--- a/frontend/src/App.jsx
+++ b/frontend/src/App.jsx
@@ -2840,7 +2840,7 @@ function App() {
{t('Votre arbre est créé.')}
{t("Ajoutez un proche pour commencer, comme votre mère, votre père ou un frère. Il suffit d'un prénom.")}
-
@@ -2850,7 +2850,7 @@ function App() {
{t("Votre arbre est créé, mais l'import n'a pas abouti.")}
{` ${treeImportError} `}
{t("Vous pouvez réessayer depuis les paramètres de l'arbre.")}
- setTreeImportError('')} aria-label={t('Fermer')}>
+ setTreeImportError('')} aria-label={t('Fermer')}>
{t('Fermer')}
diff --git a/frontend/src/components/ContributionPanel.jsx b/frontend/src/components/ContributionPanel.jsx
index bae4c0c..d311dec 100644
--- a/frontend/src/components/ContributionPanel.jsx
+++ b/frontend/src/components/ContributionPanel.jsx
@@ -237,6 +237,8 @@ const ContributionPanel = ({
const [newPassword, setNewPassword] = useState('')
const [inviteLocalError, setInviteLocalError] = useState('')
const [copyFeedback, setCopyFeedback] = useState('')
+ // Le message d'invitation reste replié : une ligne, le texte ne s'ouvre que sur demande
+ const [showInviteMessage, setShowInviteMessage] = useState(false)
// Load persisted decisions from localStorage
useEffect(() => {
@@ -365,7 +367,6 @@ const ContributionPanel = ({
aria-labelledby="contribPanelTitle"
>
-
{t('Partager et relire')}
{familyTitleBefore}{t('participe')}{familyTitleAfter}
@@ -411,11 +412,18 @@ const ContributionPanel = ({
{defaultInviteText && (
-
-
)}
{editMode && onAvatarUpload && (
-
-
- {person.photo ? t('Changer') : t('Ajouter une photo')}
-
- {person.photo && (
- onAvatarDelete?.(person.id, person.avatarFromImmich)}
- disabled={avatarActionLoading}
- >
- {t('Retirer')}
-
- )}
-
+
+
+
+ )}
+ {editMode && onAvatarUpload && person.photo && (
+ onAvatarDelete?.(person.id, person.avatarFromImmich)}
+ disabled={avatarActionLoading}
+ >
+ {t('Retirer')}
+
)}
@@ -570,22 +570,6 @@ const PersonCard = ({
placeholder={t('Nom')}
aria-label={t('Nom')}
/>
- {/* Visible tant que le prénom est vide, et tant qu'elle est cochée (pour pouvoir la décocher) */}
- {(unknownFirstName || !String(getEditValue('firstName', person.firstName) ?? '').trim()) && (
-
- )}
{firstNameMissing && {t('Il faut au moins un prénom.')}
}
{lastNameMissing && {t('Il faut au moins un nom si le prénom est inconnu.')}
}
@@ -606,7 +590,6 @@ const PersonCard = ({
)}
- {editMode && {t('Édition')}}
{editMode && siblingPlace && (
onMoveSibling?.(-1)} disabled={siblingPlace.index === 0} aria-label={t('Déplacer à gauche')} title={t('Déplacer à gauche')}>
@@ -621,6 +604,21 @@ const PersonCard = ({
{!editMode && person.profession && {person.profession}}
+ {editMode && ((unknownFirstName || !String(getEditValue('firstName', person.firstName) ?? '').trim())) && (
+
+ )}
{avatarActionError && {avatarActionError}
}
diff --git a/frontend/src/i18n/en/fiche.js b/frontend/src/i18n/en/fiche.js
index 94ea9aa..a01c9a2 100644
--- a/frontend/src/i18n/en/fiche.js
+++ b/frontend/src/i18n/en/fiche.js
@@ -19,6 +19,7 @@ export default {
'Fermer la fiche': 'Close profile',
'Changer': 'Change',
'Ajouter une photo': 'Add a photo',
+ 'Changer la photo': 'Change photo',
'Retirer': 'Remove',
'Prénom': 'First name',
'Nom': 'Last name',
diff --git a/landing/src/App.jsx b/landing/src/App.jsx
index 1d1306b..e458592 100644
--- a/landing/src/App.jsx
+++ b/landing/src/App.jsx
@@ -780,14 +780,13 @@ function Header({ t, onCta, loginHref, elevated }) {
{t.nav.privacy && {t.nav.privacy}}
diff --git a/landing/src/index.css b/landing/src/index.css
index af26450..cdc3e8e 100644
--- a/landing/src/index.css
+++ b/landing/src/index.css
@@ -80,6 +80,9 @@ em.s { font-style: italic; font-weight: 300; }
.nav-in nav { display: flex; gap: 4px; }
.nav-cta { display: flex; align-items: center; gap: 8px; flex: none; }
.nav-login svg { flex: none; }
+/* Connexion : fond blanc, sans contour, même hauteur que « Créer mon arbre » (btn sm) */
+.btn.s.nav-login { background: #fff; color: var(--encre); box-shadow: none; }
+@media (hover: hover) and (pointer: fine) { .btn.s.nav-login:hover { background: var(--a50); } }
.nav-in nav a {
font: 500 14px var(--sans); color: var(--encre2); text-decoration: none;
padding: 8px 12px; border-radius: 999px; transition: background-color 160ms ease;
@@ -239,8 +242,11 @@ html.logo-intro .lk-nom { animation: lk-nom 700ms var(--ease-out) 380ms both; }
@media (max-width: 820px) {
.steps, .promise, .guides { grid-template-columns: 1fr; }
.nav-in nav { display: none; }
- /* Téléphone : la connexion reste au pied de page, l'en-tête garde la place du bouton de création */
- .nav-login { display: none; }
+ /* Téléphone : icône de profil ronde à gauche de « Créer mon arbre », le texte passe en aria-label */
+ .btn.s.nav-login { width: 34px; height: 34px; padding: 0; border-radius: 50%; }
+ .nav-in { gap: 10px; }
+ .nav-cta { gap: 6px; }
+ .nav-login-text { display: none; }
}
@media (max-width: 560px) {
.hero { padding-top: 8px; }
From e75ff5e040cfca91d1026c3d38125333c8810219 Mon Sep 17 00:00:00 2001
From: IliesAllali
Date: Sun, 18 Oct 2026 22:43:19 +0200
Subject: [PATCH 3/4] =?UTF-8?q?fix:=20portrait=20=C3=A0=20la=20hauteur=20d?=
=?UTF-8?q?es=20champs=20en=20modification,=20symbole=20du=20logo=20sur=20?=
=?UTF-8?q?t=C3=A9l=C3=A9phone?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 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
---
frontend/src/components/PersonCard.css | 5 +++++
landing/src/App.jsx | 6 +++++-
landing/src/LogoLockup.jsx | 24 ++++++++++++++----------
landing/src/index.css | 5 ++++-
4 files changed, 28 insertions(+), 12 deletions(-)
diff --git a/frontend/src/components/PersonCard.css b/frontend/src/components/PersonCard.css
index a8ac8d7..a4c3709 100644
--- a/frontend/src/components/PersonCard.css
+++ b/frontend/src/components/PersonCard.css
@@ -57,6 +57,11 @@
/* Menu du choix de source du portrait : au-dessus de la fiche (z-index 1000), sous la modale Immich (2200) */
.pc-source-backdrop { position: fixed; inset: 0; z-index: 1100; }
.pc-source-menu { position: fixed; z-index: 1150; min-width: 220px; }
+/* Mode modification : le portrait prend la hauteur des deux champs Prénom et Nom (écart compris) et reste carré */
+.person-card--edit-mode .pc-id { padding-top: 0; }
+.person-card--edit-mode .pc-photo-wrap { align-self: stretch; display: block; }
+.person-card--edit-mode .pc-photo-wrap > .pc-photo { width: auto; height: 100%; aspect-ratio: 1 / 1; }
+
.pc-photo-badge {
position: absolute; right: -6px; bottom: -6px; z-index: 1;
width: 30px; height: 30px; display: grid; place-items: center; padding: 0;
diff --git a/landing/src/App.jsx b/landing/src/App.jsx
index e458592..55f80ae 100644
--- a/landing/src/App.jsx
+++ b/landing/src/App.jsx
@@ -773,7 +773,11 @@ function Header({ t, onCta, loginHref, elevated }) {
return (
-
+
+ {/* Sur téléphone, le symbole seul : le nom « Parenthèse » reste dans le nom accessible du lien */}
+
+
+