feat: scaffold holiday booking project

This commit is contained in:
2026-05-22 07:54:09 +00:00
commit abfc8dcf8e
39 changed files with 8941 additions and 0 deletions

View File

@@ -0,0 +1,23 @@
import type { ReactNode } from 'react';
type SectionProps = {
eyebrow?: string;
title: string;
description?: string;
children: ReactNode;
id?: string;
};
export function Section({ eyebrow, title, description, children, id }: SectionProps) {
return (
<section id={id} className="section-shell">
<div className="section-heading">
{eyebrow ? <p className="section-eyebrow">{eyebrow}</p> : null}
<h2>{title}</h2>
{description ? <p className="section-description">{description}</p> : null}
</div>
{children}
</section>
);
}

View File

@@ -0,0 +1,20 @@
export function SiteFooter() {
const year = new Date().getFullYear();
return (
<footer className="site-footer">
<div>
<p className="footer-label">Status</p>
<p>Phase 1 scaffold underway.</p>
</div>
<div>
<p className="footer-label">Build</p>
<p>
{year} {process.env.NEXT_PUBLIC_BUILD_COMMIT || 'local'} iteration{' '}
{process.env.NEXT_PUBLIC_BUILD_ITERATION || '0'}
</p>
</div>
</footer>
);
}

View File

@@ -0,0 +1,29 @@
const navItems = [
{ href: '#foundation', label: 'Foundation' },
{ href: '#stack', label: 'Stack' },
{ href: '#data', label: 'Data model' },
{ href: '#launch', label: 'Launch' },
];
export function SiteHeader() {
return (
<header className="site-header">
<div className="brand-lockup">
<span className="brand-mark">HPB</span>
<div>
<p className="brand-kicker">Project scaffold</p>
<h1>Holiday Property Booking</h1>
</div>
</div>
<nav aria-label="Primary" className="site-nav">
{navItems.map((item) => (
<a key={item.href} href={item.href}>
{item.label}
</a>
))}
</nav>
</header>
);
}