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',
},
];