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>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="rounded-box bg-base-100 p-3 text-base-content">
|
<div className="rounded-box border border-neutral-content/15 bg-base-100 p-4 text-base-content shadow-xl sm:p-5">
|
||||||
<ThemeSegmentedControl
|
<div className="mb-4 flex items-center justify-between gap-4">
|
||||||
labels="short"
|
<div>
|
||||||
className="join join-vertical w-full sm:join-horizontal"
|
<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>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ interface ThemeSegmentedControlProps {
|
|||||||
|
|
||||||
const ThemeSegmentedControl = ({
|
const ThemeSegmentedControl = ({
|
||||||
labels = 'full',
|
labels = 'full',
|
||||||
className = 'join join-vertical sm:join-horizontal',
|
className = 'grid grid-cols-2 gap-2',
|
||||||
onChange,
|
onChange,
|
||||||
}: ThemeSegmentedControlProps) => {
|
}: ThemeSegmentedControlProps) => {
|
||||||
const rootTheme = useRouteLoaderData<typeof rootLoader>('root')?.theme ?? defaultThemeName;
|
const rootTheme = useRouteLoaderData<typeof rootLoader>('root')?.theme ?? defaultThemeName;
|
||||||
@@ -33,7 +33,11 @@ const ThemeSegmentedControl = ({
|
|||||||
return (
|
return (
|
||||||
<label
|
<label
|
||||||
key={theme.value}
|
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
|
<input
|
||||||
type="radio"
|
type="radio"
|
||||||
@@ -47,7 +51,34 @@ const ThemeSegmentedControl = ({
|
|||||||
onChange?.(theme.value);
|
onChange?.(theme.value);
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
<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}
|
{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>
|
</label>
|
||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ export interface ThemeOption {
|
|||||||
label: string;
|
label: string;
|
||||||
/** Used where the segmented control is narrow, such as the landing page. */
|
/** Used where the segmented control is narrow, such as the landing page. */
|
||||||
shortLabel: string;
|
shortLabel: string;
|
||||||
|
/** A compact mood descriptor for theme pickers. */
|
||||||
|
shortVibe: string;
|
||||||
vibe: string;
|
vibe: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -17,24 +19,28 @@ export const biergartenThemes: ThemeOption[] = [
|
|||||||
value: 'biergarten-lager',
|
value: 'biergarten-lager',
|
||||||
label: 'Biergarten Lager',
|
label: 'Biergarten Lager',
|
||||||
shortLabel: 'Lager',
|
shortLabel: 'Lager',
|
||||||
|
shortVibe: 'Muted parchment',
|
||||||
vibe: 'Muted parchment, mellow amber, daytime beer garden',
|
vibe: 'Muted parchment, mellow amber, daytime beer garden',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
value: 'biergarten-stout',
|
value: 'biergarten-stout',
|
||||||
label: 'Biergarten Stout',
|
label: 'Biergarten Stout',
|
||||||
shortLabel: 'Stout',
|
shortLabel: 'Stout',
|
||||||
|
shortVibe: 'Charred barrel',
|
||||||
vibe: 'Charred barrel, deep roast, cozy evening cellar',
|
vibe: 'Charred barrel, deep roast, cozy evening cellar',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
value: 'biergarten-cassis',
|
value: 'biergarten-cassis',
|
||||||
label: 'Biergarten Cassis',
|
label: 'Biergarten Cassis',
|
||||||
shortLabel: 'Cassis',
|
shortLabel: 'Cassis',
|
||||||
|
shortVibe: 'Blackberry barrel',
|
||||||
vibe: 'Blackberry barrel, sour berry dark, vivid night market',
|
vibe: 'Blackberry barrel, sour berry dark, vivid night market',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
value: 'biergarten-weizen',
|
value: 'biergarten-weizen',
|
||||||
label: 'Biergarten Weizen',
|
label: 'Biergarten Weizen',
|
||||||
shortLabel: 'Weizen',
|
shortLabel: 'Weizen',
|
||||||
|
shortVibe: 'Bright spring',
|
||||||
vibe: 'Ultra-light young barley, green undertone, bright spring afternoon',
|
vibe: 'Ultra-light young barley, green undertone, bright spring afternoon',
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|||||||
Reference in New Issue
Block a user