foundation: project guide, tooling, design tokens, bilingual shell and routing contracts
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
50
src/app/core/content/content.contracts.ts
Normal file
50
src/app/core/content/content.contracts.ts
Normal file
@@ -0,0 +1,50 @@
|
||||
import { type RouteId } from '../routing/route-ids';
|
||||
|
||||
/**
|
||||
* Copy roles stay separate on purpose:
|
||||
* - headline is the serious heading used for SEO and page structure
|
||||
* - proof is only ever a verifiable statement
|
||||
* - playfulLine is an optional wordplay hook that is never a capability claim
|
||||
* - cta lives on CtaCopy so action labels stay swappable
|
||||
*/
|
||||
export interface CopyBlock {
|
||||
readonly headline: string;
|
||||
readonly proof?: string;
|
||||
readonly playfulLine?: string;
|
||||
readonly body?: readonly string[];
|
||||
}
|
||||
|
||||
export interface CtaCopy {
|
||||
readonly label: string;
|
||||
readonly routeId?: RouteId;
|
||||
readonly href?: string;
|
||||
readonly external?: boolean;
|
||||
}
|
||||
|
||||
export interface SectionCopy extends CopyBlock {
|
||||
readonly id: string;
|
||||
}
|
||||
|
||||
export interface PageCopy {
|
||||
readonly routeId: RouteId;
|
||||
readonly title: string;
|
||||
readonly description: string;
|
||||
readonly hero: CopyBlock;
|
||||
readonly sections: readonly SectionCopy[];
|
||||
readonly ctas: readonly CtaCopy[];
|
||||
}
|
||||
|
||||
export interface CaseStudySummary {
|
||||
readonly id: string;
|
||||
readonly client: string;
|
||||
readonly headline: string;
|
||||
readonly proof?: string;
|
||||
readonly tags: readonly string[];
|
||||
readonly routeId?: RouteId;
|
||||
}
|
||||
|
||||
export type LocalizedPages = Partial<Record<RouteId, PageCopy>>;
|
||||
|
||||
export interface SiteContent {
|
||||
readonly pages: LocalizedPages;
|
||||
}
|
||||
Reference in New Issue
Block a user