Some checks failed
Main Confidence / confidence (push) Failing after 43s
## Summary - implement the website-only core IA for Spec 215 with canonical Home, Product, Trust, Changelog, Contact, Privacy, and Imprint routes - reduce primary navigation to the core buyer journey, retain legal/supporting pages as secondary surfaces, and redirect `/security-trust` to `/trust` - add route metadata, sitemap/canonical handling, changelog publishing, and updated smoke coverage for the new IA contract ## Testing - `corepack pnpm build:website` - `cd apps/website && corepack pnpm exec playwright test` - integrated browser smoke validation for core routes, secondary routes, `/security-trust -> /trust`, hidden optional routes, mobile nav, and Trust/Changelog to Contact paths ## Notes - keeps all changes local to `apps/website` and the Spec 215 artifacts - preserves the website working contract with no `apps/platform` runtime coupling Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de> Reviewed-on: #252
62 lines
3.0 KiB
Plaintext
62 lines
3.0 KiB
Plaintext
---
|
|
import { getCollection } from 'astro:content';
|
|
|
|
import PageShell from '@/components/layout/PageShell.astro';
|
|
import Card from '@/components/primitives/Card.astro';
|
|
import Container from '@/components/primitives/Container.astro';
|
|
import Section from '@/components/primitives/Section.astro';
|
|
import SectionHeader from '@/components/primitives/SectionHeader.astro';
|
|
import CTASection from '@/components/sections/CTASection.astro';
|
|
import PageHero from '@/components/sections/PageHero.astro';
|
|
import { changelogHero, changelogSeo } from '@/content/pages/changelog';
|
|
|
|
const formatter = new Intl.DateTimeFormat('en', { dateStyle: 'long' });
|
|
const entries = (await getCollection('changelog'))
|
|
.filter((entry) => entry.data.draft !== true)
|
|
.sort((left, right) => right.data.publishedAt.valueOf() - left.data.publishedAt.valueOf());
|
|
---
|
|
|
|
<PageShell currentPath="/changelog" title={changelogSeo.title} description={changelogSeo.description}>
|
|
<PageHero
|
|
hero={changelogHero}
|
|
calloutTitle="Visible progress should be dated and concrete."
|
|
calloutDescription="The changelog exists so returning visitors can verify product motion without mistaking placeholder resources or editorial ambitions for current release truth."
|
|
/>
|
|
|
|
<Section tone="muted" density="base" layer="2">
|
|
<Container width="wide">
|
|
<div class="space-y-8">
|
|
<SectionHeader
|
|
eyebrow="Published updates"
|
|
title="Dated updates, not vague momentum signals."
|
|
description="Each entry should explain what changed in a concrete way and connect back to product understanding, trust, or the contact path."
|
|
/>
|
|
|
|
<div class="grid gap-6">
|
|
{entries.map((entry) => (
|
|
<Card as="article" class="space-y-4">
|
|
<p class="m-0 text-sm font-semibold uppercase tracking-[0.14em] text-[var(--color-brand)]">
|
|
{formatter.format(entry.data.publishedAt)}
|
|
</p>
|
|
<h2 class="m-0 font-[var(--font-display)] text-3xl text-[var(--color-ink-900)]">
|
|
{entry.data.title}
|
|
</h2>
|
|
<p class="m-0 max-w-3xl text-base leading-7 text-[var(--color-copy)]">
|
|
{entry.data.description}
|
|
</p>
|
|
</Card>
|
|
))}
|
|
</div>
|
|
</div>
|
|
</Container>
|
|
</Section>
|
|
|
|
<CTASection
|
|
eyebrow="Next step"
|
|
title="Use visible progress to start a more concrete evaluation conversation."
|
|
description="Once the route model and recent progress are clear, the next move should stay obvious: inspect the product model again or start the contact path."
|
|
primary={{ href: '/contact', label: 'Start the working session' }}
|
|
secondary={{ href: '/product', label: 'See the product model', variant: 'secondary' }}
|
|
/>
|
|
</PageShell>
|