1const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/hero-grid-D0EBdqqM.js","assets/opening-order-DlDx_v9A.js","assets/index-CzGW6FVa.js","assets/viewport-C0fhXW_y.js","assets/craft-BN_yNEP7.js","assets/title-warp-BNwbqMDR.js","assets/fold-mode-DbKzrdIL.js","assets/ScrollTrigger-DNECHiyU.js","assets/validation-D5U4Prh3.js","assets/work-ybNbFcJc.js","assets/page-bend-Dj8UK15h.js","assets/lightbox-08EUTKND.js","assets/slider-CU6W_0ld.js","assets/InertiaPlugin-m3LuIjpm.js","assets/name-bend-C5Dx7leT.js","assets/SplitText-Dg80axqL.js","assets/featured-C790QSJb.js","assets/highlight-text-vjdXAQNP.js"])))=>i.map(i=>d[i]); 2import{s as qe,l as He,g as oo,a as so,L as io,i as ro,b as ao,_ as ht}from"./elastic-pulse-CKgubG0W.js";import{g as b}from"./index-CzGW6FVa.js";import{G as no,T as Ye,c as Re,o as co,a as Bt,i as lo}from"./opening-order-DlDx_v9A.js";import{S as et}from"./ScrollTrigger-DNECHiyU.js";import{g as Ve,W as Yt,a as ze,t as ho}from"./title-warp-BNwbqMDR.js";import{o as Wt,t as uo}from"./viewport-C0fhXW_y.js";import{i as fo,s as me,c as mo}from"./fold-mode-DbKzrdIL.js";import{i as po}from"./page-bend-Dj8UK15h.js";const xt=Ye;function go(){const s=document.createElement("canvas");s.width=xt,s.height=xt;const t=s.getContext("2d");return t.fillStyle="#121212",t.fillRect(0,0,xt,xt),s}async function _o(s,t=!0){const e=no+s.src;try{const o=await fetch(e,{cache:"force-cache",priority:t?"high":"low"});if(!o.ok)throw new Error(`${o.status} ${o.statusText}`);const r=await o.blob();s.canvas=await createImageBitmap(r,{resizeWidth:xt,resizeHeight:xt,resizeQuality:"high",premultiplyAlpha:"none",colorSpaceConversion:"none"})}catch(o){console.warn("[gallery] tile failed, drawing a blank:",s.src,o.message),s.canvas=go()}return s}function vo(s,{onTile:t,firstBatch:e=12,priority:o}={}){const r=s.map((d,n)=>n).filter(d=>!o?.includes(d)),i=o?.length?[...o,...r]:s.map((d,n)=>n),l=new Array(s.length);let u=0;for(const d of i){const n=u++<e;l[d]=_o(s[d],n).then(p=>(t?.(p,d),p))}const c=i.slice(0,Math.min(e,i.length));return{first:Promise.all(c.map(d=>l[d])),all:Promise.all(l)}}const _t=10,vt=Ye,Eo=.06,yo=.028,To=.2,Ro=.09,xo=.12,xe=5,bo=0,Ao=1,be=0,wo=.25,Mo=132,So=340,Ae=2600*1400,Rt=(s,t,e)=>Math.min(e,Math.max(t,s)),Po=`#version 300 es 3precision highp float; 4 5in vec2 aUV; 6in vec2 aCell; 7in float aLayer; 8in float aLift; 9 10uniform vec2 uOffset; 11uniform vec2 uCell; 12uniform vec2 uMedia; 13uniform float uR; 14uniform float uPersp; 15uniform float uCamZ; 16uniform vec2 uHalfViewport; 17uniform float uReveal; 18 19out vec2 vUV; 20out float vLayer; 21out float vShade; 22out float vLift; 23out float vEnter; 24out vec2 vParallax; 25 26vec3 surface(vec2 arc) { 27 vec2 ang = arc / uR; 28 return vec3(uR * sin(ang.x), 29 uR * sin(ang.y), 30 uR * (2.0 - cos(ang.x) - cos(ang.y))); 31} 32 33void main() { 34 vec2 centre = aCell * uCell - uOffset; 35 vec2 local = (aUV - 0.5) * uMedia * (1.0 + aLift * 0.05); 36 vec3 P = surface(centre + local); 37 38 vec2 ang = centre / uR; 39 float facing = cos(ang.x) * cos(ang.y); 40 41 float st = sin(ang.x), ct = cos(ang.x); 42 float sp = sin(ang.y), cp = cos(ang.y); 43 vec3 T = vec3(ct, 0.0, st); 44 vec3 B = vec3(-sp * st, cp, sp * ct); 45 vec3 N = vec3(-st * cp, -sp, ct * cp); 46 47 vec3 toCam = normalize(vec3(0.0, 0.0, uCamZ) - P); 48 float nd = max(dot(toCam, N), 0.25); 49 vParallax = vec2(dot(toCam, T), dot(toCam, B)) / nd; 50 51 P.z += aLift * uCell.x * 0.12; 52 53 float d = length(centre / uCell); 54 float t = clamp(uReveal * 1.9 - d * 0.14, 0.0, 1.0); 55 float e = 1.0 - pow(1.0 - t, 3.0); 56 P.z -= (1.0 - e) * uPersp * 1.8; 57 58 vec3 V = vec3(P.x, -P.y, P.z - uCamZ); 59 float n = uPersp * 0.05; 60 float f = uPersp * 5.0; 61 62 gl_Position = vec4( 63 uPersp * V.x / uHalfViewport.x, 64 uPersp * V.y / uHalfViewport.y, 65 ((f + n) * V.z + 2.0 * f * n) / (n - f), 66 -V.z 67 ); 68 69 vUV = aUV; 70 vLayer = aLayer; 71 vShade = clamp((1.0 - facing) * 1.5, 0.0, 0.7); 72 vLift = aLift * e; 73 vEnter = e; 74} 75`,Lo=`#version 300 es 76precision highp float; 77precision highp sampler2DArray; 78 79in vec2 vUV; 80in float vLayer; 81in float vShade; 82in float vLift; 83in float vEnter; 84in vec2 vParallax; 85 86uniform sampler2DArray uTex; 87uniform vec2 uMediaPx; 88uniform float uRadius; 89uniform float uDepth; 90uniform float uZoom; 91uniform vec2 uDrag; 92 93out vec4 fragColor; 94 95void main() { 96 97 vec2 halfSize = uMediaPx * 0.5; 98 vec2 q = abs((vUV - 0.5) * uMediaPx) - (halfSize - uRadius); 99 float d = length(max(q, 0.0)) + min(max(q.x, q.y), 0.0) - uRadius; 100 float cover = 1.0 - smoothstep(-1.0, 1.0, d); 101 102 float lim = (1.0 - uZoom) * 0.5; 103 vec2 off = clamp((vParallax * uDepth + uDrag) / uMediaPx, -lim, lim); 104 vec2 uv = 0.5 + (vUV - 0.5) * uZoom - off; 105 106 vec3 c = texture(uTex, vec3(uv, vLayer)).rgb; 107 108 c *= 1.0 - vShade * 0.55; 109 110 float l = dot(c, vec3(0.299, 0.587, 0.114)); 111 c = mix(vec3(l), c, 1.0 - vShade * 0.45); 112 113 fragColor = vec4(c * vEnter, cover); 114} 115`,Fo=`#version 300 es 116precision highp float; 117 118void main() { 119 vec2 p = vec2((gl_VertexID << 1) & 2, gl_VertexID & 2); 120 gl_Position = vec4(p * 2.0 - 1.0, 0.0, 1.0); 121} 122`,Do=`#version 300 es 123precision highp float; 124 125uniform sampler2D uScene; 126uniform vec2 uResolution; 127uniform float uTime; 128 129out vec4 fragColor; 130 131void main() { 132 vec2 uv = gl_FragCoord.xy / uResolution; 133 vec2 c = uv - 0.5; 134 135 vec3 col = texture(uScene, uv).rgb; 136 137 col *= smoothstep(1.25, 0.30, length(c) * 1.5); 138 139 float n = fract(sin(dot(gl_FragCoord.xy + fract(uTime) * 91.7, vec2(12.9898, 78.233))) * 43758.5453); 140 col += (n - 0.5) * 0.030; 141 142 fragColor = vec4(col, 1.0); 143} 144`;function we(s,t,e){const o=s.createShader(t);if(s.shaderSource(o,e),s.compileShader(o),!s.getShaderParameter(o,s.COMPILE_STATUS))throw new Error(s.getShaderInfoLog(o)||"shader compile failed");return o}function Me(s,t,e){const o=s.createProgram();if(s.attachShader(o,we(s,s.VERTEX_SHADER,t)),s.attachShader(o,we(s,s.FRAGMENT_SHADER,e)),s.linkProgram(o),!s.getProgramParameter(o,s.LINK_STATUS))throw new Error(s.getProgramInfoLog(o)||"program link failed");return o}function Se(s,t){const e={},o=s.getProgramParameter(t,s.ACTIVE_UNIFORMS);for(let r=0;r<o;r++){const i=s.getActiveUniform(t,r).name.replace(/\[0\]$/,"");e[i]=s.getUniformLocation(t,i)}return e}class Uo{constructor(t,e,o=null){this.canvas=t,this.projects=e,this.overlay=o,this._occluded=!1;const r=t.getContext("webgl2",{antialias:!1,alpha:!1,depth:!1,powerPreference:"high-performance"});if(!r)throw new Error("WebGL 2 unavailable");this.gl=r,this.pos={x:0,y:0},this.target={x:0,y:0},this._dirty=!0,this._lastCamZ=NaN,this._lastSourceTex=null,this._lastCalmDraw=0,this.stats={full:0,calm:0},this.velocity={x:0,y:0},this.smoothVel={x:0,y:0},this.pointer={x:-1e5,y:-1e5},this.smoothPointer={x:-1e5,y:-1e5},this.dragging=!1,this.hold=0,this.pointerId=null,this.revealT=0,this.reveal
144ing=!1,this.parallax=1,this.camZ=0,this.depthCull=.28,this.gridProg=Me(r,Po,Lo),this.gridU=Se(r,this.gridProg),this.postProg=Me(r,Fo,Do),this.postU=Se(r,this.postProg),this._buildPatch(),this._buildTexture(),this._bind(),this.measure(),this.lastTime=performance.now(),this._tick=this._tick.bind(this),requestAnimationFrame(this._tick)}_buildPatch(){const t=this.gl,e=[];for(let h=0;h<=_t;h++)for(let d=0;d<=_t;d++)e.push(d/_t,h/_t);const o=[],r=_t+1;for(let h=0;h<_t;h++)for(let d=0;d<_t;d++){const n=h*r+d;o.push(n,n+1,n+r,n+1,n+r+1,n+r)}this.indexCount=o.length,this.vao=t.createVertexArray(),t.bindVertexArray(this.vao);const i=t.createBuffer();t.bindBuffer(t.ARRAY_BUFFER,i),t.bufferData(t.ARRAY_BUFFER,new Float32Array(e),t.STATIC_DRAW);const l=t.getAttribLocation(this.gridProg,"aUV");t.enableVertexAttribArray(l),t.vertexAttribPointer(l,2,t.FLOAT,!1,0,0);const u=t.createBuffer();t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,u),t.bufferData(t.ELEMENT_ARRAY_BUFFER,new Uint16Array(o),t.STATIC_DRAW),this.instBuf=t.createBuffer(),t.bindBuffer(t.ARRAY_BUFFER,this.instBuf);const c=[["aCell",2,0],["aLayer",1,8],["aLift",1,12]];for(const[h,d,n]of c){const p=t.getAttribLocation(this.gridProg,h);t.enableVertexAttribArray(p),t.vertexAttribPointer(p,d,t.FLOAT,!1,16,n),t.vertexAttribDivisor(p,1)}t.bindVertexArray(null)}_buildTexture(){const t=this.gl,e=this.projects.length,o=Math.floor(Math.log2(vt))+1,r=t.createTexture();t.bindTexture(t.TEXTURE_2D_ARRAY,r),t.texStorage3D(t.TEXTURE_2D_ARRAY,o,t.RGBA8,vt,vt,e),t.pixelStorei(t.UNPACK_FLIP_Y_WEBGL,!1);for(let l=0;l<e;l++)this.projects[l].canvas&&t.texSubImage3D(t.TEXTURE_2D_ARRAY,0,0,0,l,vt,vt,1,t.RGBA,t.UNSIGNED_BYTE,this.projects[l].canvas);t.generateMipmap(t.TEXTURE_2D_ARRAY);for(const l of this.projects)l.canvas&&(typeof l.canvas.close=="function"?l.canvas.close():l.canvas.width&&(l.canvas.width=0,l.canvas.height=0),l.canvas=null);t.texParameteri(t.TEXTURE_2D_ARRAY,t.TEXTURE_MIN_FILTER,t.LINEAR_MIPMAP_LINEAR),t.texParameteri(t.TEXTURE_2D_ARRAY,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D_ARRAY,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D_ARRAY,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE);const i=t.getExtension("EXT_texture_filter_anisotropic");i&&t.texParameterf(t.TEXTURE_2D_ARRAY,i.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(8,t.getParameter(i.MAX_TEXTURE_MAX_ANISOTROPY_EXT))),this.tex=r}measure(){const t=this.canvas.clientWidth,e=this.canvas.clientHeight;this.vw=t,this.vh=e;const o=navigator.hardwareConcurrency||8,r=navigator.deviceMemory||8,i=o<=4||r<=4?1.25:o<=8||r<=8?1.5:2,l=1440*900,u=2,c=Math.sqrt(i*i*l/(t*e)),h=Math.min(u,Math.max(i,c)),d=Math.min(h,this._dprCap??h);let n=Math.min(window.devicePixelRatio||1,d);t*e*n*n>Ae&&(n=Math.sqrt(Ae/(t*e))),n=Rt(n,1,d);const p=Math.round(t*n),v=Math.round(e*n),g=p!==this.dw||v!==this.dh;this.dw=p,this.dh=v,g&&(this.canvas.width=p,this.canvas.height=v);const R=Math.round(Rt(wo*Math.sqrt(t*e),Mo,So)),S=Math.round(R*Eo);this.cell=R,this.media=R-S*2,this.radius=Math.max(2,R*yo);const _=Math.max(t,e*.72),A=Rt((_-420)/1020,0,1);this.R=_*(1.18+(.94-1.18)*A);const w=this.persp;this.persp=this.R*(.85+(.65-.85)*A),(!w||this.camZ===w)&&(this.camZ=this.persp);const L=this._solveArc(t*.62),O=this._solveArc(e*.62);this.cols=Math.min(27,Math.ceil(L/R*2)+xe),this.rows=Math.min(19,Math.ceil(O/R*2)+xe),this.cols%2===0&&this.cols++,this.rows%2===0&&this.rows++,this.instances=new Float32Array(this.cols*this.rows*4),g&&this._buildTargets(),this.overlay?.resize(t,e,this.persp)}_solveArc(t){const{R:e,persp:o}=this,r=Math.acos(Rt(1-o*.8/e,-1,1));let i=0,l=r;for(let u=0;u<36;u++){const c=(i+l)/2;e*Math.sin(c)*o/(o-e*(1-Math.cos(c)))<t?i=c:l=c}return e*i}_buildTargets(){const t=this.gl,{dw:e,dh:o}=this,r=Math.min(this._msaa??4,t.getParameter(t.MAX_SAMPLES));this.fboMS&&(t.deleteFramebuffer(this.fboMS),t.deleteRenderbuffer(this.rbColor),t.deleteRenderbuffer(this.rbDepth),t.deleteFramebuffer(this.fboResolve),t.deleteTexture(this.texResolve),this.fboResolveB&&(t.deleteFramebuffer(this.fboResolveB),t.deleteTexture(this.texResolveB))),this.rbColor=t.createRenderbuffer(),t.bindRenderbuffer(t.RENDERBUFFER,this.rbColor),t.renderbufferStorageMultisample(t.RENDERBUFFER,r,t.RGBA8,e,o),this.rbDepth=t.createRenderbuffer(),t.bindRenderbuffer(t.RENDERBUFFER,this.rbDepth),t.renderbufferStorageMultisample(t.RENDERBUFFER,r,t.DEPTH_COMPONENT24,e,o),this.fboMS=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.fboMS),t.framebufferRenderbuffer(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.RENDERBUFFER,this.rbColor),t.framebufferRenderbuffer(t.FRAMEBUFFER,t.DEPTH_ATTACHMENT,t.RENDERBUFFER,this.rbDepth),this.texResolve=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.texResolve),t.texStorage2D(t.TEXTURE_2D,1,t.RGBA8,e,o),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.fboResolve=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.fboResolve),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.texResolve,0),this.overlay&&(this.texResolveB=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.texResolveB),t.texStorage2D(t.TEXTURE_2D,1,t.RGBA8,e,o),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.fboResolveB=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.fboResolveB),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.texResolveB,0)),t.bindFramebuffer(t.FRAMEBUFFER,null)}_bind(){const t=this.canvas;t.addEventListener("pointerdown",o=>{o.button===0&&(this.dragging=!0,this.pointerId=o.pointerId,this.last={x:o.clientX,y:o.clientY},this.velocity.x=this.velocity.y=0,document.body.classList.add("is-dragging"),o.pointerType!=="touch"&&t.setPointerCapture(o.pointerId))}),window.addEventListener("pointermove",o=>{if(this.pointer.x=o.clientX,this.pointer.y=o.clientY,!this.dragging||o.pointerId!==this.pointerId)return;const r=o.clientX-this.last.x,i=o.clientY-this.last.y;this.last={x:o.clientX,y:o.clientY};const l=Math.max(this.camZ,this.persp*.02)/this.persp;this.target.x-=r*l,this.target.y-=i*l,this.velocity.x=r*l,this.velocity.y=i*l},{passive:!0});const e=o=>{!this.dragging||o&&o.pointerId!==this.pointerId||(this.dragging=!1,document.body.classList.remove("is-dragging"),this.target.x-=this.velocity.x*14,this.target.y-=this.velocity.y*14,this.velocity.x=this.velocity.y=0)};window.addEventListener("pointerup",e),window.addEventListener("pointercancel",e),window.addEventListener("keydown",o=>{if(this.occluded)return;const i={ArrowLeft:[-this.cell,0],ArrowRight:[this.cell,0],ArrowUp:[0,-this.cell],ArrowDown:[0,this.cell]}[o.key];i&&(o.target?.closest?.("a, button, input, textarea, select, [contenteditable], [tabindex]")||(o.preventDefault(),this.target.x+=i[0],this.target.y+=i[1]))})}uploadTile(t,e){if(!this.gl||!this.tex||t<0||t>=this.projects.length||!e||e.width===0&&e.height===0)return;const o=this.gl;o.bindTexture(o.TEXTURE_2D_ARRAY,this.tex),o.pixelStorei(o.UNPACK_FLIP_Y_WEBGL,!1),o.texSubImage3D(o.TEXTURE_2D_ARRAY,0,0,0,t,vt,vt,1,o.RGBA,o.UNSIGNED_BYTE,e),typeof e.close=="function"&&e.close(),this._dirty=!0,clearTimeout(this._mipTimer),this._mipTimer=setTimeout(()=>{!this.gl||!this.tex||(this.gl.bindTexture(this.gl.TEXTURE_2D_ARRAY,this.tex),this.gl.generateMipmap(this.gl.TEXTURE_2D_ARRAY),this._dirty=!0,this._mipWait=Math.min((this._mipWait??150)*2,1200))},this._mipWait??150)}finishUploads(){clearTimeout(this._mipTimer),this._mipWait=150,!(!this.gl||!this.tex)&&(this.gl.bindTexture(this.gl.TEXTURE_2D_ARRAY,this.tex),this.gl.generateMipmap(this.gl.TEXTURE_2D_ARRAY),this._dirty=!0)}
144reveal(){this.revealing=!0,this.revealT=0,this._dirty=!0}resize(){this._lastSourceTex=null,this._dirty=!0,this.measure()}_tick(t){const e=Math.min(64,t-this.lastTime);if(this.lastTime=t,requestAnimationFrame(this._tick),this.occluded)return;this.hold+=((this.dragging?1:0)-this.hold)*(1-Math.pow(1-xo,e/16.667));const o=this.dragging?.26:.075,r=1-Math.pow(1-o,e/16.667),i=this.pos.x,l=this.pos.y;this.pos.x+=(this.target.x-this.pos.x)*r,this.pos.y+=(this.target.y-this.pos.y)*r;const u=this.pos.x-i,c=this.pos.y-l;this.smoothVel.x+=(u-this.smoothVel.x)*.2,this.smoothVel.y+=(c-this.smoothVel.y)*.2,this.smoothPointer.x<-1e4&&(this.smoothPointer.x=this.pointer.x,this.smoothPointer.y=this.pointer.y),this.smoothPointer.x+=(this.pointer.x-this.smoothPointer.x)*.15,this.smoothPointer.y+=(this.pointer.y-this.smoothPointer.y)*.15,this.revealing&&(this.revealT=Math.min(1,this.revealT+e/1250),this.revealT>=1&&(this.revealing=!1));const h=!this.dragging&&!this.revealing&&!this._dirty&&this.hold<.001&&Math.abs(this.target.x-this.pos.x)+Math.abs(this.target.y-this.pos.y)<.05&&Math.abs(this.smoothVel.x)+Math.abs(this.smoothVel.y)<.01&&Math.abs(this.pointer.x-this.smoothPointer.x)+Math.abs(this.pointer.y-this.smoothPointer.y)<.05&&this.camZ===this._lastCamZ&&this._lastSourceTex;this._lastCamZ=this.camZ,h?(this._lastFrameAt=t,t-this._lastCalmDraw>=1e3/12&&(this._lastCalmDraw=t,this._postOnly(t),this.stats.calm++)):(this._watchFrames(t),this._dirty=!1,this._draw(t),this.stats.full++)}_postOnly(t){const e=this.gl;!e||!this._lastSourceTex||(e.bindFramebuffer(e.FRAMEBUFFER,null),e.viewport(0,0,this.dw,this.dh),e.useProgram(this.postProg),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,this._lastSourceTex),e.uniform1i(this.postU.uScene,0),e.uniform2f(this.postU.uResolution,this.dw,this.dh),e.uniform1f(this.postU.uTime,t*.001),e.drawArrays(e.TRIANGLES,0,3))}set occluded(t){t!==this._occluded&&(this._occluded=t,this.canvas.style.visibility=t?"hidden":"",t||(this._dirty=!0))}get occluded(){return this._occluded}_watchFrames(t){const e=this._lastFrameAt||t;this._lastFrameAt=t;const o=t-e;if(o<=0||o>500||((this._gaps||=[]).push(o),this._gaps.length<45))return;const r=[...this._gaps].sort((l,u)=>l-u),i=r[r.length>>1];this._gaps.length=0,i>41&&(this._dprCap??2)>1&&(this._msaa=2,this._dprCap=Math.max(1,(this._dprCap??2)-(i>60?.5:.25)),this.resize())}get drawR(){return this.R*(1-Ro*this.hold)}get drawCamZ(){return this.camZ*(1+To*this.hold)}pick(t,e){const{cell:o,persp:r,pos:i,media:l}=this,u=this.drawR,c=this.drawCamZ,h=this.canvas.getBoundingClientRect(),d=t-h.left-this.vw/2,n=e-h.top-this.vh/2,p=Math.round(i.x/o),v=Math.round(i.y/o),g=(this.cols-1)/2,R=(this.rows-1)/2,S=this.projects.length;let _=null;for(let A=0;A<this.rows;A++)for(let w=0;w<this.cols;w++){const L=p+w-g,O=v+A-R,U=(L*o-i.x)/u,q=(O*o-i.y)/u,E=Math.cos(U),M=Math.cos(q),G=c-u*(2-E-M);if(E*M<.45||G<r*this.depthCull)continue;const f=r/G,m=u*Math.sin(U)*f,C=u*Math.sin(q)*f,F=l*f/2;Math.abs(d-m)>F||Math.abs(n-C)>F||_&&_.scale>=f||(_={index:Re(L,O)%S,sx:m,sy:C,size:F*2,scale:f})}return _?{index:_.index,sx:_.sx+this.vw/2+h.left,sy:_.sy+this.vh/2+h.top,size:_.size}:null}_pack(){const{cell:t,persp:e,pos:o}=this,r=this.drawR,i=this.drawCamZ,l=Math.round(o.x/t),u=Math.round(o.y/t),c=(this.cols-1)/2,h=(this.rows-1)/2,d=this.projects.length,n=this.instances,p=this.smoothPointer.x-this.vw/2,v=this.smoothPointer.y-this.vh/2,g=t*1.5;let R=0;for(let S=0;S<this.rows;S++)for(let _=0;_<this.cols;_++){const A=l+_-c,w=u+S-h,L=A*t-o.x,O=w*t-o.y,U=L/r,q=O/r,E=Math.cos(U),M=Math.cos(q),G=r*(2-E-M),f=i-G;if(E*M<.45||f<e*this.depthCull)continue;const m=e/f,C=r*Math.sin(U)*m,F=r*Math.sin(q)*m,H=t*m;if(Math.abs(C)>this.vw*.5+H||Math.abs(F)>this.vh*.5+H)continue;let $=1-Math.hypot(C-p,F-v)/g;$=$<=0?0:$*$*(3-2*$);const I=R*4;n[I]=A,n[I+1]=w,n[I+2]=Re(A,w)%d,n[I+3]=$,R++}return R}_draw(t){const e=this.gl,o=this._pack();e.bindBuffer(e.ARRAY_BUFFER,this.instBuf),e.bufferData(e.ARRAY_BUFFER,this.instances,e.DYNAMIC_DRAW),e.bindFramebuffer(e.FRAMEBUFFER,this.fboMS),e.viewport(0,0,this.dw,this.dh),e.clearColor(0,0,0,1),e.clearDepth(1),e.clear(e.COLOR_BUFFER_BIT|e.DEPTH_BUFFER_BIT),e.enable(e.DEPTH_TEST),e.depthFunc(e.LEQUAL),e.enable(e.SAMPLE_ALPHA_TO_COVERAGE),e.useProgram(this.gridProg),e.bindVertexArray(this.vao),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D_ARRAY,this.tex);const r=this.gridU;e.uniform1i(r.uTex,0),e.uniform2f(r.uOffset,this.pos.x,this.pos.y),e.uniform2f(r.uCell,this.cell,this.cell),e.uniform2f(r.uMedia,this.media,this.media),e.uniform2f(r.uMediaPx,this.media,this.media),e.uniform1f(r.uRadius,this.radius),e.uniform1f(r.uZoom,Ao),e.uniform1f(r.uDepth,this.media*bo*this.parallax),e.uniform2f(r.uDrag,Rt(this.smoothVel.x*be,-this.media*.04,this.media*.04),Rt(this.smoothVel.y*be,-this.media*.04,this.media*.04)),e.uniform1f(r.uR,this.drawR),e.uniform1f(r.uPersp,this.persp),e.uniform1f(r.uCamZ,this.drawCamZ),e.uniform2f(r.uHalfViewport,this.vw/2,this.vh/2),e.uniform1f(r.uReveal,this.revealT),e.drawElementsInstanced(e.TRIANGLES,this.indexCount,e.UNSIGNED_SHORT,0,o),e.disable(e.SAMPLE_ALPHA_TO_COVERAGE),e.bindVertexArray(null),this.scenePass?.(e,{focal:this.persp,camZ:this.camZ,halfW:this.vw/2,halfH:this.vh/2}),e.disable(e.DEPTH_TEST),e.bindFramebuffer(e.READ_FRAMEBUFFER,this.fboMS),e.bindFramebuffer(e.DRAW_FRAMEBUFFER,this.fboResolve),e.blitFramebuffer(0,0,this.dw,this.dh,0,0,this.dw,this.dh,e.COLOR_BUFFER_BIT,e.LINEAR);let i=this.texResolve;this.overlay&&(e.bindFramebuffer(e.FRAMEBUFFER,this.fboMS),e.viewport(0,0,this.dw,this.dh
144),this.overlay.draw(e,this.texResolve,{focal:this.persp,camZ:this.persp,halfW:this.vw/2,halfH:this.vh/2,resolution:[this.dw,this.dh],time:t}),e.bindFramebuffer(e.READ_FRAMEBUFFER,this.fboMS),e.bindFramebuffer(e.DRAW_FRAMEBUFFER,this.fboResolveB),e.blitFramebuffer(0,0,this.dw,this.dh,0,0,this.dw,this.dh,e.COLOR_BUFFER_BIT,e.LINEAR),i=this.texResolveB),e.bindFramebuffer(e.FRAMEBUFFER,null),e.viewport(0,0,this.dw,this.dh),e.useProgram(this.postProg),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,i),e.uniform1i(this.postU.uScene,0),e.uniform2f(this.postU.uResolution,this.dw,this.dh),e.uniform1f(this.postU.uTime,t*.001),e.drawArrays(e.TRIANGLES,0,3),this._lastSourceTex=i,this.drawn=o}}const Pe=` 145attribute vec2 aPosition; 146varying vec2 vUv; 147void main() { 148 vUv = aPosition * 0.5 + 0.5; 149 gl_Position = vec4(aPosition, 0.0, 1.0); 150}`,Co=`precision highp float; 151varying vec2 vUv; 152uniform sampler2D uTex; 153uniform vec2 uDir; 154void main() { 155 float w0 = 0.2270270270, w1 = 0.1945945946, w2 = 0.1216216216; 156 float w3 = 0.0540540541, w4 = 0.0162162162; 157 vec4 c = texture2D(uTex, vUv) * w0; 158 c += texture2D(uTex, vUv + uDir) * w1; 159 c += texture2D(uTex, vUv - uDir) * w1; 160 c += texture2D(uTex, vUv + uDir * 2.0) * w2; 161 c += texture2D(uTex, vUv - uDir * 2.0) * w2; 162 c += texture2D(uTex, vUv + uDir * 3.0) * w3; 163 c += texture2D(uTex, vUv - uDir * 3.0) * w3; 164 c += texture2D(uTex, vUv + uDir * 4.0) * w4; 165 c += texture2D(uTex, vUv - uDir * 4.0) * w4; 166 gl_FragColor = c; 167}`,Io=`precision highp float; 168varying vec2 vUv; 169 170uniform sampler2D uMask; 171uniform sampler2D uB0; 172uniform sampler2D uB1; 173uniform sampler2D uB2; 174uniform sampler2D uB3; 175uniform vec2 uSplit; 176uniform float uBloom; 177uniform vec3 uWarm; 178uniform vec3 uCool; 179uniform vec3 uRed; 180uniform float uCore; 181uniform float uNoise; 182uniform float uTime; 183uniform float uAspect; 184uniform vec2 uResolution; 185uniform float uSpectral; 186 187float hash(vec2 p) { 188 p = fract(p * vec2(123.34, 345.45)); 189 p += dot(p, p + 34.345); 190 return fract(p.x * p.y); 191} 192 193float bloomAt(vec2 uv) { 194 float b = 0.0; 195 b += texture2D(uB0, uv).r * 0.85; 196 b += texture2D(uB1, uv).r * 0.55; 197 b += texture2D(uB2, uv).r * 0.22; 198 b += texture2D(uB3, uv).r * 0.10; 199 return b; 200} 201 202vec3 spectralTint(float u) { 203 u = clamp(u, 0.0, 1.0); 204 if (u < 0.5) return mix(uWarm, uRed, u * 2.0); 205 return mix(uRed, uCool, (u - 0.5) * 2.0); 206} 207 208vec3 spectralFringe(vec2 uv, vec2 split) { 209 vec2 fromC = (uv - 0.5) * vec2(uAspect, 1.0); 210 float disp = 0.6 + 0.9 * clamp(length(fromC), 0.0, 1.0); 211 vec2 stepv = split * disp; 212 vec3 acc = vec3(0.0); 213 const int N = 5; 214 for (int i = 0; i < N; i++) { 215 float f = float(i) / float(N - 1); 216 acc += spectralTint(f) * bloomAt(uv + stepv * ((f - 0.5) * 2.0)); 217 } 218 return acc / float(N); 219} 220 221void main() { 222 vec2 uv = vUv; 223 vec2 s = uSplit; 224 225 float bw = bloomAt(uv + s); 226 float bc = bloomAt(uv - s); 227 float br = bloomAt(uv + vec2(-s.y, s.x) * 0.6); 228 229 vec3 baseRaw = uWarm * bw + uCool * bc + uRed * br; 230 vec3 raw = mix(baseRaw, spectralFringe(uv, s), clamp(uSpectral, 0.0, 1.0) * 0.55) * uBloom; 231 232 vec3 glow = vec3(1.0) - exp(-raw); 233 234 float core = texture2D(uMask, uv).r; 235 glow += vec3(uCore) * smoothstep(0.35, 0.55, core) * (1.0 - smoothstep(0.6, 0.9, core)); 236 237 if (uNoise > 0.0) { 238 float g = hash(uv * uResolution * 0.5 + uTime); 239 glow += (g - 0.5) * uNoise * (0.4 + 0.6 * length(glow)); 240 } 241 242 gl_FragColor = vec4(max(glow, 0.0), 1.0); 243}`,Le=[{scale:.5,radius:1.5},{scale:.25,radius:2},{scale:.125,radius:2.5},{scale:.0625,radius:3}],ko={word:"FOCUS",bloom:1.41,split:10.5,core:.84,spectral:.35,noise:0,warm:[1,.66,.5],cool:[.42,.6,.95],red:[1,.42,.6]};function Bo(s,t,e,o,r,i){const l=document.createElement("canvas");l.width=Math.max(1,Math.round(t)),l.height=Math.max(1,Math.round(e));const u=l.getContext("2d"),c=(s||"").trim();if(!c)return l;u.font=`900 ${r}px ${o}`,u.fillStyle="#fff",u.textBaseline="middle",u.textAlign="left";const h=[...c],d=r*.02,n=h.map(g=>u.measureText(g).width),p=n.reduce((g,R)=>g+R,0)+d*(h.length-1);let v=l.width/2-p/2;for(let g=0;g<h.length;g++)u.fillText(h[g],v,i),v+=n[g]+d;return l}class Oo{constructor(t,e={}){this.host=t,this.params={...ko,...e},this.ok=!1;const o=document.createElement("canvas");Object.assign(o.style,{position:"absolute",inset:"0",width:"100%",height:"100%",display:"block"}),t.appendChild(o),this.canvas=o;const r=o.getContext("webgl",{alpha:!1,antialias:!1,premultipliedAlpha:!1});if(r){this.gl=r;try{this.blurProg=this._program(Pe,Co),this.compProg=this._program(Pe,Io)}catch(i){console.warn("[chroma] shader build failed:",i.message),this.gl=null;return}this.blurLoc=this._uniforms(this.blurProg),this.compLoc=this._uniforms(this.compProg),this.quad=r.createBuffer(),r.bindBuffer(r.ARRAY_BUFFER,this.quad),r.bufferData(r.ARRAY_BUFFER,new Float32Array([-1,-1,3,-1,-1,3]),r.STATIC_DRAW),this.levels=[],this.resize(),this.ok=!0}}_program(t,e){const o=this.gl,r=(l,u)=>{const c=o.createShader(l);if(o.shaderSource(c,u),o.compileShader(c),!o.getShaderParameter(c,o.COMPILE_STATUS))throw new Error(o.getShaderInfoLog(c));return c},i=o.createProgram();if(o.attachShader(i,r(o.VERTEX_SHADER,t)),o.attachShader(i,r(o.FRAGMENT_SHADER,e)),o.linkProgram(i),!o.getProgramParameter(i,o.LINK_STATUS))throw new Error(o.getProgramInfoLog(i));return i}_uniforms(t){const e=this.gl,o={},r=e.getProgramParameter(t,e.ACTIVE_UNIFORMS);for(let i=0;i<r;i++){const l=e.getActiveUniform(t,i).name.replace(/\[0\]$/,"");o[l]=e.getUniformLocation(t,l)}return o}_target(t,e){const o=this.gl,r=o.createTexture();o.bindTexture(o.TEXTURE_2D,r),o.texImage2D(o.TEXTURE_2D,0,o.RGBA,t,e,0,o.RGBA,o.UNSIGNED_BYTE,null),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_MIN_FILTER,o.LINEAR),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_MAG_FILTER,o.LINEAR),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_WRAP_S,o.CLAMP_TO_EDGE),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_WRAP_T,o.CLAMP_TO_EDGE);const i=o.createFramebuffer();return o.bindFramebuffer(o.FRAMEBUFFER,i),o.framebufferTexture2D(o.FRAMEBUFFER,o.COLOR_ATTACHMENT0,o.TEXTURE_2D,r,0),o.bindFramebuffer(o.FRAMEBUFFER,null),{fb:i,tex:r,w:t,h:e}}setType(t){this.type=t,this._buildMask()}_buildMask(){const t=this.gl;
243if(!t||!this.type)return;const e=Bo(this.params.word,this.canvas.width,this.canvas.height,this.type.font,this.type.sizePx*this.dpr,this.type.centerY*this.dpr);this.mask||(this.mask=t.createTexture()),t.bindTexture(t.TEXTURE_2D,this.mask),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),t.pixelStorei(t.UNPACK_FLIP_Y_WEBGL,!0),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,t.RGBA,t.UNSIGNED_BYTE,e),t.pixelStorei(t.UNPACK_FLIP_Y_WEBGL,!1)}resize(){const t=this.gl;if(!t)return;const e=this.host.getBoundingClientRect();this.dpr=Math.min(1.25,window.devicePixelRatio||1);const o=Math.max(1,Math.round(e.width*this.dpr)),r=Math.max(1,Math.round(e.height*this.dpr));if(!(o===this.canvas.width&&r===this.canvas.height&&this.levels.length)){this.canvas.width=o,this.canvas.height=r,t.viewport(0,0,o,r);for(const i of this.levels)t.deleteFramebuffer(i.out.fb),t.deleteTexture(i.out.tex),t.deleteFramebuffer(i.tmp.fb),t.deleteTexture(i.tmp.tex);this.levels=Le.map(i=>{const l=Math.max(2,Math.round(o*i.scale)),u=Math.max(2,Math.round(r*i.scale));return{out:this._target(l,u),tmp:this._target(l,u)}}),this._buildMask()}}setParams(t){Object.assign(this.params,t)}render(t){const e=this.gl;if(!e||!this.mask||!this.levels.length)return;const o=this.params;e.useProgram(this.blurProg),e.bindBuffer(e.ARRAY_BUFFER,this.quad);const r=e.getAttribLocation(this.blurProg,"aPosition");e.enableVertexAttribArray(r),e.vertexAttribPointer(r,2,e.FLOAT,!1,0,0);for(let c=0;c<this.levels.length;c++){const h=this.levels[c],d=c===0?this.mask:this.levels[c-1].out.tex,n=Le[c].radius;e.bindFramebuffer(e.FRAMEBUFFER,h.tmp.fb),e.viewport(0,0,h.tmp.w,h.tmp.h),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,d),e.uniform1i(this.blurLoc.uTex,0),e.uniform2f(this.blurLoc.uDir,n/h.tmp.w,0),e.drawArrays(e.TRIANGLES,0,3),e.bindFramebuffer(e.FRAMEBUFFER,h.out.fb),e.viewport(0,0,h.out.w,h.out.h),e.bindTexture(e.TEXTURE_2D,h.tmp.tex),e.uniform2f(this.blurLoc.uDir,0,n/h.out.h),e.drawArrays(e.TRIANGLES,0,3)}e.bindFramebuffer(e.FRAMEBUFFER,null),e.viewport(0,0,this.canvas.width,this.canvas.height),e.useProgram(this.compProg),e.bindBuffer(e.ARRAY_BUFFER,this.quad);const i=e.getAttribLocation(this.compProg,"aPosition");e.enableVertexAttribArray(i),e.vertexAttribPointer(i,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,this.mask),e.uniform1i(this.compLoc.uMask,0);for(let c=0;c<4;c++)e.activeTexture(e.TEXTURE1+c),e.bindTexture(e.TEXTURE_2D,this.levels[c].out.tex),e.uniform1i(this.compLoc[`uB${c}`],1+c);const l=o.split/620,u=Math.sin(t*1.1)*.9;e.uniform2f(this.compLoc.uSplit,l*u,l*Math.cos(t*.8)*.5),e.uniform1f(this.compLoc.uBloom,o.bloom),e.uniform3f(this.compLoc.uWarm,...o.warm),e.uniform3f(this.compLoc.uCool,...o.cool),e.uniform3f(this.compLoc.uRed,...o.red),e.uniform1f(this.compLoc.uCore,o.core),e.uniform1f(this.compLoc.uSpectral,o.spectral),e.uniform1f(this.compLoc.uNoise,o.noise),e.uniform1f(this.compLoc.uTime,t),e.uniform1f(this.compLoc.uAspect,this.canvas.width/Math.max(1,this.canvas.height)),e.uniform2f(this.compLoc.uResolution,this.canvas.width,this.canvas.height),e.drawArrays(e.TRIANGLES,0,3)}}b.registerPlugin(et);const No="3OpsgOtKr3pxuub3SlCJ",Fe=.46,B=.62,Ot=1.2,Xo={bloom:1.41,split:10.5,core:.84,spectral:.35,noise:0,warm:[1,.66,.5],cool:[.42,.6,.95],red:[1,.42,.6]};function Go(s,{autoRevealTitle:t=!0}={}){const e=document.querySelector(".section--focus");if(!e)return;const o=x=>e.querySelector(x),r=o(".focus__stage"),i=o(".focus__title"),l=o(".focus__dots"),u=o(".focus__dot--l"),c=o(".focus__dot--r"),h=o(".focus__charge"),d=o(".focus__flash"),n=o(".focus__glow"),p=o(".focus__unicorn"),v=o(".focus__rays"),g=o(".focus__wash"),R=o(".focus__sparks"),S=o(".focus__motes"),_=e.querySelectorAll(".focus__ring"),A=o(".focus__chroma");let w=0,L=null;const O=()=>{if(!L)return;L.resize();const x=getComputedStyle(i);L.setType({font:x.fontFamily,sizePx:parseFloat(x.fontSize),centerY:ho(i).y})};if(!fo())try{L=new Oo(A,{word:"FOCUS",...Xo}
243),L.ok?(document.fonts?.ready.then(O),O(),b.ticker.add(x=>{w>.01&&L.render(x)}),Wt(O)):L=null}catch(x){console.warn("[focus] chroma glow unavailable:",x.message)}const U=(x,N)=>{const z=Math.sin(x*127.1+N*311.7)*43758.5453;return z-Math.floor(z)},q=Math.min(1,Math.sqrt(innerWidth*innerHeight/(2084*1233))),E=.6+q*.4,M=x=>U(x,7)>.78,G=Math.max(34,Math.round(88*q)),f=Array.from({length:G},(x,N)=>{const z=document.createElement("span");z.className="focus__mote";const a=(M(N)?10+U(N,5)*7:2.6+U(N,5)*4.4)*E;return z.style.width=`${a}px`,z.style.height=`${a}px`,z.style.marginLeft=`${-a/2}px`,z.style.marginTop=`${-a/2}px`,S.appendChild(z),z}),m=o("#focus-goo feGaussianBlur"),C=()=>{if(!m)return;const x=u.getBoundingClientRect().width;x>0&&m.setAttribute("stdDeviation",(x*.152).toFixed(2))};C(),Wt(C);const F=Math.max(12,Math.round(24*q)),H=Array.from({length:F},()=>{const x=document.createElement("span");return x.className="focus__spark",R.appendChild(x),x});s.on("scroll",et.update);const $=i.textContent.trim();i.setAttribute("aria-label",$),i.innerHTML=[...$].map(x=>`<span class="focus__mask" aria-hidden="true"><span class="focus__letter">${x}</span></span>`).join("");const I=i.querySelectorAll(".focus__letter");b.set(I,{yPercent:120}),i.classList.add("is-parked"),i.removeAttribute("data-unclaimed");const j=Ve(r).layer(i,$);let at=!1,T=null;const y=x=>{x!==at&&(at=x,T?.kill(),b.killTweensOf(I),x?(i.classList.remove("is-parked"),T=b.to(I,{yPercent:0,duration:1.15,ease:"expo.out",stagger:.055,onComplete:()=>{at&&i.classList.add("is-revealed")}}),j.state.a=1):(i.classList.remove("is-revealed"),i.classList.add("is-parked"),b.set(I,{yPercent:120}),j.state.a=0,j.render()))},st=()=>y(!0);t&&et.create({trigger:e,start:"top 65%",onEnter:st,onLeaveBack:()=>y(!1)}),b.set([u,c],{xPercent:-50,yPercent:-50});const D=b.timeline({paused:!0});D.fromTo(u,{x:()=>-innerWidth*Fe},{x:0,ease:"power2.inOut",duration:B},0).fromTo(c,{x:()=>innerWidth*Fe},{x:0,ease:"power2.inOut",duration:B},0),D.fromTo([u,c],{backgroundColor:"#3a3a3a"},{backgroundColor:"#eafdff",ease:"power2.in",duration:B*.45},B*.55).fromTo(h,{opacity:0,scale:.15},{opacity:.75,scale:.62,ease:"power2.in",duration:B*.45},B*.55),f.forEach((x,N)=>{const z=U(N,1)*Math.PI*2,P=M(N),a=(P?.24:.12)+U(N,2)*.28,k=B*((P?.06:.14)+U(N,3)*.5);D.fromTo(x,{x:()=>Math.cos(z)*innerWidth*a,y:()=>Math.sin(z)*innerWidth*a*.55,opacity:0,scale:.5+U(N,4)*.8},{x:0,y:0,opacity:.55+U(N,6)*.45,scale:.45,duration:B-k,ease:"power2.in"},k).to(x,{opacity:0,duration:.04,ease:"power2.in"},B)}),D.to([u,c],{scale:.82,duration:.05,ease:"power2.in"},B-.05),D.to(l,{opacity:0,duration:.06,ease:"power2.in"},B).to(h,{opacity:0,scale:2.4,duration:.18,ease:"power2.out"},B).fromTo(d,{opacity:0,scale:.04},{opacity:1,scale:1.05,duration:.07,ease:"power3.out"},B).to(d,{opacity:0,scale:1.9,duration:.22,ease:"power2.out"},B+.07),_.forEach((x,N)=>{D.fromTo(x,{opacity:.95,scale:.08},{opacity:0,scale:2.6+N*1.1,duration:.3+N*.09,ease:"power2.out",immediateRender:!1},B+N*.045)}),D.fromTo(v,{opacity:0,scale:.06,rotate:-14},{opacity:.85,scale:1,rotate:0,duration:.16,ease:"power3.out"},B).to(v,{opacity:0,scale:1.5,rotate:10,duration:.34,ease:"power2.out"},B+.16),D.fromTo(g,{opacity:0},{opacity:.9,duration:.04,ease:"power2.out"},B).to(g,{opacity:0,duration:.26,ease:"power2.out"},B+.04),H.forEach((x,N)=>{const z=N/F*Math.PI*2+N%4*.19,P=.16+N*7%11*.028;D.fromTo(x,{opacity:1,x:0,y:0,scale:1},{x:()=>Math.cos(z)*innerWidth*P,y:()=>Math.sin(z)*innerWidth*P*.62,opacity:0,scale:.25,duration:.3+N%5*.045,ease:"power3.out",immediateRender:!1},B+.01)}),D.fromTo(n,{opacity:0,scale:.2},{opacity:.95,scale:1,duration:.2,ease:"power2.out"},B+.02).to(n,{opacity:0,scale:1.35,duration:.06,ease:"power1.inOut"},B+.22),D.fromTo(A,{opacity:0},{opacity:1,duration:.05,ease:"power3.out",onUpdate(){w=Number(A.style.opacity)||0}},B).to(A,{opacity:0,duration:.45,ease:"power2.out",onUpdate(){w=Number(A.style.opacity)||0}},B+.07).to(i,{scale:1.055,duration:.05,ease:"power3.out"},B).to(i,{scale:1,duration:.4,ease:"elastic.out(1, 0.55)"},B+.05),D.fromTo(p,{opacity:0},{opacity:1,duration:.14,ease:"power1.inOut"},B+.1),D.to(p,{opacity:0,duration:.1,ease:"power2.inOut"},Ot).to(i,{yPercent:-110,opacity:0,duration:.1,ease:"power3.in"},Ot).fromTo(j.state,{k:Yt},{k:ze,duration:.1,ease:"power3.in",onUpdate:j.render,immediateRender:!1},Ot);let W=null;et.create({trigger:e,start:"top bottom",once:!0,onEnter:async()=>{try{const x=qe("feature");
243if(x.skip)return;W=await(await He()).addScene({elementId:"focus-boom",projectId:No,scale:1,dpi:x.dpi,fps:x.fps,lazyLoad:!1,production:!0}),p.classList.add("is-live")}catch(x){console.warn("[focus] Unicorn Studio unavailable, using CSS fallback:",x.message)}}}),Wt(()=>et.refresh());const ct=b.to(j.state,{k:Yt,duration:1,ease:"back.out(0.9)",paused:!0,onUpdate:j.render});return{timeline:D,stage:r,section:e,revealTitle:st,setTitleShown:y,setWarpProgress:x=>{D.time()>=Ot||ct.progress(x<0?0:x>1?1:x)}}}b.registerPlugin(et);const Wo="UDo4DKtCyQuiRiYQfDwk",qo=.5,Ze=1233,Ho=(s,t)=>Math.min(1.1,Math.max(.5,Math.pow(Math.min(s,t)/Ze,.6))),Yo=(s,t)=>Math.max(24,Math.min(74,Math.round(74*Math.sqrt(s*t/(2084*Ze))))),K={titleIn:.056,hubStart:.005,hubEnd:.063,riseStart:.011,riseEnd:.216,connectStart:.228,connectEnd:.569,exitStart:.58,detach:.86},Y=(s,t)=>{const e=Math.sin(s*127.1+t*311.7)*43758.5453;return e-Math.floor(e)},rt=s=>s<0?0:s>1?1:s,De=s=>1-Math.pow(1-s,3),te=s=>s*s*s*(s*(s*6-15)+10),Vo=s=>1+1.9*Math.pow(s-1,3)+.9*Math.pow(s-1,2),zo=s=>s<.5?2*s*s:1-Math.pow(-2*s+2,2)/2,Ue=(s,t,e,o,r)=>{const i=t+(e-t)*o*(1-r),l=i+(e-t)*r;return rt((s-i)/Math.max(1e-4,l-i))};function Zo(s,{titleExit:t=!1}={}){if(!s)return null;const e=s.querySelector(".listening__bg"),o=s.querySelector(".listening__canvas"),r=s.querySelector(".listening__title");s.querySelector(".focus__title");const i=o.getContext("2d"),l=s.getBoundingClientRect(),u=Array.from({length:Yo(l.width,l.height)},(T,y)=>{const st=Y(y,9)>.82,D=Y(y,10)>.62;let W=Y(y,2);return W>.28&&W<.46&&(W+=.2),{x:.04+Y(y,1)*.92,y:rt(W),r0:st?26+Y(y,3)*24:3+Y(y,3)*9,r:0,soft:D,riseDelay:Y(y,4),linkDelay:Y(y,5),exitDelay:Y(y,6),drift:(Y(y,7)-.5)*.04,arc:(Y(y,11)-.5)*.22,fx:.13+Y(y,12)*.2,fy:.11+Y(y,13)*.17,fp:Y(y,14)*Math.PI*2,fq:Y(y,15)*Math.PI*2,amp:.01+Y(y,16)*.022,pace:.85+Y(y,17)*.4,pulseSpeed:.1+Y(y,18)*.16,pulsePhase:Y(y,19),breath:.9+Y(y,20)*.9,follow:.045+Y(y,21)*.055}}),c=21,h={x:.5,y:.56,r:c};let d=0,n=0,p=1,v=1;const g={x:0,y:0,tx:0,ty:0,px:-1e5,py:-1e5},R=uo(s);addEventListener("pointermove",T=>{if(!R.on||T.pointerType!=="mouse")return;g.tx=T.clientX/innerWidth*2-1,g.ty=T.clientY/innerHeight*2-1;const y=o.getBoundingClientRect();g.px=T.clientX-y.left,g.py=T.clientY-y.top},{passive:!0});let S=-1,_=-1,A=0;const w=[];s.addEventListener("pointerdown",T=>{T.pointerType!=="mouse"||S<0||(_=S,A=0,s.setPointerCapture?.(T.pointerId))}),addEventListener("pointermove",T=>{_>=0&&(A+=Math.abs(T.movementX)+Math.abs(T.movementY))},{passive:!0}),addEventListener("pointerup",()=>{_>=0&&A<8&&w.push({i:_,t0:-1}),_=-1});const L=()=>{const T=s.getBoundingClientRect();p=Math.min(1.25,window.devicePixelRatio||1),d=T.width,n=T.height,o.width=Math.round(d*p),o.height=Math.round(n*p),i.setTransform(p,0,0,p,0,0),v=Ho(d,n);for(const y of u)y.r=y.r0*v;h.r=c*v};L();let O=!1,U=1;function q(T,y,st){if(T>=.999||T<=5e-4){O||(U=Math.max(0,U-st/180),o.style.opacity=U.toFixed(3),U<=0&&(i.clearRect(0,0,d,n),o.style.opacity="",s.style.cursor="",O=!0));return}(O||U<1)&&(U=1,o.style.opacity=""),O=!1,i.clearRect(0,0,d,n);const D=h.x*d,W=h.y*n;g.x+=(g.tx-g.x)*.05,g.y+=(g.ty-g.y)*.05;let ct=-1,jt=1/0;for(let P=0;P<u.length;P++){const a=u[P];if(a._x===void 0||a._a<.15)continue;const k=Math.hypot(g.px-a._x,g.py-a._y);k<Math.max(a.r*1.6,22*v)&&k<jt&&(jt=k,ct=P)}S=ct,s.style.cursor=ct>=0?"pointer":"";const x=rt((T-K.exitStart)/(1-K.exitStart)),N=rt((T-K.detach)/(1-K.detach));for(let P=0;P<u.length;P++){const a=u[P],k=rt(Ue(T,K.riseStart,K.riseEnd,a.riseDelay,.55)*a.pace),X=Vo(k),Q=te(rt((x-a.exitDelay*.45)/.55)),J=X*(1-Q),ut=Math.sin(y*a.fx+a.fp)*a.amp*J,nt=Math.cos(y*a.fy+a.fq)*a.amp*.7*J,pt=a.arc*(1-X),bt=(.25+Math.min(a.r,50)/50)*J;let At=(a.x+pt+ut+a.drift*Q)*d-g.x*26*bt,wt=(a.y+(1-X)*.62+nt-1.18*Q)*n-g.y*16*bt;if(a._len=Math.hypot(a.x*d-D,a.y*n-W)*1.02,P===_){let Tt=g.px-D,St=g.py-W;const dt=Math.hypot(Tt,St)||1;dt>a._len&&(Tt*=a._len/dt,St*=a._len/dt),At=D+Tt,wt=W+St}const gt=rt(k*2.2),yt=P===_?.35:a.follow/(1+Math.min(a.r,50)/60),Mt=1-Math.pow(1-yt,st/16.667);a._x===void 0&&(a._x=At,a._y=wt,a._a=gt),a._x+=(At-a._x)*Mt,a._y+=(wt-a._y)*Mt,a._a+=(gt-a._a)*Math.min(1,Mt*2.2)}if(T>K.connectStart)for(let P=0;P<u.length;P++){const a=u[P],k=te(Ue(T,K.connectStart,K.connectEnd,a.linkDelay,.45));if(k<=0||a._a<=.01)continue;const X=rt((N-a.linkDelay*.5)/.5),Q=De(X),J=Math.min(a.r,50)/50,ut=k*a._a,nt=a._len*.34,pt=Math.sin(y*1.3+a.fp)*nt*.1,bt=Math.sin(y*.85+a.fq)*nt*.22,At=D+(a._x+bt*1.15-D)*Q,wt=W+(a._y+nt-W)*Q,gt=a._x+(At-a._x)*k,yt=a._y+(wt-a._y)*k,Mt=Math.hypot(a._x-D,a._y-W),Tt=rt(1-Mt/Math.max(a._len,1)),St=Tt*a._len*.3*(1-Q)*k,dt=(a._x+gt)/2,kt=(a._y+yt)/2+St,_e=dt+(a._x+pt-dt)*Q,ve=kt+(a._y+nt*.45-kt)*Q,Ee=dt+(gt+bt*.4-dt)*Q,ye=kt+(yt-nt*.12-kt)*Q,eo=1-Tt;if(i.lineWidth=(.45+J*.45)*(.85+eo*.3)*v,i.strokeStyle=`rgba(255,255,255,${(.24+J*.32)*ut}
243)`,i.beginPath(),i.moveTo(a._x,a._y),i.bezierCurveTo(_e,ve,Ee,ye,gt,yt),i.stroke(),k>.98&&Q<.4){const tt=1-(y*a.pulseSpeed+a.pulsePhase)%1,it=1-tt,Kt=it*it*it*a._x+3*it*it*tt*_e+3*it*tt*tt*Ee+tt*tt*tt*gt,Qt=it*it*it*a._y+3*it*it*tt*ve+3*it*tt*tt*ye+tt*tt*tt*yt,Te=Math.sin(tt*Math.PI)*ut*.95*(1-Q/.4);if(Te>.02){const Jt=i.createRadialGradient(Kt,Qt,0,Kt,Qt,4+J*4);Jt.addColorStop(0,`rgba(255,255,255,${Te})`),Jt.addColorStop(1,"rgba(255,255,255,0)"),i.fillStyle=Jt,i.beginPath(),i.arc(Kt,Qt,4+J*4,0,Math.PI*2),i.fill()}}}for(let P=0;P<u.length;P++){const a=u[P];if(a._a<=.01)continue;const k=P===S?1:0,X=1-Math.pow(1-.16,st/16.667);a._h=(a._h||0)+(k-(a._h||0))*X;const Q=1+Math.sin(y*a.breath*.5+a.fp)*.05;if(a._h>.01){const J=i.createRadialGradient(a._x,a._y,0,a._x,a._y,a.r*4.5);J.addColorStop(0,`rgba(255,255,255,${.28*a._h*a._a})`),J.addColorStop(1,"rgba(255,255,255,0)"),i.fillStyle=J,i.beginPath(),i.arc(a._x,a._y,a.r*4.5,0,Math.PI*2),i.fill()}E(a._x,a._y,a.r*Q*(1+a._h*.35),a.soft,rt(a._a*(1+a._h*.5)))}for(let P=w.length-1;P>=0;P--){const a=w[P];a.t0<0&&(a.t0=y);const k=(y-a.t0)/1.1;if(k>=1){w.splice(P,1);continue}const X=u[a.i];if(!X||X._x===void 0){w.splice(P,1);continue}const Q=X.r+De(k)*90*v;i.strokeStyle=`rgba(255,255,255,${(1-k)*.5*X._a})`,i.lineWidth=1.5*v*(1-k),i.beginPath(),i.arc(X._x,X._y,Q,0,Math.PI*2),i.stroke();const J=zo(k),ut=X._x+(D-X._x)*J,nt=X._y+(W-X._y)*J,pt=i.createRadialGradient(ut,nt,0,ut,nt,11*v);pt.addColorStop(0,`rgba(255,255,255,${(1-k*.6)*X._a})`),pt.addColorStop(1,"rgba(255,255,255,0)"),i.fillStyle=pt,i.beginPath(),i.arc(ut,nt,11*v,0,Math.PI*2),i.fill()}const z=te(rt((T-K.hubStart)/(K.hubEnd-K.hubStart)));if(z>0){const P=z*(1-N),a=rt((T-K.connectStart)/(K.connectEnd-K.connectStart)),k=1+Math.sin(y*1.6)*.05+a*.22,X=i.createRadialGradient(D,W,0,D,W,h.r*k*5);X.addColorStop(0,`rgba(255,255,255,${.2*P*(.4+a)})`),X.addColorStop(1,"rgba(255,255,255,0)"),i.fillStyle=X,i.beginPath(),i.arc(D,W,h.r*k*5,0,Math.PI*2),i.fill(),E(D,W,h.r*k*z,!1,P)}}function E(T,y,st,D,W){if(D){const ct=i.createRadialGradient(T,y,0,T,y,st*2.1);ct.addColorStop(0,`rgba(255,255,255,${W})`),ct.addColorStop(.42,`rgba(255,255,255,${W*.75})`),ct.addColorStop(1,"rgba(255,255,255,0)"),i.fillStyle=ct,i.beginPath(),i.arc(T,y,st*2.1,0,Math.PI*2),i.fill()}else i.fillStyle=`rgba(255,255,255,${W})`,i.beginPath(),i.arc(T,y,st,0,Math.PI*2),i.fill()}const M=r.textContent.trim();r.setAttribute("aria-label",M),r.innerHTML=[...M].map(T=>`<span class="focus__mask" aria-hidden="true"><span class="focus__letter">${T}</span></span>`).join("");const G=r.querySelectorAll(".focus__letter");b.set(G,{yPercent:115}),r.removeAttribute("data-unclaimed");const f=Ve(s).layer(r,M);let m=0;const C=t?.999:2;let F=null,H=!1;async function $(){if(!(H||!e)){H=!0;try{const T=qe("ambient");if(T.skip)return;F=await(await He()).addScene({elementId:e.id,projectId:Wo,scale:1,dpi:T.dpi,fps:T.fps,lazyLoad:!1,production:!0}),e.classList.add("is-live")}catch(T){console.warn("[listening] Unicorn Studio unavailable:",T.message)}}}const I=b.timeline({paused:!0,onUpdate:()=>{m=I.progress();const T=m>5e-4&&m<C?1:0;f.state.a!==T&&(f.state.a=T,f.render()),T&&!H&&$()}});I.to(G,{yPercent:0,duration:K.titleIn,ease:"power3.out",stagger:{each:K.titleIn/60,from:"start"}},0),I.to(f.state,{k:Yt,duration:K.titleIn*4,ease:"back.out(0.9)",onUpdate:f.render},0),e&&(I.fromTo(e,{opacity:0},{opacity:qo,duration:K.titleIn*3,ease:"power2.out",immediateRender:!1},0),t&&I.to(e,{opacity:0,duration:.06,ease:"power2.in"},.94)),t&&(I.to(G,{yPercent:-115,duration:.05,ease:"power3.in",stagger:{each:.05/60,from:"start"}},.95),I.fromTo(f.state,{k:Yt},{k:ze,duration:.05,ease:"power3.in",onUpdate:f.render,immediateRender:!1},.95));const j=matchMedia("(prefers-reduced-motion: reduce)");let at=-1;return b.ticker.add((T,y)=>{if(!R.on){at=-1;return}if(j.matches){if(m===at)return;at=m,q(m,0,64);return}at=-1,q(m,T,Math.min(64,y))}),Wt(()=>{L(),et.refresh()}),{timeline:I}}function $o(){const s={travel:.35,settle:.25,squashDown:.15,squashBack:.45,overshoot:16,cardSquash:.2,cardInflate:.45},t=window.matchMedia("(prefers-reduced-motion: reduce)");let e=0;document.querySelectorAll("[data-bouncy-tabs-init]").forEach(o=>{const r=o.querySelector("[data-bouncy-tabs-nav]"),i=o.querySelector("[data-bouncy-tabs-indicator]"),l=o.querySelector("[data-bouncy-tabs-ghost]"),u=r?Array.from(r.querySelectorAll("[data-bouncy-tabs-button]")):[];if(!r||!i||u.length<2)return;const c=o.querySelector("[data-bouncy-tabs-card]"),h=o.querySelector("[data-bouncy-tabs-panels]"),d=h?Array.from(h.querySelectorAll("[data-bouncy-tabs-panel]")):[],n=!!(c&&h&&d.length);e+=1,u.forEach((f,m)=>{const C=d[m];C&&(f.id||(f.id="bouncy-tabs-"+e+"-tab-"+(m+1)),C.id||(C.id="bouncy-tabs-"+e+"-panel-"+(m+1)),f.setAttribute("aria-controls",C.id),C.setAttribute("aria-labelledby",f.id))});let p=Math.max(0,u.findIndex(f=>f.hasAttribute("data-active")));const v={left:0,right:0};let g=!1;const R=f=>t.matches?0:f;function S(){u.forEach((f,m)=>{f.toggleAttribute("data-active",m===p),m===p?f.setAttribute("aria-current","true"):f.removeAttribute("aria-current")})}function _(f){return{left:f.offsetLeft,right:f.offsetLeft+f.offsetWidth,top:f.offsetTop,height:f.offsetHeight}}function A(){b.set(i,{x:v.left,width:v.right-v.left})}function w(f){const m=_(u[f]);v.left=m.left,v.right=m.right,b.killTweensOf(v),b.killTweensOf(i),b.set(i,{scaleY:1,y:m.top,height:m.height}),A()}function L(){n&&b.set(h,{height:d[p].offsetHeight})}
243function O(){n&&(d.forEach((f,m)=>{b.killTweensOf(f),b.set(f,{autoAlpha:m===p?1:0,x:0}),f.toggleAttribute("data-active",m===p)}),b.set(c,{scaleX:1,scaleY:1,x:0}),L())}function U(f,m){if(!n)return;const C=m?1:-1,F=d[p],H=d[f];if(!F||!H)return;d.forEach(I=>{I!==F&&I!==H&&(b.killTweensOf(I),b.set(I,{autoAlpha:0,x:0}),I.removeAttribute("data-active"))}),F.setAttribute("data-active",""),H.removeAttribute("data-active"),b.killTweensOf([c,h,F,H]),b.set(c,{transformOrigin:"50% 50%"});const $=F.offsetHeight;b.timeline().to(c,{scaleX:.96,scaleY:1.02,x:C*10,duration:s.cardSquash,ease:"power2.out"},0).to(H,{x:C*-35,autoAlpha:0,duration:.2,ease:"power2.out"},0).to(h,{height:$,duration:.3,ease:"power2.inOut"},.1).fromTo(F,{x:C*35,autoAlpha:0},{x:0,autoAlpha:1,duration:.3,ease:"power2.out"},s.cardSquash).to(c,{scaleX:1,scaleY:1,x:0,duration:s.cardInflate,ease:"back.out(2)"},s.cardSquash).set(H,{x:0})}function q(f){if(f===p)return;const m=p,C=f>p;if(p=f,S(),t.matches){w(f),O();return}U(m,C);const F=_(u[f]);b.killTweensOf(v),b.killTweensOf(i);const H=F.left===v.left?C?1:-1:F.left>v.left?1:-1,$=Math.abs(F.left-v.left),I=Math.max(6,s.overshoot);let j=b.utils.clamp(6,I,$*.08)*H;H>0?j=Math.min(j,r.clientWidth-F.right):j=Math.max(j,-F.left),b.set(i,{transformOrigin:"50% 50%"}),b.to(i,{y:F.top,height:F.height,duration:s.travel,ease:"power3.out"}),b.timeline().to(v,{left:F.left+j,right:F.right+j,duration:s.travel,ease:"power3.out",onUpdate:A}).to(v,{left:F.left,right:F.right,duration:s.settle,ease:"power2.inOut",onUpdate:A}),b.timeline().to(i,{scaleY:.78,duration:s.squashDown,ease:"power2.out"}).to(i,{scaleY:1,duration:s.squashBack,ease:"back.out(2.5)"})}function E(f){if(!l)return;const m=_(f);g?b.to(l,{x:m.left,y:m.top,width:m.right-m.left,height:m.height,autoAlpha:1,duration:R(.3),ease:"power3.out"}):(g=!0,b.killTweensOf(l),b.set(l,{x:m.left,y:m.top,width:m.right-m.left,height:m.height}),b.to(l,{autoAlpha:1,duration:R(.25),ease:"power2.out"}))}function M(){l&&(g=!1,b.to(l,{autoAlpha:0,duration:R(.2),ease:"power1.out"}))}function G(){const f=new Set(u.map(m=>m.offsetTop));r.toggleAttribute("data-wrapped",f.size>1),w(p),L()}u.forEach((f,m)=>{f.addEventListener("click",()=>q(m)),f.addEventListener("mouseenter",()=>E(f))}),r.addEventListener("mouseleave",M),r.addEventListener("keydown",f=>{let m=null;f.key==="ArrowRight"&&(m=Math.min(u.length-1,p+1)),f.key==="ArrowLeft"&&(m=Math.max(0,p-1)),m!==null&&m!==p&&(f.preventDefault(),q(m),u[m].focus(),u[m].click())}),window.addEventListener("resize",G),document.fonts&&document.fonts.ready&&document.fonts.ready.then(G),l&&b.set(l,{autoAlpha:0}),d.forEach((f,m)=>b.set(f,{autoAlpha:m===p?1:0})),S(),G()})}const $e=38,je=[{w:9,reach:.4,alpha:.16},{w:6.8,reach:.52,alpha:.24},{w:5,reach:.64,alpha:.36},{w:3.4,reach:.76,alpha:.52},{w:2.1,reach:.88,alpha:.72},{w:1,reach:1,alpha:1}],jo=3.4,Ko=.16,Ce=.45,Pt=(s,t)=>Math.sin(s*.71+t)*.62+Math.sin(s*1.13+t*2.7)*.38,Ie=.24,Qo=.16,ke=.35,ft="http://www.w3.org/2000/svg",Jo="http://www.w3.org/1999/xlink";function ts(s,t){const e=s.getAttribute("viewBox")||"0 0 145 32",[o,r,i,l]=e.split(/[\s,]+/).map(Number),u=document.createElementNS(ft,"svg");u.setAttribute("viewBox",e),u.setAttribute("aria-hidden","true"),u.setAttribute("focusable","false"),u.classList.add("inkbleed"),u.style.overflow="visible";const c=document.createElementNS(ft,"defs"),h=document.createElementNS(ft,"g");h.id=`ink-mark-${t}`;for(const v of s.querySelectorAll("path")){const g=v.cloneNode(!1);g.removeAttribute("fill"),g.removeAttribute("stroke"),h.appendChild(g)}c.appendChild(h),u.appendChild(c);const d=v=>{const g=document.createElementNS(ft,"use");g.setAttribute("href",`#${h.id}`),g.setAttributeNS(Jo,"xlink:href",`#${h.id}`);for(const[R,S]of Object.entries(v))g.setAttribute(R,S);return g},n=$e,p=je.map((v,g)=>{const R=document.createElementNS(ft,"radialGradient");R.id=`ink-spot-${t}-${g}`,R.setAttribute("gradientUnits","userSpaceOnUse"),R.setAttribute("r","0.001");for(const[A,w]of[[0,1],[.5,.82],[.78,.4],[1,0]]){const L=document.createElementNS(ft,"stop");L.setAttribute("offset",String(A)),L.setAttribute("stop-color","#fff"),L.setAttribute("stop-opacity",String(w)),R.appendChild(L)}c.appendChild(R);const S=document.createElementNS(ft,"mask");S.id=`ink-mask-${t}-${g}`,S.setAttribute("maskUnits","userSpaceOnUse"),S.setAttribute("x",String(o-n)),S.setAttribute("y",String(r-n)),S.setAttribute("width",String(i+n*2)),S.setAttribute("height",String(l+n*2));const _=document.createElementNS(ft,"rect");return _.setAttribute("x",String(o-n)),_.setAttribute("y",String(r-n)),_.setAttribute("width",String(i+n*2)),_.setAttribute("height",String(l+n*2)),_.setAttribute("fill",`url(#${R.id}
243)`),S.appendChild(_),c.appendChild(S),u.appendChild(d({fill:"currentColor",stroke:"currentColor","stroke-width":String(v.w),"stroke-linejoin":"round","stroke-linecap":"round",opacity:String(v.alpha),mask:`url(#${S.id})`})),{grad:R,seed:Math.random()*100}});return u.appendChild(d({fill:"currentColor"})),{svg:u,spots:p,vw:i}}async function es(s,t){const e=s.querySelector("img");if(!e||s.querySelector(".inkbleed"))return;let o;try{const _=await fetch(e.currentSrc||e.src,{cache:"force-cache"});if(!_.ok)return;o=new DOMParser().parseFromString(await _.text(),"image/svg+xml")}catch{return}const r=o.querySelector("svg");if(!r||o.querySelector("parsererror"))return;const{svg:i,spots:l,vw:u}=ts(r,t);e.replaceWith(i);let c=i.getBoundingClientRect(),h=u/(c.width||1);const d=()=>{c=i.getBoundingClientRect(),h=u/(c.width||1)},n={x:0,y:0,on:0},p={x:0,y:0,on:0};let v=null;const g=_=>{for(let A=0;A<l.length;A+=1){const{grad:w,seed:L}=l[A],O=jo*p.on,U=p.x+Pt(_,L)*O,q=p.y+Pt(_,L+17.3)*O,E=1+Pt(_,L+41.7)*Ko;w.setAttribute("cx",U.toFixed(2)),w.setAttribute("cy",q.toFixed(2)),w.setAttribute("fx",(U+Pt(_,L+63.1)*O*Ce).toFixed(2)),w.setAttribute("fy",(q+Pt(_,L+88.9)*O*Ce).toFixed(2)),w.setAttribute("r",Math.max(.001,$e*je[A].reach*p.on*E).toFixed(3))}},R=_=>{const A=_/1e3;if(p.x+=(n.x-p.x)*Ie,p.y+=(n.y-p.y)*Ie,p.on+=(n.on-p.on)*Qo,g(A),n.on===0&&p.on<.004&&Math.abs(n.x-p.x)<ke&&Math.abs(n.y-p.y)<ke){p.on=0,g(A),v=null;return}v=requestAnimationFrame(R)},S=()=>{v===null&&(v=requestAnimationFrame(R))};s.addEventListener("pointermove",_=>{if(_.pointerType!=="mouse")return;const A=(_.clientX-c.left)*h,w=(_.clientY-c.top)*h;
243n.on===0&&(d(),p.x=A,p.y=w),n.x=A,n.y=w,n.on=1,S()}),s.addEventListener("pointerleave",()=>{n.on=0,S()}),window.addEventListener("resize",d,{passive:!0}),g(0)}function os(){matchMedia("(prefers-reduced-motion: reduce)").matches||matchMedia("(hover: hover) and (pointer: fine)").matches&&document.querySelectorAll("[data-inkbleed]").forEach(es)}const ne=()=>{document.body.classList.remove("is-loading");const s=document.querySelector("[data-hero]"),t=document.querySelector(".fallback");if(!s)return;const e=()=>{if(document.body.classList.contains("hero-css-on"))return;const o=Math.max(0,1-window.scrollY/(innerHeight*1.2));s.style.opacity=o.toFixed(3),s.style.visibility=o<=.001?"hidden":"",t&&(t.style.opacity=o.toFixed(3),t.style.visibility=o<=.001?"hidden":"")};addEventListener("scroll",e,{passive:!0}),e()},Be=()=>{const s=()=>ht(()=>import("./hero-grid-D0EBdqqM.js"),__vite__mapDeps([0,1,2,3])).catch(()=>{});typeof requestIdleCallback=="function"?requestIdleCallback(s,{timeout:6e3}):setTimeout(s,3e3)};document.readyState==="complete"?Be():addEventListener("load",Be,{once:!0});const ss=()=>ht(()=>import("./hero-grid-D0EBdqqM.js"),__vite__mapDeps([0,1,2,3])).catch(()=>new Promise(s=>setTimeout(s,1200)).then(()=>ht(()=>import("./hero-grid-D0EBdqqM.js"),__vite__mapDeps([0,1,2,3])))),ce=()=>ss().then(s=>{const t=s.initHeroGrid();return zt?.remeasure(),Ke(),t}).catch(s=>(console.error("[hero] light grid failed to load:",s),null));function Ke(){et.refresh()}oo();so();await me;await new Promise(s=>requestAnimationFrame(()=>requestAnimationFrame(s)));const Qe=mo();Qe||(document.body.classList.add("no-webgl"),ne(),ce());et.config({ignoreMobileResize:!0});const is=1.8,rs=.84,Nt=.75,ee=.035,as=-.015,ns=.55,mt=(s,t,e)=>Math.min(e,Math.max(t,s)),Et=document.querySelector(".stage-gl"),cs=document.querySelector(".flight"),Ct=matchMedia("(prefers-reduced-motion: reduce)"),Z=new io({smoothWheel:!Ct.matches,syncTouch:!1,lerp:.075,wheelMultiplier:.9});Ct.addEventListener?.("change",()=>{Z.options.smoothWheel=!Ct.matches});b.ticker.add(s=>Z.raf(s*1e3));b.ticker.lagSmoothing(0);window.addEventListener("lightbox:toggle",s=>{s.detail.open?Z.stop():Z.start()});const Xt=1.18,lt=document.body.dataset.story==="listening-first",V=lt?{listening:{at:0,len:4.64},focus:{at:4.64,approach:3.95,hold:1.52,clear:.54},craft:{at:10.35,len:4.3},validation:{at:14.35,len:4}}:{focus:{at:0,approach:3.94,hold:1.48,clear:.54},listening:{at:5.66,len:4.64},craft:{at:10.3,len:4.3},validation:{at:14.3,len:4}},pe=V.validation.at+V.validation.len,ls=.5;document.documentElement.style.setProperty("--story-viewports",String(pe*ls+1));const oe=.12,se=.224*4.64,ot=Go(Z,{autoRevealTitle:!lt}),hs=ot?Zo(ot.stage,{titleExit:!0}):null;let qt=null,Ht=null,le=()=>{};function us(s){typeof requestIdleCallback=="function"?requestIdleCallback(s,{timeout:2e3}):setTimeout(s,300)}const he=[];let ie=!1,ue=!1;const de=()=>{ue||(ue=!0,ge())};for(const s of["scroll","wheel","pointerdown","touchstart","keydown"])addEventListener(s,de,{once:!0,passive:!0,capture:!0});document.readyState==="complete"?setTimeout(de,6e3):addEventListener("load",()=>setTimeout(de,6e3),{once:!0});function ge(){if(!ue||ie||!he.length)return;ie=!0;const s=he.shift();us(async()=>{try{await s()}catch(t){console.error("[main] deferred load failed:",t)}ie=!1,ge()})}function Vt(s){he.push(s),ge()}ot&&(Vt(async()=>{{const{initCraft:s}=await ht(async()=>{const{initCraft:t}=await import("./craft-BN_yNEP7.js");return{initCraft:t}},__vite__mapDeps([4,2,5,3,6,7]));await me,qt=s(ot.stage,{console:!lt,flexAxis:lt?"y":"x"}),le()}}),Vt(async()=>{const{initValidation:s}=await ht(async()=>{const{initValidation:t}=await import("./validation-D5U4Prh3.js");
243return{initValidation:t}},__vite__mapDeps([8,2,5,3,6]));Ht=s(ot.stage),le()}));Vt(async()=>{const{initWork:s}=await ht(async()=>{const{initWork:o}=await import("./work-ybNbFcJc.js");return{initWork:o}},__vite__mapDeps([9,2,10,3,7,11,6,12,13]));await me,s(document.getElementById("work"));const{initNameBend:t}=await ht(async()=>{const{initNameBend:o}=await import("./name-bend-C5Dx7leT.js");return{initNameBend:o}},__vite__mapDeps([14,15])),e=()=>t(document.getElementById("work"));document.fonts?.ready?document.fonts.ready.then(e):e()});Vt(async()=>{const{initFeatured:s}=await ht(async()=>{const{initFeatured:t}=await import("./featured-C790QSJb.js");return{initFeatured:t}},__vite__mapDeps([16,2,7,5,3,6]));s(document.querySelector(".section--featured"))});const zt=po(document.querySelector(".section--lede"),"h2");et.addEventListener("refreshInit",()=>zt?.clear());let Lt=null,Gt=0,Oe=!1,re=!1,ae=0;if(ot){let s=function(c,h){r||(r=o.map(d=>document.querySelector(d)),i=new Array(r.length).fill(-1));for(let d=0;d<r.length;d+=1){const n=r[d];if(!n)continue;const p=c[d];let v=1/0;for(let R=d+1;R<c.length;R+=1)if(Number.isFinite(c[R])){v=c[R];break}const g=Number.isFinite(p)?mt((h-p)/e,0,1)*(1-mt((h-v)/e,0,1)):0;Math.abs(g-i[d])<.01||(i[d]=g,n.style.opacity=g.toFixed(3))}},t=function(c){const h=c*pe,d=(A,w)=>mt((h-A)/w,0,1),n=V.focus,p=n.at+n.approach+n.hold,v=h<n.at?0:h<n.at+n.approach?(h-n.at)/n.approach*Xt:h<p?Xt:Xt+d(p,n.clear)*(l-Xt);ot.timeline.time(mt(v,0,l)),hs?.timeline.progress(d(V.listening.at,V.listening.len)),qt?.timeline.progress(d(V.craft.at,V.craft.len)),Ht?.timeline.progress(d(V.validation.at,V.validation.len)
243);const g=n.at+oe;lt&&ot.setTitleShown(h>=g),ot.setWarpProgress?.((h-g)/se);const R=lt?V.focus.at+V.focus.approach+V.focus.hold+V.focus.clear:V.listening.at+V.listening.len,S=Math.max(V.craft.at,R)+oe;qt?.setTitleShown(h>=S),qt?.setWarpProgress?.((h-S)/se);const _=Math.max(V.validation.at,V.craft.at+V.craft.len)+oe;Ht?.setTitleShown(h>=_),Ht?.setWarpProgress?.((h-_)/se),s([lt?0:g,lt?g:1/0,S,_],h),ot.stage.classList.toggle("is-focus-armed",h>=n.at)};const e=.35,o=[".story__note--listening",".story__note--focus",".story__note--craft",".story__note--validation"];let r=null,i=null;const l=ot.timeline.duration(),u=et.create({trigger:ot.stage,start:"top top",endTrigger:ot.section,end:"bottom bottom",scrub:.6,invalidateOnRefresh:!0,onRefreshInit:()=>{re=!0,clearTimeout(ae)},onRefresh:c=>{Oe?Z.scrollTo(document.documentElement.scrollHeight,{immediate:!0,force:!0}):Gt>.001&&Gt<.999&&Z.scrollTo(c.start+Gt*(c.end-c.start),{immediate:!0,force:!0}),clearTimeout(ae),ae=setTimeout(()=>{re=!1},300)},onUpdate:c=>{re||(Gt=c.progress,Oe=Z.scroll>=document.documentElement.scrollHeight-innerHeight-2),t(c.progress)}});le=()=>t(u.progress),Lt=u}let Ft=null;const Je=[],ds=(s,t)=>{s.canvas&&(Ft?Ft.uploadTile(t,s.canvas):Je.push([t,s.canvas]))};if(Qe){const s=vo(Bt,{onTile:ds,firstBatch:12,priority:co(Bt.length)});s.all?.then?.(()=>Ft?.finishUploads?.()),s.first.then(async()=>{let t;try{t=new Uo(Et,Bt)}catch(E){document.body.classList.add("no-webgl"),ne(),ce(),console.error(E);return}t.depthCull=.02,t.canvas.addEventListener("webglcontextlost",E=>{E.preventDefault(),document.body.classList.add("no-webgl"),ne(),ce(),Ft=null},{once:!0}),Ft=t;for(const[E,M]of Je.splice(0))M&&M.width>0&&t.uploadTile(E,M);t.reveal(),document.body.classList.remove("is-loading");const e=lo(Bt),o=6,r=450;let i=null;Et.addEventListener("pointerdown",E=>{i={x:E.clientX,y:E.clientY,t:performance.now(),id:E.pointerId,hit:t.pick(E.clientX,E.clientY)}},{passive:!0}),addEventListener("pointerup",E=>{const M=i;i=null,!(!M||E.pointerId!==M.id)&&(t.occluded||Math.hypot(E.clientX-M.x,E.clientY-M.y)>o||performance.now()-M.t>r||M.hit&&e.show(M.hit))},{passive:!0}),Et.style.cursor="pointer";let l=1;const u=()=>{const E=Math.round(innerHeight*is);cs.style.height=`${E}px`,l=Math.max(1,E*rs),Z.resize(),et.refresh(),zt?.remeasure()};u(),document.fonts?.ready.then(()=>{et.refresh(),zt?.remeasure()});let c=0;const h=()=>mt(Z.scroll/l,0,1);let d=0,n=0;function p(E){const M=mt((c-.12)/.35,0,1);if(M<=0){if(d||n){const I=1-Math.pow(.91,E/16.667),j=d*I,at=n*I;t.target.x-=j,t.target.y-=at,d-=j,n-=at,Math.abs(d)<.02&&(d=0),Math.abs(n)<.02&&(n=0)}return}const G=M*M*.18,f=1-Math.pow(1-G,E/16.667),m=t.cell,C=(Math.round(t.target.x/m-.5)+.5)*m,F=(Math.round(t.target.y/m-.5)+.5)*m,H=(C-t.target.x)*f,$=(F-t.target.y)*f;t.target.x+=H,t.target.y+=$,d+=H,n+=$}const v=[...document.querySelectorAll("[data-hero]")];let g=-1;const R=E=>{const M=mt(1-E/.4,0,1);if(!(Math.abs(M-g)<.004)){g=M;for(const G of v)G.style.opacity=M,G.style.visibility=M<.02?"hidden":"visible"}};R(0);const S=(E,M)=>{const G=Math.min(64,M),f=1-Math.pow(1-.3,G/16.667),m=h();c+=(m-c)*f,Math.abs(m-c)<1e-4&&(c=m),p(G),R(c),t.occluded=c>.999&&Z.scroll>l+innerHeight*.25;const C=t.persp;if(c<Nt)t.camZ=C*Math.pow(ee,c/Nt);else{const F=(c-Nt)/(1-Nt);t.camZ=C*ee+(as*C-C*ee)*F}};b.ticker.add(S);let _=0,A=0;const w=E=>Math.hypot(E[0].clientX-E[1].clientX,E[0].clientY-E[1].clientY);Et.addEventListener("touchstart",E=>{E.touches.length===2&&(_=w(E.touches),A=h(),t.dragging=!1)},{passive:!1}),Et.addEventListener("touchmove",E=>{if(E.touches.length!==2||_<=0)return;E.preventDefault();const M=mt(A+Math.log(w(E.touches)/_)*ns,0,1);Z.scrollTo(M*l,{immediate:!0,force:!0})},{passive:!1});const L=E=>{E.touches.length<2&&(_=0)};Et.addEventListener("touchend",L),Et.addEventListener("touchcancel",L);let O=innerWidth,U=innerHeight,q=0;addEventListener("resize",()=>{cancelAnimationFrame(q),q=requestAnimationFrame(()=>{(innerWidth!==O||Math.abs(innerHeight-U)/U>.25)&&(O=innerWidth,U=innerHeight,u()),t.resize()})})})}const Ne=document.querySelector(".about__photo");Ne&&!Ct.matches&&b.fromTo(Ne,{yPercent:-6},{yPercent:6,ease:"none",scrollTrigger:{trigger:".about",start:"top bottom",end:"bottom top",scrub:!0,invalidateOnRefresh:!0}});const Zt=[...document.querySelectorAll('.hero__nav a[href^="#"]')];let fe=!1,Dt=!1;const Xe=lt?V.listening.at+V.listening.len*.25:0,fs=()=>window.innerHeight*2.5,It=document.createElement("div");It.className="nav-veil";It.setAttribute("aria-hidden","true");document.body.insertBefore(It,document.querySelector(".hero"));const ms=s=>{if(Ct.matches){Z.scrollTo(s,{immediate:!0,force:!0}),Dt=!1;return}if(Math.abs(s-Z.scroll)<=fs()){Z.scrollTo(s,{onComplete:()=>{Dt=!1}});return}It.classList.add("is-on"),setTimeout(()=>{Z.scrollTo(s,{immediate:!0,force:!0}),requestAnimationFrame(()=>requestAnimationFrame(()=>{setTimeout(()=>{It.classList.remove("is-on"),setTimeout(()=>{Dt=!1},360)},70)}))},180)};for(const s of Zt)s.addEventListener("click",t=>{const e=document.getElementById(s.getAttribute("href").slice(1));e&&(t.preventDefault(),!fe&&($t=Zt.indexOf(s),Dt=!0,ms(ps(e))))});function ps(s){return s.id==="intro"?0:s.id==="approach"&&Lt&&Xe>0?Lt.start+Xe/pe*(Lt.end-Lt.start):s.getBoundingClientRect().top+Z.scroll}const gs=Zt.map(s=>document.getElementById(s.getAttribute("href").slice(1)));let $t=0,Ut=null;const to=()=>{Ut=gs.map(s=>s?s.getBoundingClientRect().top+Z.scroll:1/0)};et.addEventListener("refresh",()=>{Ut&&to()});const Ge=()=>{Ut||to();const s=Z.scroll+window.innerHeight*.45;let t=0;for(let e=0;e<Ut.length;e+=1)Ut[e]<=s&&(t=e);t!==$t&&($t=t,!Dt&&(fe=!0,Zt[t].dispatchEvent(new MouseEvent("click",{bubbles:!0,cancelable:!0})),fe=!1))},We=()=>{$o(),$t=-1,Ge(),Z.on("scroll",Ge),os(),ht(async()=>{const{initHighlightText:s}
243=await import("./highlight-text-vjdXAQNP.js");return{initHighlightText:s}},__vite__mapDeps([17,2,7,15])).then(({initHighlightText:s})=>s(Ke)).catch(s=>console.error("[main] highlight-text failed to load:",s))};document.fonts?.ready?document.fonts.ready.then(We):We();ro();ao();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.