--- /** * Home = the voyage. One long timeline: hero → profile → asteroid belt with a * beacon per project → stack constellation → contact portal. * * Two rendering modes from the same markup: * - default (no JS, no WebGL, reduced motion): normal stacked sections * - `html.cinema` (set by voyage.ts): sections become fixed overlays, * the wrapper's height becomes the scroll timeline. */ import BaseLayout from '../layouts/BaseLayout.astro'; import Eyebrow from '../components/Eyebrow.astro'; import TechIcon from '../components/TechIcon.astro'; import { Copy } from '@lucide/astro'; import { Badge, Button } from '@unkn0wndo3s/nova-design-system'; import { site, stack } from '../data/site'; import { featuredProjects, projects, type Project } from '../data/projects'; import { breadcrumbLd, profilePageLd } from '../lib/seo'; import { getLocaleFromUrl, useTranslations, localizePath } from '../i18n'; const locale = getLocaleFromUrl(Astro.url); const t = useTranslations(locale); const voyageProjects: Project[] = [...featuredProjects, ...projects.filter((p) => !p.featured)]; const statusType = { live: 'success', maintained: 'info', wip: 'warning' } as const; const statusLabel = { live: t('work.status.live'), maintained: t('work.status.maintained'), wip: t('work.status.wip'), } as const; const pillars = [ { title: t('home.profile.front.title'), body: t('home.profile.front.body') }, { title: t('home.profile.back.title'), body: t('home.profile.back.body') }, { title: t('home.profile.ops.title'), body: t('home.profile.ops.body') }, ]; const dots = ['hero', 'about', 'projects', ...voyageProjects.map((p) => `p-${p.slug}`), 'stack', 'contact']; ---

{t('avail.badge')} {t('avail.line')}

{site.name}, {t('home.hero.title.role')}

{t('home.hero.lead')}

{t('home.profile.eyebrow')}

{t('home.profile.title')}

{t('home.profile.body1')}

{t('home.about.summary')}

    {pillars.map((p) => (
  • {p.title}{p.body}
  • ))}
{t('home.projects.eyebrow')}

{t('home.projects.intro.title')}

{t('home.projects.intro.body')}

{voyageProjects.map((p, i) => (
{statusLabel[p.status]}

{p.name}

{p.tagline[locale]}

    {p.highlights.slice(0, 2).map((h) =>
  • {h[locale]}
  • )}
))}
{t('home.stack.eyebrow')}

{t('home.stack.title')}

    {stack.map((s) =>
  • )}
{t('contact.title')}

{t('home.cta.title')}

{t('home.cta.body')}

{site.email}

{t('avail.where')}