From bd01f47df5a413118e81b69a9ec46a515b76fad2 Mon Sep 17 00:00:00 2001 From: Aaron Po Date: Sun, 4 Oct 2026 20:02:55 -0400 Subject: [PATCH] Enhance theme selection UI with mood descriptors and improved styling --- .../features/home/components/ThemeTryOut.tsx | 16 +++++--- .../components/ThemeSegmentedControl.tsx | 37 +++++++++++++++++-- web/frontend/app/features/theme/themes.ts | 6 +++ 3 files changed, 51 insertions(+), 8 deletions(-) diff --git a/web/frontend/app/features/home/components/ThemeTryOut.tsx b/web/frontend/app/features/home/components/ThemeTryOut.tsx index c93afd88..2027f0ea 100644 --- a/web/frontend/app/features/home/components/ThemeTryOut.tsx +++ b/web/frontend/app/features/home/components/ThemeTryOut.tsx @@ -13,11 +13,17 @@ const ThemeTryOut = () => (

-
- +
+
+
+

+ Set the mood +

+

Your theme follows your pour.

+
+ 4 pours +
+
diff --git a/web/frontend/app/features/theme/components/ThemeSegmentedControl.tsx b/web/frontend/app/features/theme/components/ThemeSegmentedControl.tsx index 734ec84a..0c33b7e9 100644 --- a/web/frontend/app/features/theme/components/ThemeSegmentedControl.tsx +++ b/web/frontend/app/features/theme/components/ThemeSegmentedControl.tsx @@ -19,7 +19,7 @@ interface ThemeSegmentedControlProps { const ThemeSegmentedControl = ({ labels = 'full', - className = 'join join-vertical sm:join-horizontal', + className = 'grid grid-cols-2 gap-2', onChange, }: ThemeSegmentedControlProps) => { const rootTheme = useRouteLoaderData('root')?.theme ?? defaultThemeName; @@ -33,7 +33,11 @@ const ThemeSegmentedControl = ({ return ( ); })} diff --git a/web/frontend/app/features/theme/themes.ts b/web/frontend/app/features/theme/themes.ts index e94d350f..0b7f9f62 100644 --- a/web/frontend/app/features/theme/themes.ts +++ b/web/frontend/app/features/theme/themes.ts @@ -6,6 +6,8 @@ export interface ThemeOption { label: string; /** Used where the segmented control is narrow, such as the landing page. */ shortLabel: string; + /** A compact mood descriptor for theme pickers. */ + shortVibe: string; vibe: string; } @@ -17,24 +19,28 @@ export const biergartenThemes: ThemeOption[] = [ value: 'biergarten-lager', label: 'Biergarten Lager', shortLabel: 'Lager', + shortVibe: 'Muted parchment', vibe: 'Muted parchment, mellow amber, daytime beer garden', }, { value: 'biergarten-stout', label: 'Biergarten Stout', shortLabel: 'Stout', + shortVibe: 'Charred barrel', vibe: 'Charred barrel, deep roast, cozy evening cellar', }, { value: 'biergarten-cassis', label: 'Biergarten Cassis', shortLabel: 'Cassis', + shortVibe: 'Blackberry barrel', vibe: 'Blackberry barrel, sour berry dark, vivid night market', }, { value: 'biergarten-weizen', label: 'Biergarten Weizen', shortLabel: 'Weizen', + shortVibe: 'Bright spring', vibe: 'Ultra-light young barley, green undertone, bright spring afternoon', }, ];