From 89b8c0e6d722712f9c1588d1159eb38792cc69e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Bombeck?= Date: Sat, 27 Jun 2026 17:57:45 +0200 Subject: [PATCH 1/3] refactor(admin): rename the availability section to Modules --- messages/de.json | 2 +- messages/en.json | 2 +- messages/es.json | 2 +- messages/fr.json | 2 +- messages/it.json | 2 +- messages/pl.json | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/messages/de.json b/messages/de.json index 8a3a5fb4c..221a0a141 100644 --- a/messages/de.json +++ b/messages/de.json @@ -5518,7 +5518,7 @@ "subtitle": "Version, Lizenz und Update-Status." }, "module-availability": { - "title": "Modulverfügbarkeit", + "title": "Module", "subtitle": "Module für jedes Konto auf diesem Server aktivieren oder deaktivieren." } }, diff --git a/messages/en.json b/messages/en.json index 06b38c3e8..8a5884a2f 100644 --- a/messages/en.json +++ b/messages/en.json @@ -5518,7 +5518,7 @@ "subtitle": "Version, license, and update status." }, "module-availability": { - "title": "Module availability", + "title": "Modules", "subtitle": "Turn modules on or off for every account on this server." } }, diff --git a/messages/es.json b/messages/es.json index 0b49cd985..c666fdab0 100644 --- a/messages/es.json +++ b/messages/es.json @@ -5518,7 +5518,7 @@ "subtitle": "Versión, licencia y estado de actualizaciones." }, "module-availability": { - "title": "Disponibilidad de módulos", + "title": "Módulos", "subtitle": "Activa o desactiva módulos para todas las cuentas de este servidor." } }, diff --git a/messages/fr.json b/messages/fr.json index 971a1bbd8..baa1a88cb 100644 --- a/messages/fr.json +++ b/messages/fr.json @@ -5518,7 +5518,7 @@ "subtitle": "Version, licence et état des mises à jour." }, "module-availability": { - "title": "Disponibilité des modules", + "title": "Modules", "subtitle": "Activez ou désactivez les modules pour tous les comptes de ce serveur." } }, diff --git a/messages/it.json b/messages/it.json index 4b762cd6b..c4dad1eda 100644 --- a/messages/it.json +++ b/messages/it.json @@ -5518,7 +5518,7 @@ "subtitle": "Versione, licenza e stato degli aggiornamenti." }, "module-availability": { - "title": "Disponibilità dei moduli", + "title": "Moduli", "subtitle": "Attiva o disattiva i moduli per tutti gli account su questo server." } }, diff --git a/messages/pl.json b/messages/pl.json index 664af0d8d..362f37151 100644 --- a/messages/pl.json +++ b/messages/pl.json @@ -5518,7 +5518,7 @@ "subtitle": "Wersja, licencja i stan aktualizacji." }, "module-availability": { - "title": "Dostępność modułów", + "title": "Moduły", "subtitle": "Włącz lub wyłącz moduły dla wszystkich kont na tym serwerze." } }, From 611de0f27423ce83f109b3c4b027c20d1d06ef4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Bombeck?= Date: Sat, 27 Jun 2026 17:58:22 +0200 Subject: [PATCH 2/3] fix(settings): stop the mobile section selector animating a scroll from the top --- src/components/admin/admin-shell.tsx | 20 +++++++++----------- src/components/settings/settings-shell.tsx | 11 +++++------ 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/src/components/admin/admin-shell.tsx b/src/components/admin/admin-shell.tsx index 39f94bb37..1e4bd7ede 100644 --- a/src/components/admin/admin-shell.tsx +++ b/src/components/admin/admin-shell.tsx @@ -37,7 +37,6 @@ import { } from "lucide-react"; import { cn } from "@/lib/utils"; -import { scrollBehaviorForUser } from "@/lib/motion"; import { useAuth } from "@/hooks/use-auth"; import { useTranslations } from "@/lib/i18n/context"; import { isAdminSectionSlug, type AdminSectionSlug } from "./section-slugs"; @@ -188,16 +187,15 @@ export function AdminShell({ active, children }: AdminShellProps) { '[aria-current="page"]', ); if (!activeChip) return; - activeChip.scrollIntoView({ - block: "nearest", - // v1.4.36 W4b — `inline: "start"` pins the active chip to the - // left edge of the scroller. `inline: "center"` over-scrolled - // and the first one or two chips were unreachable on narrow - // viewports. - inline: "start", - // v1.4.43 W5-H5 — respect `prefers-reduced-motion`. - behavior: scrollBehaviorForUser(), - }); + // Adjust only the strip's own horizontal offset, instantly. The old + // `scrollIntoView` walked every scrollable ancestor and could nudge the + // document vertically, and a smooth behaviour animated the strip from a + // reset `scrollLeft: 0` to the target on every tap — an unwanted "scroll + // from the start" sweep. `scrollTo({ left, behavior: "auto" })` confines + // the motion to the strip's horizontal axis and jumps without animation. + const maxScroll = strip.scrollWidth - strip.clientWidth; + const target = Math.max(0, Math.min(activeChip.offsetLeft, maxScroll)); + strip.scrollTo({ left: target, behavior: "auto" }); }, [activeSlug]); // The section bodies are already role-gated, but the shell frame diff --git a/src/components/settings/settings-shell.tsx b/src/components/settings/settings-shell.tsx index e091cfc9c..865b52a57 100644 --- a/src/components/settings/settings-shell.tsx +++ b/src/components/settings/settings-shell.tsx @@ -43,7 +43,6 @@ import { } from "lucide-react"; import { cn } from "@/lib/utils"; -import { scrollBehaviorForUser } from "@/lib/motion"; import { useAuth } from "@/hooks/use-auth"; import { useTranslations } from "@/lib/i18n/context"; import type { ModuleKey } from "@/lib/modules/registry"; @@ -366,11 +365,11 @@ export function SettingsShell({ // box, which is the origin for `scrollLeft`. const maxScroll = strip.scrollWidth - strip.clientWidth; const target = Math.max(0, Math.min(active.offsetLeft, maxScroll)); - strip.scrollTo({ - left: target, - // v1.4.43 W5-H5 — respect `prefers-reduced-motion`. - behavior: scrollBehaviorForUser(), - }); + // Position the active chip instantly. A smooth behaviour here animates + // the strip from its reset `scrollLeft: 0` to the target on every tap, + // which reads as an unwanted "scroll from the start" sweep when swapping + // sections. An instant jump keeps the chip in view without the sweep. + strip.scrollTo({ left: target, behavior: "auto" }); }, [activeSlug]); // v1.18.6.1 — resolve the heading once. Pages pass an explicit `heading` From e5ee8f3b3e6b6e5ce526a510e1e5adec7a3bc925 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Bombeck?= Date: Sat, 27 Jun 2026 17:58:26 +0200 Subject: [PATCH 3/3] fix(settings): keep the section nav fixed while only the content pane scrolls --- src/components/admin/admin-shell.tsx | 93 ++++++++++++---------- src/components/settings/settings-shell.tsx | 63 ++++++++------- 2 files changed, 87 insertions(+), 69 deletions(-) diff --git a/src/components/admin/admin-shell.tsx b/src/components/admin/admin-shell.tsx index 1e4bd7ede..1a5ce6196 100644 --- a/src/components/admin/admin-shell.tsx +++ b/src/components/admin/admin-shell.tsx @@ -309,51 +309,60 @@ export function AdminShell({ active, children }: AdminShellProps) { {headingBlock} - {/* Desktop sticky sidebar — starts at the cards row (row 2). */} + {/* Desktop sticky sidebar — starts at the cards row (row 2). + + The sticky lives on the `