<template id="pb-site-tpl"><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Anybody:wdth,wght@50..150,100..900&family=Courier+Prime:wght@400;700&family=Newsreader:ital,opsz,wght@0,6..72,400;0,6..72,500;1,6..72,400&display=swap"><style>:root{--bg:#1d0b8f;--ink:#f5f3ff;--display:"Anybody","Arial Narrow",Impact,sans-serif;--body:"Newsreader",Georgia,"Times New Roman",serif;--prompt:"Courier Prime","Courier New",Courier,monospace;--gut:max(16px,env(safe-area-inset-left,0px));--gutr:max(16px,env(safe-area-inset-right,0px));--col:min(43vw,620px);color-scheme:dark;}*{box-sizing:border-box}html{scroll-behavior:smooth;-webkit-text-size-adjust:100%}body{margin:0;background:var(--bg);color:var(--ink);font:400 clamp(17px,1.32vw,20px)/1.48 var(--body);transition:color .7s,background-color .7s;overflow-x:clip}a{color:inherit;text-underline-offset:.18em;text-decoration-thickness:1px}a:hover{text-decoration-thickness:3px}:focus-visible{outline:3px solid currentColor;outline-offset:3px}[hidden]{display:none!important}#stage{position:fixed;inset:0;width:100%;height:100%;z-index:-1;display:block}.nogl #stage{display:none}#beginners{position:fixed;inset:0;z-index:50;background:#050308;color:#f5f3ff;display:grid;place-items:center;font:400 clamp(15px,1.5vw,20px) var(--prompt);pointer-events:none;animation:bg 1.25s .9s forwards}#beginners span{animation:bgt .9s .1s both}@keyframes bg{to{opacity:0;visibility:hidden}}@keyframes bgt{from{opacity:0}}.nogl #beginners{display:none}.bar{position:fixed;z-index:20;top:0;left:0;right:0;display:flex;gap:18px;align-items:baseline;justify-content:space-between;padding:calc(10px + env(safe-area-inset-top,0px)) var(--gutr) 10px var(--gut);font:400 14px/1.2 var(--prompt);pointer-events:none;text-shadow:0 0 10px var(--bg),0 0 2px var(--bg)}.bar a{pointer-events:auto;text-decoration:none;white-space:nowrap}.mark{font-weight:700}.bar nav{display:flex;gap:16px;overflow-x:auto;scrollbar-width:none;min-width:0;pointer-events:auto}.bar nav::-webkit-scrollbar{display:none}.bar nav i{font-style:normal;opacity:.6;margin-right:.4em}.bar nav a[aria-current]{text-decoration:underline;text-decoration-thickness:2px}.bar nav a:hover{text-decoration:underline}.prompt{position:fixed;z-index:20;left:var(--gut);bottom:calc(14px + env(safe-area-inset-bottom,0px));display:flex;align-items:center;gap:9px;font:400 13px/1.2 var(--prompt);pointer-events:none;background:var(--bg);padding:5px 8px 4px;transition:background-color .7s;max-width:calc(100vw - 110px)}#cueline{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}#cuelight{flex:none;width:11px;height:11px;border-radius:50%;background:#ff2b2b;box-shadow:0 0 0 2px #0006,0 0 12px #ff2b2b}#cuelight.go{background:#2bff6a;box-shadow:0 0 0 2px #0006,0 0 16px #2bff6a}#go{position:fixed;z-index:20;right:var(--gutr);bottom:calc(12px + env(safe-area-inset-bottom,0px));width:68px;height:68px;border-radius:50%;border:0;background:#16c24e;color:#031a0a;font:800 21px/1 var(--display);font-variation-settings:'wdth' 110;cursor:pointer;box-shadow:0 0 0 3px #063,0 5px 0 3px #063,0 10px 22px #0006;transition:transform .12s,box-shadow .12s}#go:hover{background:#2bff6a}#go:active{transform:translateY(5px);box-shadow:0 0 0 3px #063,0 0 0 3px #063}#tag{position:fixed;z-index:30;left:0;top:0;padding:3px 7px;background:#050308;color:#f5f3ff;font:400 13px/1.2 var(--prompt);pointer-events:none;opacity:0;transition:opacity .15s;white-space:nowrap}.fit{margin:0;padding:0 var(--gutr) 0 var(--gut);display:block;font:800 100px/1 var(--display);mix-blend-mode:difference;color:#fff;user-select:none;font-kerning:none}.fit .ln{display:block;position:relative;white-space:nowrap}.fit .li{display:flex;justify-content:space-between;transform-origin:0 0;will-change:transform;line-height:1}.fit .ch{display:inline-block;flex:none}.scene>.fit{padding-top:16svh}.hero{height:185svh;position:relative}.hero-name{position:sticky;top:0;padding-top:calc(44px + env(safe-area-inset-top,0px));height:100svh}.role{position:absolute;left:var(--gut);top:calc(100svh - 96px);margin:0;font:400 italic clamp(22px,3vw,42px)/1 var(--body);text-shadow:0 0 16px var(--bg)}.work{min-height:100svh;display:flex;align-items:center;padding-block:9svh;padding-left:var(--gut);padding-right:var(--gutr);position:relative}.work:has(.in:empty){min-height:90svh}.work>.in{width:var(--col);min-width:0;text-shadow:0 0 14px var(--bg),0 0 3px var(--bg)}.work.right{justify-content:flex-end}.in>:first-child{margin-top:0}.in>:last-child{margin-bottom:0}p{margin:0 0 .85em}.lead{font-size:clamp(23px,2.25vw,34px);line-height:1.2}.ph{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none}.nogl .ph{position:static;width:100%;height:auto;opacity:1;flex:0 0 46%;max-width:46%;margin-right:4%;order:0}.nogl .work.right .ph{order:0}.q{display:block;font:400 13px/1 var(--prompt);margin-bottom:.8em;opacity:.8}.t{margin:0 0 .35em;font:800 clamp(32px,4.5vw,70px)/.94 var(--display);text-transform:uppercase;overflow-wrap:anywhere;hyphens:auto;font-variation-settings:'wdth' 58;transition:font-variation-settings .9s cubic-bezier(.2,.9,.2,1);text-wrap:balance}.work.on .t{font-variation-settings:'wdth' 104}.kick{font:700 15px/1.3 var(--prompt);text-transform:uppercase;letter-spacing:.04em}.cr{font:400 14.5px/1.45 var(--prompt);margin-top:1.1em}.prize{font:700 14.5px/1.4 var(--prompt);border-left:0;padding:0;margin-top:.4em}.prize::before{content:"★ "}.note{font-style:italic;margin-top:1.6em}blockquote{margin:0 0 .85em;font-style:italic;font-size:1.14em;line-height:1.3}cite{display:block;font:400 14px/1.4 var(--prompt);margin-top:.6em}.vid{display:inline-block;font:700 14.5px/1.3 var(--prompt);margin:.3em 1.2em .3em 0;overflow-wrap:anywhere}.recent{margin-top:1.5em;font-size:.94em}.recent h4,.sub{margin:0 0 .4em;font:800 15px/1.2 var(--display);text-transform:uppercase;letter-spacing:.05em;font-variation-settings:'wdth' 125}.eps{list-style:none;margin:0 0 1em;padding:0;display:flex;flex-wrap:wrap;gap:6px 18px;font:700 14.5px/1.4 var(--prompt)}.band{margin:0;padding:12svh var(--gutr) 0 var(--gut);font:400 italic clamp(44px,8vw,128px)/.95 var(--body);text-wrap:balance}.site .t{overflow-wrap:break-word}.class-room{padding:7svh var(--gutr) 22svh var(--gut);display:grid;gap:1.2em;max-width:1100px;text-shadow:0 0 14px var(--bg),0 0 3px var(--bg)}.class-room>*{margin:0}.hint{font:400 14px/1.3 var(--prompt)}.classes{list-style:none;padding:0;display:flex;flex-direction:column;align-items:flex-start;gap:.02em}.classes button{all:unset;cursor:pointer;font:800 clamp(30px,6.5vw,106px)/1 var(--display);text-transform:uppercase;font-variation-settings:'wdth' 55;transition:font-variation-settings .55s cubic-bezier(.2,.9,.2,1);overflow-wrap:break-word}.classes button:hover,.classes button[aria-pressed=true]{font-variation-settings:'wdth' 92}.classes button:focus-visible{outline:3px solid currentColor;outline-offset:2px}.cols{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,280px),1fr));gap:1.5em;margin-top:1em}.cols>div{min-width:0}.cta{all:unset;display:inline-block;justify-self:start;cursor:pointer;border:2px solid currentColor;padding:.55em .9em;font:700 15px/1.2 var(--prompt);text-shadow:none}.cta:hover{background:var(--ink);color:var(--bg)}.cta:focus-visible{outline:3px solid currentColor;outline-offset:3px}.restanza{font:800 clamp(48px,7.6vw,118px)/.9 var(--display);font-variation-settings:'wdth' 62;margin-bottom:.25em;text-transform:uppercase}.prog{width:100%;border-collapse:collapse;margin:.3em 0 1em;font-size:.95em}.prog th{font:700 14px/1.3 var(--prompt);text-align:left;vertical-align:top;white-space:nowrap;padding:.5em 1em .5em 0}.prog td{padding:.42em 0}.prog tr{border-top:1px solid currentColor}.logos{display:flex;flex-wrap:wrap;gap:16px 22px;align-items:center;margin-top:1.2em}.logos img{height:34px;width:auto;max-width:100%}.eye{display:block;width:110px;height:auto;margin:.4em 0 1em;filter:invert(1)}.ciao{padding:6svh var(--gutr) 110px var(--gut);max-width:1100px;text-shadow:0 0 14px var(--bg),0 0 3px var(--bg)}.email{font:800 clamp(25px,5.5vw,84px)/1 var(--display);font-variation-settings:'wdth' 72;margin:.5em 0 .4em;overflow-wrap:anywhere}.social{list-style:none;padding:0;display:flex;flex-wrap:wrap;gap:6px 22px;margin:1.6em 0;font:700 14.5px/1.4 var(--prompt)}.terms{border-top:2px solid currentColor;padding-top:.8em;margin-top:2em;max-width:760px}.terms summary{cursor:pointer;font:700 15px/1.3 var(--prompt)}.terms h3{font:800 24px/1.05 var(--display);font-variation-settings:'wdth' 82;margin:1em 0 .6em}.terms h4{font:700 15px/1.3 var(--prompt);margin:1.4em 0 .4em}.terms p,.terms li{font-size:.92em}.legal{font:400 13px/1.4 var(--prompt);margin-top:2em}@media (max-width:760px){:root{--col:100%}.bar{flex-direction:column;gap:6px;align-items:stretch}.bar nav{margin-inline:calc(var(--gut) * -1);padding-inline:var(--gut)}.bar nav a{font-size:13px}.work,.work.right{display:block;padding-top:54svh;padding-bottom:6svh;min-height:0;padding-left:0;padding-right:0}.work>.in{width:100%;background:var(--bg);padding:20px var(--gutr) 26px var(--gut);text-shadow:none;transition:background-color .7s}.work>.in:empty{display:none}.scene>.fit{padding-top:18svh}.band{padding-top:10svh}.role{top:calc(100svh - 106px)}.class-room,.ciao{text-shadow:0 0 12px var(--bg),0 0 3px var(--bg)}#go{width:58px;height:58px;font-size:18px}.nogl .work{padding-top:6svh}.nogl .ph{max-width:100%;margin:0}}@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}#beginners{display:none}.t,.classes button{transition:none}}#pb-main h3,#pb-main h4,#pb-main .t,#pb-main a,#pb-main summary,#pb-main em,.bar a{color:var(--ink)}</style><canvas id="stage" aria-hidden="true"></canvas><div id="beginners" aria-hidden="true"><span>Beginners to the stage, please.</span></div><div id="tag" aria-hidden="true"></div><header class="bar"><a class="mark" href="#top">Patrizio Bucci</a><nav aria-label="Main"><a href="#performer"><i>Q2</i>Performer</a><a href="#choreographer"><i>Q3</i>Choreographer</a><a href="#teacher"><i>Q4</i>Teacher</a><a href="#coordinate"><i>Q5</i>COORDINATE Festival</a><a href="#webdesign"><i>Q6</i>Webdesign</a><a href="#maan"><i>Q7</i>Omarm de Maan</a><a href="#contact"><i>Q8</i>Contact</a></nav></header><aside class="prompt" aria-hidden="true"><b id="cuelight"></b><span id="cueline">LX Q1</span></aside><button id="go" type="button" aria-label="Go to the next cue">GO</button><main id="pb-main"><section id="top" class="scene" data-gel="181" data-form="preset" data-cam="front" data-q="1"><div class="hero"><h1 class="fit hero-name" aria-label="Patrizio Bucci" data-hero="1"><span class="ln">PATRIZIO</span><span class="ln">BUCCI</span></h1><p class="role">dance artist</p></div><article class="work" data-d="02aed9af"><img class="ph" loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/02aed9af-ef3a-41d4-9f36-08d03ff871c3/The+Embrace-foto-Steffie+van+den+Akker-3.jpg?format=750w" alt="Patrizio Bucci and Marika Meoli in The Embrace, performed outdoors"><div class="in"><p class="lead">Patrizio Bucci is an Italian dance artist based in Maastricht. His work spans performance, choreography, teaching and cultural organising, between the Netherlands and Italy.</p><p>He currently teaches movement at the Toneelacademie Maastricht and performs <em>The Embrace</em>, a duet choreographed by Marika Meoli and Joost Vrouenraets, in theatres and public spaces across both countries. In Rome he leads PROTEO ETS with Raffaella Appià and Tommaso Petrolo, and together they co-direct COORDINATE Festival in the medieval village of Calcata.</p><p>Trained at Centro di Danza Balletto di Roma, he began performing in Italy before moving to the Netherlands in 2011 to join Noord Nederlandse Dans. From 2013 to 2025 he was a core member of SALLY Dansgezelschap Maastricht as dancer, choreographer and artistic coordinator.</p><p>His approach is intuitive and collaborative, built on connection, musicality and the intelligence of the body.</p></div></article></section><section id="performer" class="scene" data-gel="106" data-form="diagonal" data-cam="diagonal" data-q="2"><h2 class="fit" aria-label="Performer" data-h=".42"><span class="ln">PERFORMER</span></h2><article class="work" data-d="8396e968"><img class="ph" loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/8396e968-5c16-4234-9628-ace1744f993d/vreemde-eend-4-sally-dansgezelschap-maastricht-het-laagland-foto-tycho-merijn-lr.jpg?format=750w" alt="A dancer in a high kick in front of a red door, from Vreemde Eend"><div class="in"><p>Patrizio’s performance career began in full with Noord Nederlandse Dans, where he danced from 2011 to 2013 under the direction of Stephen Shropshire. During this time, he performed in a wide range of works that explored both classical structure and experimental contemporary vocabulary, including <em>Lab Dance</em>, <em>Strange Light</em>, <em>Mythology</em>, and <em>Symphony in C (Golden)</em>.</p><p>In 2013, he joined SALLY Dansgezelschap Maastricht, a contemporary dance company with a strong focus on youth engagement and interdisciplinary collaboration. At SALLY, he performed in dozens of productions, including <em>Skyline</em>, <em>Revolt</em>, <em>Blauw</em>, <em>Dekbed</em>, <em>Bull’s Eye</em>, and <em>Tabula Rasa – Spectrum</em>. His presence within the company expanded over time to include artistic coordination and choreographic development. He worked closely with emerging and established choreographers, composers, and dramaturges, and contributed not only as a performer but also as a rehearsal director and creative collaborator.</p><p>He continues his artistic journey as a freelance performer, contributing to a range of creative projects.</p><a class="vid" href="https://vimeo.com/286869278" target="_blank" rel="noopener">Watch Dansportret Patrizio ↗</a><p class="note">A selection of Patrizio’s work as a performer.</p></div></article><article class="work" data-d="7b4087e6"><img class="ph" loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/7b4087e6-2227-409f-8b27-8211833cb53b/IMG_7943.jpeg?format=750w" alt="Two dancers in a close embrace, from The Embrace"><div class="in"><h3 class="t">The Embrace</h3><p>The Embrace explores the power and intimacy of the embrace. Two bodies remain in constant contact—skin to skin, intertwined limbs, gliding muscles in an endless movement of connection. In an age of increasing digital communication and individualism, this work focuses on the simplicity and value of physical closeness.</p><p class="cr">Choreography by Marika Meoli and Joost Vrouenraets</p><div class="recent"><h4>Recent performances</h4><p><em>The Embrace</em> — Vondelpark Openluchttheater, Amsterdam · Omarm de Maan, Heerlen · COORDINATE Festival, Calcata · Museumnacht Maastricht (2026)</p><p><em>Domenica</em> — COORDINATE Festival, Calcata (2025)</p></div></div></article><article class="work" data-d="0ce11921"><img class="ph" loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/0ce11921-9df3-47d9-bb4d-f3d8be818ef8/Woest-1-SALLY-Dansgezelschap-Maastricht-foto-Jochem-Jurgens_web.webp?format=750w" alt="A dancer shouting among colourful furniture, from Woest"><div class="in"><h3 class="t">Woest</h3><p>Woest is a performance about uncontrollable fits of rage. A boy with divorced parents takes it out on everything and everyone. But beneath his anger lies a deeper longing: in his unique world full of dynamic, virtuoso, and acrobatic dance, he tries to keep everything as it was…</p><blockquote>“Your heart is pounding in your throat, your legs are shaking, and you're turning red. It's bubbling deep inside and unstoppable. It has to come out…QUACK…Watch out, the hothead is on the loose. He's Wild!”</blockquote><p class="cr">Choreography Stefan Ernst<br>SALLY Dansgezelschap Maastricht</p><a class="vid" href="https://vimeo.com/259634098" target="_blank" rel="noopener">Watch the teaser ↗</a></div></article><article class="work" data-d="a3adf933"><img class="ph" loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/a3adf933-b6a9-4c0e-a0aa-2168f52ff5a5/bullseye-2000.jpg?format=750w" alt="Dancers leaping across a stack of grey blocks, from Bull's Eye"><div class="in"><h3 class="t">Bull's Eye</h3><p>Bull's Eye is a dazzling dance performance exploring the power of the authentic self.</p><p>How can you be true to yourself in a world that increasingly imposes itself on you? In Bull's Eye, a new generation of dancers heads straight for their goal. Like a bull facing a red rag!</p><p class="cr">Choreography Stefan Ernst, Ronald Wintjens, Itzik Galili, Conny Janssen, Stephen Shropshire<br>SALLY Dansgezelschap Maastricht</p><a class="vid" href="https://vimeo.com/81929894" target="_blank" rel="noopener">Watch the teaser ↗</a></div></article><article class="work" data-d="e739beaa"><img class="ph" loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/e739beaa-ffb3-454f-808d-8da03af8ea60/Persfoto-1-Keihard-SALLY-Dansgezelschap-Maastricht-foto-Tycho-Merijn-LR.webp?format=750w" alt="Dancers in red moving as a group on a black stage, from Keihard"><div class="in"><h3 class="t">Keihard</h3><p class="kick">IN YOUR FACE</p><p>KEIHARD showcases the power of the collective and what a group of individuals can achieve. Seven dancers take to the stage and demonstrate how a collective can create energy, ignite a willingness to take action, and bring about change. SALLY lets the audience experience how infectious it is to watch dance: intense, virtuosic, full of humor, and ROCKY "in your face."</p><p class="cr">Choreography Stefan Ernst, Martin Harriague<br>SALLY Dansgezelschap Maastricht</p><a class="vid" href="https://vimeo.com/316978058" target="_blank" rel="noopener">Watch the teaser ↗</a></div></article><article class="work" data-d="cff7d5f3"><img class="ph" loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/cff7d5f3-c628-49ef-8db3-2d35379c8b3a/35860407_2078150309073790_7025309982098718720_n.jpg?format=750w" alt="A dancer in a patterned costume on a blue floor, from Lux"><div class="in"><h3 class="t">Lux</h3><p>LUX, a choreography by Martin Harriague in collaboration with Maastricht-based fashion designer Mieke Kockelkorn. The collaboration between the two creators underscores the extraordinary connection between dance and fashion and demonstrates how these completely different disciplines reinforce each other. LUX (the strength of light) is inspired by the influence of the written word on the experience of religion. In our individualistic society, each individual has a personal "collection" of words and symbols that represent us. They reflect our universal and essential values in life and thus transcend the boundaries of religion. But do they also illuminate who we truly are?</p><p class="cr">Choreography: Martin Harriague<br>Costumes: Mieke Kockelkorn<br>SALLY Dansgezelschap Maastricht</p></div></article><article class="work" data-d="914b84de"><img class="ph" loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/914b84de-f917-4155-9dfd-04a2ccfd994a/Thyco+Merijn+Photographer.jpg?format=750w" alt="A dancer suspended among flying sheet music on a red background, from Heartbeat"><div class="in"><h3 class="t">Heartbeat</h3><p>"HeartBeat" is a unique performance for young audiences, in which both the orchestra and the dance company push the boundaries of traditional presentation, resulting in a remarkable interdisciplinary performance (featuring dance, music, and spoken word). In "HeartBeat," the audience experiences the story of a dancer who has lost his heartbeat. They follow his passionate quest and actively help him regain it. The performance challenges them to explore what makes their hearts beat faster and sometimes poses uncomfortable questions: what happens when you don't have a heartbeat? And if you do, do you dare to speak out about it?</p><p class="cr">Choreography Stefan Ernst<br>Orchestra Philzuid<br>SALLY Dansgezelschap Maastricht</p></div></article><article class="work" data-d="5f43faea"><img class="ph" loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/5f43faea-5bdd-4a42-8ecc-45d06c1aa205/lea-giamattei-skyline-1000.jpg?format=750w" alt="A dancer lying among graphic shards of colour, from Skyline"><div class="in"><h3 class="t">Skyline</h3><p>In Skyline, the paths of five young people cross on a quest to find themselves. They share their journey and become fellow travelers in each other's lives. The performance offers a snapshot of their encounter in a place surrounded by walls. A place that traps them, forms a barrier, and keeps them from the dream that lies on the horizon. Their imagination allows them to break free from their surroundings.</p><p class="cr">Choreography Stefan Ernst, Itzik Galili, Roy Assaf, and Martin Harriague<br>SALLY Dansgezelschap Maastricht</p><a class="vid" href="https://vimeo.com/234870781" target="_blank" rel="noopener">Watch the teaser ↗</a></div></article><article class="work" data-d="40dd4f74"><img class="ph" loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/40dd4f74-ba49-4343-88cb-787a2c576dd0/revolt2-2000.jpg?format=750w" alt="Six dancers facing the viewer in a tight group, from Revolt"><div class="in"><h3 class="t">Revolt</h3><p>Revolt is a stormy dance performance that reflects the current zeitgeist. In this performance, deeply moving for all ages, six young dancers bare their hearts and souls. They rebel together by choosing their own personal protest.</p><p class="cr">Choreography Stefan Ernst, Ronald Wintjens, Stephen Shropshire, Itzik Galili and Martin Harriague<br>SALLY Dansgezelschap Maastricht</p><a class="vid" href="https://vimeo.com/141534808" target="_blank" rel="noopener">Watch the teaser ↗</a></div></article><article class="work" data-d="bcbf8fce"><img class="ph" loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/bcbf8fce-a1c5-4b67-bd69-7364d4124ff3/LandslideMythology-Noord-Nederlandse-Dans-foto-Karel-Zwaneveld.jpg?format=750w" alt="Two dancers in white on a dark stage, from Mythology"><div class="in"><h3 class="t">Mythology</h3><p>It is a work about community, one unified by a common vision and language, coming together to achieve something greater than the sum of its individual parts. It is also a work about letting go.</p><p>The work is the culmination of four years of the company building together a vision, a philosophy of movement, and community of like-minded artists. Mythology stands as testament to that time, reflecting all that is left of that journey, written in a language that has since become its history.</p><p class="cr">Choreography Stephen Shropshire in collaboration with the dancers<br>Noord Nederlandse Dans</p><a class="vid" href="https://vimeo.com/126740675" target="_blank" rel="noopener">Watch the video ↗</a></div></article><article class="work" data-d="a72a2278"><img class="ph" loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/a72a2278-3730-46e6-9cac-50f020b42f4a/FOLIA+performance+Martin+Harriague+%26+Mieke+Kockelkorn_.jpg?format=750w" alt="Two male dancers joined by a long pole, from Folia"><div class="in"><h3 class="t">Folia</h3><blockquote>“FOLIA was the most striking and engaging, involving two male dancers dressed by Mieke Kockelkorn. Superbly choreographed by Martin Harriague, the dance piece was intense, vibrant and sensual, acting as the perfect prelude to three days of creative fashion.”<cite>- A shaded view of fashion - Philippe</cite></blockquote><p class="cr">Choreography: Martin Harriague<br>Costumes: Mieke Kockelkorn<br>SALLY Dansgezelschap Maastricht</p><a class="vid" href="https://vimeo.com/771669164" target="_blank" rel="noopener">Watch the trailer ↗</a></div></article><article class="work" data-d="06347d9a"><img class="ph" loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/06347d9a-34cd-4ae0-8263-7b8db39029aa/Screenshot+2025-07-29+at+23.17.22.png?format=750w" alt="A solo dancer in red in a small pool of light, from JUK"><div class="in"><h3 class="t">JUK</h3><p>A solo created by Krisztina de Chatêl on Patrizio Bucci for the 10th year anniversary of SALLY dansgezelschap Maastricht.</p></div></article><article class="work" data-d="e637ee1a"><img class="ph" loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/e637ee1a-aaef-427a-a7a8-57f00dc08a05/Vreemde-Eend-2-SALLY-Dansgezelschap-Maastricht-Het-Laagland-foto-Tycho-Merijn-LR.jpg?format=750w" alt="A dancer balancing above a small red house on a green floor, from Vreemde Eend"><div class="in"><h3 class="t">Vreemde Eend</h3><p>Everything is neat, quiet, and under control on Buuf en Buur's street. Until a newcomer moves in next door. The arrival of this odd duck turns the street upside down and tests the neighborhood. Will they be open to this newcomer? Is there room on the picnic blanket for a third person? And who is the odd duck here, anyway?</p><p class="cr">Choreography Stefan Ernst<br>Dramaturgy Inez Derksen<br>Coproduction SALLY and Het Laagland</p><a class="vid" href="https://vimeo.com/341785754" target="_blank" rel="noopener">Watch the teaser ↗</a></div></article><article class="work" data-d="c470702d"><img class="ph" loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/c470702d-55fa-4df1-a681-33df541887bb/dekbed-2000.jpg?format=750w" alt="Dancers in orange and blue falling towards a bed, from Dekbed"><div class="in"><h3 class="t">Dekbed</h3><p>A dreamy performance full of beautiful images, in which dance is dynamic, virtuosic, and sometimes even acrobatic. A playful and exciting performance about a grand and universal theme. About sleep and dreams, fear of the dark, and the world between reality and fantasy. Because, where do you actually go when you dream? What can you do when the dark scares you? And what happens if you never wake up? Will you remain in your dream forever?</p><p>Do you dare to look under your bed?</p><p class="cr">Choreography Stefan Ernst<br>SALLY Dansgezelschap Maastricht</p><a class="vid" href="https://vimeo.com/507089235" target="_blank" rel="noopener">Watch the teaser ↗</a></div></article><article class="work" data-d="4da8e916"><img class="ph" loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/4da8e916-eb51-4760-b426-a3421393e026/spectrum2.jpg?format=750w" alt="Two dancers in pink costumes in a wide stance, from Spectrum"><div class="in"><h3 class="t">Spectrum</h3><p>An interdisciplinary performance with choreography by Martin Harriague and costumes by Mieke Kockelkorn about being transgender.</p><p class="cr">Choreography: Martin Harriague<br>Costumes: Mieke Kockelkorn<br>SALLY Dansgezelschap Maastricht</p><a class="vid" href="https://vimeo.com/771165383" target="_blank" rel="noopener">Watch the trailer ↗</a></div></article><article class="work" data-d="05d1ed01"><img class="ph" loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/05d1ed01-5e33-4bff-97e3-4027429b1c4b/202800572_2902409093314570_3234936924340187079_n.jpg?format=750w" alt="A woman in a blue headscarf looks at a garden through a window, from Vreemde Eend TV"><div class="in"><h3 class="t">Vreemde Eend TV</h3><p>During the COVID-19 pandemic, Vreemde Eend has been made into a TV serie of 6 episodes on NPO</p><ul class="eps"><li><a href="https://npo.nl/start/serie/vreemde-eend/seizoen-1/vreemd/afspelen" target="_blank" rel="noopener">Episode 1</a></li><li><a href="https://npo.nl/start/serie/vreemde-eend/seizoen-1/vreemd/afspelen" target="_blank" rel="noopener">Episode 2</a></li><li><a href="https://npo.nl/start/serie/vreemde-eend/seizoen-1/gezellig/afspelen" target="_blank" rel="noopener">Episode 3</a></li><li><a href="https://npo.nl/start/serie/vreemde-eend/seizoen-1/winnaar/afspelen" target="_blank" rel="noopener">Episode 4</a></li><li><a href="https://npo.nl/start/serie/vreemde-eend/seizoen-1/kleintje/afspelen" target="_blank" rel="noopener">Episode 5</a></li><li><a href="https://npo.nl/start/serie/vreemde-eend/seizoen-1/blijf/afspelen" target="_blank" rel="noopener">Episode 6</a></li></ul><p class="cr">Coproduction SALLY and Het Laagland<br>Production Evangelische Oproep (EO)</p></div></article></section><section id="choreographer" class="scene" data-gel="128" data-form="circle" data-cam="circle" data-q="3"><h2 class="fit" aria-label="Choreographer" data-h=".42"><span class="ln">CHOREOGRAPHER</span></h2><article class="work" data-d="d46bf285"><img class="ph" loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/d46bf285-04ec-4377-8186-ab0853793822/AloTog_009.jpg?format=750w" alt="Two dancers in a lift in a modern hall, from Alone Together"><div class="in"><p>As a choreographer, Patrizio has developed a body of original work that often explores human connection, memory, isolation, and transformation. His solo <em>And Now What?</em>, developed in 2015, was performed in Maastricht, in Florence at Doc.3 and also featured in BodyPerform Rome. The piece combined spoken word, minimalist gesture, and grounded floorwork to explore personal and cultural disorientation.</p><p>In 2016, he created <em>Pacts & Faith</em>, a duet inspired by his relationship with his twin brother, which was performed at the PAS Festival in Maastricht and at SALLY’s 10-year anniversary. This work reflected on the silent understandings and unresolved tensions that can define siblinghood.</p><p>In 2017, during a residency for the Limburg Festival, he created <em>Alone Together</em>, a duet inspired by Henryk Górecki’s <em>Symphony of Sorrowful Songs</em>. The work explored themes of separation, longing, and emotional resilience and was performed in unconventional spaces as part of the festival’s site-specific programming.</p><p>Earlier, in 2014, his piece <em>LAST</em>, created during SALLY’s choreographic development program, marked his early steps into personal movement invention and thematic abstraction.</p><p>Patrizio has also been assistant choreographer for Stefan Ernst, <a href="https://www.rover.company/en/roshanak-morrowatian/" target="_blank" rel="noopener">Roshanak Morrowatian</a>, <a href="https://emmaevelein.com/" target="_blank" rel="noopener">Emma Evelein</a>, Winston Arnon and David Middendorp.</p><p>In 2025, he created <em>Domenica</em> in collaboration with Marika Meoli, a duet for young audiences that premiered at COORDINATE Festival.</p></div></article><h3 class="band">as a choreographer</h3><article class="work" data-d="2b10672b"><img class="ph" loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/2b10672b-0da0-4113-88d0-44391f7c7f94/Screenshot+2025-07-30+at+09.29.06.png?format=750w" alt="A dancer standing against a wall in a room with tall doors, from And Now What"><div class="in"><h3 class="t">And Now What</h3><p>When you feel like there is no escape, how do you react in that moment? The dancer enters a confined space but finds he cannot leave, and the overwhelming emotions surge within him, compelling him to move and release all of his pent-up energy.</p><p class="cr">Dance Luis Ricardo Pedraza Cedron</p></div></article><article class="work" data-d="7fd41bc1"><img class="ph" loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/7fd41bc1-fc58-42ab-96a7-6de592382471/654352116-7c529b6e0dcc9f44ea43d1b01a55725ea289ccf031ee2903b5a4283d064c3bb4-d.webp?format=750w" alt="Two dancers in violet light, from Alone Together"><div class="in"><h3 class="t">Alone Together</h3><p>Inspired by Henryk Górecki’s Symphony of Sorrowful Songs, it is a poignant encounter between two strangers who, after carefully studying one another, come together as if they have known each other for a lifetime. The piece also draws inspiration from the deep-seated fears and uncertainties surrounding the experience of immigration, reflecting both vulnerability and the hope for connection amidst unfamiliarity.</p><p class="cr">Dance Amy Greene and Pedro Ricardo Henry</p></div></article><article class="work" data-d="97e4cbe7"><img class="ph" loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/97e4cbe7-e020-4a66-bd0e-3203099354e2/9bf87f6c-6bff-4127-85c3-3dc9f318daf8.jpeg?format=750w" alt="A dancer in white in front of an audience on a village square, from Domenica"><div class="in"><h3 class="t">Domenica</h3><p>DOMENICA is a captivating duet crafted specifically for children, capturing the tender essence of young friendship and affection. This performance delicately explores the anticipation of waiting for a friend’s arrival, the joyful eagerness to play together, and the bittersweet reluctance when playtime must come to an end. Through expressive choreography, it invites its young audience to connect with the universal feelings of companionship, curiosity, and the enduring magic found in shared moments.</p><p class="cr">Concept and choreography Marika Meoli and Patrizio Bucci<br>COORDINATE Festival – PROTEO</p></div></article><article class="work" data-d="315f8ba3"><img class="ph" loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/315f8ba3-6658-4a5d-a43d-5f4edf13dbb7/Screenshot+2025-07-30+at+09.26.44.png?format=750w" alt="Two dancers far apart on a dark stage, from Pacts and Faith"><div class="in"><h3 class="t">Pacts&Faith</h3><p>Draws deep inspiration from Patrizio’s unique experience of growing up as a twin brother. What is it really like to share your life so closely with someone who is often seen as an extension of yourself? Twins are frequently perceived either as a single unit or as an indistinguishable pair, which can create challenges in individual identity. Over time, there is a natural process of pulling apart, discovering personal strengths and understanding who you truly are as an individual. Ultimately, this journey leads to a powerful reunion, where both come back together stronger, enriched by their individuality and shared bond.</p><p class="cr">Dance Luis Ricardo Pedraza Cedron and Joel Mesa</p></div></article><article class="work" data-d="760c58ab"><img class="ph" loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/760c58ab-4425-4f18-93f0-4e30d683351e/maxresdefault.jpg?format=750w" alt="Two dancers in an abandoned industrial hall, from Last"><div class="in"><h3 class="t">Last</h3><p>A raw and unfiltered relationship, marking the painful end of one difficult chapter, where the intense desire to be together lingers deeply within both hearts, yet there is a clear and sober understanding that holding on any longer will only cause more hurt and inevitably lead to toxicity on both sides.</p><p class="cr">Dance Morgane Michel and Ivan Montis</p></div></article><h3 class="band">as assistant choreographer</h3><article class="work" data-d="494798d3"><img class="ph" loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/494798d3-c5bb-4d4e-a6ce-1e0fd25af9bf/SALLY-Bange-Rick_foto-Tycho-Merijn_LR_3.webp?format=750w" alt="Three dancers in bright clothes around a metal structure, from Bange Rick"><div class="in"><h3 class="t">Bange Rick</h3><p>In "Bange Rick," three friends embark on an adventure together. One is a true daredevil, the other a scaredy-cat. And the third? He's all about having fun. During their journey of discovery, they encounter exciting situations. They playfully challenge each other to try new things. Who dares to jump from the highest cliff? And who dares to fly? Will the daredevil do anything and the scaredy-cat nothing, or will even the daredevil be afraid sometimes? Everyone approaches things in their own way. But together, something special happens. The power of friendship proves to be able to tame even the greatest fear.</p><p class="cr">Choreography Stefan Ernst<br>Assistant choreographer Patrizio Bucci<br>SALLY Dansgezelschap Maastricht</p><p class="prize">Nominated for a Swan for most impressive youth dance performance.</p></div></article><article class="work" data-d="fab9ffca"><img class="ph" loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/fab9ffca-494f-4ec5-80ba-df3fbfd264f4/SALLY-DANSLAB-on-tour-Roshanak-Morrowatian-Mask_foto-Tycho-Merijn.webp?format=750w" alt="A dancer in blue light, from Danslab on tour #1"><div class="in"><h3 class="t">Danslab on tour #1</h3><p class="kick">A dazzling performance by a new generation of creators</p><p>In DANSLAB on tour #1, choreographies by a new generation of contemporary dance artists follow one another in rapid succession. This dazzling dance performance consists of five unique pieces created by Thirza Riphagen, Jennifer Romen, Roshanak Morrowatian, and Justin de Jager.</p><p class="cr">Assistant choreographer Patrizio Bucci<br>SALLY Dansgezelschap Maastricht</p><div class="recent"><h4>Recent choreographies</h4><p><em>What’s behind?</em> — Nederlandse Dansdagen 2026 Open Podium</p><p><em>Danscode</em> — Nederlandse Dansdagen 2026</p></div></div></article><article class="work" data-d="0b9c233a"><img class="ph" loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/0b9c233a-9c48-4907-8b2e-87c900045208/250131-sally-dm-blob-6854.jpg?format=750w" alt="Dancers casting large shadows on a white disc, from Blob"><div class="in"><h3 class="t">Blob</h3><p>In BLOB, the virtual dance world of dance company Another Kind of Blue and the interactive dance world of SALLY converge in a next-level dance experience. The audience becomes a player in a game.</p><p>BLOB opens up an adventurous world that begins with… nothing. Then something appears; is it a sign, a thing, a person? It's BLOB, and it invites you to explore a new, extraordinary world of dance together. From the very first second, this interactive performance appeals to the audience's imagination and creativity. Before you know it, you're playing and dancing in a dance game. A unique experience!</p><p class="cr">Choreography Stefan Ernst and David Middendorp<br>Coproduction SALLY and Another Kind of Blue<br>Assistant choreographer Patrizio Bucci</p><p class="prize">Nominated for the Podiumkids Public Award</p></div></article><article class="work" data-d="3a7fda10"><img class="ph" loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/3a7fda10-dd22-44fa-ba5a-37b8ded0df8c/SALLY-Danslab-on-tour-2-Thirza-1-foto-Tycho-Merijn-LR.webp?format=750w" alt="Two dancers on a red background, from Danslab on tour #2"><div class="in"><h3 class="t">Danslab on tour #2</h3><p>DANSLAB on tour #2 brings together the findings of four young artists who each worked on a research question in the Danslab. The result of these experiments is a fantastic mix of dance styles, modern interpretations, challenging themes, and unexpected combinations. An explosion of innovative contemporary dance.</p><p class="cr">Choreography Thirza Riphagen, Liam Francis, Sellam El Achari, Jennifer Romen<br>Assistant choreographer Patrizio Bucci<br>SALLY Dansgezelschap Maastricht</p></div></article><article class="work" data-d="3886ddf4"><img class="ph" loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/3886ddf4-2357-4766-9ba5-119e63ddb18e/img35927_orig.webp?format=750w" alt="Silhouetted dancers against golden stage lights, from God is a DJ"><div class="in"><h3 class="t">God is a DJ</h3><p>Immerse yourself in ecstatic movements and lose yourself to find yourself. In GOD is a DJ, everyone can be who they want to be, because only when you let go of labels and limitations can you experience true freedom. In a swirling mix of music, video, movement, and emotion, you're swept away from the very first moment in a dance experience where the boundaries between spectator and performer blur.</p><blockquote>"A must-see for anyone seeking energy, emotion, and unprecedented freedom." <cite>– Theaterkrant</cite></blockquote><p class="cr">Choreography Stefan Ernst, Emma Evelein, Michael Lubbers, Winston Arnon<br>Assistant choreographer Patrizio Bucci<br>SALLY Dansgezelschap Maastricht</p><p class="prize">Dancer Sellam El Achari nominated for most impressive youth dance performance.</p></div></article><article class="work" data-d="492758dd"><img class="ph" loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/492758dd-1564-4a3e-bddd-8ee4b69554aa/5-sallydm-krijtjemij-10898-800x533.jpg?format=750w" alt="Dancers lying on a floor covered in chalk drawings, from Krijtje Mij"><div class="in"><h3 class="t">Krijtje Mij</h3><p>"Krijtje Mij" is an interactive and playful dance party for the whole family. A meeting between children, adult audience members, and dancers, an introduction using each other's movements and chalk as ingredients. Together, dancers and audience create a unique living sketchbook, where they draw, dance, and experience together.</p><p>The performance welcomes the audience with open arms and, through dancing, takes them onto the floor and into the story. Children and adults discover the magical world of dance together through playful experimentation, using each other's bodies, and exploring different solutions. The performance offers adults and children genuine time together, allowing them to connect in a new way.</p><p class="cr">Concept Patrizio Bucci and Sophie van Heesewijk<br>Choreography Kiki Boot and Ivan Montis<br>SALLY Dansgezelschap Maastricht</p></div></article><article class="work" data-d="ec16edef"><img class="ph" loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/ec16edef-7a6a-4a2d-acd7-48ae47505639/230928-salldym-laagland-DGGG-15045.webp?format=750w" alt="Dancers in yellow machine costumes, from De Grote Gele Graafmachine"><div class="in"><h3 class="t">De Grote Gele Graafmachine</h3><p>Welcome under the hood of the biggest powerhouse on any construction site: The Big Yellow Excavator.</p><p>Parts slide together, explode. Bang, boom, and the job is done. Four well-oiled parts always do exactly what an excavator is supposed to. Until one part suddenly has a different opinion. This part wants to go. Why only dig and shovel and never jump or step? Why isn't a cement mixer meant for sleeping? Couldn't an excavator dance if it already moves so smoothly? The parts wonder aloud whether all those arrangements are correct. Do you want to join in? The Big Yellow Excavator is a colorful ensemble for all builders, breakers, troublemakers, and those who want to move along with others aged 4 and up.</p><p class="cr">Concept, choreography and direction Stefan Ernst, Lennart Monaster<br>Assistant choreographer Patrizio Bucci<br>SALLY Dansgezelschap Maastricht</p><a class="vid" href="https://vimeo.com/878307175" target="_blank" rel="noopener">Watch the trailer ↗</a></div></article></section><section id="teacher" class="scene" data-gel="010" data-form="ballet" data-cam="top" data-q="4"><h2 class="fit" aria-label="Teacher" data-h=".42"><span class="ln">TEACHER</span></h2><div class="class-room"><p class="lead">Patrizio’s classes are built on connection and awareness: technique as a way to understand your own body, not a set of shapes to copy. He works with dancers and actors alike, from beginners to professionals, combining clear structure with room to explore.</p><h3 class="sub">Classes and workshops</h3><p class="hint" aria-hidden="true">Pick a class. The company on stage takes it.</p><ul class="classes"><li><button type="button" data-class="ballet" aria-pressed="true">Ballet</button></li><li><button type="button" data-class="contemporary" aria-pressed="false">Contemporary dance</button></li><li><button type="button" data-class="impro" aria-pressed="false">Improvisation</button></li><li><button type="button" data-class="viewpoints" aria-pressed="false">Viewpoints</button></li><li><button type="button" data-class="actors" aria-pressed="false">Movement for actors</button></li></ul><div class="cols"><div><h3 class="sub">Current</h3><p>Movement teacher at the <a href="https://www.toneelacademie.nl/" target="_blank" rel="noopener">Toneelacademie Maastricht</a> (Zuyd Hogeschool).</p></div><div><h3 class="sub">Previously</h3><p>Balletto di Roma · Opleiding Dans Maastricht · SALLY Dansgezelschap Maastricht · amateur and youth dance groups</p></div></div><p>Available for company class, workshops and guest teaching in English, Italian and Dutch.</p><a class="cta" href="#contact">Book a class or workshop</a></div></section><section id="coordinate" class="scene" data-gel="139" data-form="procession" data-cam="low" data-q="5"><h2 class="fit" aria-label="COORDINATE Festival" data-h=".6"><span class="ln">COORDINATE</span><span class="ln">FESTIVAL</span></h2><article class="work" data-d="8d011178"><img class="ph" loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/8d011178-1697-4c85-96e8-67acfc949e9a/Banner+COORDINATE+Landscape.jpg?format=750w" alt="COORDINATE Festival banner over a rocky landscape"><div class="in"><p class="lead"><a href="https://www.proteoets.com/coordinatefestival" target="_blank" rel="noopener">COORDINATE Festival</a> is a new cultural festival that takes place in Calcata, a medieval village in Italy, transforming it into a living laboratory of art, territory, and community.</p><p>The Festival is led by a shared artistic direction made up of Raffaella Appià, Patrizio Bucci, and Tommaso Petrolo. Each brings a different but complementary background, spanning choreography, performance, and visual storytelling. Together, they guide the festival with a collaborative approach that avoids a single, fixed vision. Instead, they create an open and flexible space where different ideas can meet, and where diversity drives the creative process.</p><p>The festival focuses on site-specific performances, contemporary dance, and multidisciplinary art interventions that actively engage with the natural and urban landscape. It's not just about watching art—it's about inhabiting spaces differently, through immersive installations, participatory workshops, outdoor activities, and exhibitions.</p></div></article><article class="work" data-d="8d011178"><div class="in"><p class="restanza">Restanza</p><p><strong>Restanza</strong> is the theme of the first edition of the Festival. It is a poetic and political concept centered on the act of staying—choosing to remain in a place with commitment and imagination, instead of leaving. It becomes a way to create new visions, stronger bonds, and shared responsibility for the future.</p><p>COORDINATE Festival invites artists and local residents to co-create a collective experience where the village is not treated as a static heritage site, but as a dynamic, re-inhabitable space full of potential.</p></div></article></section><section id="webdesign" class="scene" data-gel="158" data-form="wall" data-cam="front" data-q="6"><h2 class="fit" aria-label="Webdesign" data-h=".42"><span class="ln">WEBDESIGN</span></h2><article class="work" data-d="17537229"><img class="ph" loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/1753722934622-KIQF5Z7R41VSE3P2OQVN/202108246z3a8679-%C2%A9laurens+bouvrie.JPG?format=750w" alt="Patrizio Bucci working at a laptop, black and white"><div class="in"><p class="lead">Patrizio designs websites, visual identities and content for cultural organisations and artists. Working from inside the field, as a performer and festival director, he knows what a programme page, an open call or a festival site needs to do.</p></div></article><article class="work site" data-d="09bff11b"><img class="ph" loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/09bff11b-08f3-44ff-942d-2887a5ec7976/%C2%BBLukesTheWord%C2%AB.png?format=750w" alt="Full-page screenshot of the Lukestheword website"><div class="in"><h3 class="t">Lukestheword</h3><p>Full website design for a translation and transcreation agency working across Dutch, French, German, Italian and English.</p><a class="vid" href="https://www.lukestheword.com" target="_blank" rel="noopener">www.lukestheword.com ↗</a></div></article><article class="work site" data-d="33cf17ba"><img class="ph" loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/33cf17ba-c61c-43d2-a0a4-dac5ee109cf7/Coordinate+Festival+%7C+Scopri%2C+Partecipa%2C+Connettiti+Ora+%E2%80%94+PROTEO+ETS.png?format=750w" alt="Full-page screenshot of the COORDINATE Festival website"><div class="in"><h3 class="t">COORDINATE Festival</h3><p>Visual identity, web pages and social media for the dance and performing arts festival in Calcata (VT), which Patrizio co-directs with Raffaella Appià and Tommaso Petrolo.</p><a class="vid" href="https://www.proteoets.com/coordinatefestival" target="_blank" rel="noopener">www.proteoets.com/coordinatefestival ↗</a><a class="vid" href="http://www.instagram.com/coordinatefestival" target="_blank" rel="noopener">www.instagram.com/coordinatefestival ↗</a></div></article><article class="work site" data-d="54285190"><img class="ph" loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/54285190-f22b-48b5-be8d-5325645083b8/Proteo+%7C+Scopri+e+partecipa+ora.png?format=750w" alt="Screenshot of the PROTEO ETS website"><div class="in"><h3 class="t">PROTEO ETS</h3><p>Brand identity and website for the Rome-based cultural association: logo, site, and ongoing content for each of its projects.</p><a class="vid" href="https://www.proteoets.com" target="_blank" rel="noopener">www.proteoets.com ↗</a></div></article><article class="work site" data-d="6f78c39d"><img class="ph" loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/6f78c39d-35f6-4a81-a0b4-2b54bef7cd15/CHOREOGRAFICHE+%E2%80%94+Proteo.png?format=750w" alt="Full-page screenshot of the Choreografiche page on the PROTEO website"><div class="in"><h3 class="t">PROTEO ETS · Choreografiche</h3><a class="vid" href="https://www.proteoets.com/choreografiche" target="_blank" rel="noopener">www.proteoets.com/choreografiche ↗</a></div></article><article class="work site" data-d="37d10329"><img class="ph" loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/37d10329-07ac-4846-94b7-5b404b7e5870/Dive+into+Argentine+Tango+with+TangoparaTodos+-+Maastricht.png?format=750w" alt="Full-page screenshot of the Tango para Todos website"><div class="in"><h3 class="t">Tango para Todos</h3><p>A new logo and website for a tango school with many services to present, using a clean layout, consistent typography and a palette that balances energy and calm.</p><a class="vid" href="https://www.tangoparatodos.eu" target="_blank" rel="noopener">www.tangoparatodos.eu ↗</a></div></article></section><section id="maan" class="scene" data-gel="126" data-form="moon" data-cam="moon" data-q="7" lang="nl"><h2 class="fit" aria-label="Omarm de Maan" data-h=".6"><span class="ln">OMARM</span><span class="ln">DE MAAN</span></h2><article class="work" data-d="3f28fea2"><img class="ph" loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/3f28fea2-0b78-4d21-bcce-5ec3f2a7c953/2.png?format=750w" alt="Poster van Omarm de Maan: twee dansers in omhelzing"><div class="in"><p class="kick">30 Augustus 2026 · Maankwartier, Heerlen</p><h3 class="sub">Dans in het maankwartier</h3><h3 class="sub">Programma</h3><table class="prog"><tr><th scope="row">18:00 - 19:30</th><td>Screening Short Films<br><em>LUCID DREAMING</em> - Emma Evelein<br><em>DROOM</em> - Fleur Jonkers</td></tr><tr><th scope="row">19:30 - 19:50</th><td><em>Together</em> - Ernanda Brandt</td></tr><tr><th scope="row">19:55 - 20:15</th><td><em>The Moving Ground</em> - Mariona Vinyes & Mireia Varón</td></tr><tr><th scope="row">20:20 - 20:30</th><td><em>THE EMBRACE</em> - Marika Meoli & Patrizio Bucci</td></tr></table><p class="cr">De films worden drie keer vertoond.<br>Starttijd 18.00 uur, 18.30 uur en 19.00 uur.</p></div></article><article class="work" data-d="5d490b86"><img class="ph" loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/5d490b86-fa3c-4868-9229-da85464bb14e/Marika_Meoli_The_embrace__at_Mathieu_Bruls-033c6cd2.jpg?format=750w" alt="Twee dansers in beweging, The Embrace"><div class="in"><h3 class="t">The Embrace</h3><p class="kick">Dans · Marika Meoli & Patrizio Bucci</p><p><em>The embrace</em> onderzoekt de kracht en intimiteit van de omhelzing. Twee lichamen blijven voortdurend met elkaar in contact - huid op huid, verstrengelde ledematen, glijdende spieren in een eindeloze beweging van verbondenheid. In een tijd waarin digitale communicatie en individualisme toenemen, richt dit werk zich op de eenvoud en waarde van lichamelijke nabijheid.</p><p class="cr">Choreografie Marika Meoli en Joost Vrouenraets<br>Dans Marika Meoli en Patrizio Bucci<br>Muziek Before Tigers AKA Laurent Delforge</p></div></article><article class="work" data-d="52036f50"><img class="ph" loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/52036f50-6f7d-4825-bd24-431f28e3ff32/IMG_0090-2048x1366.jpg?format=750w" alt="Twee dansers op de vloer, The Moving Ground"><div class="in"><h3 class="t">The Moving Ground</h3><p class="kick">Dans · Mariona Vinyes & Mireia Varón</p><blockquote>“Ik ben aan het bewegen, denk ik. Door beweging heb ik geleerd dat ik niet alles onder controle kan houden; je moet loslaten om het opnieuw te kunnen vangen, of het op een andere manier te kunnen vangen.”</blockquote><p>The Moving Ground is een interactieve dansvoorstelling op locatie, gechoreografeerd en uitgevoerd door Mariona Vinyes en Mireia Varón. De voorstelling onderzoekt instabiliteit, aanpassing en onderlinge afhankelijkheid aan de hand van twee lichamen die hun balans zoeken op een voortdurend veranderende ondergrond, terwijl ze steeds reageren op elkaar, de ruimte en het onbekende.</p><p>Geworteld in onze ervaringen met verhuizing, culturele transitie en het opnieuw opbouwen van een leven in een onbekende omgeving, reflecteert de voorstelling op wat het betekent om door beweging een gevoel van thuis te vinden. Het publiek wordt meegenomen op een gelaagde reis door fysieke, geografische en emotionele verplaatsing, waarin kwetsbaarheid, veerkracht en verbinding zichtbaar worden.</p></div></article><article class="work" data-d="db6a7f75"><img class="ph" loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/db6a7f75-760b-4d55-b6c7-8b9bc8d4b69e/1740243284-edd46d6e098e11a3a966b5f649bf1d80d493a1154244ee8a1c6ed3fa49fe7ad6-d.webp?format=750w" alt="Beeld uit de korte film Lucid Dreaming, in een treinwagon"><div class="in"><h3 class="t">Lucid Dreaming</h3><p class="kick">Short film · Emma Evelein</p><p>De bekroonde film Lucid Dreaming vertelt het verhaal van een meisje in een trein dat zichzelf verliest in de wereld van een man die tegenover haar zit. Terwijl ze zich laat meeslepen in zijn wereld, worden de trein en de passagiers onderdeel van de ervaring die ze via hem beleeft. Er ontstaat een non-verbale ontmoeting tussen twee vreemden, en ze ervaart hoe verbeelding en empathie tegelijkertijd krachtig en kwetsbaar zijn.</p><p>Lucid Dreaming is geschreven en geregisseerd door Emma Evelein en geproduceerd door Blanc film. De film ging in première op het Nederlands Filmfestival, waar hij de Nederlandse Filmprijs voor beste korte film won, genaamd ‘Gouden Kalf’. In 2024 en 2025 zal de film op diverse festivals wereldwijd worden vertoond. Hij is geaccepteerd door de Franse Filmacademie, ook wel bekend als de “César”.</p><a class="vid" href="https://vimeo.com/875622454" target="_blank" rel="noopener">Click for trailer ↗</a></div></article><article class="work" data-d="4431c030"><img class="ph" loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/4431c030-cddf-49da-81e5-d321a8a483fd/Droom_Fleur-Jonkers.jpg?format=750w" alt="Dansers in donker blauw licht, uit de korte film DROOM"><div class="in"><h3 class="t">Droom</h3><p class="kick">Short film · Fleur Jonkers</p><p>In de wereld van vandaag is het bijna onmogelijk om echt stil te staan. We zijn constant bezig, streven naar meer en krijgen er minder voor terug. DROOM erkent dit overweldigende gevoel en nodigt ons uit om drie verschillende fasen van stilte te ervaren.</p><p>DROOM is vertoond tijdens Rialto Shorts, op Lumière in Maastricht in een programma samengesteld door CineSud, op Cinedans '25 en zal te zien zijn op het Filmfestival van Cannes in Cannes (Frankrijk).</p><p class="cr">Regie: Fleur Jonkers<br>Choreograaf: Linde Wagemakers<br>Producent: Dewi Sytsema</p></div></article><article class="work" data-d="f313d8a2"><img class="ph" loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/f313d8a2-b0ae-4bb3-aea6-4d08845caa5e/20250521_091543.jpg?format=750w" alt="Dansers met elkaar verbonden op een plein in Heerlen, Together"><div class="in"><h3 class="t">Together</h3><p class="kick">Ernanda Brandt</p><p lang="en">Together, all Together on this place.<br>But how can we move together with each other and the ground we are standing on<br>What if we are tied together?<br>How does that feel?</p><p class="cr">Dit evenement wordt georganiseerd door THE PRODUCTION LADY en het is ondersteund door Gemeente Heerlen en schrit_tmacher just dance!. i.s.m. La Loena</p><div class="logos"><img loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/bfef2944-02dd-49ca-b13c-856e8f2e0b0c/Theproductionlady1.png?format=1500w" alt="The Production Lady"><img loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/c510b1c6-6033-4b5a-9bc4-d9e07f5f8bf5/heerlen1.png?format=1500w" alt="Gemeente Heerlen"><img loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/b341ffc1-4111-46ea-97dd-29628847a4c5/Schrit_tmacher.png?format=1500w" alt="schrit_tmacher just dance!"><img loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/e13a45c4-62b1-47af-abd3-1d8cf6ff851c/Maanzin+Wit.png?format=1500w" alt="Maanzin"></div></div></article></section><section id="dancemakers" class="scene" data-gel="119" data-form="wall" data-cam="front" data-q="9" hidden><article class="work" data-d="3667fd94"><img class="ph" loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/3667fd94-722c-4f0d-8648-6fb79efb8934/WhatsApp+Image+2026-04-27+at+14.00.02+%282%29.jpg?format=750w" alt="Portrait of Patrizio Bucci, black and white"><div class="in"><h2 class="t">Hi, I am Patrizio Bucci</h2><p>I am a dancer, choreographer, and cultural organizer based in Maastricht, the Netherlands. I have experience in talent development and audience accessibility. During my thirteen years with SALLY Dansgezelschap Maastricht I worked to make dance accessible to younger audiences. I currently teach at Toneelacademie (performing arts academy) in Maastricht. I co-direct and co-curate COORDINATE Festival in Calcata, Italy, an initiative that deliberately moves dance out of major cities into rural communities and reaches audiences with little access to culture through partnerships like Amici dei Bimbi ETS.</p><img class="eye" loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/42cf416c-c184-4105-b631-624894f5201b/Closed+eye.png?format=1500w" alt="A drawing of a closed eye"><p>My curatorial practice is rooted in asking: how do we make dance truly accessible, not as adaptation, but as reimagined experience? This question has led me to explore how dance can be experienced fully by blind and visually impaired audiences, a direction I'm pursuing with the artist Mireia Varón Gallofré.</p><p><a href="https://www.patriziobucci.com/s/PATRIZIO-BUCCI-CV-english-9j5h.pdf" target="_blank" rel="noopener">Here</a> you can find my CV.</p><p><a href="https://www.proteoets.com/coordinatefestival" target="_blank" rel="noopener">Here</a> information about COORDINATE Festival, the festival I co-direct and co-create (only available in Italian, but translatable with Google Chrome).</p><p><a href="https://www.mireiavaron.com" target="_blank" rel="noopener">Here</a> information about Mireia Varón Gallofré, the artist I want to work with for Dancemakers</p></div></article><article class="work" data-d="02e0ada1"><img class="ph" loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/02e0ada1-2c54-49dc-abb8-ed7cf3a2aa17/26092025_ElodieVreeburg_NoLimits_HNT_8-1024x683.jpg.webp?format=750w" alt="People with eyes closed touching and sensing a performer"><div class="in"></div></article><article class="work" data-d="6532b664"><img class="ph" loading="lazy" src="https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/6532b664-5950-4d2d-b6b1-a075982cefe7/26092025_ElodieVreeburg_NoLimits_HNT_11-1024x683.jpg.webp?format=750w" alt="Audience in the dark around small lights"><div class="in"></div></article></section><section id="contact" class="scene" data-gel="000" data-form="call" data-cam="call" data-q="8"><h2 class="fit" aria-label="Say ciao" data-h=".62"><span class="ln">SAY</span><span class="ln">CIAO</span></h2><div class="ciao"><p class="lead">Whether you're interested in working together, have a question, or just want to say hello, drop a line.</p><p>Patrizio will get back to you soon.</p><p class="email"><a id="mail" href="mailto:ciao@patriziobucci.com">ciao@patriziobucci.com</a></p><button id="copy" class="cta" type="button">Copy the address</button><ul class="social"><li><a href="http://instagram.com/patrizio.bucci" target="_blank" rel="noopener">Instagram ↗</a></li><li><a href="https://nl.linkedin.com/in/patrizio-bucci-61193bb6" target="_blank" rel="noopener">LinkedIn ↗</a></li><li><a href="https://www.facebook.com/bucci.patrizio" target="_blank" rel="noopener">Facebook ↗</a></li></ul><details class="terms"><summary>Terms and Conditions</summary><h3>Terms and Conditions for Patrizio Bucci Services</h3><h4>1. Definitions</h4><p><b>Freelancer:</b> Patrizio Bucci, registered at Fatimaplein 17, 6214TS, Maastricht NL with KVK number 98040472.</p><p><b>Client:</b> The individual, company, or institution engaging the Freelancer's services.</p><p><b>Agreement:</b> The agreement for services between the Freelancer and the Client, consisting of the offer, these general terms and conditions, and any subsequent written agreements.</p><p><b>Services:</b> The work to be performed by the Freelancer, including but not limited to choreography, rehearsal direction, teaching, workshops, and artistic consultancy.</p><p><b>Work:</b> The artistic and intellectual output created by the Freelancer during the provision of the Services.</p><h4>2. Applicability</h4><p>These terms and conditions apply to all offers, Agreements, and Services provided by the Freelancer. Deviations from these terms and conditions are only valid if agreed upon in writing.</p><h4>3. Formation of the Agreement</h4><p>The Agreement is established when the Client accepts a written offer from the Freelancer, or upon the Freelancer's confirmation of a commission from the Client.</p><p>Verbal agreements and promises are only binding after the Freelancer has confirmed them in writing.</p><h4>4. Quotations and Pricing</h4><p>All quotations are valid for 30 days, unless otherwise stated.</p><p>Prices are quoted in Euros and are exclusive of VAT (BTW), unless explicitly stated otherwise.</p><p>The Freelancer reserves the right to adjust agreed prices if changes to the project scope, unforeseen circumstances, or increases in cost prices occur, after consultation with the Client.</p><h4>5. Payment Terms</h4><p>Invoices must be paid within <b>30 days</b> of the invoice date, unless a different payment term is agreed in writing.</p><p>For projects with a duration longer than one month, the Freelancer may invoice a 50% advance payment and/or interim invoices.</p><p>If the Client fails to pay within the agreed term, the Client is in default by operation of law. The Freelancer is entitled to charge statutory interest on the outstanding amount.</p><p>All collection costs, both judicial and extrajudicial, incurred due to late payment will be borne by the Client.</p><h4>6. Cancellation Policy</h4><p>The Client can cancel a scheduled session or project only in writing. The following cancellation costs apply:</p><ul><li>Cancellation more than 4 weeks before the scheduled date: No charge.</li><li>Cancellation between 4 and 2 weeks before the scheduled date: 50% of the agreed fee.</li><li>Cancellation less than 2 weeks before the scheduled date: 100% of the agreed fee.</li></ul><p>The Freelancer will make reasonable efforts to reschedule rather than charge a fee, but this is not guaranteed.</p><h4>7. Intellectual Property & Copyright (Auteursrecht)</h4><p>The Freelancer retains the full and exclusive copyright (auteursrecht) and all other intellectual property rights on all Work created, including choreography, dance notation, lesson plans, and concepts.</p><p>Upon full payment of all invoices, the Client receives the agreed <b>license</b> to use the Work for the specific purpose, duration, and territory as defined in the Agreement.</p><p>Any use of the Work beyond the licensed scope (e.g., commercial recordings, adaptations, performances by other groups, transfer to other venues) requires a separate, written agreement and additional remuneration.</p><p>The Freelancer always has the <b>moral right</b> (morele rechten) to be credited as the creator of the Work in a clear and reasonable manner in all programs, promotional materials, and recordings.</p><h4>8. Responsibilities of the Client</h4><p>The Client is responsible for:</p><ul><li>Providing a safe, suitable, and professional workspace (studio, theatre) that complies with Dutch health and safety regulations (Arbowet).</li><li>Providing any necessary technical equipment (sound system, etc.) as agreed upon.</li><li>Ensuring that participating dancers/students are adequately insured against personal injury.</li><li>Providing all necessary information and materials to the Freelancer in a timely manner to allow for the proper execution of the Services.</li></ul><h4>9. Liability & Insurance</h4><p>The Freelancer is liable for direct damages resulting from a shortcoming attributable to them, but only up to the amount paid out by their professional liability insurance in the concerning case, and never more than the total fee agreed for that specific project.</p><p>The Freelancer is not liable for indirect damages, consequential damages, lost profits, or damages resulting from improper use of the Work by the Client or participants.</p><p>The Client is liable for any damages to the Freelancer or third parties caused by acts or omissions of the Client or its employees/participants.</p><p>The Client is obliged to take out adequate insurance to cover its own risks, including but not limited to liability insurance and accident insurance for participants.</p><h4>10. Force Majeure</h4><p>In case of force majeure (overmacht), which includes illness, injury, or other circumstances beyond the Freelancer's reasonable control preventing the execution of the Services, the Freelancer is not liable for any resulting damages. The Freelancer will inform the Client as soon as possible and will make reasonable efforts to find a suitable replacement or reschedule. Fees for services not rendered will not be due.</p><h4>11. Confidentiality</h4><p>Both parties agree to treat all confidential information received from the other party as strictly confidential and not to disclose it to third parties without prior written consent.</p><h4>12. Image Rights (Portretrecht)</h4><p>Photographs, videos, and audio recordings of the Freelancer or her Work may only be made and used for commercial or promotional purposes with her prior written consent, in accordance with Dutch portrait law (portretrecht).</p><h4>13. Termination</h4><p>Either party may terminate the Agreement with immediate effect if the other party is declared bankrupt, applies for a suspension of payments, or fails to remedy a material breach of the Agreement within a reasonable period after written notice.</p><h4>14. Applicable Law and Disputes</h4><p>All Agreements between the Freelancer and the Client are governed by Dutch law.</p><p>Any disputes arising from the Agreement will, in the first instance, be submitted to the competent court.</p><h4>15. Final Provisions</h4><p>If any provision of these terms and conditions is found to be void or unenforceable, the remaining provisions will remain in full force and effect. The Freelancer will replace the void provision with a valid one that closely reflects the original intent.</p></details><p class="legal">Patrizio Bucci · KVK:98040472 · Btw-id: NL005305475B18</p></div></section></main></template>
<script>(function(){
var P={"02aed9af":"02aed9af-ef3a-41d4-9f36-08d03ff871c3/The+Embrace-foto-Steffie+van+den+Akker-3.jpg","02e0ada1":"02e0ada1-2c54-49dc-abb8-ed7cf3a2aa17/26092025_ElodieVreeburg_NoLimits_HNT_8-1024x683.jpg.webp","05d1ed01":"05d1ed01-5e33-4bff-97e3-4027429b1c4b/202800572_2902409093314570_3234936924340187079_n.jpg","06347d9a":"06347d9a-34cd-4ae0-8263-7b8db39029aa/Screenshot+2025-07-29+at+23.17.22.png","09bff11b":"09bff11b-08f3-44ff-942d-2887a5ec7976/%C2%BBLukesTheWord%C2%AB.png","0b9c233a":"0b9c233a-9c48-4907-8b2e-87c900045208/250131-sally-dm-blob-6854.jpg","0ce11921":"0ce11921-9df3-47d9-bb4d-f3d8be818ef8/Woest-1-SALLY-Dansgezelschap-Maastricht-foto-Jochem-Jurgens_web.webp","17537229":"1753722934622-KIQF5Z7R41VSE3P2OQVN/202108246z3a8679-%C2%A9laurens+bouvrie.JPG","2b10672b":"2b10672b-0da0-4113-88d0-44391f7c7f94/Screenshot+2025-07-30+at+09.29.06.png","315f8ba3":"315f8ba3-6658-4a5d-a43d-5f4edf13dbb7/Screenshot+2025-07-30+at+09.26.44.png","33cf17ba":"33cf17ba-c61c-43d2-a0a4-dac5ee109cf7/Coordinate+Festival+%7C+Scopri%2C+Partecipa%2C+Connettiti+Ora+%E2%80%94+PROTEO+ETS.png","3667fd94":"3667fd94-722c-4f0d-8648-6fb79efb8934/WhatsApp+Image+2026-04-27+at+14.00.02+%282%29.jpg","37d10329":"37d10329-07ac-4846-94b7-5b404b7e5870/Dive+into+Argentine+Tango+with+TangoparaTodos+-+Maastricht.png","3886ddf4":"3886ddf4-2357-4766-9ba5-119e63ddb18e/img35927_orig.webp","3a7fda10":"3a7fda10-dd22-44fa-ba5a-37b8ded0df8c/SALLY-Danslab-on-tour-2-Thirza-1-foto-Tycho-Merijn-LR.webp","3f28fea2":"3f28fea2-0b78-4d21-bcce-5ec3f2a7c953/2.png","40dd4f74":"40dd4f74-ba49-4343-88cb-787a2c576dd0/revolt2-2000.jpg","4431c030":"4431c030-cddf-49da-81e5-d321a8a483fd/Droom_Fleur-Jonkers.jpg","492758dd":"492758dd-1564-4a3e-bddd-8ee4b69554aa/5-sallydm-krijtjemij-10898-800x533.jpg","494798d3":"494798d3-c5bb-4d4e-a6ce-1e0fd25af9bf/SALLY-Bange-Rick_foto-Tycho-Merijn_LR_3.webp","4da8e916":"4da8e916-eb51-4760-b426-a3421393e026/spectrum2.jpg","52036f50":"52036f50-6f7d-4825-bd24-431f28e3ff32/IMG_0090-2048x1366.jpg","54285190":"54285190-f22b-48b5-be8d-5325645083b8/Proteo+%7C+Scopri+e+partecipa+ora.png","5d490b86":"5d490b86-fa3c-4868-9229-da85464bb14e/Marika_Meoli_The_embrace__at_Mathieu_Bruls-033c6cd2.jpg","5f43faea":"5f43faea-5bdd-4a42-8ecc-45d06c1aa205/lea-giamattei-skyline-1000.jpg","6532b664":"6532b664-5950-4d2d-b6b1-a075982cefe7/26092025_ElodieVreeburg_NoLimits_HNT_11-1024x683.jpg.webp","6f78c39d":"6f78c39d-35f6-4a81-a0b4-2b54bef7cd15/CHOREOGRAFICHE+%E2%80%94+Proteo.png","760c58ab":"760c58ab-4425-4f18-93f0-4e30d683351e/maxresdefault.jpg","7b4087e6":"7b4087e6-2227-409f-8b27-8211833cb53b/IMG_7943.jpeg","7fd41bc1":"7fd41bc1-fc58-42ab-96a7-6de592382471/654352116-7c529b6e0dcc9f44ea43d1b01a55725ea289ccf031ee2903b5a4283d064c3bb4-d.webp","8396e968":"8396e968-5c16-4234-9628-ace1744f993d/vreemde-eend-4-sally-dansgezelschap-maastricht-het-laagland-foto-tycho-merijn-lr.jpg","8d011178":"8d011178-1697-4c85-96e8-67acfc949e9a/Banner+COORDINATE+Landscape.jpg","914b84de":"914b84de-f917-4155-9dfd-04a2ccfd994a/Thyco+Merijn+Photographer.jpg","97e4cbe7":"97e4cbe7-e020-4a66-bd0e-3203099354e2/9bf87f6c-6bff-4127-85c3-3dc9f318daf8.jpeg","a3adf933":"a3adf933-b6a9-4c0e-a0aa-2168f52ff5a5/bullseye-2000.jpg","a72a2278":"a72a2278-3730-46e6-9cac-50f020b42f4a/FOLIA+performance+Martin+Harriague+%26+Mieke+Kockelkorn_.jpg","bcbf8fce":"bcbf8fce-a1c5-4b67-bd69-7364d4124ff3/LandslideMythology-Noord-Nederlandse-Dans-foto-Karel-Zwaneveld.jpg","c470702d":"c470702d-55fa-4df1-a681-33df541887bb/dekbed-2000.jpg","c711039a":"c711039a-c38d-42a6-93ef-e5ff1ad8f389/moon.png","cff7d5f3":"cff7d5f3-c628-49ef-8db3-2d35379c8b3a/35860407_2078150309073790_7025309982098718720_n.jpg","d46bf285":"d46bf285-04ec-4377-8186-ab0853793822/AloTog_009.jpg","db6a7f75":"db6a7f75-760b-4d55-b6c7-8b9bc8d4b69e/1740243284-edd46d6e098e11a3a966b5f649bf1d80d493a1154244ee8a1c6ed3fa49fe7ad6-d.webp","e637ee1a":"e637ee1a-aaef-427a-a7a8-57f00dc08a05/Vreemde-Eend-2-SALLY-Dansgezelschap-Maastricht-Het-Laagland-foto-Tycho-Merijn-LR.jpg","e739beaa":"e739beaa-ffb3-454f-808d-8da03af8ea60/Persfoto-1-Keihard-SALLY-Dansgezelschap-Maastricht-foto-Tycho-Merijn-LR.webp","ec16edef":"ec16edef-7a6a-4a2d-acd7-48ae47505639/230928-salldym-laagland-DGGG-15045.webp","f313d8a2":"f313d8a2-b0ae-4bb3-aea6-4d08845caa5e/20250521_091543.jpg","fab9ffca":"fab9ffca-494f-4ec5-80ba-df3fbfd264f4/SALLY-DANSLAB-on-tour-Roshanak-Morrowatian-Mask_foto-Tycho-Merijn.webp"};
function PBIMG(t,i){return "https://images.squarespace-cdn.com/content/v1/6887b0347ff65012a9431ded/"+P[i]+"?format="+(t==="s"?"750w":"1500w");}
function start(){
/* Patrizio Bucci. One stage, one company of photographs, many lighting cues. */
(function () {
  'use strict';
  const reduced = matchMedia('(prefers-reduced-motion: reduce)').matches;
  const clamp = (v, a = 0, b = 1) => Math.min(b, Math.max(a, v));
  const lerp = (a, b, t) => a + (b - a) * t;
  const ease = t => t * t * (3 - 2 * t);
  const TAU = Math.PI * 2;
  const rnd = (i, s = 1) => { const x = Math.sin(i * 127.1 + s * 311.7) * 43758.5453; return x - Math.floor(x); };
  const hex = h => { const n = parseInt(h.slice(1), 16); return [(n >> 16 & 255) / 255, (n >> 8 & 255) / 255, (n & 255) / 255]; };
  const $$ = (s, r = document) => [...r.querySelectorAll(s)];

  // Real LEE filter numbers and names; the values are screen approximations.
  const GELS = {
    '181': { name: 'L181 Congo Blue', bg: '#1d0b8f', deep: '#0b0347', light: '#8f86ff', ink: '#f5f3ff' },
    '106': { name: 'L106 Primary Red', bg: '#c90d1f', deep: '#5c0210', light: '#ff7a6e', ink: '#fff6f2' },
    '128': { name: 'L128 Bright Pink', bg: '#ff2f92', deep: '#99004f', light: '#ffb3d6', ink: '#16030d' },
    '010': { name: 'L010 Medium Yellow', bg: '#ffd60a', deep: '#e3a600', light: '#fff3a3', ink: '#171200' },
    '139': { name: 'L139 Primary Green', bg: '#007f4e', deep: '#00331f', light: '#5fe0a6', ink: '#f1fff8' },
    '158': { name: 'L158 Deep Orange', bg: '#ff6200', deep: '#a63300', light: '#ffc08a', ink: '#140700' },
    '126': { name: 'L126 Mauve', bg: '#5b17a8', deep: '#25064f', light: '#c79bff', ink: '#fbf6ff' },
    '119': { name: 'L119 Dark Blue', bg: '#0b3fc4', deep: '#03164f', light: '#8fb0ff', ink: '#f3f7ff' },
    '000': { name: 'House lights', bg: '#e8ebee', deep: '#8a9096', light: '#ffffff', ink: '#0f1113' }
  };

  // Unlisted page: only exists when asked for by address.
  if (location.hash === '#dancemakers') document.getElementById('dancemakers').hidden = false;

  /* ── Document model ─────────────────────────────── */
  const scenes = $$('.scene').filter(s => !s.hidden);
  const works = $$('.work').filter(w => !w.closest('[hidden]'));
  scenes.forEach(s => {
    $$('.work', s).forEach((w, i) => {
      if (i % 2) w.classList.add('right');
      w.dataset.side = i % 2 ? '-1' : '1';
      const inner = w.querySelector('.in');
      const q = document.createElement('span');
      q.className = 'q'; q.setAttribute('aria-hidden', 'true');
      q.textContent = 'Q' + s.dataset.q + '.' + String(i + 1).padStart(2, '0');
      w.dataset.cue = q.textContent;
      if (inner && inner.firstElementChild) inner.prepend(q);
    });
  });
  let vw = innerWidth, vh = innerHeight, phone = vw <= 760;
  let sceneTops = [], workBoxes = [];
  function measure() {
    vw = innerWidth; vh = innerHeight; phone = vw <= 760;
    const y = scrollY;
    sceneTops = scenes.map(s => { const r = s.getBoundingClientRect(); return { top: r.top + y, h: r.height }; });
    workBoxes = works.map(w => { const r = w.getBoundingClientRect(); return { top: r.top + y, h: r.height }; });
  }

  /* ── Fitted, shoving display type ────────────────── */
  const fits = [];
  const probe = document.createElement('span');
  probe.style.cssText = 'position:absolute;visibility:hidden;white-space:pre;font:800 100px/1 ' + getComputedStyle(document.documentElement).getPropertyValue('--display');
  const widths = {};
  function charW(c) {
    if (widths[c]) return widths[c];
    probe.textContent = c === ' ' ? ' ' : c;
    const out = [50, 100, 150].map(w => { probe.style.fontVariationSettings = "'wdth' " + w; return probe.getBoundingClientRect().width; });
    return (widths[c] = out);
  }
  const wAt = (a, t) => t < .5 ? lerp(a[0], a[1], t * 2) : lerp(a[1], a[2], (t - .5) * 2);
  let capRatio = .7, baseRatio = .8;

  function buildFit(el) {
    const lines = $$('.ln', el).map(ln => {
      const txt = ln.textContent; ln.textContent = ''; ln.setAttribute('aria-hidden', 'true');
      const inner = document.createElement('span'); inner.className = 'li'; ln.append(inner);
      const chars = [...txt].map((c, i) => {
        const s = document.createElement('span'); s.className = 'ch';
        s.textContent = c === ' ' ? ' ' : c; inner.append(s);
        return { c, s, i, t: .5, x: 0, last: -1 };
      });
      return { ln, inner, chars, fs: 100, lh: 100, sy: 1, top: 0 };
    });
    fits.push({ el, lines, hero: !!el.dataset.hero, h: +(el.dataset.h || .6), vis: false, top: 0, H: 0 });
  }
  function layoutFits() {
    const m = document.createElement('canvas').getContext('2d');
    m.font = '800 100px Anybody';
    const tm = m.measureText('H');
    if (tm.actualBoundingBoxAscent) {
      capRatio = tm.actualBoundingBoxAscent / 100;
      const a = tm.fontBoundingBoxAscent / 100, d = tm.fontBoundingBoxDescent / 100;
      baseRatio = (1 + a - d) / 2;
    }
    fits.forEach(f => {
      const cs = getComputedStyle(f.el);
      const W = f.el.clientWidth - parseFloat(cs.paddingLeft) - parseFloat(cs.paddingRight);
      const H = f.hero ? vh - parseFloat(cs.paddingTop) - (phone ? 118 : 110) : vh * f.h * (phone ? .8 : 1);
      f.H = H;
      const gap = Math.max(6, H * .02);
      f.lines.forEach(l => {
        const sum = l.chars.reduce((a, c) => a + wAt(charW(c.c), .5), 0);
        l.W = W; l.fs = W / sum * 100; l.lh = (H - gap * (f.lines.length - 1)) / f.lines.length;
        l.sy = l.lh / (capRatio * l.fs);
        l.gap = gap;
        l.inner.style.fontSize = l.fs + 'px';
        l.ln.style.height = l.lh + 'px';
        l.ln.style.marginBottom = gap + 'px';
        l.inner.style.width = W + 'px';
        let x = 0;
        l.chars.forEach(c => { const cw = wAt(charW(c.c), .5) * l.fs / 100; c.x = x + cw / 2; x += cw; });
      });
      const r = f.el.getBoundingClientRect(); f.top = r.top + scrollY;
    });
  }
  let px = -9999, py = -9999, hasPointer = false;
  function updateFits(t) {
    fits.forEach(f => {
      const r = f.el.getBoundingClientRect();
      if (r.bottom < -40 || r.top > vh + 40) return;
      let rise = 1;
      if (f.hero) rise = 1 - .93 * ease(clamp(scrollY / (vh * .8)));
      else rise = reduced ? 1 : lerp(.08, 1, ease(clamp((vh * 1.02 - r.top) / (vh * .62))));
      let ly = r.top + parseFloat(getComputedStyle(f.el).paddingTop);
      f.lines.forEach((l, li) => {
        const lt = l.ln.getBoundingClientRect().top;
        const near = hasPointer ? Math.exp(-Math.pow((py - (lt + l.lh / 2)) / (l.lh * .95), 2)) : 0;
        const a = l.chars.map(c => {
          const b = reduced ? 0 : Math.sin(t * .9 + c.i * .85 + li * 1.7) * .17;
          const d = hasPointer ? (px - r.left - 16 - c.x) / (vw * .12) : 9;
          return .5 + b + near * .62 * Math.exp(-d * d);
        });
        // Bisect a shared offset so the line always fills its width exactly: one grows, the others give way.
        let lo = -1, hi = 1;
        for (let n = 0; n < 11; n++) {
          const k = (lo + hi) / 2;
          const sum = l.chars.reduce((s, c, i) => s + wAt(charW(c.c), clamp(a[i] + k)), 0) * l.fs / 100;
          if (sum > l.W * .998) hi = k; else lo = k;
        }
        const k = (lo + hi) / 2;
        l.chars.forEach((c, i) => {
          const v = clamp(a[i] + k), d = Math.round((50 + 100 * v) * 4) / 4;
          if (d !== c.last) { c.s.style.fontVariationSettings = "'wdth' " + d; c.last = d; }
        });
        const s = l.sy * rise;
        const y = l.lh - capRatio * l.fs * s - (baseRatio - capRatio) * l.fs * s;
        l.inner.style.transform = 'translateY(' + y.toFixed(1) + 'px) scaleY(' + s.toFixed(4) + ')';
      });
    });
  }

  /* ── Page furniture ──────────────────────────────── */
  const navLinks = $$('.bar nav a');
  const cueline = document.getElementById('cueline'), cuelight = document.getElementById('cuelight');
  let cueTimer;
  function flashGo() {
    cuelight.classList.add('go');
    clearTimeout(cueTimer); cueTimer = setTimeout(() => cuelight.classList.remove('go'), 1100);
  }
  function goTo(el) {
    if (!el) return;
    const r = el.getBoundingClientRect();
    const y = scrollY + r.top + (el.classList.contains('work') && !phone ? Math.min(0, (r.height - vh) / 2) + (r.height > vh ? 0 : (r.height - vh) / 2) : 0);
    scrollTo({ top: y, behavior: reduced ? 'auto' : 'smooth' });
  }
  const stops = [];
  scenes.forEach(s => { const f = s.querySelector('.fit'); if (f && s.id !== 'top') stops.push(f); $$('.work', s).forEach(w => stops.push(w)); });
  document.getElementById('go').addEventListener('click', () => {
    flashGo();
    const y = scrollY + 8;
    const next = stops.find(s => s.getBoundingClientRect().top + scrollY > y + vh * .12);
    goTo(next || document.documentElement);
  });
  addEventListener('keydown', e => {
    if ((e.key === 'g' || e.key === 'G') && !e.metaKey && !e.ctrlKey && !e.altKey && !e.target.closest('input,textarea')) document.getElementById('go').click();
  });
  const copy = document.getElementById('copy');
  copy.addEventListener('click', () => {
    const done = () => { copy.textContent = 'Copied'; setTimeout(() => copy.textContent = 'Copy the address', 1800); bowAt = now(); };
    const sel = () => { const s = getSelection(), n = document.createRange(); n.selectNodeContents(document.getElementById('mail')); s.removeAllRanges(); s.addRange(n); copy.textContent = 'Selected: press copy'; };
    if (navigator.clipboard && navigator.clipboard.writeText) navigator.clipboard.writeText('ciao@patriziobucci.com').then(done, sel); else sel();
  });

  /* ── Stage ───────────────────────────────────────── */
  const now = () => performance.now() / 1000;
  let bowAt = -99;
  let gl3 = false;
  const canvas = document.getElementById('stage');
  let renderer;
  try {
    if (!window.THREE) throw 0;
    renderer = new THREE.WebGLRenderer({ canvas, antialias: true, alpha: false, powerPreference: 'high-performance' });
    gl3 = true;
  } catch (e) { document.documentElement.classList.add('nogl'); }

  let currentGel = '181';
  let sceneIdx = -1, form = 'preset', classForm = 'ballet';
  let spot = { x: vw * .5, y: vh * .5 }, spotTarget = { x: vw * .5, y: vh * .5 };

  let S; // shared uniforms
  const dancers = [];
  const byId = {};
  let camera, scene3, floor, moon, cam = { x: 0, y: 2, z: 12, lx: 0, ly: 1.6, lz: 0 };
  let dpr = 1;
  const CAMS = {
    front: [0, 2.0, 12, 0, 1.55, 0],
    diagonal: [2.4, 3.1, 12.5, .6, 1.2, -2],
    circle: [0, 6.2, 13, 0, .9, -5],
    top: [0, 12.5, 7.5, 0, 0, -4.5],
    low: [-3.2, .95, 11.5, -.4, 2.1, -3],
    moon: [0, .7, 12, 0, 3, 0],
    call: [0, 1.5, 9.5, 0, 1.25, 0]
  };

  const COMMON = `
    uniform vec3 aBg,aDeep,aLight,bBg,bDeep,bLight;
    uniform float uWipe; uniform vec2 uWipeC,uRes,uSpot; uniform float uSpotR,uTime;
    float gw(){ float d=length(gl_FragCoord.xy-uWipeC)/uRes.y; return 1.-smoothstep(uWipe-.1,uWipe,d); }
    float front(){ float d=length(gl_FragCoord.xy-uWipeC)/uRes.y; return smoothstep(uWipe-.09,uWipe-.015,d)*(1.-smoothstep(uWipe-.015,uWipe,d))*step(uWipe,2.6); }
    float spotMask(float k){ return 1.-smoothstep(uSpotR*k*.82,uSpotR*k,length(gl_FragCoord.xy-uSpot)); }
    float hash(vec2 p){ return fract(sin(dot(p,vec2(12.9898,78.233)))*43758.5453); }
  `;

  function initStage() {
    dpr = Math.min(devicePixelRatio || 1, phone ? 1.6 : 1.75);
    renderer.setPixelRatio(dpr);
    renderer.outputColorSpace = THREE.LinearSRGBColorSpace;
    renderer.setClearColor(0x050308, 1);
    scene3 = new THREE.Scene();
    camera = new THREE.PerspectiveCamera(34, vw / vh, .1, 120);
    const g = GELS['181'];
    S = {
      aBg: { value: new THREE.Vector3(...hex(g.bg)) }, aDeep: { value: new THREE.Vector3(...hex(g.deep)) }, aLight: { value: new THREE.Vector3(...hex(g.light)) },
      bBg: { value: new THREE.Vector3(...hex(g.bg)) }, bDeep: { value: new THREE.Vector3(...hex(g.deep)) }, bLight: { value: new THREE.Vector3(...hex(g.light)) },
      uWipe: { value: 3 }, uWipeC: { value: new THREE.Vector2() }, uRes: { value: new THREE.Vector2(1, 1) },
      uSpot: { value: new THREE.Vector2() }, uSpotR: { value: 200 }, uTime: { value: 0 },
      uSpotW: { value: new THREE.Vector3(0, 0, 0) }, uSpotOn: { value: 0 }, uHouse: { value: 0 }
    };

    // Cyclorama
    const bg = new THREE.Mesh(new THREE.PlaneGeometry(2, 2), new THREE.ShaderMaterial({
      depthTest: false, depthWrite: false, uniforms: S,
      vertexShader: 'varying vec2 v; void main(){ v=position.xy*.5+.5; gl_Position=vec4(position.xy,1.,1.); }',
      fragmentShader: COMMON + `varying vec2 v;
        void main(){ float w=gw(); vec3 c=mix(aBg,bBg,w); vec3 l=mix(aLight,bLight,w);
          float glow=exp(-pow((v.y-.34)*2.6,2.))*.28*(1.-.5*abs(v.x-.5));
          c=mix(c,l,glow); c=mix(c,c*.72,smoothstep(.55,1.2,v.y));
          c=mix(c,l,spotMask(1.)*.42);
          c+=front()*.55;
          c+=(hash(gl_FragCoord.xy+uTime)-.5)*.022;
          gl_FragColor=vec4(c,1.); }`
    }));
    bg.frustumCulled = false; bg.renderOrder = -20; scene3.add(bg);

    // Floor with real stage markings: centre line, quarter marks, spike tape
    floor = new THREE.Mesh(new THREE.PlaneGeometry(90, 90).rotateX(-Math.PI / 2), new THREE.ShaderMaterial({
      transparent: true, depthWrite: false, uniforms: S,
      vertexShader: 'varying vec3 w; void main(){ vec4 p=modelMatrix*vec4(position,1.); w=p.xyz; gl_Position=projectionMatrix*viewMatrix*p; }',
      fragmentShader: COMMON + `varying vec3 w; uniform vec3 uSpotW; uniform float uSpotOn;
        float ln(float x,float t){ float f=fwidth(x); return 1.-smoothstep(t-f,t+f,abs(x)); }
        float cross2(vec2 p,vec2 c){ p-=c; float a=ln(p.x,.012)*step(abs(p.y),.13); float b=ln(p.y,.012)*step(abs(p.x),.13); return max(a,b); }
        void main(){ float g=gw(); vec3 c=mix(aBg,bBg,g)*.84; vec3 d=mix(aDeep,bDeep,g); vec3 l=mix(aLight,bLight,g);
          float dash=step(.5,fract(w.z*.5));
          float m=ln(w.x,.018)*dash*.6;
          for(int i=1;i<=3;i++){ float q=float(i)*3.; m=max(m,ln(abs(w.x)-q,.012)*step(.72,fract(w.z*.5))*.42); }
          m=max(m,cross2(vec2(abs(w.x),w.z),vec2(3.,-2.))); m=max(m,cross2(vec2(abs(w.x),w.z),vec2(6.,-6.)));
          m=max(m,cross2(vec2(abs(w.x),w.z),vec2(0.,-9.))); m=max(m,ln(w.z-3.4,.02)*.8);
          c=mix(c,l,m*.55);
          float vig=1.-smoothstep(4.,26.,length(w.xz-vec2(0.,-3.)));
          c=mix(d,c,.35+.65*vig);
          float pool=(1.-smoothstep(1.7,2.7,length(w.xz-uSpotW.xz)))*uSpotOn;
          c=mix(c,mix(l,vec3(1.),.35),pool*.62);
          c+=front()*.45;
          c+=(hash(gl_FragCoord.xy-uTime)-.5)*.03;
          float a=(1.-smoothstep(16.,32.,-w.z))*(1.-smoothstep(11.,13.,w.z));
          gl_FragColor=vec4(c,a); }`
    }));
    floor.renderOrder = -15; scene3.add(floor);

    // Follow-spot beam in the haze
    const shaft = new THREE.Mesh(new THREE.PlaneGeometry(2, 2), new THREE.ShaderMaterial({
      transparent: true, depthTest: false, depthWrite: false, blending: THREE.AdditiveBlending, uniforms: S,
      vertexShader: 'void main(){ gl_Position=vec4(position.xy,0.,1.); }',
      fragmentShader: COMMON + `void main(){ vec2 s=vec2(uRes.x*.5,uRes.y*1.25); vec2 ax=uSpot-s; float L=length(ax); vec2 d=ax/L; vec2 p=gl_FragCoord.xy-s;
          float t=dot(p,d)/L; float wid=max(t,0.)*uSpotR; float e=abs(dot(p,vec2(-d.y,d.x)));
          float m=(1.-smoothstep(wid*.72,wid*1.02,e))*smoothstep(0.,.25,t)*(1.-smoothstep(.9,1.02,t));
          float n=.75+.25*sin(p.x*.012+uTime*.5)*sin(p.y*.017-uTime*.35);
          gl_FragColor=vec4(vec3(1.),m*.085*n); }`
    }));
    shaft.frustumCulled = false; shaft.renderOrder = 20; scene3.add(shaft);

    // The company
    const ids = [];
    works.forEach(w => { if (!ids.includes(w.dataset.d)) ids.push(w.dataset.d); });
    const geo = new THREE.PlaneGeometry(1, 1, phone ? 8 : 18, phone ? 8 : 18); geo.translate(0, .5, 0);
    ids.forEach((id, i) => addDancer(id, i, ids.length, geo));

    // A moon for Q7: from the site's own artwork
    moon = new THREE.Mesh(new THREE.PlaneGeometry(1, 1), danceMat({ uMap: { value: null } }, false));
    moon.renderOrder = -12; moon.visible = false; scene3.add(moon);
    moon.material.uniforms.uReveal.value = .75;
    loadTex(PBIMG('l','c711039a'), t => { moon.material.uniforms.uMap.value = t; moon.userData.asp = t.image.width / t.image.height; moon.visible = true; });

    pumpLoads();
    resize();
  }

  function danceMat(extra, reflect) {
    return new THREE.ShaderMaterial({
      transparent: true, side: THREE.DoubleSide, depthWrite: !reflect, depthTest: !reflect,
      uniforms: Object.assign({}, S, {
        uMap: { value: null }, uBend: { value: new THREE.Vector2() }, uReveal: { value: 0 }, uAlpha: { value: 0 },
        uFog: { value: 0 }, uUv: { value: new THREE.Vector4(0, 0, 1, 1) }, uRefl: { value: reflect ? 1 : 0 }, uDim: { value: 0 }
      }, extra),
      vertexShader: `varying vec2 v; uniform vec2 uBend; uniform float uTime;
        void main(){ v=uv; vec3 p=position; float c=sin(p.y*3.14159);
          p.x+=uBend.x*c*.42; p.z+=uBend.y*c*.5+uBend.x*sin(p.x*5.+uTime*2.)*.1*c;
          p.y+=abs(uBend.x)*.06*sin(p.x*3.14159+1.57);
          gl_Position=projectionMatrix*modelViewMatrix*vec4(p,1.); }`,
      fragmentShader: COMMON + `varying vec2 v; uniform sampler2D uMap; uniform float uReveal,uAlpha,uFog,uRefl,uDim; uniform vec4 uUv;
        void main(){ vec2 uv=uUv.xy+v*uUv.zw; vec4 t=texture2D(uMap,uv); if(t.a<.02) discard;
          float g=gw(); vec3 d=mix(aDeep,bDeep,g),l=mix(aLight,bLight,g),b=mix(aBg,bBg,g);
          float L=dot(t.rgb,vec3(.299,.587,.114));
          vec3 duo=mix(d,l,smoothstep(.03,.82,L));
          float s=spotMask(1.);
          float r=max(uReveal,s);
          vec3 c=mix(mix(duo,b,uDim*(1.-s)),t.rgb,r);
          c=mix(c,b,uFog*(1.-s));
          c+=front()*.35;
          float a=uAlpha*t.a;
          if(uRefl>.5){ a*=.34*(1.-smoothstep(0.,.55,v.y)); c=mix(c,b,.25); }
          gl_FragColor=vec4(c,a); }`
    });
  }

  const loadQ = [];
  let loading = 0;
  const loader = window.THREE ? new THREE.TextureLoader() : null;
  function loadTex(url, cb) {
    loader.load(url, t => {
      t.generateMipmaps = true; t.minFilter = THREE.LinearMipmapLinearFilter; t.magFilter = THREE.LinearFilter;
      t.anisotropy = 4; t.wrapS = t.wrapT = THREE.ClampToEdgeWrapping;
      cb(t);
    });
  }
  function pumpLoads() {
    while (loading < 5 && loadQ.length) {
      const j = loadQ.shift(); loading++;
      loader.load(j.url, t => {
        t.generateMipmaps = true; t.minFilter = THREE.LinearMipmapLinearFilter; t.anisotropy = 4;
        j.cb(t); loading--; pumpLoads();
      }, undefined, () => { loading--; pumpLoads(); });
    }
  }

  function addDancer(id, i, n, geo) {
    const mat = danceMat({}, false), rm = danceMat({}, true);
    const mesh = new THREE.Mesh(geo, mat), refl = new THREE.Mesh(geo, rm);
    mesh.frustumCulled = refl.frustumCulled = false;
    refl.renderOrder = -10; mesh.visible = refl.visible = false;
    scene3.add(mesh, refl);
    const el = works.find(w => w.dataset.d === id);
    const title = (el.querySelector('.t') || {}).textContent || (el.closest('.scene').querySelector('.fit') || {}).getAttribute?.('aria-label') || '';
    const d = byId[id] = {
      id, i, el, mesh, refl, mat, rm, title, asp: 1.4, cropAsp: 1.4, long: false,
      p: new THREE.Vector3(rnd(i) * 16 - 8, 0, -8 - rnd(i, 2) * 8), v: new THREE.Vector3(),
      h: 1.6, vh: 0, ry: 0, vry: 0, rx: 0, vrx: 0, reveal: 0, a: 0, form: 'preset', k: 15 + rnd(i, 3) * 14, hi: false, dim: 0, scroll: 0
    };
    dancers.push(d); mesh.userData.d = d;
    loadQ.push({
      url: PBIMG('s',id), cb: t => {
        mat.uniforms.uMap.value = rm.uniforms.uMap.value = t;
        setAspect(d, t.image.width / t.image.height);
        mesh.visible = refl.visible = true;
      }
    });
  }
  function setAspect(d, a) {
    d.imgAsp = a; d.long = a < .62;
    d.asp = d.long ? .74 : a;
    const v = d.long ? a / d.asp : 1;
    d.cropV = v;
    [d.mat, d.rm].forEach(m => m.uniforms.uUv.value.set(0, 1 - v, 1, v));
  }
  function upgrade(d) {
    if (d.hi) return; d.hi = true;
    loader.load(PBIMG('l',d.id), t => {
      t.generateMipmaps = true; t.minFilter = THREE.LinearMipmapLinearFilter; t.anisotropy = 8;
      const old = d.mat.uniforms.uMap.value;
      d.mat.uniforms.uMap.value = d.rm.uniforms.uMap.value = t;
      if (old) old.dispose();
    });
  }

  /* Formations. Each returns x, z, height, rotation for dancer i of n. */
  function formation(name, i, n, t, sp) {
    const u = n > 1 ? i / (n - 1) : 0;
    switch (name) {
      case 'preset': return { x: (rnd(i, 5) - .5) * 19, z: -3.5 - rnd(i, 7) * 11, h: 1.5 + rnd(i, 9) * 1.1, ry: (rnd(i, 4) - .5) * .7 };
      case 'diagonal': return { x: lerp(-11, 9, u), z: lerp(-18, 1, u), h: 2.2, ry: -.55 };
      case 'circle': { const a = u * TAU + sp * 3.2; return { x: Math.cos(a) * 8.2, z: -6.5 + Math.sin(a) * 5.2, h: 1.9, ry: -a + Math.PI / 2 }; }
      case 'ballet': { const c = 8, row = Math.floor(i / c), col = i % c; return { x: (col - (c - 1) / 2) * 2.1 + (row % 2) * 1.05, z: -11 + row * 2.3, h: 1.45, ry: 0 }; }
      case 'contemporary': { const a = i * .52 + t * .14, r = .7 + .29 * i; return { x: Math.cos(a) * r * .9, z: -6.5 + Math.sin(a) * r * .72, h: 1.25 + .012 * i, ry: -a }; }
      case 'impro': { const s = t * .17; return { x: Math.sin(s * (1 + rnd(i)) + i * 1.9) * 9, z: -6.5 + Math.cos(s * (1 + rnd(i, 3)) + i * 2.7) * 7, h: .9 + rnd(i, 6) * 1.5, ry: Math.sin(s * 2.1 + i) * 1.4 }; }
      case 'viewpoints': { // the Viewpoints grid: only straight lines, only right angles
        const b = Math.floor(t / 1.5 + rnd(i, 8) * 3), axis = (b + i) % 2;
        const gx = Math.floor(rnd(i, b - axis) * 9) - 4, gz = Math.floor(rnd(i + 40, b - 1 + axis) * 7);
        return { x: gx * 2.1, z: -12.5 + gz * 1.9, h: 1.35, ry: axis ? Math.PI / 2 * .55 : 0 };
      }
      case 'actors': { const p = Math.floor(i / 2), side = i % 2 ? 1 : -1, a = p / Math.ceil(n / 2) * TAU + t * .05; return { x: Math.cos(a) * 7.8 + Math.cos(a) * side * .44, z: -6.5 + Math.sin(a) * 5.4 + Math.sin(a) * side * .44, h: 1.5, ry: side * 1.1 }; }
      case 'procession': { const q = (u + sp * .35) % 1; return { x: Math.sin(q * 8) * (2 + 5 * (1 - q)) - 1, z: lerp(-24, 0, q), h: lerp(1.2, 2.3, q), ry: Math.cos(q * 8) * .5 }; }
      case 'wall': { const c = 11, row = Math.floor(i / c); return { x: ((i % c) - (c - 1) / 2) * 2.15, z: -13 - row * 2.2, h: 1.7, ry: 0 }; }
      case 'moon': { const a = lerp(-1.15, 1.15, u); return { x: Math.sin(a) * 12.5, z: -11 + (1 - Math.cos(a)) * 8, h: .95 + rnd(i, 2) * .5, ry: -a * .8 }; }
      case 'call': { const c = phone ? 7 : 15, row = Math.floor(i / c), per = (i % c) - (c - 1) / 2; return { x: per * (phone ? .92 : 1.22) + (row % 2) * .4, z: -.9 - row * 1.7, h: 1.32, ry: 0 }; }
    }
    return { x: 0, z: -8, h: 1.5, ry: 0 };
  }

  function setCue(idx, instant) {
    sceneIdx = idx;
    const s = scenes[idx];
    form = s.dataset.form === 'ballet' ? classForm : s.dataset.form;
    const gel = GELS[s.dataset.gel];
    document.documentElement.style.setProperty('--bg', gel.bg);
    document.documentElement.style.setProperty('--ink', gel.ink);
    navLinks.forEach(a => { const on = a.getAttribute('href') === '#' + s.id; if (on) { a.setAttribute('aria-current', 'true'); if (a.parentNode.scrollWidth > a.parentNode.clientWidth) a.parentNode.scrollTo({ left: a.offsetLeft - 16, behavior: 'smooth' }); } else a.removeAttribute('aria-current'); });
    flashGo();
    if (s.id === 'contact') bowAt = now() + 1.1;
    if (!S) return;
    const set = (k, v) => S[k].value.set(...v);
    // Whatever was crossing fades into the wave's start state
    set('aBg', S.bBg.value.toArray()); set('aDeep', S.bDeep.value.toArray()); set('aLight', S.bLight.value.toArray());
    set('bBg', hex(gel.bg)); set('bDeep', hex(gel.deep)); set('bLight', hex(gel.light));
    S.uWipeC.value.set(spot.x * dpr, (vh - spot.y) * dpr);
    S.uWipe.value = instant || reduced ? 3 : 0;
    canon();
  }
  function canon() {
    const t = now();
    dancers.forEach(d => { d.switchAt = t + (reduced ? 0 : (d.i % 43) * .038); });
  }

  /* ── Pointer: the follow-spot ────────────────────── */
  const tag = document.getElementById('tag');
  let lastMove = -9, hover = null;
  const ray = window.THREE ? new THREE.Raycaster() : null, ndc = window.THREE ? new THREE.Vector2() : null;
  const TEXTY = 'a,button,summary,p,h1,h2,h3,h4,li,table,blockquote,.in .q,.fit,img';
  addEventListener('pointermove', e => {
    px = e.clientX; py = e.clientY; hasPointer = e.pointerType !== 'touch' || e.buttons > 0; lastMove = now();
    spotTarget.x = px; spotTarget.y = py;
    if (!camera) return;
    if (e.pointerType === 'touch' || e.target.closest(TEXTY)) { setHover(null); return; }
    ndc.set(px / vw * 2 - 1, -(py / vh) * 2 + 1);
    ray.setFromCamera(ndc, camera);
    const hit = ray.intersectObjects(dancers.filter(d => d.mesh.visible).map(d => d.mesh), false)[0];
    setHover(hit ? hit.object.userData.d : null);
    if (hover) { tag.style.transform = 'translate(' + Math.min(px + 14, vw - 220) + 'px,' + (py + 16) + 'px)'; }
  }, { passive: true });
  addEventListener('pointerdown', e => { if (e.pointerType === 'touch') { spotTarget.x = e.clientX; spotTarget.y = e.clientY; lastMove = now(); } }, { passive: true });
  function setHover(d) {
    if (d === hover) return;
    hover = d;
    document.body.style.cursor = d ? 'pointer' : '';
    tag.style.opacity = d && d.title ? 1 : 0;
    if (d) { tag.textContent = d.title + ' →'; upgrade(d); }
  }
  addEventListener('click', e => { if (hover && !e.target.closest(TEXTY)) { flashGo(); goTo(hover.el); } });

  $$('.classes button').forEach(b => {
    const pick = () => {
      if (classForm === b.dataset.class) return;
      classForm = b.dataset.class;
      $$('.classes button').forEach(o => o.setAttribute('aria-pressed', String(o === b)));
      if (scenes[sceneIdx] && scenes[sceneIdx].id === 'teacher') { form = classForm; if (S) canon(); }
    };
    b.addEventListener('pointerenter', pick); b.addEventListener('focus', pick); b.addEventListener('click', pick);
  });

  /* ── Frame ───────────────────────────────────────── */
  let activeWork = null, lastT = now(), sinceDrop = 0, frames = 0;
  const tmpV = gl3 ? new THREE.Vector3() : null, floorHit = gl3 ? new THREE.Vector3() : null;
  const camEuler = gl3 ? new THREE.Euler() : null;

  function pickActive() {
    const y = scrollY;
    let idx = 0;
    for (let i = 0; i < sceneTops.length; i++) if (y + vh * .55 >= sceneTops[i].top) idx = i;
    if (idx !== sceneIdx) setCue(idx);
    let best = null;
    const refTop = y + vh * (phone ? .62 : .58), refBot = y + vh * .3;
    for (let i = 0; i < works.length; i++) {
      const b = workBoxes[i];
      if (b.top <= refTop && b.top + b.h >= refBot) best = works[i];
    }
    if (y < vh * .25 && scenes[0].contains(works[0])) best = works[0];
    if (best !== activeWork) {
      if (activeWork) activeWork.classList.remove('on');
      activeWork = best;
      if (best) {
        best.classList.add('on');
        const b = byId[best.dataset.d]; if (b) upgrade(b);
        flashGo();
      }
    }
    if (best && cueline) {
      cueline.textContent = 'LX ' + best.dataset.cue + ' · ' + GELS[scenes[sceneIdx].dataset.gel].name;
    } else cueline.textContent = 'LX Q' + scenes[sceneIdx].dataset.q + ' · ' + GELS[scenes[sceneIdx].dataset.gel].name;
  }

  function resize() {
    measure(); layoutFits();
    if (!gl3) return;
    if (!camera) return;
    dpr = Math.min(devicePixelRatio || 1, phone ? 1.6 : 1.75);
    renderer.setPixelRatio(dpr); renderer.setSize(vw, vh, false);
    camera.aspect = vw / vh; camera.updateProjectionMatrix();
    S.uRes.value.set(vw * dpr, vh * dpr);
    S.uSpotR.value = (phone ? .19 : .24) * vh * dpr;
  }

  function frame() {
    requestAnimationFrame(frame);
    const t = now(); let dt = Math.min(t - lastT, .05); lastT = t;
    pickActive();
    updateFits(t);
    if (!gl3 || !camera) return;

    const s = scenes[sceneIdx], box = sceneTops[sceneIdx];
    const sp = clamp((scrollY - box.top + vh * .5) / Math.max(1, box.h));
    S.uTime.value = t;
    if (S.uWipe.value < 3) S.uWipe.value = Math.min(3, S.uWipe.value + dt * 2.5 * (1 + S.uWipe.value));

    // Spot: follows the pointer; idles across the stage if nobody is steering it
    if (t - lastMove > 3.5 || !hasPointer) {
      const a = activeWork && byId[activeWork.dataset.d];
      if (a && phone) { spotTarget.x = vw * (.5 + Math.sin(t * .5) * .22); spotTarget.y = vh * (.26 + Math.sin(t * .37) * .08); }
      else if (a && !(activeWork === works[0] && scrollY < vh * .9)) { const sd = +activeWork.dataset.side || 1; spotTarget.x = vw * (.5 + sd * .27 + Math.sin(t * .31) * .13); spotTarget.y = vh * (.5 + Math.sin(t * .47 + 1) * .2); }
      else { spotTarget.x = vw * (.5 + Math.sin(t * .31) * .36); spotTarget.y = vh * (.5 + Math.sin(t * .47 + 1) * .24); }
    }
    const sk = 1 - Math.exp(-dt * (reduced ? 40 : 7));
    spot.x += (spotTarget.x - spot.x) * sk; spot.y += (spotTarget.y - spot.y) * sk;
    S.uSpot.value.set(spot.x * dpr, (vh - spot.y) * dpr);

    // Camera
    const C = CAMS[s.dataset.cam] || CAMS.front;
    const narrow = phone ? 1.35 : 1;
    const ck = 1 - Math.exp(-dt * (reduced ? 30 : 1.8));
    const mx = (spot.x / vw - .5), my = (spot.y / vh - .5);
    cam.x += (C[0] + mx * .9 - cam.x) * ck; cam.y += (C[1] - my * .4 - cam.y) * ck; cam.z += (C[2] * narrow + (sp - .5) * -1.4 - cam.z) * ck;
    cam.lx += (C[3] - cam.lx) * ck; cam.ly += (C[4] - cam.ly) * ck; cam.lz += (C[5] - cam.lz) * ck;
    camera.position.set(cam.x, cam.y, cam.z); camera.lookAt(cam.lx, cam.ly, cam.lz); camera.updateMatrixWorld();

    // Where the spot lands on the floor
    ndc.set(spot.x / vw * 2 - 1, -(spot.y / vh) * 2 + 1);
    ray.setFromCamera(ndc, camera);
    const rd = ray.ray.direction, ro = ray.ray.origin;
    if (rd.y < -.002) { const k = -ro.y / rd.y; S.uSpotW.value.set(ro.x + rd.x * k, 0, ro.z + rd.z * k); S.uSpotOn.value += (1 - S.uSpotOn.value) * .1; }
    else S.uSpotOn.value += (0 - S.uSpotOn.value) * .1;

    // Featured slot, in camera space, so the photo sits beside its text at any camera angle
    const D = 6.4, vH = 2 * D * Math.tan(camera.fov * Math.PI / 360), vW = vH * camera.aspect;
    const pitch = Math.atan2(camera.position.y - cam.ly, camera.position.z - cam.lz);
    const featId = activeWork && activeWork.dataset.d;
    const n = dancers.length;
    const bowT = t - bowAt;
    dancers.forEach(d => {
      if (t >= (d.switchAt || 0)) d.form = form;
      const featured = d.id === featId;
      const f = formation(d.form, d.i, n, t, sp);
      let tx, ty, tz, th, try_, trx = 0;
      if (featured) {
        const side = +activeWork.dataset.side || 1;
        const hero = activeWork === works[0] && scrollY < vh * .9;
        const nx = phone ? 0 : hero ? 0 : side * .53, ny = phone ? .44 : hero ? -.02 : 0;
        const maxH = phone ? .41 : hero ? .8 : .78, maxW = phone ? .92 : hero ? .62 : .42;
        th = Math.min(maxH * vH, maxW * vW / d.asp);
        tmpV.set(nx * vW / 2, ny * vH / 2 - th / 2 , -D).applyMatrix4(camera.matrixWorld);
        tx = tmpV.x; ty = tmpV.y; tz = tmpV.z;
        try_ = Math.atan2(camera.position.x - tx, camera.position.z - tz) * .9;
        trx = -pitch;
      } else {
        const w = Math.sin(t * .55 + d.i * 1.3);
        tx = f.x + w * .06; tz = f.z + Math.cos(t * .42 + d.i) * .06; ty = 0; th = f.h * (1 + w * .012); try_ = f.ry + Math.sin(t * .33 + d.i) * .03;
        if (d.form === 'call') { const b = bowT - d.i % 15 * .09; if (b > 0 && b < 2.2) trx = Math.sin(b / 2.2 * Math.PI) * .95; }
      }
      const k = featured ? 44 : d.k, cc = 2 * Math.sqrt(k) * (featured ? .92 : .7);
      if (reduced) { d.p.set(tx, ty, tz); d.h = th; d.ry = try_; d.rx = trx; d.v.set(0, 0, 0); }
      else {
        d.v.x += ((tx - d.p.x) * k - d.v.x * cc) * dt; d.v.y += ((ty - d.p.y) * k - d.v.y * cc) * dt; d.v.z += ((tz - d.p.z) * k - d.v.z * cc) * dt;
        d.p.x += d.v.x * dt; d.p.y += d.v.y * dt; d.p.z += d.v.z * dt;
        d.vh += ((th - d.h) * k - d.vh * cc) * dt; d.h += d.vh * dt;
        d.vry += ((try_ - d.ry) * k - d.vry * cc) * dt; d.ry += d.vry * dt;
        d.vrx += ((trx - d.rx) * k - d.vrx * cc) * dt; d.rx += d.vrx * dt;
      }
      const sc = d.h;
      d.mesh.position.copy(d.p); d.mesh.rotation.set(d.rx, d.ry, 0, 'YXZ'); d.mesh.scale.set(sc * d.asp, sc, 1);
      d.refl.position.set(d.p.x, -d.p.y, d.p.z); d.refl.rotation.set(-d.rx, d.ry, 0, 'YXZ'); d.refl.scale.set(sc * d.asp, -sc, 1);
      d.refl.visible = d.mesh.visible && d.p.y < 1.4;

      const u = d.mat.uniforms, ru = d.rm.uniforms;
      const b = reduced ? 0 : 1;
      const bx = clamp(d.v.x * .17, -1.5, 1.5) * b, bz = clamp(d.v.z * .14, -1.2, 1.2) * b;
      u.uBend.value.set(bx, bz); ru.uBend.value.set(bx, bz);
      const hov = hover === d;
      d.reveal += ((featured || hov ? 1 : 0) - d.reveal) * (1 - Math.exp(-dt * 5));
      const dimT = hov ? 0 : activeWork && !featured ? .72 : s.id === 'teacher' ? .34 : s.id === 'contact' && scrollY > box.top + vh * .4 ? .82 : 0;
      d.dim += (dimT - d.dim) * .06;
      d.a += ((d.mesh.visible ? 1 : 0) - d.a) * (1 - Math.exp(-dt * 3));
      u.uReveal.value = d.reveal; ru.uReveal.value = d.reveal;
      u.uDim.value = d.dim; ru.uDim.value = d.dim;
      u.uAlpha.value = d.a; ru.uAlpha.value = d.a;
      const fog = featured ? 0 : clamp((-d.p.z - 1) / 26) * .72;
      u.uFog.value = fog; ru.uFog.value = fog;
      d.mesh.renderOrder = featured ? 5 : 0;
      if (d.long) { // a full-page screenshot scrolls inside its frame while its text is on stage
        let pr = 0;
        if (featured) { const r = activeWork.getBoundingClientRect(); pr = clamp((vh * .75 - r.top) / (r.height + vh * .35)); pr = ease(pr); }
        d.scroll += (pr - d.scroll) * .08;
        const off = (1 - d.cropV) * (1 - d.scroll);
        u.uUv.value.y = off; ru.uUv.value.y = off;
      }
    });

    // Moon rises over Q7 and sets again
    if (moon.visible || moon.userData.asp) {
      const isMoon = s.id === 'maan';
      moon.userData.m = (moon.userData.m || 0) + ((isMoon ? 1 : 0) - (moon.userData.m || 0)) * (1 - Math.exp(-dt * 1.3));
      const m = moon.userData.m, h = 13, a = moon.userData.asp || 1.4;
      moon.scale.set(h * a, h, 1);
      moon.position.set(Math.sin(t * .05) * .6, lerp(-7, 9.5 - sp * 2.6, m), -20);
      moon.material.uniforms.uAlpha.value = m;
      moon.visible = m > .01 && !!moon.material.uniforms.uMap.value;
    }

    renderer.render(scene3, camera);

    // Keep it fluid on weak GPUs
    frames++; sinceDrop += dt;
    if (sinceDrop > 2.5) {
      const fps = frames / sinceDrop;
      if (fps < 32 && dpr > 1) { dpr = Math.max(1, dpr - .35); renderer.setPixelRatio(dpr); renderer.setSize(vw, vh, false); S.uRes.value.set(vw * dpr, vh * dpr); S.uSpotR.value = (phone ? .19 : .24) * vh * dpr; }
      frames = 0; sinceDrop = 0;
    }
  }

  /* ── Boot ────────────────────────────────────────── */
  function boot() {
    document.body.append(probe);
    $$('.fit').filter(f => !f.closest('[hidden]')).forEach(buildFit);
    measure();
    layoutFits();
    if (gl3) initStage();
    measure();
    let i = 0;
    for (let k = 0; k < sceneTops.length; k++) if (scrollY + vh * .55 >= sceneTops[k].top) i = k;
    setCue(i, true);
    addEventListener('resize', resize);
    if ('ResizeObserver' in window) new ResizeObserver(measure).observe(document.getElementById('pb-main'));
    if (location.hash) { const e = document.getElementById(location.hash.slice(1)); if (e) { scrollTo({ top: e.getBoundingClientRect().top + scrollY, behavior: 'instant' }); measure(); } }
    requestAnimationFrame(frame);
  }
  const fontsReady = Promise.all([document.fonts.load("800 100px Anybody"), document.fonts.ready]);
  Promise.race([fontsReady, new Promise(r => setTimeout(r, 2500))]).then(boot);
})();

}
function go(){
var t=document.getElementById("pb-site-tpl");
if(!t||document.getElementById("pb-main"))return;
var w=document.getElementById("siteWrapper");if(w)w.style.display="none";
document.body.appendChild(t.content.cloneNode(true));
var s=document.createElement("script");s.src="https://cdn.jsdelivr.net/npm/three@0.158.0/build/three.min.js";s.onload=start;s.onerror=start;document.body.appendChild(s);
}
if(document.readyState==="loading")document.addEventListener("DOMContentLoaded",go);else go();
})();</script>