Apply La Huasca brand colors across layout, nav, login, admin, user and home
This commit is contained in:
+97
-42
@@ -31,6 +31,11 @@ interface PortalData {
|
||||
wifiPassword: string;
|
||||
}
|
||||
|
||||
const gold = '#E8A849';
|
||||
const navy = '#010D1E';
|
||||
const cream = '#f5f0e8';
|
||||
const warm = '#a6683c';
|
||||
|
||||
export default function UserPage() {
|
||||
const router = useRouter();
|
||||
const [data, setData] = useState<PortalData | null>(null);
|
||||
@@ -53,94 +58,144 @@ export default function UserPage() {
|
||||
.finally(() => setLoading(false));
|
||||
}, [router]);
|
||||
|
||||
if (loading) return <main style={{ padding: '2rem' }}><p>Loading...</p></main>;
|
||||
if (loading) {
|
||||
return (
|
||||
<main style={{ padding: '2rem', color: warm, fontSize: '18px' }}>
|
||||
<p>Loading your portal...</p>
|
||||
</main>
|
||||
);
|
||||
}
|
||||
|
||||
if (!data) {
|
||||
return <main style={{ padding: '2rem' }}><p>Please log in as user to access this page.</p></main>;
|
||||
}
|
||||
|
||||
return (
|
||||
<main style={{ padding: '2rem', maxWidth: '48rem', margin: '0 auto' }}>
|
||||
<h1>User Portal</h1>
|
||||
<main style={{ padding: '2rem', maxWidth: '56rem', margin: '0 auto' }}>
|
||||
<h1 style={{ fontSize: 'clamp(28px, 4vw, 42px)', fontWeight: 400, fontStyle: 'italic', color: navy, margin: '0 0 2rem' }}>
|
||||
Member Portal
|
||||
</h1>
|
||||
|
||||
<section style={{ marginBottom: '2rem' }}>
|
||||
<h2>Future Reservations</h2>
|
||||
<Section title="Future Reservations">
|
||||
{data.reservations.length === 0 ? (
|
||||
<p style={{ color: 'dimgray' }}>No upcoming reservations.</p>
|
||||
<p style={{ color: '#777' }}>No upcoming reservations.</p>
|
||||
) : (
|
||||
<ul style={{ padding: 0, listStyle: 'none' }}>
|
||||
<ul style={{ padding: 0, listStyle: 'none', display: 'flex', flexDirection: 'column', gap: '0.75rem' }}>
|
||||
{data.reservations.map((r) => (
|
||||
<li
|
||||
key={r.id}
|
||||
style={{
|
||||
padding: '1rem',
|
||||
marginBottom: '0.5rem',
|
||||
border: '1px solid #ddd',
|
||||
borderRadius: '8px',
|
||||
padding: '1rem 1.25rem',
|
||||
background: cream,
|
||||
borderRadius: '16px',
|
||||
boxShadow: '0 1px 2px rgba(1,13,30,0.08)',
|
||||
color: navy,
|
||||
}}
|
||||
>
|
||||
{r.date} at {r.time} · {r.guests} guests · {r.table_name}
|
||||
<strong style={{ color: warm }}>{r.date}</strong> at {r.time} · {r.guests} guests · {r.table_name}
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
)}
|
||||
</section>
|
||||
</Section>
|
||||
|
||||
<section style={{ marginBottom: '2rem' }}>
|
||||
<h2>Discount Coupons</h2>
|
||||
<Section title="Discount Coupons">
|
||||
<div style={{ display: 'flex', gap: '1rem', flexWrap: 'wrap' }}>
|
||||
{data.coupons.map((c) => (
|
||||
<div
|
||||
key={c.id}
|
||||
style={{
|
||||
padding: '1rem',
|
||||
border: '2px dashed #1a1a1a',
|
||||
borderRadius: '8px',
|
||||
minWidth: '12rem',
|
||||
padding: '1.25rem',
|
||||
background: cream,
|
||||
border: '2px dashed ' + warm,
|
||||
borderRadius: '16px',
|
||||
minWidth: '13rem',
|
||||
color: navy,
|
||||
}}
|
||||
>
|
||||
<strong>{c.code}</strong>
|
||||
<p style={{ margin: '0.5rem 0 0', color: 'dimgray' }}>{c.discount}</p>
|
||||
<strong style={{ fontSize: '18px', color: warm }}>{c.code}</strong>
|
||||
<p style={{ margin: '0.5rem 0 0', color: '#555', fontSize: '14px' }}>{c.discount}</p>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
</Section>
|
||||
|
||||
<section style={{ marginBottom: '2rem' }}>
|
||||
<h2>Offers</h2>
|
||||
<ul>
|
||||
<Section title="Offers">
|
||||
<ul style={{ padding: 0, listStyle: 'none', display: 'flex', flexDirection: 'column', gap: '0.75rem' }}>
|
||||
{data.offers.map((o) => (
|
||||
<li key={o.id}>
|
||||
<strong>{o.title}</strong> — {o.description}
|
||||
<li
|
||||
key={o.id}
|
||||
style={{
|
||||
padding: '1rem 1.25rem',
|
||||
background: cream,
|
||||
borderRadius: '16px',
|
||||
color: navy,
|
||||
}}
|
||||
>
|
||||
<strong style={{ color: warm }}>{o.title}</strong> — {o.description}
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</section>
|
||||
</Section>
|
||||
|
||||
<section style={{ marginBottom: '2rem' }}>
|
||||
<h2>WiFi Password</h2>
|
||||
<p
|
||||
<Section title="WiFi Password">
|
||||
<div
|
||||
style={{
|
||||
display: 'inline-block',
|
||||
padding: '0.75rem 1.5rem',
|
||||
background: '#f4f4f4',
|
||||
borderRadius: '8px',
|
||||
padding: '0.9rem 2rem',
|
||||
background: navy,
|
||||
color: cream,
|
||||
borderRadius: '12px',
|
||||
fontFamily: 'monospace',
|
||||
fontSize: '1.25rem',
|
||||
fontSize: '1.4rem',
|
||||
letterSpacing: '0.04em',
|
||||
boxShadow: '0 4px 12px rgba(1,13,30,0.2)',
|
||||
}}
|
||||
>
|
||||
{data.wifiPassword}
|
||||
</p>
|
||||
</section>
|
||||
</div>
|
||||
</Section>
|
||||
|
||||
<section>
|
||||
<h2>Member Benefits</h2>
|
||||
<ul>
|
||||
<Section title="Member Benefits">
|
||||
<ul style={{ padding: 0, listStyle: 'none', display: 'grid', gridTemplateColumns: 'repeat(auto-fill, minmax(260px, 1fr))', gap: '0.75rem' }}>
|
||||
{data.benefits.map((b) => (
|
||||
<li key={b}>{b}</li>
|
||||
<li
|
||||
key={b}
|
||||
style={{
|
||||
padding: '0.9rem 1.1rem',
|
||||
background: '#e8eff3',
|
||||
borderLeft: '4px solid ' + gold,
|
||||
borderRadius: '0 12px 12px 0',
|
||||
color: navy,
|
||||
}}
|
||||
>
|
||||
{b}
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</section>
|
||||
</Section>
|
||||
</main>
|
||||
);
|
||||
}
|
||||
|
||||
function Section({ title, children }: { title: string; children: React.ReactNode }) {
|
||||
return (
|
||||
<section style={{ marginBottom: '2.5rem' }}>
|
||||
<h2
|
||||
style={{
|
||||
fontSize: '20px',
|
||||
fontWeight: 600,
|
||||
letterSpacing: '-0.01em',
|
||||
color: navy,
|
||||
margin: '0 0 1rem',
|
||||
paddingBottom: '0.4rem',
|
||||
borderBottom: '1.5px solid ' + warm,
|
||||
display: 'inline-block',
|
||||
}}
|
||||
>
|
||||
{title}
|
||||
</h2>
|
||||
{children}
|
||||
</section>
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user