Files
ttvfx/content/site.ts
T
twotalesanimation aba0bcde86 Add SAFTA nomination: award band, project badge, filmography tag
Summertide nominated for Best Achievement in Visual Effects - TV at the
19th South African Film and Television Awards (2026).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 19:15:22 +02:00

210 lines
8.9 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 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",
// Muted background loop for the home hero (cut from the Summertide reel).
reel: "/reel/hero-loop.mp4" as string | null,
reelPoster: "/reel/hero-poster.jpg" as string | null,
// Full reel with sound, opened by the hero's "Play reel" button.
fullReel: "/reel/summertide-reel.mp4" 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: "Filmography", href: "/#filmography" },
{ label: "Work", href: "/work/" },
{ 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 Award = {
body: string;
longName: string;
edition: string;
year: number;
result: "Nominee" | "Winner";
category: string;
title: string;
// Filmography slug and/or project slug this award belongs to.
credit?: string;
project?: string;
image: string;
reel?: string;
};
export const awards: Award[] = [
{
body: "SAFTA",
longName: "19th South African Film and Television Awards",
edition: "19th",
year: 2026,
result: "Nominee",
category: "Best Achievement in Visual Effects – TV",
title: "Summertide",
credit: "summertide",
project: "summertide",
image: "/work/summertide/award-bg.jpg",
reel: "/reel/summertide-reel.mp4",
},
];
export const awardFor = (slug: string) => awards.find((a) => a.credit === slug || a.project === slug);
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: "SAFTA", label: "2026 VFX nominee" },
];
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: "summertide",
title: "Summertide",
client: "M-Net",
year: 2024,
category: "Series",
summary:
"Creature and simulation work for M-Net’s coastal family drama: CG African penguins, a CG shark with water simulation, shark replacements on the beach, CG storm clouds and lightning, a CG seal and pyro simulations.",
image: "/work/summertide/still-18.jpg",
video: "/reel/summertide-reel.mp4",
gallery: [
"/work/summertide/still-101.jpg",
"/work/summertide/still-139.jpg",
"/work/summertide/still-80.jpg",
"/work/summertide/still-187.jpg",
],
credits: ["CG Penguins", "CG Shark & Water Sim", "Shark Replacement", "CG Clouds & Lightning", "CG Seal", "Pyro Simulations"],
hue: 190,
},
{
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,
},
];