951dba7905
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
157 lines
7.2 KiB
TypeScript
157 lines
7.2 KiB
TypeScript
// All editable site copy lives here. Facts come from the Dec 2024 company
|
||
// profile (content/TT_Company_profile.pdf). Items marked TODO need confirming.
|
||
|
||
export const site = {
|
||
name: "Two Tales VFX",
|
||
shortName: "TTVFX",
|
||
url: "https://ttvfx.com",
|
||
// TODO: company profile says founded 2014; the logo lockup says "Est. 2015".
|
||
founded: 2014,
|
||
tagline: "Invisible work. Unforgettable frames.",
|
||
description:
|
||
"Two Tales VFX is a 3D animation and visual effects studio in Pretoria, South Africa, crafting VFX for film, series and commercials for clients across the globe.",
|
||
// TODO: switch to an @ttvfx.com address once the domain's mail is set up.
|
||
email: "chris@twotalesanimation.com",
|
||
location: "Pretoria, South Africa",
|
||
// Optional studio showreel for the home hero: drop public/reel.mp4 and set
|
||
// this to "/reel.mp4" (and reelPoster to a still).
|
||
reel: null as string | null,
|
||
reelPoster: null as string | null,
|
||
socials: [
|
||
// TODO: add real profiles, e.g. { label: "Vimeo", href: "https://vimeo.com/..." }
|
||
] as { label: string; href: string }[],
|
||
};
|
||
|
||
export const nav = [
|
||
{ label: "Work", href: "/work/" },
|
||
{ label: "Filmography", href: "/#filmography" },
|
||
{ label: "Services", href: "/#services" },
|
||
{ label: "Contact", href: "/#contact" },
|
||
];
|
||
|
||
export type Service = { title: string; image: string };
|
||
|
||
export const services: { group: string; items: Service[] }[] = [
|
||
{
|
||
group: "Visual Effects",
|
||
items: [
|
||
{ title: "Creature Effects", image: "/capabilities/creature.jpg" },
|
||
{ title: "Set Extensions", image: "/capabilities/set-extension.jpg" },
|
||
{ title: "Volume Simulations", image: "/capabilities/volume-sim.jpg" },
|
||
{ title: "Fluid Simulations", image: "/capabilities/fluid-sim.jpg" },
|
||
{ title: "Screen Replacements", image: "/capabilities/screen-replacement.jpg" },
|
||
{ title: "Clean Up & Removals", image: "/capabilities/cleanup.jpg" },
|
||
{ title: "Compositing", image: "/capabilities/compositing.jpg" },
|
||
{ title: "Green Screen", image: "/capabilities/green-screen.jpg" },
|
||
{ title: "Gun Effects", image: "/capabilities/gun-fx.jpg" },
|
||
],
|
||
},
|
||
{
|
||
group: "3D Animation",
|
||
items: [
|
||
{ title: "Character Creation", image: "/capabilities/character-creation.jpg" },
|
||
{ title: "Character Animation", image: "/capabilities/character-animation.jpg" },
|
||
{ title: "Product Visualisation", image: "/capabilities/product-viz.jpg" },
|
||
],
|
||
},
|
||
];
|
||
|
||
// Stills used in the studio section collage.
|
||
export const studioStills = [
|
||
"/capabilities/explosion.jpg",
|
||
"/capabilities/penguins.jpg",
|
||
"/capabilities/shark.jpg",
|
||
"/capabilities/penguin-box.jpg",
|
||
];
|
||
|
||
export type Credit = {
|
||
slug: string;
|
||
title: string;
|
||
year: number;
|
||
format: "Feature" | "Series";
|
||
network?: string;
|
||
// Not yet released; shown with an "Upcoming" badge.
|
||
upcoming?: boolean;
|
||
poster: string;
|
||
};
|
||
|
||
// Selected film & series credits, newest first.
|
||
export const filmography: Credit[] = [
|
||
{ slug: "baba-segi", title: "The Secret Lives of Baba Segi’s Wives", year: 2026, format: "Feature", upcoming: true, poster: "/film/baba-segi.jpg" },
|
||
{ slug: "beter-as-gister", title: "Beter as Gister", year: 2026, format: "Series", network: "kykNET", poster: "/film/beter-as-gister.jpg" },
|
||
{ slug: "blood-sisters-s2", title: "Blood Sisters: Season 2", year: 2026, format: "Series", network: "Netflix", poster: "/film/blood-sisters-s2.jpg" },
|
||
{ slug: "baby-farm", title: "Baby Farm", year: 2025, format: "Series", network: "Netflix", poster: "/film/baby-farm.jpg" },
|
||
{ slug: "die-affere", title: "Die Affêre", year: 2025, format: "Feature", network: "kykNET", poster: "/film/die-affere.jpg" },
|
||
{ slug: "som-van-twee", title: "Som van Twee", year: 2024, format: "Feature", poster: "/film/som-van-twee.jpg" },
|
||
{ slug: "oloture-the-journey", title: "Òlòtūré: The Journey", year: 2024, format: "Series", network: "Netflix", poster: "/film/oloture-the-journey.jpg" },
|
||
{ slug: "funmilayo-ransome-kuti", title: "Funmilayo Ransome-Kuti", year: 2024, format: "Feature", poster: "/film/funmilayo-ransome-kuti.jpg" },
|
||
{ slug: "summertide", title: "Summertide", year: 2024, format: "Series", network: "M-Net", poster: "/film/summertide.jpg" },
|
||
{ slug: "war-wrath-and-revenge", title: "WAR: Wrath and Revenge", year: 2023, format: "Series", network: "Netflix", poster: "/film/war-wrath-and-revenge.jpg" },
|
||
{ slug: "little-big-mouth", title: "Little Big Mouth", year: 2021, format: "Feature", network: "Netflix", poster: "/film/little-big-mouth.jpg" },
|
||
{ slug: "vergeet-my-nie", title: "Vergeet My Nie", year: 2020, format: "Feature", poster: "/film/vergeet-my-nie.jpg" },
|
||
{ slug: "toorbos", title: "Toorbos", year: 2019, format: "Feature", poster: "/film/toorbos.jpg" },
|
||
{ slug: "fiela-se-kind", title: "Fiela se Kind", year: 2019, format: "Feature", poster: "/film/fiela-se-kind.jpg" },
|
||
{ slug: "ander-mens", title: "Ander Mens", year: 2019, format: "Feature", poster: "/film/ander-mens.jpg" },
|
||
{ slug: "ellen", title: "Ellen: The Ellen Pakkies Story", year: 2018, format: "Feature", poster: "/film/ellen.jpg" },
|
||
{ slug: "stroomop", title: "Stroomop", year: 2018, format: "Feature", poster: "/film/stroomop.jpg" },
|
||
{ slug: "vir-die-voels", title: "Vir die Voëls", year: 2016, format: "Feature", poster: "/film/vir-die-voels.jpg" },
|
||
{ slug: "modder-en-bloed", title: "Modder en Bloed", year: 2016, format: "Feature", poster: "/film/modder-en-bloed.jpg" },
|
||
];
|
||
|
||
const yearsActive = new Date().getFullYear() - site.founded;
|
||
|
||
export const stats = [
|
||
{ value: `${yearsActive}+`, label: "Years in production" },
|
||
{ value: String(filmography.length), label: "Film & series credits" },
|
||
{ value: String(filmography.filter((c) => c.network === "Netflix").length), label: "Netflix titles" },
|
||
{ value: "PTA", label: "Pretoria, South Africa" },
|
||
];
|
||
|
||
export type Project = {
|
||
slug: string;
|
||
title: string;
|
||
client: string;
|
||
year: number;
|
||
category: string;
|
||
summary: string;
|
||
// Still under /public used for cards and as the video poster.
|
||
image?: string;
|
||
// MP4 under /public, or a Vimeo/YouTube embed URL.
|
||
video?: string;
|
||
gallery?: string[];
|
||
credits: string[];
|
||
// Accent hue (0-360) for the generated frame shown when there is no image.
|
||
hue: number;
|
||
};
|
||
|
||
export const projects: Project[] = [
|
||
{
|
||
slug: "festo-f1",
|
||
title: "Festo F1",
|
||
client: "Festo",
|
||
// TODO: confirm year (Festo's centenary campaign; file dated March 2026).
|
||
year: 2026,
|
||
category: "Commercial",
|
||
summary:
|
||
"A fully CG Formula 1 spot celebrating 100 years of Festo, “Automation for a world in motion”. It runs from a moody studio reveal of the car, through a glitch-driven race sequence, to the podium.",
|
||
image: "/work/festo-f1/still-2.jpg",
|
||
video: "/work/festo-f1/festo-f1.mp4",
|
||
gallery: ["/work/festo-f1/still-13.jpg", "/work/festo-f1/still-46.jpg"],
|
||
credits: ["Full CG", "Vehicle Lookdev", "Character Animation", "Lighting", "Compositing"],
|
||
hue: 200,
|
||
},
|
||
{
|
||
slug: "clere-radiance",
|
||
title: "Clere Radiance",
|
||
client: "Clere",
|
||
// TODO: confirm year.
|
||
year: 2024,
|
||
category: "Product Visualisation",
|
||
summary:
|
||
"Photoreal CG product visualisation for Clere’s Radiance Night Re-Newer.",
|
||
image: "/capabilities/product-viz.jpg",
|
||
credits: ["Product Visualisation", "Lookdev", "Lighting"],
|
||
hue: 330,
|
||
},
|
||
];
|