GRV-Summit-Site/content/topo-patterns.ts
kirukib cb404ec079
Some checks failed
Deploy to Cloudflare Workers (OpenNext) / deploy (push) Has been cancelled
Align site colors with GRV brand book palette.
Centralize primary, secondary, tertiary, and neutral tokens and apply them across theme variables and UI components.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-04 14:45:22 +03:00

87 lines
3.0 KiB
TypeScript

/**
* Site patterns: mainwhite.svg (white sections) · main.svg (green edge frames)
*/
export type TopoPatternId = "topo-main" | "none";
/** White sections — full mainwhite pattern */
export type TopoSectionTone = "light" | "green";
export const SITE_TOPO_PATTERN = "topo-main" as const satisfies TopoPatternId;
export const MAIN_WHITE_PATTERN_SRC = "/patterns/mainwhite.svg";
export const MAIN_GREEN_PATTERN_SRC = "/patterns/main.svg";
export { BRAND_GREEN } from "@/content/brand-colors";
export type TopoPatternAsset = {
src: string;
positions: [string, string];
defaultOpacity: number;
};
export const MAIN_WHITE_ASSET: TopoPatternAsset = {
src: MAIN_WHITE_PATTERN_SRC,
positions: ["50% 46%", "42% 58%"],
defaultOpacity: 0.42,
};
export const MAIN_GREEN_EDGE_ASSET: TopoPatternAsset = {
src: MAIN_GREEN_PATTERN_SRC,
positions: ["left center", "right center"],
defaultOpacity: 0.58,
};
export function getAssetForTone(tone: TopoSectionTone): TopoPatternAsset {
return tone === "light" ? MAIN_WHITE_ASSET : MAIN_GREEN_EDGE_ASSET;
}
export function toneUsesEdgeLayout(tone: TopoSectionTone): boolean {
return tone === "green";
}
export const PAGE_TOPO_PATTERN: Record<string, TopoPatternId> = {
home: SITE_TOPO_PATTERN,
program: SITE_TOPO_PATTERN,
speakers: SITE_TOPO_PATTERN,
partners: SITE_TOPO_PATTERN,
pitch: SITE_TOPO_PATTERN,
exhibit: SITE_TOPO_PATTERN,
sponsor: SITE_TOPO_PATTERN,
contact: SITE_TOPO_PATTERN,
payment: SITE_TOPO_PATTERN,
"payment-success": SITE_TOPO_PATTERN,
privacy: SITE_TOPO_PATTERN,
};
export function getPageTopoPattern(pathname: string): TopoPatternId {
if (pathname === "/") return PAGE_TOPO_PATTERN.home;
if (pathname.startsWith("/program")) return PAGE_TOPO_PATTERN.program;
if (pathname.startsWith("/speakers")) return PAGE_TOPO_PATTERN.speakers;
if (pathname.startsWith("/partners")) return PAGE_TOPO_PATTERN.partners;
if (pathname.startsWith("/pitch-competition")) return PAGE_TOPO_PATTERN.pitch;
if (pathname.startsWith("/exhibit")) return PAGE_TOPO_PATTERN.exhibit;
if (pathname.startsWith("/sponsor")) return PAGE_TOPO_PATTERN.sponsor;
if (pathname.startsWith("/contact")) return PAGE_TOPO_PATTERN.contact;
if (pathname === "/payment/success") return PAGE_TOPO_PATTERN["payment-success"];
if (pathname.startsWith("/payment")) return PAGE_TOPO_PATTERN.payment;
if (pathname.startsWith("/privacy")) return PAGE_TOPO_PATTERN.privacy;
return SITE_TOPO_PATTERN;
}
export function resolveTopoPattern(
pattern: TopoPatternId | undefined,
fallback: TopoPatternId = SITE_TOPO_PATTERN
): Exclude<TopoPatternId, "none"> | null {
const resolved = pattern && pattern !== "none" ? pattern : fallback;
if (resolved === "none") return null;
return "topo-main";
}
/** Map section variant → pattern tone (white = light, muted/inverse = green) */
export function toneFromSectionVariant(
variant: "default" | "muted" | "inverse"
): TopoSectionTone {
return variant === "default" ? "light" : "green";
}