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:
39
src/routes/nessa/meta.ts
Normal file
39
src/routes/nessa/meta.ts
Normal 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."
|
||||
};
|
||||
Reference in New Issue
Block a user