Files
highland_games_website/lib/games.ts
T
Mathew 9b6638eb00
Deploy / deploy (push) Successful in 1m13s
Ajoute une couche de micro-animations sur tout le site
Deux courbes partagées dans lib/motion.ts, pour que le CSS et Framer
aient le même feeling, et quatre primitives que Tailwind ne sait pas
exprimer : reflet de bouton, halo qui suit le curseur, soulignement qui
se dessine, secousse d'erreur.

Nouveaux composants : Stagger (les collections se distribuent une par
une), Spotlight (trouve son parent tout seul, donc les cartes restent
des composants serveur), ScrollProgress, BackToTop, Parallax, Spinner,
CheckMark. Reveal accepte maintenant une direction.

Côté rendu : le trait de nav glisse d'un onglet à l'autre, les cartes
se soulèvent, le hero réagit au scroll, les piliers entrent en zig-zag,
la lightbox glisse dans le sens demandé et les formulaires répondent.

prefers-reduced-motion est respecté partout : Framer coupe via
useReducedMotion, le CSS via la media query déjà en place.

Le commit embarque aussi la réorganisation des composants par domaine
qui était en cours dans l'arbre de travail — les deux étaient trop
imbriquées pour être séparées proprement.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 16:04:41 +02:00

132 lines
4.2 KiB
TypeScript

export type GameStatus = "in-development" | "released" | "coming-soon";
export type Screenshot = {
src: string;
/** Short caption. Also used as the image alt text. */
caption: string;
};
/**
* A gameplay pillar: what the player actually *does*.
*
* Copy rules, borrowed from the EmberWild site so both properties describe the
* game the same way:
* 1. No story. No lore, no factions, no twists. A visitor should arrive
* knowing what they will do, not what they will find out.
* 2. The title is one word. The body is one sentence.
* 3. If the screenshot already says it, do not write it.
*/
export type Pillar = {
title: string;
body: string;
/** The capture that illustrates it. */
shot: string;
};
export type Game = {
slug: string;
title: string;
status: GameStatus;
/** One readable line. Shown under the title on cards and on the game page. */
tagline: string;
/** Full pitch. Shown in the "About" block of the game page. */
description: string;
genres: string[];
releaseWindow?: string;
steamUrl?: string;
/** Player count, e.g. "1-6". Drives the co-op block on the game page. */
players?: string;
platform?: string;
/** What the player does, one band each on the game page. */
pillars: Pillar[];
/**
* Illustrated key art / cover (portrait or square-ish artwork).
* Rendered on its own panel — never used as a background behind text,
* because the artwork is light and text would become unreadable.
*/
keyArt?: string;
/**
* Wide in-game capture used as the page banner. Prefer a 16:9 screenshot.
* Text is never laid over it either; the title block sits underneath.
*/
banner?: string;
/**
* Gallery. This is the ONLY place screenshots are declared: the game page
* shows them all, the home page shows the first few of the featured game.
* Drop new files in /public/image/Games/<Game>/ and add them here.
*/
screenshots: Screenshot[];
};
export const STATUS_LABEL: Record<GameStatus, string> = {
"in-development": "IN DEVELOPMENT",
released: "RELEASED",
"coming-soon": "COMING SOON",
};
export const games: Game[] = [
{
slug: "emberwild",
title: "Emberwild",
status: "in-development",
tagline: "Co-op survival in a world gone wild.",
description:
"Emberwild is a 1-6 player co-op survival craft game. Drive the blight out of a handcrafted world, farm and build on the ground you take back, and watch the colour return with you. Five regions, nothing generated, nothing repeated.",
genres: ["Survival", "Crafting", "Co-op", "Exploration"],
releaseWindow: "TBA",
players: "1-6",
platform: "PC",
keyArt: "/image/Games/Emberwild/Cover.png",
banner: "/image/Games/Emberwild/Capture_1.png",
// Only three captures exist so far, so "Build" borrows the key art. Swap
// it for a real in-game shot of a base as soon as there is one.
pillars: [
{
title: "Restore",
body: "Drive the blight out and the colour comes back with it. What you clear stays clear.",
shot: "/image/Games/Emberwild/Capture_1.png",
},
{
title: "Survive",
body: "Farm, cook, fish, hunt. Clean ground grows more and sleeps quieter.",
shot: "/image/Games/Emberwild/Capture_2.png",
},
{
title: "Explore",
body: "One handcrafted world, five regions. Nothing generated, nothing repeated.",
shot: "/image/Games/Emberwild/Capture_3.png",
},
{
title: "Build",
body: "Raise a home. Push outposts into everything you take back.",
shot: "/image/Games/Emberwild/Cover.png",
},
],
screenshots: [
{
src: "/image/Games/Emberwild/Capture_1.png",
caption: "First light over the clearing",
},
{
src: "/image/Games/Emberwild/Capture_2.png",
caption: "Autumn treeline",
},
{
src: "/image/Games/Emberwild/Capture_3.png",
caption: "The path through the meadow",
},
],
},
];
/** The game showcased on the home page. */
export const featuredGame: Game | undefined = games[0];
export function getGame(slug: string): Game | undefined {
return games.find((g) => g.slug === slug);
}