From 886216749e89f2ebe7da60ba325da4a630a566d7 Mon Sep 17 00:00:00 2001 From: khannurien Date: Thu, 8 Oct 2026 22:22:15 +0000 Subject: [PATCH] =?UTF-8?q?v4:=20the=20avatar=20menu=20shows=20at=20every?= =?UTF-8?q?=20width=20and=20holds=20Log=20out,=20so=20a=20profile=20keeps?= =?UTF-8?q?=20only=20Invite;=20the=20profile's=20dump=20cards=20lay=20out?= =?UTF-8?q?=20again=20=E2=80=94=20your=20own=20profile=20had=20four=20butt?= =?UTF-8?q?ons=20in=20a=20row,=20Invite=20someone,=20Settings,=20Manage=20?= =?UTF-8?q?and=20Log=20out,=20Invite=20taller=20than=20the=20rest,=20and?= =?UTF-8?q?=20on=20wide=20screens=20it=20was=20the=20only=20way=20to=20rea?= =?UTF-8?q?ch=20/settings=20or=20/manage.=20The=20avatar=20menu=20now=20le?= =?UTF-8?q?ads=20the=20header's=20icon=20row=20at=20every=20width,=20after?= =?UTF-8?q?=20the=20name=20and=20Playlists=20text=20links=20on=20wide=20sc?= =?UTF-8?q?reens,=20and=20ends=20with=20Log=20out=20under=20a=20separator,?= =?UTF-8?q?=20muted=20until=20hovered.=20The=20profile=20keeps=20Invite=20?= =?UTF-8?q?someone=20alone.=20The=20menu's=20button=20outweighs=20.app-hea?= =?UTF-8?q?der-nav=20button=20and=20the=20themes'=20button=20rules=20(Brut?= =?UTF-8?q?alist=20and=20GeoCities=20list=20it=20among=20their=20flat=20bu?= =?UTF-8?q?ttons),=20so=20it=20reads=20as=20one=20of=20the=20menu's=20link?= =?UTF-8?q?s.=20Since=20b9ff9c4,=20a=20card=20under=20472px=20is=20laid=20?= =?UTF-8?q?out=20by=20the=20narrow-card=20container=20query,=20but=20the?= =?UTF-8?q?=20profile=20columns'=20dense-card=20rules=20still=20placed=20t?= =?UTF-8?q?he=20thumb,=20body=20and=20vote=20themselves,=20more=20specific?= =?UTF-8?q?ally:=20the=20thumb=20lost=20its=20row=20span,=20so=20the=20tit?= =?UTF-8?q?le=20fell=20under=20it=20and=20every=20card=20was=20a=20tall,?= =?UTF-8?q?=20mostly=20empty=20box.=20Those=20rules=20now=20only=20make=20?= =?UTF-8?q?the=20card=20denser=20(a=20smaller=20thumb,=20a=202-line=20titl?= =?UTF-8?q?e,=20smaller=20type)=20and=20leave=20placement=20to=20the=20con?= =?UTF-8?q?tainer=20query.=20670=20frontend=20tests=20pass,=20and=20tsc,?= =?UTF-8?q?=20eslint,=20deno=20fmt,=20doc:lint=20and=20i18n:compile=20--st?= =?UTF-8?q?rict=20are=20clean;=20checked=20in=20screenshots=20in=20Smooth?= =?UTF-8?q?=20dark=20at=201400=20and=20390px,=20Brutalist=20light=20at=203?= =?UTF-8?q?90px,=20GeoCities=20light=20and=20Kanagawa=20dark=20at=201400px?= =?UTF-8?q?,=20in=20French.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- locales/en.po | 70 ++++++------ locales/fr.po | 70 ++++++------ src/App.css | 113 ++++++------------- src/components/layout/AppHeader.tsx | 8 +- src/components/layout/UserMenu.tsx | 24 +++- src/components/profile/ProfileHeader.tsx | 27 +---- src/components/profile/ProfileOwnActions.tsx | 34 +++--- src/test/components/layout/UserMenu.test.tsx | 25 +++- src/test/pages/UserPublicProfile.test.tsx | 23 +--- src/themes/brutalist.css | 3 + src/themes/geocities.css | 1 + 11 files changed, 179 insertions(+), 219 deletions(-) diff --git a/locales/en.po b/locales/en.po index 0b23add8..72eb8e8c 100644 --- a/locales/en.po +++ b/locales/en.po @@ -431,7 +431,7 @@ msgstr "← Back" msgid "← Back to all dumps" msgstr "← Back to all dumps" -#: src/components/profile/ProfileOwnActions.tsx:80 +#: src/components/profile/ProfileOwnActions.tsx:76 msgid "+ Invite someone" msgstr "+ Invite someone" @@ -518,11 +518,11 @@ msgstr "Add a comment…" msgid "Add category" msgstr "Add category" -#: src/components/profile/ProfileHeader.tsx:154 +#: src/components/profile/ProfileHeader.tsx:153 msgid "Add email…" msgstr "Add email…" -#: src/components/shared/ImagePicker.tsx:63 +#: src/components/shared/ImagePicker.tsx:66 msgid "Add image" msgstr "Add image" @@ -589,7 +589,7 @@ msgstr "Can't connect to the live updates server. Upvotes and notifications may #: src/components/comment/CommentForm.tsx:127 #: src/components/dump/create/DumpCreateModal.tsx:752 #: src/components/form/FormActions.tsx:42 -#: src/components/playlist/PlaylistEditForm.tsx:199 +#: src/components/playlist/PlaylistEditForm.tsx:200 #: src/components/profile/DescriptionEditor.tsx:97 #: src/components/profile/EmailEditor.tsx:83 #: src/components/shared/ConfirmModal.tsx:63 @@ -607,7 +607,7 @@ msgstr "Cancel removal" msgid "Cancel reply" msgstr "Cancel reply" -#: src/components/layout/AppHeader.tsx:190 +#: src/components/layout/AppHeader.tsx:188 msgid "Cancel search" msgstr "Cancel search" @@ -620,11 +620,11 @@ msgstr "Categories" msgid "Category" msgstr "Category" -#: src/components/profile/ProfileHeader.tsx:96 +#: src/components/profile/ProfileHeader.tsx:95 msgid "Change avatar" msgstr "Change avatar" -#: src/components/shared/ImagePicker.tsx:63 +#: src/components/shared/ImagePicker.tsx:66 msgid "Change image" msgstr "Change image" @@ -695,11 +695,11 @@ msgstr "Confirm new password" msgid "Connection lost — this message may not have been sent" msgstr "Connection lost — this message may not have been sent" -#: src/components/profile/ProfileOwnActions.tsx:105 +#: src/components/profile/ProfileOwnActions.tsx:99 msgid "Copied!" msgstr "Copied!" -#: src/components/profile/ProfileOwnActions.tsx:105 +#: src/components/profile/ProfileOwnActions.tsx:99 msgid "Copy" msgstr "Copy" @@ -800,7 +800,7 @@ msgid "Delete failed ({0})" msgstr "Delete failed ({0})" #: src/components/playlist/PlaylistCard.tsx:142 -#: src/components/playlist/PlaylistEditForm.tsx:190 +#: src/components/playlist/PlaylistEditForm.tsx:191 #: src/components/profile/ProfilePlaylistsTab.tsx:156 #: src/pages/PlaylistDetail.tsx:141 msgid "Delete playlist" @@ -827,7 +827,7 @@ msgstr "Delete this playlist? This cannot be undone." msgid "deleted message" msgstr "deleted message" -#: src/components/playlist/PlaylistEditForm.tsx:175 +#: src/components/playlist/PlaylistEditForm.tsx:176 msgid "Description" msgstr "Description" @@ -869,7 +869,7 @@ msgstr "Drop a file here, or paste one" msgid "Drop a replacement here" msgstr "Drop a replacement here" -#: src/components/layout/AppHeader.tsx:209 +#: src/components/layout/AppHeader.tsx:207 msgid "Dump" msgstr "Dump" @@ -914,7 +914,7 @@ msgstr "Edit {0}" msgid "Edit description" msgstr "Edit description" -#: src/components/profile/ProfileHeader.tsx:152 +#: src/components/profile/ProfileHeader.tsx:151 msgid "Edit email" msgstr "Edit email" @@ -984,9 +984,9 @@ msgstr "Failed to create playlist" msgid "Failed to delete" msgstr "Failed to delete" +#: src/components/profile/ProfileOwnActions.tsx:46 #: src/components/profile/ProfileOwnActions.tsx:49 -#: src/components/profile/ProfileOwnActions.tsx:52 -#: src/components/profile/ProfileOwnActions.tsx:114 +#: src/components/profile/ProfileOwnActions.tsx:108 msgid "Failed to generate invite" msgstr "Failed to generate invite" @@ -1006,7 +1006,7 @@ msgstr "Failed to post comment" msgid "Failed to post reply" msgstr "Failed to post reply" -#: src/components/playlist/PlaylistEditForm.tsx:184 +#: src/components/playlist/PlaylistEditForm.tsx:185 #: src/components/profile/DescriptionEditor.tsx:99 #: src/components/profile/EmailEditor.tsx:86 msgid "Failed to save" @@ -1020,7 +1020,7 @@ msgstr "Failed to save category" msgid "Failed to save edit" msgstr "Failed to save edit" -#: src/components/profile/ProfileHeader.tsx:163 +#: src/components/profile/ProfileHeader.tsx:162 msgid "Failed to update avatar" msgstr "Failed to update avatar" @@ -1128,12 +1128,12 @@ msgstr "Invalid invite" msgid "Invalid link" msgstr "Invalid link" -#: src/components/profile/ProfileOwnActions.tsx:88 -#: src/components/profile/ProfileOwnActions.tsx:95 +#: src/components/profile/ProfileOwnActions.tsx:82 +#: src/components/profile/ProfileOwnActions.tsx:89 msgid "Invite link" msgstr "Invite link" -#: src/components/profile/ProfileHeader.tsx:117 +#: src/components/profile/ProfileHeader.tsx:116 msgid "invited by" msgstr "invited by" @@ -1176,7 +1176,7 @@ msgstr "Link or file" msgid "Live updates are temporarily disconnected. Trying to reconnect…" msgstr "Live updates are temporarily disconnected. Trying to reconnect…" -#: src/components/layout/AppHeader.tsx:242 +#: src/components/layout/AppHeader.tsx:240 msgid "Live updates unavailable." msgstr "Live updates unavailable." @@ -1219,7 +1219,7 @@ msgstr "Loading profile…" msgid "Loading…" msgstr "Loading…" -#: src/components/layout/AppHeader.tsx:216 +#: src/components/layout/AppHeader.tsx:214 #: src/pages/UserLogin.tsx:41 #: src/pages/UserLogin.tsx:67 #: src/pages/UserLogin.tsx:86 @@ -1234,7 +1234,7 @@ msgstr "Log in to like" msgid "Log in to vote" msgstr "Log in to vote" -#: src/components/profile/ProfileHeader.tsx:188 +#: src/components/layout/UserMenu.tsx:115 #: src/pages/UserPublicProfile.tsx:131 msgid "Log out" msgstr "Log out" @@ -1251,8 +1251,7 @@ msgstr "Login failed" msgid "Lowercase letters, numbers and single hyphens only" msgstr "Lowercase letters, numbers and single hyphens only" -#: src/components/layout/UserMenu.tsx:98 -#: src/components/profile/ProfileHeader.tsx:180 +#: src/components/layout/UserMenu.tsx:102 #: src/pages/Manage.tsx:24 #: src/pages/Manage.tsx:29 #: src/pages/UserPublicProfile.tsx:164 @@ -1465,7 +1464,7 @@ msgstr "Play" #: src/components/dump/create/StepIndicator.tsx:21 #: src/components/layout/AppHeader.tsx:178 -#: src/components/layout/UserMenu.tsx:81 +#: src/components/layout/UserMenu.tsx:85 #: src/components/profile/ProfileFollowTab.tsx:167 #: src/components/profile/ProfilePlaylistsTab.tsx:118 #: src/pages/Search.tsx:123 @@ -1616,7 +1615,7 @@ msgstr "Role" #: src/components/category/CategoryManager.tsx:216 #: src/components/chat/ChatEditBox.tsx:85 #: src/components/comment/CommentNode.tsx:216 -#: src/components/playlist/PlaylistEditForm.tsx:206 +#: src/components/playlist/PlaylistEditForm.tsx:207 #: src/components/profile/DescriptionEditor.tsx:89 #: src/components/profile/EmailEditor.tsx:75 #: src/pages/Dump.tsx:437 @@ -1625,7 +1624,7 @@ msgid "Save" msgstr "Save" #: src/components/comment/CommentNode.tsx:217 -#: src/components/playlist/PlaylistEditForm.tsx:203 +#: src/components/playlist/PlaylistEditForm.tsx:204 #: src/components/profile/ChangePasswordModal.tsx:119 #: src/components/profile/DescriptionEditor.tsx:86 #: src/components/profile/EmailEditor.tsx:72 @@ -1634,7 +1633,7 @@ msgstr "Save" msgid "Saving…" msgstr "Saving…" -#: src/components/layout/AppHeader.tsx:190 +#: src/components/layout/AppHeader.tsx:188 #: src/components/layout/SearchBar.tsx:83 #: src/pages/Search.tsx:69 msgid "Search" @@ -1677,7 +1676,7 @@ msgstr "Send reset link" msgid "Sending…" msgstr "Sending…" -#: src/components/layout/AppHeader.tsx:206 +#: src/components/layout/AppHeader.tsx:204 msgid "Server unreachable" msgstr "Server unreachable" @@ -1686,8 +1685,7 @@ msgstr "Server unreachable" msgid "Set new password" msgstr "Set new password" -#: src/components/layout/UserMenu.tsx:89 -#: src/components/profile/ProfileHeader.tsx:176 +#: src/components/layout/UserMenu.tsx:93 #: src/pages/Settings.tsx:70 #: src/pages/Settings.tsx:82 msgid "Settings" @@ -1697,7 +1695,7 @@ msgstr "Settings" msgid "Several people are typing…" msgstr "Several people are typing…" -#: src/components/profile/ProfileOwnActions.tsx:108 +#: src/components/profile/ProfileOwnActions.tsx:102 msgid "Single use, valid for 7 days." msgstr "Single use, valid for 7 days." @@ -1786,7 +1784,7 @@ msgstr "Thumbnail" #: src/components/dump/create/TitleField.tsx:45 #: src/components/playlist/PlaylistCreateForm.tsx:96 -#: src/components/playlist/PlaylistEditForm.tsx:159 +#: src/components/playlist/PlaylistEditForm.tsx:160 #: src/pages/DumpEdit.tsx:516 msgid "Title" msgstr "Title" @@ -1853,7 +1851,7 @@ msgstr "Unsubscribe" msgid "Unsubscribed" msgstr "Unsubscribed" -#: src/components/profile/ProfileHeader.tsx:73 +#: src/components/profile/ProfileHeader.tsx:72 msgid "Upload failed" msgstr "Upload failed" @@ -1904,7 +1902,7 @@ msgstr "User" msgid "User management" msgstr "User management" -#: src/components/layout/UserMenu.tsx:56 +#: src/components/layout/UserMenu.tsx:60 msgid "User menu" msgstr "User menu" diff --git a/locales/fr.po b/locales/fr.po index 4b92ff7c..c60e2ebd 100644 --- a/locales/fr.po +++ b/locales/fr.po @@ -431,7 +431,7 @@ msgstr "← Retour" msgid "← Back to all dumps" msgstr "← Retour à toutes les recos" -#: src/components/profile/ProfileOwnActions.tsx:80 +#: src/components/profile/ProfileOwnActions.tsx:76 msgid "+ Invite someone" msgstr "+ Inviter quelqu'un" @@ -518,11 +518,11 @@ msgstr "Ajouter un commentaire…" msgid "Add category" msgstr "Ajouter une catégorie" -#: src/components/profile/ProfileHeader.tsx:154 +#: src/components/profile/ProfileHeader.tsx:153 msgid "Add email…" msgstr "Ajouter un e-mail…" -#: src/components/shared/ImagePicker.tsx:63 +#: src/components/shared/ImagePicker.tsx:66 msgid "Add image" msgstr "Ajouter une image" @@ -589,7 +589,7 @@ msgstr "Impossible de se connecter au serveur de mises à jour en direct. Les vo #: src/components/comment/CommentForm.tsx:127 #: src/components/dump/create/DumpCreateModal.tsx:752 #: src/components/form/FormActions.tsx:42 -#: src/components/playlist/PlaylistEditForm.tsx:199 +#: src/components/playlist/PlaylistEditForm.tsx:200 #: src/components/profile/DescriptionEditor.tsx:97 #: src/components/profile/EmailEditor.tsx:83 #: src/components/shared/ConfirmModal.tsx:63 @@ -607,7 +607,7 @@ msgstr "Annuler la suppression" msgid "Cancel reply" msgstr "Annuler la réponse" -#: src/components/layout/AppHeader.tsx:190 +#: src/components/layout/AppHeader.tsx:188 msgid "Cancel search" msgstr "Annuler la recherche" @@ -620,11 +620,11 @@ msgstr "Catégories" msgid "Category" msgstr "Catégorie" -#: src/components/profile/ProfileHeader.tsx:96 +#: src/components/profile/ProfileHeader.tsx:95 msgid "Change avatar" msgstr "Changer l'avatar" -#: src/components/shared/ImagePicker.tsx:63 +#: src/components/shared/ImagePicker.tsx:66 msgid "Change image" msgstr "Changer l'image" @@ -695,11 +695,11 @@ msgstr "Confirmer le nouveau mot de passe" msgid "Connection lost — this message may not have been sent" msgstr "Connexion perdue — ce message n'a peut-être pas été envoyé" -#: src/components/profile/ProfileOwnActions.tsx:105 +#: src/components/profile/ProfileOwnActions.tsx:99 msgid "Copied!" msgstr "Copié !" -#: src/components/profile/ProfileOwnActions.tsx:105 +#: src/components/profile/ProfileOwnActions.tsx:99 msgid "Copy" msgstr "Copier" @@ -800,7 +800,7 @@ msgid "Delete failed ({0})" msgstr "Échec de la suppression ({0})" #: src/components/playlist/PlaylistCard.tsx:142 -#: src/components/playlist/PlaylistEditForm.tsx:190 +#: src/components/playlist/PlaylistEditForm.tsx:191 #: src/components/profile/ProfilePlaylistsTab.tsx:156 #: src/pages/PlaylistDetail.tsx:141 msgid "Delete playlist" @@ -827,7 +827,7 @@ msgstr "Supprimer cette collection ? Cette action est irréversible." msgid "deleted message" msgstr "message supprimé" -#: src/components/playlist/PlaylistEditForm.tsx:175 +#: src/components/playlist/PlaylistEditForm.tsx:176 msgid "Description" msgstr "Description" @@ -869,7 +869,7 @@ msgstr "Déposez un fichier ici, ou collez-en un" msgid "Drop a replacement here" msgstr "Déposez un fichier de remplacement ici" -#: src/components/layout/AppHeader.tsx:209 +#: src/components/layout/AppHeader.tsx:207 msgid "Dump" msgstr "Reco" @@ -914,7 +914,7 @@ msgstr "Modifier {0}" msgid "Edit description" msgstr "Modifier la description" -#: src/components/profile/ProfileHeader.tsx:152 +#: src/components/profile/ProfileHeader.tsx:151 msgid "Edit email" msgstr "Modifier l'e-mail" @@ -984,9 +984,9 @@ msgstr "Impossible de créer la collection" msgid "Failed to delete" msgstr "Suppression échouée" +#: src/components/profile/ProfileOwnActions.tsx:46 #: src/components/profile/ProfileOwnActions.tsx:49 -#: src/components/profile/ProfileOwnActions.tsx:52 -#: src/components/profile/ProfileOwnActions.tsx:114 +#: src/components/profile/ProfileOwnActions.tsx:108 msgid "Failed to generate invite" msgstr "Impossible de générer une invitation" @@ -1006,7 +1006,7 @@ msgstr "Impossible de publier le commentaire" msgid "Failed to post reply" msgstr "Impossible de publier la réponse" -#: src/components/playlist/PlaylistEditForm.tsx:184 +#: src/components/playlist/PlaylistEditForm.tsx:185 #: src/components/profile/DescriptionEditor.tsx:99 #: src/components/profile/EmailEditor.tsx:86 msgid "Failed to save" @@ -1020,7 +1020,7 @@ msgstr "Échec de l’enregistrement de la catégorie" msgid "Failed to save edit" msgstr "Impossible d'enregistrer la modification" -#: src/components/profile/ProfileHeader.tsx:163 +#: src/components/profile/ProfileHeader.tsx:162 msgid "Failed to update avatar" msgstr "Impossible de mettre à jour l'avatar" @@ -1128,12 +1128,12 @@ msgstr "Invitation invalide" msgid "Invalid link" msgstr "Lien invalide" -#: src/components/profile/ProfileOwnActions.tsx:88 -#: src/components/profile/ProfileOwnActions.tsx:95 +#: src/components/profile/ProfileOwnActions.tsx:82 +#: src/components/profile/ProfileOwnActions.tsx:89 msgid "Invite link" msgstr "Lien d'invitation" -#: src/components/profile/ProfileHeader.tsx:117 +#: src/components/profile/ProfileHeader.tsx:116 msgid "invited by" msgstr "invité par" @@ -1176,7 +1176,7 @@ msgstr "Lien ou fichier" msgid "Live updates are temporarily disconnected. Trying to reconnect…" msgstr "Les mises à jour en direct sont temporairement interrompues. Tentative de reconnexion…" -#: src/components/layout/AppHeader.tsx:242 +#: src/components/layout/AppHeader.tsx:240 msgid "Live updates unavailable." msgstr "Mises à jour en direct indisponibles." @@ -1219,7 +1219,7 @@ msgstr "Chargement du profil…" msgid "Loading…" msgstr "Chargement…" -#: src/components/layout/AppHeader.tsx:216 +#: src/components/layout/AppHeader.tsx:214 #: src/pages/UserLogin.tsx:41 #: src/pages/UserLogin.tsx:67 #: src/pages/UserLogin.tsx:86 @@ -1234,7 +1234,7 @@ msgstr "Se connecter pour aimer" msgid "Log in to vote" msgstr "Se connecter pour voter" -#: src/components/profile/ProfileHeader.tsx:188 +#: src/components/layout/UserMenu.tsx:115 #: src/pages/UserPublicProfile.tsx:131 msgid "Log out" msgstr "Se déconnecter" @@ -1251,8 +1251,7 @@ msgstr "Connexion échouée" msgid "Lowercase letters, numbers and single hyphens only" msgstr "Minuscules, chiffres et tirets simples seulement" -#: src/components/layout/UserMenu.tsx:98 -#: src/components/profile/ProfileHeader.tsx:180 +#: src/components/layout/UserMenu.tsx:102 #: src/pages/Manage.tsx:24 #: src/pages/Manage.tsx:29 #: src/pages/UserPublicProfile.tsx:164 @@ -1465,7 +1464,7 @@ msgstr "Lecture" #: src/components/dump/create/StepIndicator.tsx:21 #: src/components/layout/AppHeader.tsx:178 -#: src/components/layout/UserMenu.tsx:81 +#: src/components/layout/UserMenu.tsx:85 #: src/components/profile/ProfileFollowTab.tsx:167 #: src/components/profile/ProfilePlaylistsTab.tsx:118 #: src/pages/Search.tsx:123 @@ -1616,7 +1615,7 @@ msgstr "Rôle" #: src/components/category/CategoryManager.tsx:216 #: src/components/chat/ChatEditBox.tsx:85 #: src/components/comment/CommentNode.tsx:216 -#: src/components/playlist/PlaylistEditForm.tsx:206 +#: src/components/playlist/PlaylistEditForm.tsx:207 #: src/components/profile/DescriptionEditor.tsx:89 #: src/components/profile/EmailEditor.tsx:75 #: src/pages/Dump.tsx:437 @@ -1625,7 +1624,7 @@ msgid "Save" msgstr "Enregistrer" #: src/components/comment/CommentNode.tsx:217 -#: src/components/playlist/PlaylistEditForm.tsx:203 +#: src/components/playlist/PlaylistEditForm.tsx:204 #: src/components/profile/ChangePasswordModal.tsx:119 #: src/components/profile/DescriptionEditor.tsx:86 #: src/components/profile/EmailEditor.tsx:72 @@ -1634,7 +1633,7 @@ msgstr "Enregistrer" msgid "Saving…" msgstr "Enregistrement…" -#: src/components/layout/AppHeader.tsx:190 +#: src/components/layout/AppHeader.tsx:188 #: src/components/layout/SearchBar.tsx:83 #: src/pages/Search.tsx:69 msgid "Search" @@ -1677,7 +1676,7 @@ msgstr "Envoyer le lien de réinitialisation" msgid "Sending…" msgstr "Envoi…" -#: src/components/layout/AppHeader.tsx:206 +#: src/components/layout/AppHeader.tsx:204 msgid "Server unreachable" msgstr "Serveur inaccessible" @@ -1686,8 +1685,7 @@ msgstr "Serveur inaccessible" msgid "Set new password" msgstr "Définir un nouveau mot de passe" -#: src/components/layout/UserMenu.tsx:89 -#: src/components/profile/ProfileHeader.tsx:176 +#: src/components/layout/UserMenu.tsx:93 #: src/pages/Settings.tsx:70 #: src/pages/Settings.tsx:82 msgid "Settings" @@ -1697,7 +1695,7 @@ msgstr "Paramètres" msgid "Several people are typing…" msgstr "Plusieurs personnes écrivent…" -#: src/components/profile/ProfileOwnActions.tsx:108 +#: src/components/profile/ProfileOwnActions.tsx:102 msgid "Single use, valid for 7 days." msgstr "Usage unique, valable 7 jours." @@ -1786,7 +1784,7 @@ msgstr "Miniature" #: src/components/dump/create/TitleField.tsx:45 #: src/components/playlist/PlaylistCreateForm.tsx:96 -#: src/components/playlist/PlaylistEditForm.tsx:159 +#: src/components/playlist/PlaylistEditForm.tsx:160 #: src/pages/DumpEdit.tsx:516 msgid "Title" msgstr "Titre" @@ -1853,7 +1851,7 @@ msgstr "Se désabonner" msgid "Unsubscribed" msgstr "Désabonné" -#: src/components/profile/ProfileHeader.tsx:73 +#: src/components/profile/ProfileHeader.tsx:72 msgid "Upload failed" msgstr "Envoi échoué" @@ -1904,7 +1902,7 @@ msgstr "Utilisateur" msgid "User management" msgstr "Gestion utilisateur" -#: src/components/layout/UserMenu.tsx:56 +#: src/components/layout/UserMenu.tsx:60 msgid "User menu" msgstr "Menu utilisateur" diff --git a/src/App.css b/src/App.css index 8b793142..86fce443 100644 --- a/src/App.css +++ b/src/App.css @@ -2186,54 +2186,28 @@ body.has-player .chat-fab { } /* ── Dense dump cards in the two-column profile view ── - The default card is proportioned for the 860px feed. Dropped into a ~400px - column it falls apart: the title wraps four lines deep, the meta row stacks, - every category chip takes a line of its own and the vote button floats in - the middle of the resulting void. Below is the same card re-proportioned for - the column — smaller thumb, title clamped to two lines, no teaser, and meta - plus chips sharing the line under the title. Scoped to the width where the - columns actually split; narrower than that the feed is full-width again and - the regular (then the phone) layout applies. */ + A ~400px column is narrow enough for the narrow card's grid (the + `@container dump-card` rules), which places the thumb, the text and the + vote; placing them here as well, more specifically, broke that grid. This + only makes the card denser for a column of a dozen: a smaller thumb, the + title clamped to two lines and smaller type. Scoped to the width where the + columns split; narrower than that the feed is full-width again. */ @media (min-width: 900px) { .profile-columns .dump-feed { padding: 0.75rem 0 0; gap: 0.5rem; } - /* preview | body | vote, all top-aligned so the count sits on the title - line instead of drifting to the card's vertical middle. */ .profile-columns .dump-card-inner { - display: grid; - grid-template-columns: auto minmax(0, 1fr) auto; - align-items: start; - gap: 0.55rem; padding: 0.5rem 0.6rem; } .profile-columns .dump-card-preview { - grid-area: 1 / 1; width: 88px; height: 50px; } - .profile-columns .dump-card-vote { - grid-area: 1 / 3; - align-self: start; - } - - /* Row layout with a full-width title: the title takes a line to itself, then - meta and chips flow onto the next one and only wrap when they must. */ - .profile-columns .dump-card-body { - grid-area: 1 / 2; - margin-left: 0; - flex-direction: row; - flex-wrap: wrap; - align-items: baseline; - gap: 0.15rem 0.45rem; - } - .profile-columns .dump-card-title { - flex: 1 0 100%; font-size: var(--text-md); line-height: 1.3; display: -webkit-box; @@ -2243,22 +2217,6 @@ body.has-player .chat-fab { overflow: hidden; } - /* The teaser is the first thing to go, the same call the phone layout makes. */ - .profile-columns .dump-card-comment { - display: none; - } - - .profile-columns .dump-card-meta, - .profile-columns .dump-card-categories { - margin-top: 0; - } - - .profile-columns .dump-card-meta { - gap: 0.4rem; - /* Keeps "3 weeks ago" and "1 comment" on one line each. */ - white-space: nowrap; - } - .profile-columns .dump-card-date, .profile-columns .dump-card-comment-count { font-size: var(--text-2xs); @@ -2341,10 +2299,6 @@ body.has-player .chat-fab { background: var(--color-success); } -.profile-header .btn-border { - margin-top: 0.5rem; -} - .profile-header .follow-btn { margin-top: 0.5rem; } @@ -2476,8 +2430,8 @@ body.has-player .chat-fab { color: var(--color-accent); } -/* Grid sized by the button row; the invite panel below only fills that - width (width: 0 + min-width: 100% keeps it out of the sizing). */ +/* Grid sized by the button; the invite panel below only fills that width + (width: 0 + min-width: 100% keeps it out of the sizing). */ .profile-own-actions { display: grid; width: fit-content; @@ -2485,15 +2439,6 @@ body.has-player .chat-fab { gap: 0.5rem; margin-top: 0.5rem; } -.profile-own-actions-row { - display: flex; - flex-wrap: wrap; - gap: 0.5rem; - align-items: center; -} -.profile-own-actions .btn-border { - margin-top: 0; -} .invite-btn { padding: 0.3rem 0.9rem; @@ -3121,18 +3066,6 @@ body.has-player .chat-fab { } } -/* Avatar menu — visible only below the text-links breakpoint */ -.nav-compact { - display: flex; - align-items: center; -} - -@media (min-width: 1150px) { - .nav-compact { - display: none; - } -} - .app-header-user { display: inline-flex; align-items: center; @@ -3150,7 +3083,7 @@ body.has-player .chat-fab { background: var(--color-header-user-bg-hover); } -/* ── User menu (compact nav) ── */ +/* ── User menu ── */ /* A flex box, so the inline-flex trigger leaves no line-box gap under it that would sit it higher than the buttons beside it. */ .user-menu { @@ -3206,6 +3139,7 @@ body.has-player .chat-fab { color: var(--color-text); font-size: var(--text-md); font-weight: 600; + white-space: nowrap; transition: background var(--dur-fast); } @@ -3213,6 +3147,33 @@ body.has-player .chat-fab { background: var(--color-header-user-bg-hover); } +.user-menu-separator { + margin: 0.15rem 0.35rem; + border-top: var(--border-width) solid var(--color-border-subtle); +} + +/* Log out is a button among links: it drops the button's own border, + background and weight, and is muted until hovered, as ending the session + should be. Two classes, to outweigh `.app-header-nav button`, which + centres it, and the themes' `[data-style] button`. */ +.user-menu .user-menu-item--logout { + display: block; + border: none; + border-radius: var(--radius-md); + background: transparent; + color: var(--color-text-muted); + font-family: inherit; + font-size: var(--text-md); + font-weight: 600; + text-align: left; + line-height: inherit; +} + +.user-menu .user-menu-item--logout:hover { + background: var(--color-header-user-bg-hover); + color: var(--color-danger); +} + .user-list-popover { /* position/top/bottom/left/max-height set inline — anchored to the trigger's viewport rect, flipping above it when there isn't room below */ diff --git a/src/components/layout/AppHeader.tsx b/src/components/layout/AppHeader.tsx index f78275ac..e6f26af5 100644 --- a/src/components/layout/AppHeader.tsx +++ b/src/components/layout/AppHeader.tsx @@ -159,8 +159,8 @@ export function AppHeader(