Files
ttvfx/content/site.ts
T
twotalesanimation 6c464d6dfb Add real studio content: Festo F1 film, filmography, service stills
From the Dec 2024 company profile: Pretoria location, founding year, service
list with stills, and 14 film/series credits with posters. Festo F1 spot
transcoded for web (cropped letterbox, 14 MB, faststart).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 18:40:45 +02:00

150 lines
6.5 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",
// 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;
poster: string;
};
// Selected film & series credits, newest first.
export const filmography: Credit[] = [
{ 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,
},
];