Rakan Dajani

:root{–bg:#0a0a0a;–fg:#e8e4df;–dim:#5a5550;–accent:#ff5e3a;–accent2:#3aff8e;–accent3:#3a8eff;–yellow:#ffd53a;–mono:’Space Mono’,monospace;–display:’Syne’,sans-serif;–serif:’Instrument Serif’,Georgia,serif}
*,*::before,*::after{margin:0;padding:0;box-sizing:border-box}
html{scroll-behavior:smooth}
body{background:var(–bg);color:var(–fg);font-family:var(–mono);overflow-x:hidden;cursor:crosshair;-webkit-font-smoothing:antialiased}
::selection{background:var(–accent);color:var(–bg)}

/* GRAIN */
body::before{content:”;position:fixed;inset:0;pointer-events:none;z-index:9998;opacity:.04;background-image:url(“data:image/svg+xml,%3Csvg viewBox=’0 0 256 256′ xmlns=’http://www.w3.org/2000/svg’%3E%3Cfilter id=’n’%3E%3CfeTurbulence type=’fractalNoise’ baseFrequency=’0.9′ numOctaves=’4′ stitchTiles=’stitch’/%3E%3C/filter%3E%3Crect width=’100%25′ height=’100%25′ filter=’url(%23n)’/%3E%3C/svg%3E”);background-size:128px;animation:grain .5s steps(4) infinite}
body::after{content:”;position:fixed;inset:0;pointer-events:none;z-index:9997;background:repeating-linear-gradient(0deg,transparent,transparent 2px,rgba(255,255,255,.008) 2px,rgba(255,255,255,.008) 4px)}
@keyframes grain{0%{transform:translate(0,0)}25%{transform:translate(-2px,1px)}50%{transform:translate(1px,-1px)}75%{transform:translate(-1px,2px)}100%{transform:translate(0,0)}}

/* CURSOR */
.cursor-dot{position:fixed;width:8px;height:8px;background:var(–accent);border-radius:50%;pointer-events:none;z-index:10000;mix-blend-mode:difference;transition:transform .15s}
.cursor-ring{position:fixed;width:40px;height:40px;border:1px solid var(–fg);border-radius:50%;pointer-events:none;z-index:10000;mix-blend-mode:difference;transition:all .2s;opacity:.5}

/* SIDE NAV */
.side-nav{position:fixed;left:0;top:0;bottom:0;width:48px;z-index:1000;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2rem;border-right:1px solid rgba(255,255,255,.06)}
.side-nav a{writing-mode:vertical-rl;text-orientation:mixed;font-size:.6rem;letter-spacing:.2em;text-transform:uppercase;color:var(–dim);text-decoration:none;transition:all .3s;padding:.5rem 0}
.side-nav a:hover{color:var(–accent);text-shadow:0 0 20px var(–accent)}

/* HERO */
.hero{height:100vh;position:relative;display:flex;align-items:center;justify-content:center;padding-left:48px;overflow:hidden}
.hero-scatter{position:absolute;font-family:var(–mono);font-size:.55rem;color:var(–dim);letter-spacing:.15em;text-transform:uppercase;opacity:.4;pointer-events:none}
.hero-name{position:relative;text-align:center}
.hero-name .line1{font-family:var(–display);font-size:clamp(4rem,12vw,11rem);font-weight:800;line-height:.85;letter-spacing:-.04em;color:var(–fg);display:block;opacity:0;animation:glitchIn .8s .2s forwards}
.hero-name .line2{font-family:var(–serif);font-size:clamp(3rem,9vw,8rem);font-weight:400;font-style:italic;line-height:.9;color:transparent;-webkit-text-stroke:1.5px var(–fg);display:block;margin-top:-.1em;margin-left:15%;opacity:0;animation:slideRight 1s .5s forwards}
.hero-tag{position:absolute;bottom:15%;right:8%;font-size:.6rem;letter-spacing:.2em;text-transform:uppercase;color:var(–accent);max-width:200px;line-height:1.8;text-align:right;opacity:0;animation:fadeIn .6s 1.2s forwards}
.hero-tag span{display:block;color:var(–dim)}
.hero-year{position:absolute;bottom:5%;left:calc(48px + 2rem);font-family:var(–display);font-size:clamp(6rem,15vw,14rem);font-weight:800;color:transparent;-webkit-text-stroke:1px rgba(255,255,255,.04);line-height:1;pointer-events:none;opacity:0;animation:fadeIn 1s .8s forwards}
.hero-arrow{position:absolute;bottom:3rem;left:50%;transform:translateX(-50%);opacity:0;animation:fadeIn .6s 1.5s forwards,bounce 2s 2s infinite}
.hero-arrow svg{width:20px;height:20px;stroke:var(–dim);stroke-width:1.5;fill:none}

@keyframes glitchIn{0%{opacity:0;transform:translateX(-30px) skewX(-5deg);clip-path:inset(40% 0 40% 0)}30%{opacity:1;clip-path:inset(20% 0 60% 0)}60%{clip-path:inset(60% 0 10% 0);transform:translateX(5px) skewX(1deg)}100%{opacity:1;transform:translateX(0) skewX(0);clip-path:inset(0 0 0 0)}}
@keyframes slideRight{from{opacity:0;transform:translateX(-40px)}to{opacity:1;transform:translateX(0)}}
@keyframes fadeIn{to{opacity:1}}
@keyframes bounce{0%,100%{transform:translateX(-50%) translateY(0)}50%{transform:translateX(-50%) translateY(8px)}}

/* MARQUEE */
.marquee-strip{overflow:hidden;white-space:nowrap;border-top:1px solid rgba(255,255,255,.06);border-bottom:1px solid rgba(255,255,255,.06);padding:.8rem 0;margin-left:48px}
.marquee-inner{display:inline-block;animation:marquee 25s linear infinite}
.marquee-inner span{font-family:var(–mono);font-size:.6rem;letter-spacing:.3em;text-transform:uppercase;color:var(–dim);padding:0 3rem}
.marquee-inner .dot{color:var(–accent);padding:0 1rem}
@keyframes marquee{0%{transform:translateX(0)}100%{transform:translateX(-50%)}}

/* SECTIONS */
.section{padding:8rem 3rem 8rem calc(48px + 3rem);position:relative}
.section-label{display:inline-flex;align-items:center;gap:1rem;font-size:.55rem;letter-spacing:.3em;text-transform:uppercase;color:var(–accent);margin-bottom:3rem}
.section-label::before{content:”;width:40px;height:1px;background:var(–accent)}
.section-label .num{font-family:var(–display);font-size:2.5rem;font-weight:800;color:transparent;-webkit-text-stroke:1px var(–accent);margin-right:.5rem;line-height:1}

/* ═══════════════════════════════
FILM CARDS — KINETIC TYPOGRAPHY
═══════════════════════════════ */
.film-scattered{display:grid;grid-template-columns:repeat(12,1fr);grid-auto-rows:minmax(60px,auto);gap:1rem;max-width:1400px;min-height:700px;position:relative}
.film-card{position:relative;overflow:hidden;border:1px solid rgba(255,255,255,.06);background:rgba(255,255,255,.02);cursor:pointer;transition:all .5s cubic-bezier(.25,.46,.45,.94)}
.film-card:hover{border-color:var(–accent);z-index:10;box-shadow:0 0 40px rgba(255,94,58,.08)}

.film-card.fc1{grid-column:1/8;grid-row:1/6}
.film-card.fc2{grid-column:8/13;grid-row:1/4}
.film-card.fc3{grid-column:8/11;grid-row:4/8}
.film-card.fc4{grid-column:11/13;grid-row:4/6}
.film-card.fc5{grid-column:1/5;grid-row:6/9}
.film-card.fc6{grid-column:5/8;grid-row:6/9}
.film-card.fc7{grid-column:11/13;grid-row:6/9}

/* Giant title filling card */
.fc-bg-title{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;font-family:var(–display);font-weight:800;color:rgba(255,255,255,.03);text-transform:uppercase;line-height:.85;padding:1rem;overflow:hidden;transition:color .6s,letter-spacing .6s,transform .6s;letter-spacing:-.02em;text-align:center;word-break:break-word}
.fc1 .fc-bg-title{font-size:5rem}
.fc2 .fc-bg-title{font-size:3rem}
.fc3 .fc-bg-title{font-size:2.5rem}
.fc4 .fc-bg-title{font-size:1.5rem}
.fc5 .fc-bg-title{font-size:2.2rem}
.fc6 .fc-bg-title{font-size:2rem}
.fc7 .fc-bg-title{font-size:1.4rem}

.film-card:hover .fc-bg-title{color:rgba(255,255,255,.06);letter-spacing:.05em;transform:scale(1.05)}

/* Scramble text overlay — shows on hover */
.fc-scramble{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-family:var(–mono);font-size:.65rem;letter-spacing:.15em;text-transform:uppercase;color:var(–accent);opacity:0;transition:opacity .3s;pointer-events:none;white-space:nowrap}
.film-card:hover .fc-scramble{opacity:.6}

.fc-inner{position:absolute;bottom:0;left:0;right:0;padding:2rem 1.2rem 1.2rem;background:linear-gradient(0deg,rgba(10,10,10,.9) 0%,rgba(10,10,10,.4) 60%,transparent 100%);z-index:2}
.fc-type{font-size:.5rem;letter-spacing:.25em;text-transform:uppercase;margin-bottom:.3rem}
.fc-type.t-short{color:var(–accent)}.fc-type.t-doc{color:var(–accent2)}.fc-type.t-exp{color:var(–accent3)}.fc-type.t-music{color:var(–yellow)}
.fc-title{font-family:var(–serif);font-size:1.2rem;font-style:italic;color:var(–fg);line-height:1.2}
.fc-year{font-size:.6rem;color:var(–dim);margin-top:.2rem}
.fc-role{font-size:.5rem;letter-spacing:.1em;color:var(–dim);margin-top:.15rem}

/* ═══════════════════════════════
PHOTOGRAPHY — WAVY TEXT STRIP
═══════════════════════════════ */
.photo-strip-wrapper{overflow:hidden;padding:4rem 0;margin-left:48px}
.photo-strip{display:flex;gap:1.5rem;transform:rotate(-2deg);margin-left:-3rem;padding:2rem 0}
.photo-frame{flex:0 0 auto;position:relative;transition:transform .5s cubic-bezier(.25,.46,.45,.94)}
.photo-frame:hover{transform:rotate(2deg) scale(1.05) translateY(-10px);z-index:10}
.photo-frame:nth-child(odd):hover{transform:rotate(-1deg) scale(1.05) translateY(-10px)}

.photo-inner{background:rgba(255,255,255,.03);border:1px solid rgba(255,255,255,.06);padding:.75rem .75rem 2.5rem;position:relative;transition:border-color .4s}
.photo-frame:hover .photo-inner{border-color:rgba(255,255,255,.15)}

/* Text-only photo cards */
.photo-text-fill{display:flex;align-items:center;justify-content:center;overflow:hidden;position:relative}
.photo-frame.pf-wide .photo-text-fill{width:420px;height:280px}
.photo-frame.pf-tall .photo-text-fill{width:280px;height:400px}
.photo-frame.pf-square .photo-text-fill{width:320px;height:320px}
.photo-frame.pf-pano .photo-text-fill{width:550px;height:220px}

.photo-text-fill .wavy-word{font-family:var(–display);font-weight:800;color:rgba(255,255,255,.04);text-transform:uppercase;position:absolute;white-space:nowrap;transition:all .6s cubic-bezier(.25,.46,.45,.94)}
.photo-frame:hover .wavy-word{color:rgba(255,255,255,.08)}

/* Stacked repeating word effect */
.photo-text-fill .wavy-word:nth-child(1){font-size:3rem;top:10%;left:-5%;transform:rotate(-5deg)}
.photo-text-fill .wavy-word:nth-child(2){font-size:2rem;top:35%;right:-10%;transform:rotate(3deg);opacity:.6}
.photo-text-fill .wavy-word:nth-child(3){font-size:4rem;bottom:10%;left:5%;transform:rotate(-2deg);opacity:.4}

.photo-frame:hover .wavy-word:nth-child(1){transform:rotate(-3deg) translateX(5px)}
.photo-frame:hover .wavy-word:nth-child(2){transform:rotate(1deg) translateX(-5px)}
.photo-frame:hover .wavy-word:nth-child(3){transform:rotate(0deg) translateY(-5px)}

.photo-label{position:absolute;bottom:.5rem;left:.75rem;right:.75rem;display:flex;justify-content:space-between;font-size:.5rem;letter-spacing:.1em;color:var(–dim)}

/* ═══════════════════════════════
MIXED MEDIA — STRETCHING TEXT
═══════════════════════════════ */
.mixed-scatter{display:flex;flex-wrap:wrap;gap:2rem;max-width:1200px;justify-content:center;padding:2rem 0}
.mixed-card{width:260px;background:rgba(255,255,255,.03);border:1px solid rgba(255,255,255,.06);padding:1rem;transition:all .5s cubic-bezier(.25,.46,.45,.94);position:relative;cursor:pointer;overflow:hidden}
.mixed-card:nth-child(1){transform:rotate(-3deg)}
.mixed-card:nth-child(2){transform:rotate(2deg) translateY(30px)}
.mixed-card:nth-child(3){transform:rotate(-1deg) translateY(-15px)}
.mixed-card:nth-child(4){transform:rotate(4deg) translateY(20px)}
.mixed-card:nth-child(5){transform:rotate(-2deg)}
.mixed-card:nth-child(6){transform:rotate(1deg) translateY(10px)}
.mixed-card:hover{transform:rotate(0deg) translateY(-10px) scale(1.05)!important;border-color:var(–accent2);box-shadow:0 20px 60px rgba(0,0,0,.4);z-index:10}

/* Text art replacing image */
.mixed-text-art{width:100%;aspect-ratio:4/5;display:flex;align-items:center;justify-content:center;margin-bottom:1rem;position:relative;overflow:hidden}
.mixed-text-art .art-word{font-family:var(–display);font-weight:800;text-transform:uppercase;position:absolute;transition:all .5s cubic-bezier(.25,.46,.45,.94)}
.mixed-card:hover .art-word{letter-spacing:.1em}

/* Each card gets unique text art treatment */
.mixed-card:nth-child(1) .art-word{font-size:3.5rem;color:rgba(255,94,58,.08);transform:scaleY(2.5)}
.mixed-card:nth-child(1):hover .art-word{color:rgba(255,94,58,.15);transform:scaleY(1.5)}

.mixed-card:nth-child(2) .art-word{font-size:1.2rem;color:rgba(58,255,142,.06);writing-mode:vertical-rl;transform:rotate(0deg)}
.mixed-card:nth-child(2):hover .art-word{color:rgba(58,255,142,.12);transform:rotate(5deg)}

.mixed-card:nth-child(3) .art-word{font-size:5rem;color:rgba(58,142,255,.05);transform:scaleX(0.3)}
.mixed-card:nth-child(3):hover .art-word{color:rgba(58,142,255,.1);transform:scaleX(0.6)}

.mixed-card:nth-child(4) .art-word{font-size:2rem;color:rgba(255,213,58,.06);transform:skewX(-15deg)}
.mixed-card:nth-child(4):hover .art-word{color:rgba(255,213,58,.12);transform:skewX(-5deg)}

.mixed-card:nth-child(5) .art-word{font-size:4rem;color:rgba(255,94,58,.05);transform:rotate(-90deg)}
.mixed-card:nth-child(5):hover .art-word{color:rgba(255,94,58,.1);transform:rotate(-85deg)}

.mixed-card:nth-child(6) .art-word{font-size:1.5rem;color:rgba(58,255,142,.05);transform:scaleY(3) scaleX(.5)}
.mixed-card:nth-child(6):hover .art-word{color:rgba(58,255,142,.1);transform:scaleY(2) scaleX(.7)}

.mixed-type{font-size:.48rem;letter-spacing:.25em;text-transform:uppercase;margin-bottom:.2rem}
.mixed-card:nth-child(1) .mixed-type{color:var(–accent)}
.mixed-card:nth-child(2) .mixed-type{color:var(–accent2)}
.mixed-card:nth-child(3) .mixed-type{color:var(–accent3)}
.mixed-card:nth-child(4) .mixed-type{color:var(–yellow)}
.mixed-card:nth-child(5) .mixed-type{color:var(–accent)}
.mixed-card:nth-child(6) .mixed-type{color:var(–accent2)}

/* WRITING */
.writing-stack{max-width:800px;display:flex;flex-direction:column}
.writing-entry{padding:2.5rem 2rem;border-bottom:1px solid rgba(255,255,255,.04);position:relative;cursor:pointer;transition:all .4s;display:grid;grid-template-columns:60px 1fr auto;gap:2rem;align-items:start}
.writing-entry:hover{background:rgba(255,255,255,.015);padding-left:2.5rem}
.writing-entry:hover .we-num{color:var(–accent)}
.writing-entry:hover .we-arrow{opacity:1;transform:translateX(0)}
.we-num{font-family:var(–display);font-size:1.5rem;font-weight:700;color:rgba(255,255,255,.08);transition:color .4s}
.we-type{font-size:.48rem;letter-spacing:.25em;text-transform:uppercase;color:var(–accent);margin-bottom:.5rem}
.we-title{font-family:var(–serif);font-size:1.6rem;font-style:italic;color:var(–fg);line-height:1.3;margin-bottom:.5rem}
.we-excerpt{font-size:.78rem;color:var(–dim);line-height:1.7;max-width:500px}
.we-arrow{font-size:1.2rem;color:var(–accent);opacity:0;transform:translateX(-10px);transition:all .4s;margin-top:.5rem}

/* ABOUT */
.about-split{display:grid;grid-template-columns:1fr 1fr;gap:4rem;max-width:1100px;align-items:center}
.about-portrait-wrap{position:relative}
.about-portrait-box{aspect-ratio:3/4;background:rgba(255,255,255,.02);border:1px solid rgba(255,255,255,.06);position:relative;display:flex;align-items:center;justify-content:center;overflow:hidden}
/* Giant initials as portrait */
.about-portrait-box .initials{font-family:var(–display);font-size:12rem;font-weight:800;color:transparent;-webkit-text-stroke:1px rgba(255,255,255,.04);line-height:1;transition:all .6s;user-select:none}
.about-portrait-box:hover .initials{-webkit-text-stroke:1px rgba(255,255,255,.08);transform:scale(1.05)}
.about-decor{position:absolute;top:-15px;right:-15px;width:80px;height:80px;border:1px solid var(–accent);opacity:.3}
.about-text h3{font-family:var(–display);font-size:2.5rem;font-weight:700;color:var(–fg);line-height:1.15;margin-bottom:1.5rem}
.about-text h3 .ital{font-family:var(–serif);font-style:italic;font-weight:400;color:var(–accent)}
.about-text p{font-size:.82rem;line-height:1.8;color:var(–dim);margin-bottom:1rem}
.about-links{margin-top:2.5rem;display:flex;gap:2rem}
.about-links a{font-size:.58rem;letter-spacing:.2em;text-transform:uppercase;color:var(–dim);text-decoration:none;position:relative;transition:color .3s;padding-bottom:4px}
.about-links a::after{content:”;position:absolute;bottom:0;left:0;width:100%;height:1px;background:var(–accent);transform:scaleX(0);transform-origin:right;transition:transform .4s cubic-bezier(.25,.46,.45,.94)}
.about-links a:hover{color:var(–accent)}.about-links a:hover::after{transform:scaleX(1);transform-origin:left}

/* CREDITS */
.credits-wall{max-width:1200px;columns:3;column-gap:2rem}
.credit-item{break-inside:avoid;margin-bottom:.6rem;font-size:.65rem;line-height:1.6;color:var(–dim);padding:.3rem 0;transition:color .3s;cursor:default}
.credit-item:hover{color:var(–fg)}
.credit-item .cr-title{font-family:var(–serif);font-style:italic;font-size:.85rem;color:var(–fg);opacity:.7}
.credit-item .cr-role{color:var(–accent)}

/* FOOTER */
.footer{padding:6rem 3rem 3rem calc(48px + 3rem);border-top:1px solid rgba(255,255,255,.04);position:relative;overflow:hidden}
.footer-big{font-family:var(–display);font-size:clamp(4rem,10vw,9rem);font-weight:800;color:transparent;-webkit-text-stroke:1px rgba(255,255,255,.06);line-height:.9;margin-bottom:3rem}
.footer-bottom{display:flex;justify-content:space-between;align-items:flex-end}
.footer-bottom p{font-size:.6rem;color:var(–dim);letter-spacing:.1em}
.footer-email{font-family:var(–serif);font-style:italic;font-size:1.2rem;color:var(–fg);text-decoration:none;transition:color .3s}
.footer-email:hover{color:var(–accent)}

/* SCROLL REVEAL */
.reveal{opacity:0;transform:translateY(40px);transition:all 1s cubic-bezier(.25,.46,.45,.94)}
.reveal.vis{opacity:1;transform:translateY(0)}
.reveal-d1{transition-delay:.1s}.reveal-d2{transition-delay:.2s}.reveal-d3{transition-delay:.3s}

/* ═══════ LETTER-BY-LETTER STAGGER (for section titles) ═══════ */
.stagger-letter{display:inline-block;opacity:0;transform:translateY(20px) rotate(5deg);transition:all .4s cubic-bezier(.25,.46,.45,.94)}
.stagger-letter.vis{opacity:1;transform:translateY(0) rotate(0)}

/* RESPONSIVE */
@media(max-width:900px){.side-nav{display:none}.section{padding:5rem 1.5rem}.hero{padding-left:0}.hero-year{left:1.5rem}.marquee-strip{margin-left:0}.photo-strip-wrapper{margin-left:0}.film-scattered{display:flex;flex-direction:column;gap:1rem}.film-card{min-height:180px}.fc-bg-title{font-size:2.5rem!important}.mixed-scatter{gap:1rem}.mixed-card{width:45%}.about-split{grid-template-columns:1fr;gap:2rem}.credits-wall{columns:2}.writing-entry{grid-template-columns:40px 1fr;gap:1rem}.we-arrow{display:none}.footer{padding-left:1.5rem}}
@media(max-width:600px){.mixed-card{width:100%;transform:none!important}.credits-wall{columns:1}.photo-frame.pf-wide .photo-text-fill{width:300px;height:200px}.photo-frame.pf-tall .photo-text-fill{width:200px;height:300px}.photo-frame.pf-square .photo-text-fill{width:260px;height:260px}.photo-frame.pf-pano .photo-text-fill{width:340px;height:140px}}

Film
Photo
Mixed
Who

Amsterdam
Cinematographer
Visual Artist
Storyteller
@rakan_dajani
RAKAN
Dajani
Film · Photography
Mixed Media · Writing
Est. Amsterdam
2026

Blackwater FeverKung FuYellow GrassGuiltGuinea Pig DoctorCitizen’s AnxietyTrace of LightThe MadmanMish WahtaHands Up
Blackwater FeverKung FuYellow GrassGuiltGuinea Pig DoctorCitizen’s AnxietyTrace of LightThe MadmanMish WahtaHands Up

BLACK
WATER
FEVER
Short FilmBlackwater Fever2018Cinematographer

KUNG
FU
InstallationKung Fu2017 · Calcutta IFF NomineeCinematographer

GU
ILT
Visual InstallationGuilt2018Co-Director

YEL
LOW
ShortYellow Grass2017Cinematographer

MISH
WAHTA
DocumentaryMish WahtaUpcomingCo-Director

MAD
MAN
ExperimentalThe Madman2016 · Khalil GibranDirector

TR
ACE
Music VideoTrace of Light2016Director

MACROLANDSCAPEMACRO
Macro-Landscape001
DETAILSTUDYDETAIL
Detail Study002
TEXTUREGRAINSURFACE
Texture003
PANORAMICWIDEFIELD
Panoramic004
OBSERVEWATCHLOOK
Observation005
LIGHTSTUDYTRACE
Light Study006

TAPE

Tape Art

TADELAKT

Tadelakt

FRAME

Custom Frame

INSTALL

Installation

DESIGN

Design

EXPERIMENT

Experiment

R.D.

Filmmaker,
photographer,
restless maker

Amsterdam-based visual artist working across film, macro-landscape photography, tape art, tadelakt, custom framing, and written storytelling. Involved in the production of 23+ films ranging from narrative shorts and documentaries to visual installations and experimental work.

Cinematographer for Kung Fu (2017), nominated for the Calcutta International Cult Film Festival. Co-founder of Dromedair, an independent production house. Previously worked with Forward Film Production in Lebanon as video journalist, editor, and researcher.

GuiltCo-Director 2018
Blackwater FeverCinematographer 2018
Kung FuCinematographer 2017 · Calcutta IFF Nominee
Yellow GrassCinematographer 2017
Guinea Pig DoctorCinematographer 2016
Kiss KissCinematographer 2016
VanitasCinematographer 2016
ThisAssistant Camera 2016
Little Small Eared ManCo-Director 2016
My Love Is Not A CurrencyCinematographer 2016
Trace of LightDirector 2016
Look AwayCinematographer 2016
Iffley Open HouseCo-Director 2017
Mish WahtaCo-Director Upcoming
Hands UpDirector 2017
The MadmanDirector 2016
Citizen’s AnxietyDirector 2016
BeetleDirector 2016
In the Republic of HappinessProducer/Director 2016 · 5 Trailers

// ═══ CURSOR ═══
const dot=document.getElementById(‘cursorDot’),ring=document.getElementById(‘cursorRing’);
let mx=0,my=0,dx=0,dy=0;
document.addEventListener(‘mousemove’,e=>{mx=e.clientX;my=e.clientY;dot.style.left=mx-4+’px’;dot.style.top=my-4+’px’});
function animCursor(){dx+=(mx-dx)*.12;dy+=(my-dy)*.12;ring.style.left=dx-20+’px’;ring.style.top=dy-20+’px’;requestAnimationFrame(animCursor)}animCursor();
document.querySelectorAll(‘a,.film-card,.mixed-card,.writing-entry,.photo-frame’).forEach(el=>{
el.addEventListener(‘mouseenter’,()=>{ring.style.width=’60px’;ring.style.height=’60px’;ring.style.left=dx-30+’px’;ring.style.top=dy-30+’px’;ring.style.borderColor=’var(–accent)’;ring.style.opacity=’.8′});
el.addEventListener(‘mouseleave’,()=>{ring.style.width=’40px’;ring.style.height=’40px’;ring.style.borderColor=’var(–fg)’;ring.style.opacity=’.5′})
});

// ═══ PARALLAX SCATTER ═══
const scatters=document.querySelectorAll(‘.hero-scatter’);
window.addEventListener(‘mousemove’,e=>{const cx=e.clientX/window.innerWidth-.5,cy=e.clientY/window.innerHeight-.5;scatters.forEach(s=>{const sp=parseFloat(s.dataset.speed)||.01;s.style.transform=`translate(${cx*sp*1000}px,${cy*sp*800}px)`})});

// ═══ SCROLL REVEAL ═══
const obs=new IntersectionObserver(entries=>{entries.forEach(e=>{if(e.isIntersecting)e.target.classList.add(‘vis’)})},{threshold:.06,rootMargin:’0px 0px -30px 0px’});
document.querySelectorAll(‘.reveal’).forEach(el=>obs.observe(el));

// ═══ SMOOTH NAV ═══
document.querySelectorAll(‘.side-nav a’).forEach(a=>{a.addEventListener(‘click’,e=>{e.preventDefault();const t=document.querySelector(a.getAttribute(‘href’));if(t)t.scrollIntoView({behavior:’smooth’,block:’start’})})});

// ═══════════════════════════════
// TEXT SCRAMBLE EFFECT ON HOVER
// ═══════════════════════════════
const chars=’ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789@#$%&*!?/\\|{}[]~^’;

document.querySelectorAll(‘.film-card[data-scramble]’).forEach(card=>{
const target=card.querySelector(‘.fc-scramble’);
const finalText=card.dataset.scramble;
let interval=null;
let iteration=0;

card.addEventListener(‘mouseenter’,()=>{
iteration=0;
clearInterval(interval);
interval=setInterval(()=>{
target.textContent=finalText.split(”).map((c,i)=>{
if(i=finalText.length)clearInterval(interval);
iteration+=1/2;
},30);
});

card.addEventListener(‘mouseleave’,()=>{
clearInterval(interval);
target.textContent=”;
});
});

// ═══════════════════════════════
// LETTER STAGGER ON SECTION LABELS
// ═══════════════════════════════
document.querySelectorAll(‘.section-label’).forEach(label=>{
const text=label.childNodes;
const textContent=label.textContent.trim();
// Only stagger the text part (not the num span)
});

// ═══════════════════════════════
// CREDITS — HOVER RIPPLE
// ═══════════════════════════════
const creditItems=document.querySelectorAll(‘.credit-item’);
creditItems.forEach((item,i)=>{
item.addEventListener(‘mouseenter’,()=>{
// Highlight neighbours
const prev=creditItems[i-1];
const next=creditItems[i+1];
if(prev)prev.style.color=’rgba(232,228,223,0.4)’;
if(next)next.style.color=’rgba(232,228,223,0.4)’;
});
item.addEventListener(‘mouseleave’,()=>{
const prev=creditItems[i-1];
const next=creditItems[i+1];
if(prev)prev.style.color=”;
if(next)next.style.color=”;
});
});