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>
This commit is contained in:
@@ -0,0 +1,51 @@
|
||||
import Link from "next/link";
|
||||
import Laurel from "./Laurel";
|
||||
import PlayReel from "./PlayReel";
|
||||
import Reveal from "./Reveal";
|
||||
import type { Award } from "@/content/site";
|
||||
|
||||
// Full-bleed award callout over a still from the nominated work.
|
||||
export default function AwardBand({ award }: { award: Award }) {
|
||||
return (
|
||||
<section className="relative overflow-hidden border-y border-line">
|
||||
{/* eslint-disable-next-line @next/next/no-img-element */}
|
||||
<img src={award.image} alt="" className="absolute inset-0 h-full w-full object-cover object-[70%_40%] opacity-60" />
|
||||
<div className="absolute inset-0 bg-gradient-to-r from-ink via-ink/75 to-transparent" />
|
||||
<div className="relative mx-auto grid max-w-7xl items-center gap-12 px-5 py-20 md:grid-cols-[auto_1fr] md:gap-16 md:px-8 md:py-28">
|
||||
<Reveal>
|
||||
<div className="relative mx-auto flex h-52 w-52 items-center justify-center text-accent md:h-64 md:w-64">
|
||||
<Laurel className="absolute inset-0 h-full w-full" />
|
||||
<div className="text-center">
|
||||
<p className="font-mono text-[10px] tracking-[0.3em] text-muted uppercase">{award.edition}</p>
|
||||
<p className="mt-1 font-display text-4xl font-light tracking-[0.15em] text-fg md:text-5xl">{award.body}</p>
|
||||
<p className="mt-1 font-mono text-[10px] tracking-[0.3em] uppercase">{award.result}</p>
|
||||
</div>
|
||||
</div>
|
||||
</Reveal>
|
||||
<Reveal delay={120}>
|
||||
<p className="font-mono text-xs tracking-[0.3em] text-accent uppercase">
|
||||
{award.result} · {award.year}
|
||||
</p>
|
||||
<h2 className="mt-5 font-display text-4xl leading-tight font-thin uppercase md:text-6xl">
|
||||
{award.category}
|
||||
</h2>
|
||||
<p className="mt-6 max-w-xl text-base leading-relaxed text-muted md:text-lg">
|
||||
Our creature and simulation work on <span className="text-fg">{award.title}</span> was nominated at the{" "}
|
||||
{award.longName}.
|
||||
</p>
|
||||
<div className="mt-10 flex flex-wrap items-center gap-6">
|
||||
{award.reel && <PlayReel src={award.reel} poster={award.image} label="Watch the breakdown" />}
|
||||
{award.project && (
|
||||
<Link
|
||||
href={`/work/${award.project}/`}
|
||||
className="font-mono text-xs tracking-[0.2em] text-muted uppercase transition-colors hover:text-fg"
|
||||
>
|
||||
See the project →
|
||||
</Link>
|
||||
)}
|
||||
</div>
|
||||
</Reveal>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
import Reveal from "./Reveal";
|
||||
import { filmography } from "@/content/site";
|
||||
import { awardFor, filmography } from "@/content/site";
|
||||
|
||||
export default function Filmography() {
|
||||
return (
|
||||
@@ -23,6 +23,11 @@ export default function Filmography() {
|
||||
Upcoming
|
||||
</span>
|
||||
)}
|
||||
{awardFor(c.slug) && (
|
||||
<span className="bg-fg px-1.5 py-0.5 font-mono text-[9px] tracking-[0.2em] text-ink uppercase">
|
||||
{awardFor(c.slug)!.body} {awardFor(c.slug)!.result}
|
||||
</span>
|
||||
)}
|
||||
{c.network && (
|
||||
<span className="bg-black/70 px-1.5 py-0.5 font-mono text-[9px] tracking-[0.2em] text-fg uppercase backdrop-blur-sm">
|
||||
{c.network}
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
// Laurel wreath: a left branch of leaves curving from the bottom up the side,
|
||||
// mirrored for the right. SVG angles run clockwise from +x (90° = bottom).
|
||||
const R = 40;
|
||||
const C = 50;
|
||||
const leaves = Array.from({ length: 8 }, (_, i) => {
|
||||
const deg = 112 + i * 18; // bottom-left round to top-left
|
||||
const a = (deg * Math.PI) / 180;
|
||||
return { x: C + R * Math.cos(a), y: C + R * Math.sin(a), deg };
|
||||
});
|
||||
|
||||
function Branch() {
|
||||
const start = leaves[0];
|
||||
const end = leaves[leaves.length - 1];
|
||||
return (
|
||||
<g>
|
||||
<path
|
||||
d={`M${start.x.toFixed(2)} ${start.y.toFixed(2)} A${R} ${R} 0 0 1 ${end.x.toFixed(2)} ${end.y.toFixed(2)}`}
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
strokeWidth="1"
|
||||
/>
|
||||
{leaves.map((l, i) => {
|
||||
// Outer and inner leaf at each node, angled toward the top of the wreath.
|
||||
const tangent = l.deg + 90;
|
||||
return (
|
||||
<g key={i} transform={`translate(${l.x.toFixed(2)} ${l.y.toFixed(2)})`}>
|
||||
<ellipse cx="0" cy="-5" rx="2.4" ry="5.5" fill="currentColor" transform={`rotate(${tangent - 35})`} />
|
||||
<ellipse cx="0" cy="-5" rx="2.4" ry="5.5" fill="currentColor" transform={`rotate(${tangent + 35})`} opacity="0.75" />
|
||||
</g>
|
||||
);
|
||||
})}
|
||||
</g>
|
||||
);
|
||||
}
|
||||
|
||||
export default function Laurel({ className = "" }: { className?: string }) {
|
||||
return (
|
||||
<svg viewBox="0 0 100 100" className={className} aria-hidden="true">
|
||||
<Branch />
|
||||
<g transform="matrix(-1 0 0 1 100 0)">
|
||||
<Branch />
|
||||
</g>
|
||||
</svg>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user