// work.jsx — Featured work section: big editorial cards + scroll-linked list.
//
// To add a real video to any project: open components/data.jsx and paste
// the URL into the project's `video` field. Supported:
// • YouTube → https://youtu.be/XXXX or https://youtube.com/watch?v=XXXX
// • Vimeo → https://vimeo.com/XXXXXXXX
// • Direct file → "assets/yourfile.mp4" (drop file into assets/ folder first)
// Optional: set `cover` to "assets/yourimage.jpg" for the still that shows
// before the video plays.
function parseVideoSrc(url) {
if (!url) return null;
// Direct file
if (/\.(mp4|webm|mov)(\?|$)/i.test(url) || url.startsWith("assets/")) {
return { kind: "file", src: url, thumb: null };
}
// YouTube
let m = url.match(/(?:youtu\.be\/|youtube\.com\/(?:watch\?v=|embed\/|shorts\/))([\w-]{11})/);
if (m) {
const id = m[1];
return {
kind: "youtube",
src: `https://www.youtube-nocookie.com/embed/${id}?autoplay=1&mute=1&controls=1&rel=0&modestbranding=1&playsinline=1`,
thumb: `https://img.youtube.com/vi/${id}/maxresdefault.jpg`,
};
}
// Vimeo
m = url.match(/vimeo\.com\/(?:video\/)?(\d+)/);
if (m) {
return {
kind: "vimeo",
src: `https://player.vimeo.com/video/${m[1]}?autoplay=1&muted=1&loop=1&background=0&dnt=1`,
thumb: null,
};
}
return null;
}
function WorkSection({ onOpen }) {
const [hovered, setHovered] = React.useState(null);
return (
A slice of what we've made for founders, operators, and institutions since 2016. Film, identity, campaign, and everything between.
Six projects
worth sharing.
) : (
{w.title}
{w.title}