Files
Portfolio/src/app/core/content/content.contracts.ts

51 lines
1.3 KiB
TypeScript

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;
}