From 3273cf1bcb13210689ecb330bfb2f37e00224d44 Mon Sep 17 00:00:00 2001 From: chrisp Date: Tue, 30 Jun 2026 16:01:36 +0000 Subject: [PATCH] claude/settings-menu-urls-kbp6x8 (#116) Co-authored-by: Claude Reviewed-on: https://forge.brackt.com/chrisp/brackt/pulls/116 --- .../league/settings/SettingsNavigation.tsx | 157 ++++++++++++------ .../__tests__/SettingsNavigation.test.tsx | 67 ++++++++ .../user/settings/AccountSection.tsx | 2 +- .../user/settings/NotificationsSection.tsx | 12 +- .../__tests__/AccountSection.test.tsx | 2 +- app/routes.ts | 2 +- app/routes/__tests__/settings.test.ts | 102 ++++++++++++ app/routes/settings.tsx | 46 +++-- 8 files changed, 311 insertions(+), 79 deletions(-) create mode 100644 app/components/league/settings/__tests__/SettingsNavigation.test.tsx create mode 100644 app/routes/__tests__/settings.test.ts diff --git a/app/components/league/settings/SettingsNavigation.tsx b/app/components/league/settings/SettingsNavigation.tsx index ec0a139..d6542bb 100644 --- a/app/components/league/settings/SettingsNavigation.tsx +++ b/app/components/league/settings/SettingsNavigation.tsx @@ -1,6 +1,7 @@ import type { ComponentType } from "react"; import type { LucideProps } from "lucide-react"; import { ArrowLeft } from "lucide-react"; +import { Link } from "react-router"; import { cn } from "~/lib/utils"; type SettingsNavSection = { @@ -17,10 +18,37 @@ export type SettingsGridSection = SettingsNavSection & { export function SettingsMobileGridNav({ sections, onSectionChange, + buildHref, }: { sections: readonly SettingsGridSection[]; - onSectionChange: (sectionId: string) => void; + onSectionChange?: (sectionId: string) => void; + buildHref?: (sectionId: string) => string; }) { + const cardClassName = (section: SettingsGridSection) => + cn( + "flex cursor-pointer flex-col gap-3 rounded-xl border bg-card p-4 text-left transition-colors hover:border-primary/40 active:scale-[0.98]", + section.isDanger && "border-destructive/40" + ); + + const cardInner = (section: SettingsGridSection) => ( + <> +
+ +
+
+

{section.label}

+

{section.subtitle}

+
+ + ); + return (
@@ -29,32 +57,22 @@ export function SettingsMobileGridNav({

- {sections.map((section) => ( -
-
-

{section.label}

-

{section.subtitle}

-
- - ))} + {cardInner(section)} + + ) + )}
); @@ -62,19 +80,30 @@ export function SettingsMobileGridNav({ export function SettingsMobileSectionPill({ onShowGrid, + backHref, }: { - onShowGrid: () => void; + onShowGrid?: () => void; + backHref?: string; }) { + const className = + "flex cursor-pointer items-center gap-1.5 rounded-full border bg-card px-3 py-1.5 text-sm font-medium hover:bg-muted"; + const content = ( + <> + + Back to all settings + + ); return (
- + {backHref ? ( + + {content} + + ) : ( + + )}
); } @@ -83,33 +112,57 @@ export function SettingsDesktopNav({ sections, activeSection, onSectionChange, + buildHref, + navLabel = "League settings", }: { sections: readonly SettingsGridSection[]; activeSection: string; - onSectionChange: (sectionId: string) => void; + onSectionChange?: (sectionId: string) => void; + buildHref?: (sectionId: string) => string; + navLabel?: string; }) { + const itemClassName = (section: SettingsGridSection) => + cn( + "flex w-full cursor-pointer items-center gap-2.5 rounded-md px-3 py-2 text-left text-sm font-medium text-muted-foreground hover:bg-muted hover:text-foreground", + activeSection === section.id && "bg-muted text-foreground" + ); + + const itemInner = (section: SettingsGridSection) => ( + <> +