feat(nessa): add branded landing page with site-aware metadata

Add the Nessa subdomain landing page served at nessa.freno.me/.

- index.tsx: hero, feature highlights, CTA band, and footer themed via
  useSite() brandColor and useDarkMode(); deliberately avoids freno.me
  web-auth UI (Nessa uses Clerk) and uses a non-fabricated 'Coming soon'
  CTA since there's no app-store presence yet.
- meta.ts: deterministic PageHeadProps (title, description, OG) as a pure
  module mirroring the page-head-meta testability pattern; feature copy is
  derived from real nessaCommunityRouter capabilities (clubs, challenges,
  social.feed, events).
- meta.test.ts: resolves metadata over SITE_CONFIG.nessa + pathname '/' to
  assert title suffix composition, canonical, OG image fallback, and
  description content.
This commit is contained in:
2026-07-23 11:42:25 -04:00
parent 6fdbbbbe2b
commit dbf47f3170
3 changed files with 391 additions and 0 deletions

39
src/routes/nessa/meta.ts Normal file
View File

@@ -0,0 +1,39 @@
/**
* Deterministic `PageHead` metadata for the Nessa landing page (task 07).
*
* Pure module — imports NOTHING from solid-js / @solidjs/router / @solidjs/meta —
* so the landing-page metadata can be unit-tested in `bun:test` without
* spinning up the router / MetaProvider / DOM, mirroring the
* `page-head-meta.ts` / `nav-config.ts` testability pattern.
*
* `index.tsx` imports `NESSA_LANDING_META` and feeds it to `<PageHead …/>`;
* `meta.test.ts` asserts the *resolved* title / canonical / OG values against
* the site-aware `resolvePageHeadMeta` helper (task 02) for the `nessa` site.
*
* Nessa-specific metadata contract:
* - `<title>` resolves to `"Nessa | Nessa"` (props.title + nessa.titleSuffix).
* - canonical resolves to `https://nessa.freno.me/` (auto-derived from
* `site.domain` + the browser pathname `/` — the vercel.json host rewrite
* targets the internal `/nessa` prefix but leaves the public URL clean).
* - `og:image` falls back to the site's `ogDefaultImage` (`/nessa/og-default.png`).
* - description emphasizes Nessa's community capabilities (clubs, challenges,
* social feed, events) — derived from `nessaCommunityRouter`, not fabricated.
*/
import type { PageHeadProps } from "~/components/page-head-meta";
/**
* PageHead props for the Nessa landing page.
*
* `title` is intentionally `"Nessa"` so the site-aware suffix composes into
* `"Nessa | Nessa"`. An explicit `ogTitle` is provided so the OG card reads
* as a clean brand title rather than the bare `"Nessa"` (which would be the
* no-suffix fallback) — this matches the marketing-copy intent of the card.
*/
export const NESSA_LANDING_META: PageHeadProps = {
title: "Nessa",
description:
"Nessa is a community platform for building clubs, running challenges, sharing in a social feed, and organizing events.",
ogTitle: "Nessa — Build community. Run challenges. Stay connected.",
ogDescription:
"Nessa brings clubs, challenges, social posts, and events together in one community platform."
};