import type { Metadata } from "next"; import { DecodeText } from "@/src/components/bits/DecodeText"; import { Block } from "@/src/components/home/Block"; import { ClosingCta } from "@/src/components/home/ClosingCta"; import { PipelineRun } from "@/src/components/illustrations/PipelineRun"; import { Reveal } from "@/src/components/Reveal"; import { SwipeRow } from "@/src/components/SwipeRow"; import { contentFor } from "@/src/content"; import { DEFAULT_LOCALE, parseLocale } from "@/src/domain/locale"; import { languageAlternates, pathFor } from "@/src/domain/routes"; type Props = { readonly params: Promise<{ readonly locale: string }> }; export async function generateMetadata({ params }: Props): Promise { const locale = parseLocale((await params).locale) ?? DEFAULT_LOCALE; const { freelance } = contentFor(locale); return { title: { absolute: freelance.metaTitle }, description: freelance.metaDescription, alternates: { canonical: pathFor("freelance", locale), languages: languageAlternates("freelance"), }, }; } const MUTED = "text-slate-400"; const BODY = "m-0 font-sans text-lg leading-relaxed text-slate-500 md:text-xl"; const LIST_TITLE = "m-0 font-sans text-xl font-bold tracking-tight md:text-2xl"; /** * The page for people who develop themselves or lead a team: which projects * fit, the tools, and how a change is secured before it goes live. */ export default async function FreelancePage({ params }: Props) { const locale = parseLocale((await params).locale) ?? DEFAULT_LOCALE; const content = contentFor(locale); const { freelance, technology } = content; return (

{freelance.label}

{freelance.title.lead}{" "} {freelance.title.rest}

{freelance.intro}

{technology.title.lead}{" "} {technology.title.rest} } > {technology.fit.map((group, i) => (

{group.title}

    {group.items.map((item) => (
  • {item}
  • ))}
))}

{technology.techLabel}

{technology.tech.map((group) => (

{group.area}

    {group.items.map((item) => (
  • ))}
))}

{technology.pipelineIntro}

); }