mirror of
https://github.com/aaronpo97/the-biergarten-app.git
synced 2026-10-14 17:54:42 +00:00
Enhance theme selection UI with mood descriptors and improved styling
This commit is contained in:
@@ -13,11 +13,17 @@ const ThemeTryOut = () => (
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="rounded-box bg-base-100 p-3 text-base-content">
|
||||
<ThemeSegmentedControl
|
||||
labels="short"
|
||||
className="join join-vertical w-full sm:join-horizontal"
|
||||
/>
|
||||
<div className="rounded-box border border-neutral-content/15 bg-base-100 p-4 text-base-content shadow-xl sm:p-5">
|
||||
<div className="mb-4 flex items-center justify-between gap-4">
|
||||
<div>
|
||||
<p className="m-0 text-xs font-bold uppercase tracking-[0.18em] opacity-60">
|
||||
Set the mood
|
||||
</p>
|
||||
<p className="m-0 mt-1 text-sm opacity-75">Your theme follows your pour.</p>
|
||||
</div>
|
||||
<span className="badge badge-outline shrink-0">4 pours</span>
|
||||
</div>
|
||||
<ThemeSegmentedControl labels="short" />
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
@@ -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<typeof rootLoader>('root')?.theme ?? defaultThemeName;
|
||||
@@ -33,7 +33,11 @@ const ThemeSegmentedControl = ({
|
||||
return (
|
||||
<label
|
||||
key={theme.value}
|
||||
className={`btn join-item ${checked ? 'btn-primary' : 'btn-outline'}`}
|
||||
className={`group flex min-h-20 cursor-pointer items-center gap-3 rounded-box border p-3 text-left transition-all duration-200 ${
|
||||
checked
|
||||
? 'border-primary bg-primary text-primary-content shadow-md'
|
||||
: 'border-base-content/15 bg-base-200/45 hover:-translate-y-0.5 hover:border-primary/50 hover:bg-base-200'
|
||||
}`}
|
||||
>
|
||||
<input
|
||||
type="radio"
|
||||
@@ -47,7 +51,34 @@ const ThemeSegmentedControl = ({
|
||||
onChange?.(theme.value);
|
||||
}}
|
||||
/>
|
||||
{labels === 'short' ? theme.shortLabel : theme.label}
|
||||
<span
|
||||
aria-hidden="true"
|
||||
className={`size-9 shrink-0 rounded-full border-4 shadow-inner transition-transform duration-200 group-hover:scale-105 ${
|
||||
checked ? 'border-primary-content/70' : 'border-base-100'
|
||||
}`}
|
||||
style={{
|
||||
background:
|
||||
theme.value === 'biergarten-lager'
|
||||
? 'linear-gradient(135deg, #f5c451 0%, #a96728 100%)'
|
||||
: theme.value === 'biergarten-stout'
|
||||
? 'linear-gradient(135deg, #d69b45 0%, #382116 100%)'
|
||||
: theme.value === 'biergarten-cassis'
|
||||
? 'linear-gradient(135deg, #c777b9 0%, #4c214e 100%)'
|
||||
: 'linear-gradient(135deg, #f7e6a5 0%, #82a85d 100%)',
|
||||
}}
|
||||
/>
|
||||
<span className="min-w-0">
|
||||
<span className="block truncate text-sm font-bold">
|
||||
{labels === 'short' ? theme.shortLabel : theme.label}
|
||||
</span>
|
||||
<span
|
||||
className={`mt-0.5 block truncate text-xs ${
|
||||
checked ? 'text-primary-content/75' : 'text-base-content/60'
|
||||
}`}
|
||||
>
|
||||
{theme.shortVibe}
|
||||
</span>
|
||||
</span>
|
||||
</label>
|
||||
);
|
||||
})}
|
||||
|
||||
@@ -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',
|
||||
},
|
||||
];
|
||||
|
||||
Reference in New Issue
Block a user