PageSourceSearch

https://perxel.com/_next/static/chunks/1x1u8bg2kpe_x.js

js perxel.com collected 2026-10-06 13:37:56 UTC 48,200 bytes, 519 lines download raw bytes

1(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,70731,e=>{"use strict";var t=e.i(38397),r=e.i(95331),n=e.i(69622),i=e.i(47163);let o=e=>new Map(e.split(",").map(e=>e.trim()).map(e=>{let[t,r]=e.split(" ");return[t.replace(/['"]/g,""),parseFloat(r)]})),s=(0,r.forwardRef)(({children:e,as:s="span",fromFontVariationSettings:l,toFontVariationSettings:a,containerRef:c,radius:u=50,falloff:p="linear",letterIndexOffset:v,className:d,...h},f)=>{var m;let w,g=(0,r.useRef)([]),b=(0,r.useRef)([]),j=(0,n.useMousePositionRef)(c),x=(0,r.useRef)(!1);(0,r.useEffect)(()=>{let e=()=>{x.current=!0};return window.addEventListener("mousemove",e,{once:!0}),window.addEventListener("touchstart",e,{once:!0}),()=>{window.removeEventListener("mousemove",e),window.removeEventListener("touchstart",e)}},[]);let k=(0,r.useMemo)(()=>{let e=o(l),t=o(a);return Array.from(e.entries()).map(([e,r])=>({axis:e,fromValue:r,toValue:t.get(e)??r}))},[l,a]);m=()=>{if(!c.current||!x.current)return;let e=c.current.getBoundingClientRect();g.current.forEach((t,r)=>{let n;if(!t)return;let i=t.getBoundingClientRect(),o=i.left+i.width/2-e.left,s=i.top+i.height/2-e.top,a=(n=j.current.x,Math.sqrt(Math.pow(o-n,2)+Math.pow(s-j.current.y,2)));if(a>=u){t.style.fontVariationSettings!==l&&(t.style.fontVariationSettings=l);return}let c=(e=>{let t=Math.min(Math.max(1-e/u,0),1);switch(p){case"exponential":return Math.pow(t,2);case"gaussian":return Math.exp(-Math.pow(e/(u/2),2)/2);default:return t}})(a),v=k.map(({axis:e,fromValue:t,toValue:r})=>`'${e}' ${t+(r-t)*c}`).join(", ");b.current[r]=v,t.style.fontVariationSettings=v})},(w=(0,r.useRef)(m)).current=m,(0,r.useEffect)(()=>{let e=0,t=performance.now(),r=n=>{w.current(n,n-t),t=n,e=requestAnimationFrame(r)};return e=requestAnimationFrame(r),()=>cancelAnimationFrame(e)},[]);let L=String(e).split(" "),y=0;return(0,t.jsxs)(s,{ref:f,className:(0,i.cn)(d),...h,"data-text":String(e),children:[L.map((e,r)=>(0,t.jsxs)("span",{className:"inline-block whitespace-nowrap","aria-hidden":!0,children:[e.split("").map(e=>{let r=y++;return(0,t.jsx)("span",{ref:e=>{g.current[r]=e},className:"inline-block","aria-hidden":"true","data-letter":void 0===v?void 0:"",style:{fontVariationSettings:b.current[r]??l,...void 0===v?{}:{"--letter-i":v+r}},children:e},r)}),r<L.length-1&&(0,t.jsx)("span",{className:"inline-block",children:" "})]},r)),(0,t.jsx)("span",{className:"sr-only",children:e})]})});s.displayName="VariableFontCursorProximity",e.s(["default",0,s],70731)},37306,e=>{"use strict";var t=e.i(38397),r=e.i(95331),n=e.i(28985);let i=1e3/60;e.s(["default",0,function({color:e="#082ae5",flip:o=!1,swell:s=!1}){let l=(0,r.useRef)(null);return(0,r.useEffect)(()=>{let t=l.current,r=t?.getContext("2d");if(!t||!r)return;let a=window.matchMedia(n.REDUCED_MOTION).matches,c=Math.min(2,window.devicePixelRatio||1),u=0,p=0,v=new Float32Array(0),d=new Float32Array(0),h=new Float32Array(0),f=!1,m=t=>{r.setTransform(c,0,0,c,0,0),r.clearRect(0,0,u,56),r.beginPath(),r.moveTo(0,56);for(let e=0;e<p;e++){let n=6*e,i=a?0:2.2*Math.sin(.012*n+.0011*t)+1.6*Math.sin(.027*n-.0017*t);r.lineTo(n,32-v[e]-i)}r.lineTo(u,56),r.closePath(),r.fillStyle=e,r.fill()},w=()=>{v=new Float32Array(p=Math.ceil((u=t.clientWidth)/6)+1),d=new Float32Array(p),h=new Float32Array(p),t.width=u*c,t.height=56*c,m(performance.now())};w();let g=new ResizeObserver(()=>{t.clientWidth!==u&&w()});if(g.observe(t),a)return()=>g.disconnect();let b=(e,t)=>{let r=Math.round(e/6);for(let e=-5;e<=5;e++){let n=r+e;n>=0&&n<p&&(d[n]+=t*Math.exp(-(e*e)/8))}f=!0},j=()=>{let e=0;for(let t=0;t<p;t++)d[t]+=-.02*v[t]-.018*d[t],v[t]=Math.max(-20,Math.min(28,v[t]+d[t])),e=Math.max(e,Math.abs(d[t]),.1*Math.abs(v[t]));for(let e=0;e<3;e++){h.fill(0);for(let e=0;e<p;e++)e>0&&(h[e-1]+=.22*(v[e]-v[e-1])),e<p-1&&(h[e+1]+=.22*(v[e]-v[e+1]));for(let e=0;e<p;e++)d[e]+=h[e]}return!(e<.03)||(v.fill(0),d.fill(0),!1)},x=null,k=e=>{if("touch"===e.pointerType)return;let r=t.getBoundingClientRect(),n=e.clientX-r.left;L=n;let i=(o?56-(e.clientY-r.top):e.clientY-r.top)-32;if(x&&48>=Math.abs(i)){let e=n-x.x,t=i-x.y,r=Math.hypot(e,t);if(r>=1)if(Math.sign(i)!==Math.sign(x.y)){let e=Math.min(6,1.6+.22*r);b(n,i>0?-e:e)}else{let e=1-Math.abs(i)/48;b(n,Math.max(-2,Math.min(2,t*(i>0?-.16:.16)-.025*r))*e)}}x={x:n,y:i}},L=null,y=window.scrollY,M=performance.now(),R=!1,_=()=>{let e=performance.now(),t=window.scrollY,r=Math.abs(t-y)/Math.max(1,e-M),n=window.innerHeight+t>=document.documentElement.scrollHeight-2;if(n&&!R&&t>y){let e=Math.min(9,4+3*r),t=L??u*(.35+.3*Math.random());b(t-8,-e),b(t+8,-e)}R=n,y=t,M=e},E=0,S=0,A=0,T=0,C=e=>{for(E=requestAnimationFrame(C),S+=Math.min(100,e-A),A=e;S>=i;)f&&(f=j()),S-=i;(f||(1&T++)==0)&&m(e)},F=()=>{cancelAnimationFrame(E),E=0,x=null,window.removeEventListener("pointermove",k),window.removeEventListener("scroll",_)}
1,V=new IntersectionObserver(([e])=>{if(!e.isIntersecting)return F();if(E||(A=performance.now(),E=requestAnimationFrame(C),window.addEventListener("pointermove",k,{passive:!0}),window.addEventListener("scroll",_,{passive:!0})),s&&e.boundingClientRect.top>0)for(let e=0;e<=72;e+=12)b(e,3.2)},{rootMargin:"48px"});return V.observe(t),()=>{F(),g.disconnect(),V.disconnect()}},[e,o,s]),(0,t.jsx)("canvas",{ref:l,"aria-hidden":!0,className:`px-footer-water pointer-events-none block w-full${o?" -scale-y-100":""}`,style:{height:56}})}])},88205,e=>{"use strict";var t=e.i(38397),r=e.i(95331),n=e.i(28985),i=e.i(91606);let o=[{x0:0,x1:83,d:["M80.23 17.58c-1.62-4.12-4.16-7.54-7.62-10.25-3.42-2.71-7.81-4.48-13.19-5.31-1.17-.21-2.49-.34-4-.38-1.46-.08-2.63-.12-3.5-.12H31.05v15.87h20.13c.87 0 1.83.04 2.87.12q1.56.135 2.88.51c2.29.62 4.05 1.68 5.31 3.19 1.24 1.46 2.1 3.1 2.56 4.93.5 1.8.75 3.5.75 5.13s-.25 3.35-.75 5.19c-.46 1.79-1.32 3.43-2.56 4.93-1.26 1.46-3.02 2.5-5.31 3.12q-1.32.39-2.88.51c-1.04.08-2 .12-2.87.12H30.92v15.88h21c.83 0 2-.04 3.5-.13 1.51-.08 2.83-.21 4-.37 5.34-.84 9.71-2.61 13.13-5.31 3.45-2.71 6-6.11 7.62-10.19 1.67-4.12 2.5-8.71 2.5-13.75s-.81-9.61-2.44-13.69m-66.31.29v27.27h17V17.87z","M13.92 45.14h17L17 90.92H0z"]},{x0:87,x1:148,d:["M87.97 91.51V1.08H147v15.95h-41.95v19.34h34.41v15.95h-34.41v23.24H147v15.95z"]},{x0:152,x1:224,d:["M219.17 17.22c-1.63-4.14-4.18-7.57-7.66-10.29-3.43-2.73-7.85-4.5-13.25-5.34-1.17-.21-2.51-.34-4.02-.38q-2.19-.12-3.51-.12h-20.85v15.95h20.09c.88 0 1.84.04 2.89.12 1.05.09 2.01.25 2.89.5q3.45.945 5.34 3.21c1.25 1.46 2.11 3.12 2.57 4.96.51 1.8.76 3.52.76 5.15s-.25 3.37-.76 5.21c-.46 1.8-1.32 3.45-2.57 4.96-1.26 1.47-3.04 2.51-5.34 3.14-.88.25-1.84.42-2.89.5-1.05.09-2.01.13-2.89.13h-20.34V17.11h-17.09v74.41h17.09V60.87h21.1l7.53-.5c3.08-.48 5.84-1.26 8.29-2.35 3.96-1.74 7.09-4.27 9.42-7.57 3.77-5.4 5.65-11.89 5.65-19.47 0-5.07-.81-9.65-2.45-13.76m-12.62 40.8-3.26-6.69-17.59 3.39 2.98 6.15 14.86 30.65h19.34z"]},{x0:227,x1:310,d:["m228.05 91.78 30.4-45.72-29.52-44.71h20.97l19.22 30.14 18.97-30.14h21.1l-29.52 44.71 30.27 45.72h-20.98l-19.85-31.15-19.97 31.15h-21.1z"]},{x0:315,x1:376,d:["M316.46 91.78V1.35h59.03V17.3h-41.95v19.34h34.42v15.95h-34.42v23.24h41.95v15.95z"]},{x0:380,x1:438,d:["M437.31 75.84v15.95h-56.02V17.52h17.09v58.32z","M415.66 0h-17.2v17.52h17.2z"]}],s=1e3/60;e.s(["default",0,function(){let e=(0,r.useRef)(null);return(0,r.useEffect)(()=>{let t=e.current,r=t?.getContext("2d");if(!t||!r)return;let l=window.matchMedia(n.REDUCED_MOTION).matches,a=o.map(e=>e.d.map(e=>new Path2D(e))),c=o.length,u=new i.Seaweed(o.map((e,t)=>1.7*t+.8*Math.random())),p=1,v=0,d=0,h=0,f=0,m=0,w=[],g=[],b=[],j=()=>{p=Math.min(2,window.devicePixelRatio||1),v=t.clientWidth,d=t.clientHeight,h=(v-(t.parentElement?.clientWidth??v))/2,t.width=Math.round(v*p),t.height=Math.round(d*p),m=d/120,b=o.map(e=>(e.x1-e.x0)*m);let e=(v-2*h-b.reduce((e,t)=>e+t,0))/(c-1);g=[];let r=h;for(let t=0;t<c;t++)g.push(r),r+=b[t]+e;f=Math.max(0,Math.min(.35*e,h,92*m*.5)),w=o.map((e,t)=>{let r=document.createElement("canvas");r.width=Math.ceil(b[t]*p),r.height=Math.ceil(92*m*p);let n=r.getContext("2d");for(let r of(n.scale(m*p,m*p),n.translate(-e.x0,0),n.fillStyle="rgb(255 255 255 / 0.12)",a[t]))n.fill(r);return r}),x()},x=()=>{r.setTransform(1,0,0,1,0,0),r.clearRect(0,0,t.width,t.height);let e=Math.round(d*p);for(let t=0;t<c;t++){let n=w[t],o=n.height,s=g[t]*p,l=e-o;(0,i.drawBent)(r,n,0,0,n.width,o,s,l,o,o,u.sway[t]*p)}};j();let k=new ResizeObserver(()=>{(t.clientWidth!==v||t.clientHeight!==d)&&j()});if(k.observe(t),l)return()=>k.disconnect();let L=(e,t)=>u.push(e,t),y=null,M=e=>{if("touch"===e.pointerType)return;let r=t.getBoundingClientRect(),n=e.clientX-r.left,i=e.clientY-r.top;if(y&&i>-24&&i<d){let e=Math.max(-40,Math.min(40,n-y.x)),t=Math.max(.25,Math.min(1,(d-i)/d));for(let r=0;r<c;r++){let i=.3*b[r];n>g[r]-i&&n<g[r]+b[r]+i&&L(r,.035*e*t)}}y={x:n,y:i}},R=e=>{if("touch"!==e.pointerType)return;let r=t.getBoundingClientRect(),n=e.clientX-r.left,i=e.clientY-r.top;if(!(i<-24)&&!(i>d))for(let e=0;e<c;e++){let t=g[e]+b[e]/2;Math.abs(t-n)<1.5*b[e]&&L(e,2.5*Math.sign(t-n||1))}},_=window.scrollY,E=()=>{let e=Math.max(-60,Math.min(60,window.scrollY-_));_=window.scrollY;for(let t=0;t<c;t++)L(t,.012*e)},S=e=>u.step(e,f),A=0,T=0,C=0,F=0,V=e=>{A=requestAnimationFrame(V),T+=Math.min(100,e-C),C=e;let t=!1;for(;T>=s;)t=S(e)||t,T-=s;(t||(1&F++)==0)&&x()},I=()=>{cancelAnimationFrame(A),A=0,y=null,window.removeEventListener("pointermove",M),window.removeEventListener("pointerdown",R),window.removeEventListener("scroll",E)},N=new IntersectionObserver(([e])=>{e.isIntersecting?A||(C=performance.now(),_=window.scrollY,A=requestAnimationFrame(V),window.addEventListener("pointermove",M,{passive:!0}),window.addEventListener("pointerdown",R,{passive:!0}),window.addEventListener("scroll",E,{passive:!0})):I()});return N.observe(t),()=>{I(),k.disconnect(),N.disconnect()}}
1,[]),(0,t.jsx)("div",{"aria-hidden":!0,className:"px-footer-wordmark relative h-[calc(40vw*120/438)] w-full",children:(0,t.jsx)("canvas",{ref:e,className:"pointer-events-none absolute inset-y-0 -left-[3vw] -right-[3vw] block h-full w-[calc(100%+6vw)]"})})}])},44764,e=>{"use strict";var t=e.i(38397),r=e.i(95331),n=e.i(47163);let i=`
2#ifdef GL_ES
3precision highp float;
4#endif
5
6uniform vec2 u_mouse;
7uniform vec2 u_resolution;
8uniform float u_pixelRatio;
9uniform float u_time;
10uniform int u_shape;
11uniform vec3 u_lineColor;
12uniform vec3 u_bgColor;
13uniform bool u_bgTransparent;
14
15#define PI 3.1415926535897932384626433832795
16#define TWO_PI 6.2831853071795864769252867665590
17
18// 3D rotation matrices
19mat3 rotateX(float angle) {
20    float s = sin(angle);
21    float c = cos(angle);
22    return mat3(
23        1.0, 0.0, 0.0,
24        0.0, c, -s,
25        0.0, s, c
26    );
27}
28
29mat3 rotateY(float angle) {
30    float s = sin(angle);
31    float c = cos(angle);
32    return mat3(
33        c, 0.0, s,
34        0.0, 1.0, 0.0,
35        -s, 0.0, c
36    );
37}
38
39mat3 rotateZ(float angle) {
40    float s = sin(angle);
41    float c = cos(angle);
42    return mat3(
43        c, -s, 0.0,
44        s, c, 0.0,
45        0.0, 0.0, 1.0
46    );
47}
48
49// Coordinate normalization
50vec2 coord(in vec2 p) {
51    p = p / u_resolution.xy;
52    if (u_resolution.x > u_resolution.y) {
53        p.x *= u_resolution.x / u_resolution.y;
54        p.x += (u_resolution.y - u_resolution.x) / u_resolution.y / 2.0;
55    } else {
56        p.y *= u_resolution.y / u_resolution.x;
57        p.y += (u_resolution.x - u_resolution.y) / u_resolution.x / 2.0;
58    }
59    p -= 0.5;
60    return p;
61}
62
63// Project 3D point to 2D
64vec2 project(vec3 p) {
65    float perspective = 2.0 / (2.0 - p.z);
66    return p.xy * perspective;
67}
68
69// Distance from point to line segment
70float distToSegment(vec2 p, vec2 a, vec2 b) {
71    vec2 pa = p - a;
72    vec2 ba = b - a;
73    float h = clamp(dot(pa, ba) / dot(ba, ba), 0.0, 1.0);
74    return length(pa - ba * h);
75}
76
77// Draw a line with blur effect
78float drawLine(vec2 p, vec2 a, vec2 b, float thickness, float blur) {
79    float d = distToSegment(p, a, b);
80    return smoothstep(thickness + blur, thickness - blur, d);
81}
82
83// Get cube vertices
84void getCubeVertices(out vec3 v[8]) {
85    float s = 0.7; // Scale down cube
86    v[0] = vec3(-s, -s, -s);
87    v[1] = vec3( s, -s, -s);
88    v[2] = vec3( s,  s, -s);
89    v[3] = vec3(-s,  s, -s);
90    v[4] = vec3(-s, -s,  s);
91    v[5] = vec3( s, -s,  s);
92    v[6] = vec3( s,  s,  s);
93    v[7] = vec3(-s,  s,  s);
94}
95
96// Get tetrahedron vertices
97void getTetrahedronVertices(out vec3 v[4]) {
98    float a = 1.0 / sqrt(3.0);
99    v[0] = vec3( a,  a,  a);
100    v[1] = vec3( a, -a, -a);
101    v[2] = vec3(-a,  a, -a);
102    v[3] = vec3(-a, -a,  a);
103}
104
105// Get octahedron vertices
106void getOctahedronVertices(out vec3 v[6]) {
107    v[0] = vec3( 1.0,  0.0,  0.0);
108    v[1] = vec3(-1.0,  0.0,  0.0);
109    v[2] = vec3( 0.0,  1.0,  0.0);
110    v[3] = vec3( 0.0, -1.0,  0.0);
111    v[4] = vec3( 0.0,  0.0,  1.0);
112    v[5] = vec3( 0.0,  0.0, -1.0);
113}
114
115// Get icosahedron vertices (12 vertices)
116void getIcosahedronVertices(out vec3 v[12]) {
117    float t = (1.0 + sqrt(5.0)) / 2.0;
118    float s = 1.0 / sqrt(1.0 + t * t);
119    
120    v[0] = vec3(-s, t * s, 0);
121    v[1] = vec3( s, t * s, 0);
122    v[2] = vec3(-s, -t * s, 0);
123    v[3] = vec3( s, -t * s, 0);
124    
125    v[4] = vec3(0, -s, t * s);
126    v[5] = vec3(0,  s, t * s);
127    v[6] = vec3(0, -s, -t * s);
128    v[7] = vec3(0,  s, -t * s);
129    
130    v[8] = vec3( t * s, 0, -s);
131    v[9] = vec3( t * s, 0,  s);
132    v[10] = vec3(-t * s, 0, -s);
133    v[11] = vec3(-t * s, 0,  s);
134}
135
136// Transform and project vertices
137void transformVertices(inout vec3 vertices[12], int count, mat3 rotation, float scale) {
138    for (int i = 0; i < 12; i++) {
139        if (i < count) {
140            vertices[i] = rotation * (vertices[i] * scale);
141        }
142    }
143}
144
145// Draw wireframe shape
146float drawWireframe(vec2 p, int shape, mat3 rotation, float scale, float thickness, float blur) {
147    float result = 0.0;
148    
149    if (shape == 0) {
150        // Cube - 12 edges
151        vec3 v[8];
152        getCubeVertices(v);
153        
154        // Transform vertices
155        for (int i = 0; i < 8; i++) {
156            v[i] = rotation * (v[i] * scale);
157        }
158        
159        // Draw edges
160        // Bottom face
161        result += drawLine(p, project(v[0]), project(v[1]), thickness, blur);
162        result += drawLine(p, project(v[1]), project(v[2]), thickness, blur);
163        result += drawLine(p, project(v[2]), project(v[3]), thickness, blur);
164        result += drawLine(p, project(v[3]), project(v[0]), thickness, blur);
165        
166        // Top face
167        result += drawLine(p, project(v[4]), project(v[5]), thickness, blur);
168        result += drawLine(p, project(v[5]), project(v[6]), thickness, blur);
169        result += drawLine(p, project(v[6]), project(v[7]), thickness, blur);
170        result += drawLine(p, project(v[7]), project(v[4]), thickness, blur);
171        
172        // Vertical edges
173        result += drawLine(p, project(v[0]), project(v[4]), thickness, blur);
174        result += drawLine(p, project(v[1]), project(v[5]), thickness, blur);
175        result += drawLine(p, project(v[2]), project(v[6]), thickness, blur);
176        result += drawLine(p, project(v[3]), project(v[7]), thickness, blur);
177        
178    } else if (shape == 1) {
179        // Tetrahedron - 6 edges
180        vec3 v[4];
181        getTetrahedronVertices(v);
182        
183        // Transform vertices
184        for (int i = 0; i < 4; i++) {
185            v[i] = rotation * (v[i] * scale);
186        }
187        
188        // Draw all edges
189        result += drawLine(p, project(v[0]), project(v[1]), thickness, blur);
190        result += drawLine(p, project(v[0]), project(v[2]), thickness, blur);
191        result += drawLine(p, project(v[0]), project(v[3]), thickness, blur);
192        result += drawLine(p, project(v[1]), project(v[2]), thickness, blur);
193        result += drawLine(p, project(v[1]), project(v[3]), thickness, blur);
194        result += drawLine(p, project(v[2]), project(v[3]), thickness, blur);
195        
196    } else if (shape == 2) {
197        // Octahedron - 12 edges
198        vec3 v[6];
199        getOctahedronVertices(v);
200        
201        // Transform vertices
202        for (int i = 0; i < 6; i++) {
203            v[i] = rotation * (v[i] * scale);
204        }
205        
206        // Draw edges connecting to top vertex
207        result += drawLine(p, project(v[2]), project(v[0]), thickness, blur);
208        result += drawLine(p, project(v[2]), project(v[1]), thickness, blur);
209        result += drawLine(p, project(v[2]), project(v[4]), thickness, blur);
210        result += drawLine(p, project(v[2]), project(v[5]), thickness, blur);
211        
212        // Draw edges connecting to bottom vertex
213        result += drawLine(p, project(v[3]), project(v[0]), thickness, blur);
214        result += drawLine(p, project(v[3]), project(v[1]), thickness, blur);
215        result += drawLine(p, project(v[3]), project(v[4]), thickness, blur);
216        result += drawLine(p, project(v[3]), project(v[5]), thickness, blur);
217        
218        // Draw middle square
219        result += drawLine(p, project(v[0]), project(v[4]), thickness, blur);
220        result += drawLine(p, project(v[4]), project(v[1]), thickness, blur);
221        result += drawLine(p, project(v[1]), project(v[5]), thickness, blur);
222        result += drawLine(p, project(v[5]), project(v[0]), thickness, blur);
223        
224    } else if (shape == 3) {
225        // Icosahedron - 30 edges
226        vec3 v[12];
227        getIcosahedronVertices(v);
228        
229        // Transform vertices
230        for (int i = 0; i < 12; i++) {
231            v[i] = rotation * (v[i] * scale);
232        }
233        
234        // Draw all 30 edges of icosahedron
235        // Each vertex connects to exactly 5 others
236        
237        // Vertex 0 connections
238        result += drawLine(p, project(v[0]), project(v[1]), thickness, blur);
239        result += drawLine(p, project(v[0]), project(v[5]), thickness, blur);
240        result += drawLine(p, project(v[0]), project(v[7]), thickness, blur);
241        result += drawLine(p, project(v[0]), project(v[10]), thickness, blur);
242        result += drawLine(p, project(v[0]), project(v[11]), thickness, blur);
243        
244        // Vertex 1 connections (excluding already drawn)
245        result += drawLine(p, project(v[1]), project(v[5]), thickness, blur);
246        result += drawLine(p, project(v[1]), project(v[7]), thickness, blur);
247        result += drawLine(p, project(v[1]), project(v[8]), thickness, blur);
248        result += drawLine(p, project(v[1]), project(v[9]), thickness, blur);
249        
250        // Vertex 2 connections
251        result += drawLine(p, project(v[2]), project(v[3]), thickness, blur);
252        result += drawLine(p, project(v[2]), project(v[4]), thickness, blur);
253        result += drawLine(p, project(v[2]), project(v[6]), thickness, blur);
254        result += drawLine(p, project(v[2]), project(v[10]), thickness, blur);
255        result += drawLine(p, project(v[2]), project(v[11]), thickness, blur);
256        
257        // Vertex 3 connections (excluding already drawn)
258        result += drawLine(p, project(v[3]), project(v[4]), thickness, blur);
259        result += drawLine(p, project(v[3]), project(v[6]), thickness, blur);
260        result += drawLine(p, project(v[3]), project(v[8]), thickness, blur);
261        result += drawLine(p, project(v[3]), project(v[9]), thickness, blur);
262        
263        // Vertex 4 connections (excluding already drawn)
264        result += drawLine(p, project(v[4]), project(v[5]), thickness, blur);
265        result += drawLine(p, project(v[4]), project(v[11]), thickness, blur);
266        
267        // Vertex 5 connections (excluding already drawn)
268        result += drawLine(p, project(v[5]), project(v[11]), thickness, blur);
269        
270        // Vertex 6 connections (excluding already drawn)
271        result += drawLine(p, project(v[6]), project(v[7]), thickness, blur);
272        result += drawLine(p, project(v[6]), project(v[8]), thickness, blur);
273        result += drawLine(p, project(v[6]), project(v[10]), thickness, blur);
274        
275        // Vertex 7 connections (excluding already drawn)
276        result += drawLine(p, project(v[7]), project(v[10]), thickness, blur);
277        
278        // Vertex 8 connections (excluding already drawn)
279        result += drawLine(p, project(v[8]), project(v[9]), thickness, blur);
280        
281        // Vertex 9 connections (excluding already drawn)
282        result += drawLine(p, project(v[9]), project(v[11]), thickness, blur);
283        
284        // Vertex 10 connections (excluding already drawn)
285        result += drawLine(p, project(v[10]), project(v[11]), thickness, blur);
286        
287    } else if (shape == 4) {
288        // Pyramid - 8 edges
289        vec3 v[5];
290        float s = 0.7; // Scale down pyramid base
291        v[0] = vec3(-s, 0.0, -s);
292        v[1] = vec3( s, 0.0, -s);
293        v[2] = vec3( s, 0.0,  s);
294        v[3] = vec3(-s, 0.0,  s);
295        v[4] = vec3( 0.0, 1.0,  0.0); // Lower height
296        
297        // Transform vertices
298        for (int i = 0; i < 5; i++) {
299            v[i] = rotation * (v[i] * scale);
300        }
301        
302        // Base
303        result += drawLine(p, project(v[0]), project(v[1]), thickness, blur);
304        result += drawLine(p, project(v[1]), project(v[2]), thickness, blur);
305        result += drawLine(p, project(v[2]), project(v[3]), thickness, blur);
306        result += drawLine(p, project(v[3]), project(v[0]), thickness, blur);
307        
308        // Edges to apex
309        result += drawLine(p, project(v[0]), project(v[4]), thickness, blur);
310        result += drawLine(p, project(v[1]), project(v[4]), thickness, blur);
311        result += drawLine(p, project(v[2]), project(v[4]), thickness, blur);
312        result += drawLine(p, project(v[3]), project(v[4]), thickness, blur);
313        
314    } else if (shape == 5) {
315        // Double pyramid (diamond) - 12 edges
316        vec3 v[6];
317        float s = 0.6; // Scale down diamond
318        v[0] = vec3(-s, 0.0, -s);
319        v[1] = vec3( s, 0.0, -s);
320        v[2] = vec3( s, 0.0,  s);
321        v[3] = vec3(-s, 0.0,  s);
322        v[4] = vec3( 0.0,  1.0,  0.0);
323        v[5] = vec3( 0.0, -1.0,  0.0);
324        
325        // Transform vertices
326        for (int i = 0; i < 6; i++) {
327            v[i] = rotation * (v[i] * scale);
328        }
329        
330        // Middle square
331        result += drawLine(p, project(v[0]), project(v[1]), thickness, blur);
332        result += drawLine(p, project(v[1]), project(v[2]), thickness, blur);
333        result += drawLine(p, project(v[2]), project(v[3]), thickness, blur);
334        result += drawLine(p, project(v[3]), project(v[0]), thickness, blur);
335        
336        // Top pyramid
337        result += drawLine(p, project(v[0]), project(v[4]), thickness, blur);
338        result += drawLine(p, project(v[1]), project(v[4]), thickness, blur);
339        result += drawLine(p, project(v[2]), project(v[4]), thickness, blur);
340        result += drawLine(p, project(v[3]), project(v[4]), thickness, blur);
341        
342        // Bottom pyramid
343        result += drawLine(p, project(v[0]), project(v[5]), thickness, blur);
344        result += drawLine(p, project(v[1]), project(v[5]), thickness, blur);
345        result += drawLine(p, project(v[2]), project(v[5]), thickness, blur);
346        result += drawLine(p, project(v[3]), project(v[5]), thickness, blur);
347        
348    } else if (shape == 6) {
349        // Hexagonal prism - 18 edges
350        vec3 v[12];
351        float angleStep = TWO_PI / 6.0;
352        
353        // Generate hexagon vertices - unrolled loop
354        v[0] = vec3(cos(0.0 * angleStep), -1.0, sin(0.0 * angleStep));
355        v[1] = vec3(cos(1.0 * angleStep), -1.0, sin(1.0 * angleStep));
356        v[2] = vec3(cos(2.0 * angleStep), -1.0, sin(2.0 * angleStep));
357        v[3] = vec3(cos(3.0 * angleStep), -1.0, sin(3.0 * angleStep));
358        v[4] = vec3(cos(4.0 * angleStep), -1.0, sin(4.0 * angleStep));
359        v[5] = vec3(cos(5.0 * angleStep), -1.0, sin(5.0 * angleStep));
360        
361        v[6] = vec3(cos(0.0 * angleStep), 1.0, sin(0.0 * angleStep));
362        v[7] = vec3(cos(1.0 * angleStep), 1.0, sin(1.0 * angleStep));
363        v[8] = vec3(cos(2.0 * angleStep), 1.0, sin(2.0 * angleStep));
364        v[9] = vec3(cos(3.0 * angleStep), 1.0, sin(3.0 * angleStep));
365        v[10] = vec3(cos(4.0 * angleStep), 1.0, sin(4.0 * angleStep));
366        v[11] = vec3(cos(5.0 * angleStep), 1.0, sin(5.0 * angleStep));
367        
368        // Transform vertices - unrolled loop
369        v[0] = rotation * (v[0] * scale);
370        v[1] = rotation * (v[1] * scale);
371        v[2] = rotation * (v[2] * scale);
372        v[3] = rotation * (v[3] * scale);
373        v[4] = rotation * (v[4] * scale);
374        v[5] = rotation * (v[5] * scale);
375        v[6] = rotation * (v[6] * scale);
376        v[7] = rotation * (v[7] * scale);
377        v[8] = rotation * (v[8] * scale);
378        v[9] = rotation * (v[9] * scale);
379        v[10] = rotation * (v[10] * scale);
380        v[11] = rotation * (v[11] * scale);
381        
382        // Draw bottom hexagon - unrolled
383        result += drawLine(p, project(v[0]), project(v[1]), thickness, blur);
384        result += drawLine(p, project(v[1]), project(v[2]), thickness, blur);
385        result += drawLine(p, project(v[2]), project(v[3]), thickness, blur);
386        result += drawLine(p, project(v[3]), project(v[4]), thickness, blur);
387        result += drawLine(p, project(v[4]), project(v[5]), thickness, blur);
388        result += drawLine(p, project(v[5]), project(v[0]), thickness, blur);
389        
390        // Draw top hexagon - unrolled
391        result += drawLine(p, project(v[6]), project(v[7]), thickness, blur);
392        result += drawLine(p, project(v[7]), project(v[8]), thickness, blur);
393        result += drawLine(p, project(v[8]), project(v[9]), thickness, blur);
394        result += drawLine(p, project(v[9]), project(v[10]), thickness, blur);
395        result += drawLine(p, project(v[10]), project(v[11]), thickness, blur);
396        result += drawLine(p, project(v[11]), project(v[6]), thickness, blur);
397        
398        // Draw vertical edges - unrolled
399        result += drawLine(p, project(v[0]), project(v[6]), thickness, blur);
400        result += drawLine(p, project(v[1]), project(v[7]), thickness, blur);
401        result += drawLine(p, project(v[2]), project(v[8]), thickness, blur);
402        result += drawLine(p, project(v[3]), project(v[9]), thickness, blur);
403        result += drawLine(p, project(v[4]), project(v[10]), thi
403ckness, blur);
404        result += drawLine(p, project(v[5]), project(v[11]), thickness, blur);
405        
406    } else {
407        // Animated morphing shape
408        float t = u_time * 0.5;
409        float morph = sin(t) * 0.5 + 0.5;
410        
411        // Morph between cube and octahedron
412        vec3 cube[8];
413        getCubeVertices(cube);
414        
415        vec3 octa[6];
416        getOctahedronVertices(octa);
417        
418        // Create morphed vertices
419        vec3 v[8];
420        for (int i = 0; i < 8; i++) {
421            if (i < 6) {
422                v[i] = mix(cube[i], octa[i] * 1.5, morph);
423            } else {
424                v[i] = cube[i] * (1.0 - morph * 0.3);
425            }
426            v[i] = rotation * (v[i] * scale);
427        }
428        
429        // Draw morphed edges
430        float alpha = 1.0 - morph * 0.5;
431        
432        // Cube edges (fade out as morphing)
433        result += drawLine(p, project(v[0]), project(v[1]), thickness, blur) * alpha;
434        result += drawLine(p, project(v[1]), project(v[2]), thickness, blur) * alpha;
435        result += drawLine(p, project(v[2]), project(v[3]), thickness, blur) * alpha;
436        result += drawLine(p, project(v[3]), project(v[0]), thickness, blur) * alpha;
437        
438        result += drawLine(p, project(v[4]), project(v[5]), thickness, blur) * alpha;
439        result += drawLine(p, project(v[5]), project(v[6]), thickness, blur) * alpha;
440        result += drawLine(p, project(v[6]), project(v[7]), thickness, blur) * alpha;
441        result += drawLine(p, project(v[7]), project(v[4]), thickness, blur) * alpha;
442        
443        // Morphing diagonals (octahedron-like)
444        result += drawLine(p, project(v[0]), project(v[6]), thickness, blur) * morph;
445        result += drawLine(p, project(v[1]), project(v[7]), thickness, blur) * morph;
446        result += drawLine(p, project(v[2]), project(v[4]), thickness, blur) * morph;
447        result += drawLine(p, project(v[3]), project(v[5]), thickness, blur) * morph;
448    }
449    
450    return clamp(result, 0.0, 1.0);
451}
452
453// Main rendering function
454vec3 render(vec2 st, vec2 mouse) {
455    // Calculate mouse influence for hover effect - stronger falloff
456    float mouseDistance = length(st - mouse);
457    float mouseInfluence = 1.0 - smoothstep(0.0, 0.5, mouseDistance);
458    
459    // Smooth rotation based on time and subtle mouse influence
460    float time = u_time * 0.2;
461    mat3 rotation = rotateY(time + (mouse.x - 0.5) * mouseInfluence * 1.0) * 
462                    rotateX(time * 0.7 + (mouse.y - 0.5) * mouseInfluence * 1.0) * 
463                    rotateZ(time * 0.1);
464    
465    // Single layer with elegant parameters
466    float scale = 0.35;
467    
468    // INVERTED: Hover creates blur effect
469    // Near mouse: blurry (0.05), far from mouse: sharp (0.0001)
470    float blur = mix(0.0001, 0.05, mouseInfluence);
471    
472    // Dynamic thickness - thicker when blurred, thinner when clear
473    float thickness = mix(0.002, 0.003, mouseInfluence);
474    
475    // Draw wireframe
476    float shape = drawWireframe(st, u_shape, rotation, scale, thickness, blur);
477    
478    vec3 color = u_lineColor;
479    
480    // Subtle dimming on hover (instead of glow)
481    float dimming = 1.0 - mouseInfluence * 0.3;
482    
483    color *= shape * dimming;
484    
485    // Very subtle vignette for depth
486    float vignette = 1.0 - length(st) * 0.2;
487    color *= vignette;
488    
489    // Soft tone mapping
490    color = pow(color, vec3(0.9));
491    
492    return color;
493}
494
495void main() {
496    vec2 st = coord(gl_FragCoord.xy);
497    vec2 mouse = coord(u_mouse * u_pixelRatio) * vec2(1., -1.);
498
499    vec3 color = render(st, mouse);
500
501    // lineMask: 0 = background, 1 = full line
502    float lineMask = clamp(length(color) * 3.0, 0.0, 1.0);
503
504    if (u_bgTransparent) {
505        gl_FragColor = vec4(color, lineMask);
506    } else {
507        gl_FragColor = vec4(mix(u_bgColor, color, lineMask), 1.0);
508    }
509}
510`,o=`
511attribute vec3 a_position;
512attribute vec2 a_uv;
513varying vec2 v_texcoord;
514
515void main() {
516    gl_Position = vec4(a_position, 1.0);
517    v_texcoord = a_uv;
518}
519`,s=["Cube","Tetrahedron","Octahedron","Icosahedron","Pyramid","Diamond","Hexagonal Prism","Morphing"];function l(e){let t=parseInt(e.replace("#",""),16);return[(t>>16&255)/255,(t>>8&255)/255,(255&t)/255]}function a({bgColor:e="#000",lineColor:c="#e6f2ff",transparent:u=!1,className:p="",defaultShape:v="Cube",clickable:d=!1}){let h=(0,r.useRef)(null),f=(0,r.useRef)(null),m=(0,r.useRef)({x:0,y:0}),w=(0,r.useRef)({x:0,y:0}),[g,b]=(0,r.useState)(s.indexOf(v)),j=(0,r.useRef)(void 0),x=(0,r.useRef)(null),k=(0,r.useRef)(null),L=(0,r.useRef)({}),y=(0,r.useRef)(Date.now()),M=(0,r.useRef)(l(e)),R=(0,r.useRef)(l(c)),_=(0,r.useRef)(u);return(0,r.useEffect)(()=>{M.current=l(e)},[e]),(0,r.useEffect)(()=>{R.current=l(c)},[c]),(0,r.useEffect)(()=>{_.current=u},[u]),(0,r.useEffect)(()=>{let e=f.current;if(!e)return;let t=e.getContext("webgl",{antialias:!0,alpha:!0,premultipliedAlpha:!1,preserveDrawingBuffer:!1});if(!t)return void console.error("WebGL not supported");x.current=t;let r=(e,r)=>{let n=t.createShader(e);return n?(t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS))?n:(console.error("Shader compilation error:",t.getShaderInfoLog(n)),t.deleteShader(n),null):null},n=r(t.VERTEX_SHADER,o),s=r(t.FRAGMENT_SHADER,i);if(!n||!s)return;let l=t.createProgram();if(!l)return;if(t.attachShader(l,n),t.attachShader(l,s),t.linkProgram(l),!t.getProgramParameter(l,t.LINK_STATUS))return void console.error("Program linking error:",t.getProgramInfoLog(l));k.current=l,t.useProgram(l),L.current={u_mouse:t.getUniformLocation(l,"u_mouse"),u_resolution:t.getUniformLocation(l,"u_resolution"),u_pixelRatio:t.getUniformLocation(l,"u_pixelRatio"),u_time:t.getUniformLocation(l,"u_time"),u_shape:t.getUniformLocation(l,"u_shape"),u_lineColor:t.getUniformLocation(l,"u_lineColor"),u_bgColor:t.getUniformLocation(l,"u_bgColor"),u_bgTransparent:t.getUniformLocation(l,"u_bgTransparent")};let a=new Float32Array([-1,-1,0,1,-1,0,-1,1,0,1,1,0]),c=new Float32Array([0,0,1,0,0,1,1,1]),u=t.createBuffer();t.bindBuffer(t.ARRAY_BUFFER,u),t.bufferData(t.ARRAY_BUFFER,a,t.STATIC_DRAW);let p=t.getAttribLocation(l,"a_position");t.enableVertexAttribArray(p),t.vertexAttribPointer(p,3,t.FLOAT,!1,0,0);let v=t.createBuffer();t.bindBuffer(t.ARRAY_BUFFER,v),t.bufferData(t.ARRAY_BUFFER,c,t.STATIC_DRAW);let d=t.getAttribLocation(l,"a_uv");return t.enableVertexAttribArray(d),t.vertexAttribPointer(d,2,t.FLOAT,!1,0,0),()=>{t.deleteProgram(l),t.deleteShader(n),t.deleteShader(s)}},[]),(0,r.useEffect)(()=>{let e=()=>{let e=f.current,t=h.current;if(!e||!t)return;let r=Math.min(window.devicePixelRatio,2),n=t.clientWidth,i=t.clientHeight;e.width=n*r,e.height=i*r,e.style.width=`${n}px`,e.style.height=`${i}px`;let o=x.current;o&&o.viewport(0,0,e.width,e.height)};return e(),window.addEventListener("resize",e),()=>window.removeEventListener("resize",e)},[]),(0,r.useEffect)(()=>{let e=e=>{let t=f.current;if(!t)return;let r=t.getBoundingClientRect(),n="touches"in e?e.touches[0].clientX:e.clientX,i="touches"in e?e.touches[0].clientY:e.clientY;m.current={x:n-r.left,y:i-r.top}};return window.addEventListener("mousemove",e),window.addEventListener("touchmove",e),()=>{window.removeEventListener("mousemove",e),window.removeEventListener("touchmove",e)}},[]),(0,r.useEffect)(()=>
519{if(!d)return;let e=()=>{b(e=>(e+1)%s.length)},t=h.current;if(t)return t.addEventListener("click",e),()=>t.removeEventListener("click",e)},[d]),(0,r.useEffect)(()=>{let e=e=>{if(e.key>="1"&&e.key<="8"){let t=parseInt(e.key)-1;t<s.length&&b(t)}};return window.addEventListener("keypress",e),()=>window.removeEventListener("keypress",e)},[]),(0,r.useEffect)(()=>{let e=performance.now(),t=r=>{let n=(r-e)/1e3;e=r;let i=f.current,o=x.current,s=k.current;if(!i||!o||!s){j.current=requestAnimationFrame(t);return}w.current.x+=(m.current.x-w.current.x)*8*n,w.current.y+=(m.current.y-w.current.y)*8*n,o.clear(o.COLOR_BUFFER_BIT);let l=Math.min(window.devicePixelRatio,2),a=(Date.now()-y.current)/1e3;if(L.current.u_mouse&&o.uniform2f(L.current.u_mouse,w.current.x,w.current.y),L.current.u_resolution&&o.uniform2f(L.current.u_resolution,i.width,i.height),L.current.u_pixelRatio&&o.uniform1f(L.current.u_pixelRatio,l),L.current.u_time&&o.uniform1f(L.current.u_time,a),L.current.u_shape&&o.uniform1i(L.current.u_shape,g),L.current.u_lineColor){let[e,t,r]=R.current;o.uniform3f(L.current.u_lineColor,e,t,r)}if(L.current.u_bgColor){let[e,t,r]=M.current;o.uniform3f(L.current.u_bgColor,e,t,r)}L.current.u_bgTransparent&&o.uniform1i(L.current.u_bgTransparent,+!!_.current),o.drawArrays(o.TRIANGLE_STRIP,0,4),j.current=requestAnimationFrame(t)};return j.current=requestAnimationFrame(t),()=>{j.current&&cancelAnimationFrame(j.current)}},[g]),(0,t.jsx)("div",{ref:h,"data-name":s[g],className:(0,n.cn)("px-geometric-blur-mesh hidden relative w-full aspect-square overflow-hidden lg:block",d&&"cursor-pointer",p),children:(0,t.jsx)("canvas",{ref:f,className:"w-full h-full"})})}e.s(["Component",0,a,"default",0,a])},26181,e=>{"use strict";var t=e.i(38397),r=e.i(95331),n=e.i(77487),i=e.i(47163);let o={checking:"bg-[color:var(--color-warm-gray)] opacity-50",up:"bg-emerald-500",down:"bg-red-500"};e.s(["default",0,function({className:e}){let[s,l]=(0,r.useState)("checking"),a=(0,n.useCommon)().mcpStatus;return(0,r.useEffect)(()=>{let e=!1;return fetch("/api/mcp-health").then(e=>e.json()).then(t=>!e&&l(t.ok?"up":"down")).catch(()=>!e&&l("down")),()=>{e=!0}},[]),(0,t.jsxs)("a",{href:"https://mcp.perxel.com",target:"_blank",rel:"noopener noreferrer",className:(0,i.cn)("px-mcp-status-badge inline-flex w-fit items-center gap-2 text-[13px] text-[color:var(--color-warm-gray)] transition-colors duration-200 hover:text-black",e),children:[(0,t.jsx)("span",{"aria-hidden":!0,className:(0,i.cn)("size-2 rounded-full",o[s])}),"Perxel MCP: ",a[s]]})}])},69667,e=>{"use strict";var t=e.i(38397),r=e.i(95331),n=e.i(66460),i=e.i(47163),o=e.i(27882);function s({src:e,width:r,height:i,sizes:l,alt:a,label:c,flex:u,paneRef:p,imgRef:v,state:d,isAnimating:h,isActive:f,onToggle:m}){let w=c.charAt(0).toUpperCase()+c.slice(1),g="expanded"===d?"Back to dual view":`Expand ${w} view`;return(0,t.jsx)(o.TooltipBubble,{tooltip:g,rotate:!1,children:(0,t.jsx)("div",{ref:p,onClick:"collapsed"===d?void 0:m,role:"button","aria-hidden":"collapsed"===d,"aria-label":g,className:`relative h-full rounded-[6px] transition-[flex-grow,opacity,box-shadow] duration-300 ease-in-out hover:shadow-[0_0_0_2px_var(--color-brand-blue)] ${"collapsed"===d?"pointer-events-none opacity-0":"cursor-pointer opacity-100"}`,style:{flex:`${"expanded"===d?1:"collapsed"===d?0:u} ${+("collapsed"!==d)} 0%`},children:(0,t.jsx)("div",{className:"relative h-full w-full overflow-hidden rounded-[6px] border bg-white",children:(0,t.jsx)(n.default,{ref:v,src:e,width:r,height:i,sizes:l,alt:a,loading:"lazy",className:`absolute left-0 top-0 h-auto w-full transition-[filter] duration-300 ease-in-out ${f||h?"will-change-transform":""} ${h?"blur-md":"blur-none"}`})})})})}function l({active:e,desktopSrc:n,desktopWidth:i,desktopHeight:o,mobileSrc:a,mobileWidth:c,mobileHeight:u,alt:p,tone:v="light"}){let d=(0,r.useRef)(null),h=(0,r.useRef)(null),f=(0,r.useRef)(null),m=(0,r.useRef)(null),w=(0,r.useRef)(0),g=(0,r.useRef)("scroll"),b=(0,r.useRef)(0),j=(0,r.useRef)(null),[x,k]=(0,r.useState)(null),[L,y]=(0,r.useState)(!1),[M,R]=(0,r.useState)(1),_=(0,r.useRef)(null);function E(e){k(t=>{let r=t===e?null:e;return null===r&&R(1),r}),y(!0),_.current&&clearTimeout(_.current),_.current=setTimeout(()=>y(!1),300)}return(0,r.useEffect)(()=>()=>{_.current&&clearTimeout(_.current)},[]),(0,r.useEffect)(()=>{x&&(w.current=0,g.current="scroll",b.current=0)},[x]),(0,r.useEffect)(()=>{let t;if(!e)return;j.current=null;let r=e=>{let n=d.current,i=h.current,o=f.current,s=m.current;if(n&&i&&o&&s){let t=i.getBoundingClientRect().height-n.clientHeight,r=s.getBoundingClientRect().height-o.clientHeight,l="desktop"===x?Math.max(0,t):"mobile"===x?Math.max(0,r):Math.max(0,Math.min(t,r)),a=j.current??e,c=e-a;if(j.current=e,l<=0)w.current=0;else if("scroll"===g.current)w.current=Math.min(l,w.current+.06*c*M),w.current>=l&&(g.current="snap",b.current=0);else{b.current+=c;let e=Math.min(1,b.current/700);w.current=l*(1-e*e*e),e>=1&&(g.current="scroll",w.current=0)}i.style.transform=`translateY(-${w.current}px)`,s.style.transform=`translateY(-${w.current}px)`}t=requestAnimationFrame(r)};return t=requestAnimationFrame(r),()=>cancelAnimationFrame(t)}
519,[e,x,M]),(0,t.jsxs)("div",{className:`px-dual-screenshot-frame group relative aspect-[4/3] rounded-[8px] ${"blue"===v?"border-white/10 bg-black":"bg-[#f5f5f5]"} shadow-[var(--shadow-card)] transition-[padding,border-width] duration-300 ease-in-out`,style:{padding:x?"0px":"10px",borderWidth:x?"0px":"1px"},children:[(0,t.jsxs)("div",{className:"flex h-full transition-[gap] duration-300 ease-in-out",style:{gap:x?"0px":"10px"},children:[(0,t.jsx)(s,{src:n,width:i,height:o,sizes:"(min-width: 640px) 30vw, 55vw",alt:`${p} — desktop`,label:"desktop",flex:3,paneRef:d,imgRef:h,state:"desktop"===x?"expanded":"mobile"===x?"collapsed":"default",isAnimating:L,isActive:e,onToggle:()=>E("desktop")}),(0,t.jsx)(s,{src:a,width:c,height:u,sizes:"(min-width: 640px) 20vw, 40vw",alt:`${p} — mobile`,label:"mobile",flex:2,paneRef:f,imgRef:m,state:"mobile"===x?"expanded":"desktop"===x?"collapsed":"default",isAnimating:L,isActive:e,onToggle:()=>E("mobile")})]}),x&&(0,t.jsxs)("button",{type:"button",onClick:function(e){e.stopPropagation(),R(e=>1===e?2:2===e?4:1)},"aria-label":`Scroll speed ${M}x — click to cycle to ${1===M?2:2===M?4:1}x`,className:`absolute bottom-3 right-3 z-10 flex size-9 items-center justify-center rounded-full text-xs font-medium text-white opacity-0 backdrop-blur-md transition-[opacity,background-color,transform] duration-200 group-hover:opacity-100 hover:scale-110 ${4===M?"bg-[var(--color-brand-blue)] hover:brightness-110":2===M?"bg-[var(--color-brand-blue)]/70 hover:bg-[var(--color-brand-blue)]/90":"bg-black/40 hover:bg-black/60"}`,children:["x",M]})]})}let a=new Map,c=1,u=null;function p(){let e=null,t=0;for(let[r,n]of a)n.ratio>t&&(t=n.ratio,e=r);if(e===u)return;let r=null!=u?a.get(u):void 0;u=e,r?.setActive(!1),null!=e&&a.get(e)?.setActive(!0)}let v=3/4*1440;e.s(["default",0,function({thumbnail:e,title:o,iframeSrc:s,className:d,tone:h="light"}){let f=(0,r.useRef)(null),m=(0,r.useRef)(null),[w,g]=(0,r.useState)(!1),[b,j]=(0,r.useState)(1),x="dual-image"===e.type,k="video"===e.type,L="iframe"===e.type,y="blue"===h?"bg-black":"bg-[#f5f5f5]",M="blue"===h?"border-white/10":"border-[var(--color-border-light)]",R=function(e,t){let[n,i]=(0,r.useState)(!1);return(0,r.useEffect)(()=>{if(!t||window.matchMedia?.("(prefers-reduced-motion: reduce)").matches)return;let r=e.current;if(!r)return;let n=c++;a.set(n,{ratio:0,setActive:i});let o=new IntersectionObserver(([e])=>{let t=a.get(n);t&&(t.ratio=e.isIntersecting?e.intersectionRatio:0,p())},{threshold:[0,.2,.4,.6,.8,1]});return o.observe(r),()=>{o.disconnect(),a.delete(n),u===n&&(u=null,p()),i(!1)}},[e,t]),t&&n}(f,w&&(x||k));return(0,r.useEffect)(()=>{if(!f.current)return;let e=new IntersectionObserver(([t])=>{t.isIntersecting&&(g(!0),e.disconnect())},{rootMargin:"200px"});return e.observe(f.current),()=>e.disconnect()},[]),(0,r.useEffect)(()=>{if(!L||!f.current)return;let e=f.current,t=()=>j(e.offsetWidth/1440);t();let r=new ResizeObserver(t);return r.observe(e),()=>r.disconnect()},[L]),(0,r.useEffect)(()=>{let e=m.current;e&&(R?e.play().catch(()=>{}):e.pause())},[R,w]),(0,t.jsx)("div",{ref:f,className:(0,i.cn)("px-project-frame max-w-[560px]",!x&&`relative overflow-hidden rounded-xl border ${M} ${y} shadow-[var(--shadow-card)] ${k?"":"aspect-[4/3]"}`,d),style:k&&"video"===e.type?{aspectRatio:`${e.width} / ${e.height}`}:void 0,children:w?"dual-image"===e.type?(0,t.jsx)(l,{active:R,desktopSrc:e.desktopSrc,desktopWidth:e.desktopWidth,desktopHeight:e.desktopHeight,mobileSrc:e.mobileSrc,mobileWidth:e.mobileWidth,mobileHeight:e.mobileHeight,alt:o,tone:h}):"iframe"===e.type?s?(0,t.jsx)("div",{className:"origin-top-left",style:{width:1440,height:v,transform:`scale(${b})`},children:(0,t.jsx)("iframe",{src:s,title:o,className:"h-full w-full",style:{border:0},scrolling:"no",loading:"lazy"})}):(0,t.jsx)("div",{className:"flex h-full items-center justify-center text-sm text-[var(--color-warm-gray)]",children:"No preview available"}):"image"===e.type?(0,t.jsx)(n.default,{src:e.src,alt:o,fill:!0,sizes:"(min-width: 1024px) 40vw, 100vw",className:"object-cover"}):(0,t.jsx)("video",{ref:m,src:e.src,poster:e.poster,className:"h-full w-full object-cover",preload:"metadata",muted:!0,loop:!0,playsInl
519ine:!0}):x?(0,t.jsx)("div",{className:`aspect-[4/3] rounded-[8px] ${y}`}):null})}],69667)},38378,e=>{"use strict";var t=e.i(38397),r=e.i(95331),n=e.i(70731),i=e.i(47163);e.s(["default",0,function({text:e,className:o,as:s="div"}){let l=(0,r.useRef)(null);return(0,t.jsx)("div",{ref:l,className:"px-proximity-heading inline-block",children:(0,t.jsx)(n.default,{as:s,className:(0,i.cn)("p-heading text-brand-blue text-4xl lg:text-5xl leading-[1.1]",o),fromFontVariationSettings:"'wght' 300",toFontVariationSettings:"'wght' 800",radius:140,falloff:"gaussian",containerRef:l,children:e})})}])},50724,e=>{"use strict";var t=e.i(38397),r=e.i(95331),n=e.i(28985);let i=20,o=1e3/60;e.s(["default",0,function({color:e="rgba(255,255,255,0.2)",className:s="",glow:l=!1,glowColor:a="8,42,229"}){let c=(0,r.useRef)(null);return(0,r.useEffect)(()=>{let t=c.current,r=t?.getContext("2d");if(!t||!r)return;let s=window.matchMedia(n.REDUCED_MOTION).matches,u=window.matchMedia(n.FINE_POINTER).matches,p=Math.min(2,window.devicePixelRatio||1),v=0,d=0,h=new Float32Array(0),f=new Float32Array(0),m=new Float32Array(0),w=!1,g=null,b=0,j=0,x=null,k=!1,L=0,y=0,M=0,R=(e,t)=>{let r=Math.max(0,1-e/t);return r*r*(3-2*r)},_=(e,t,n,i)=>{for(let o=Math.max(0,e);o<Math.min(d-1,t);o++){let e=24-h[o],t=24-h[o+1],s=i((o+.5)*6,(e+t)/2)*n;s<.01||(r.beginPath(),r.moveTo(Math.min(v,6*o),e),r.lineTo(Math.min(v,(o+1)*6),t),r.lineWidth=1+.8*s,r.strokeStyle=`rgba(${a},${s})`,r.stroke())}},E=()=>{r.setTransform(p,0,0,p,0,0),r.clearRect(0,0,v,48),r.beginPath(),r.moveTo(0,24-h[0]);for(let e=1;e<d;e++)r.lineTo(Math.min(v,6*e),24-h[e]);r.lineWidth=1,r.strokeStyle=e,r.stroke(),l&&(M>0&&_(Math.floor((L-200)/6),Math.ceil((L+200)/6),M,(e,t)=>R(Math.hypot(e-L,t-y),200)),j>0&&_(Math.floor((b-200)/6),Math.ceil(b/6),j,e=>e>b?0:R(b-e,200)))},S=()=>{h=new Float32Array(d=Math.ceil((v=t.clientWidth)/6)+1),f=new Float32Array(d),m=new Float32Array(d),t.width=v*p,t.height=48*p,E()};S();let A=new ResizeObserver(()=>{t.clientWidth!==v&&S()});if(A.observe(t),s||!u)return()=>A.disconnect();let T=(e,t)=>{let r=Math.round(e/6);for(let e=-5;e<=5;e++){let n=r+e;n>=0&&n<d&&(f[n]+=t*Math.exp(-(e*e)/8))}w=!0},C=e=>{let{x:t,impulse:r}=e.detail;T(t,r)};t.addEventListener("px-wave-poke",C);let F=e=>{let{x:t}=e.detail;g=t,null!==t&&(b=t)};t.addEventListener("px-wave-tip",F);let V=()=>{let e=0;for(let t=0;t<d;t++)f[t]+=-.02*h[t]-.022*f[t],h[t]=Math.max(-i,Math.min(i,h[t]+f[t])),e=Math.max(e,Math.abs(f[t]),.1*Math.abs(h[t]));for(let e=0;e<3;e++){m.fill(0);for(let e=0;e<d;e++)e>0&&(m[e-1]+=.22*(h[e]-h[e-1])),e<d-1&&(m[e+1]+=.22*(h[e]-h[e+1]));for(let e=0;e<d;e++)f[e]+=m[e]}return h[0]=h[d-1]=0,f[0]=f[d-1]=0,!(e<.02)||(h.fill(0),f.fill(0),!1)},I=null,N=e=>{if("touch"===e.pointerType)return;let r=t.getBoundingClientRect(),n=e.clientX-r.left,i=24-(e.clientY-r.top);if(x={x:e.clientX,y:e.clientY},I&&n>=0&&n<=v&&28>=Math.abs(i)){let e=n-I.x,t=i-I.y,r=Math.hypot(e,t);r>=1&&(Math.sign(i)!==Math.sign(I.y)?T(n,Math.sign(t)*Math.min(5,1.4+.2*r)):T(n,Math.max(-1.5,Math.min(1.5,.14*t))*(1-Math.abs(i)/28)))}I={x:n,y:i}},P=0,D=0,B=0,O=e=>{P=requestAnimationFrame(O);let r=l&&(()=>{if(j+=((null!==g)-j)*.15,x){let e=t.getBoundingClientRect();L=x.x-e.left,y=x.y-e.top}return k=!!x&&y>-200&&y<248&&L>-200&&L<v+200,M+=(!!k-M)*.15,null===g&&j<.01&&(j=0),!k&&M<.01&&(M=0),j>0||M>0})();if(!w&&!r){B=e;return}for(D+=Math.min(100,e-B),B=e;D>=o;)w&&(w=V()),D-=o;E()},$=()=>{x=null},z=()=>{cancelAnimationFrame(P),P=0,I=null,x=null,window.removeEventListener("pointermove",N),document.documentElement.removeEventListener("mouseleave",$)},q=new IntersectionObserver(([e])=>{e.isIntersecting?P||(B=performance.now(),P=requestAnimationFrame(O),window.addEventListener("pointermove",N,{passive:!0}),document.documentElement.addEventListener("mouseleave",$)):z()},{rootMargin:`${l?200:28}px`});return q.observe(t),()=>{z(),t.removeEventListener("px-wave-poke",C),t.removeEventListener("px-wave-tip",F),A.disconnect(),q.disconnect()}},[e,l,a]),(0,t.jsx)("canvas",{ref:c,"aria-hidden":!0,className:`px-wave-line pointer-events-none absolute inset-x-0 block w-full ${s}`,style:{height:48,top:-24}})}])},69622,e=>{"use strict";var t=e.i(95331);e.s(["useMousePositionRef",0,e=>{let r=(0,t.useRef)({x:0,y:0});return(0,t.useEffect)(()=>{let t=(t,n)=>{if(e&&e.current){let i=e.current.getBoundingClientRect();r.current={x:t-i.left,y:n-i.top}}else r.current={x:t,y:n}},n=e=>{t(e.clientX,e.clientY)},i=e=>{let r=e.touches[0];t(r.clientX,r.clientY)};return window.addEventListener("mousemove",n),window.addEventListener("touchmove",i),()=>{window.removeEventListener("mousemove",n),window.removeEventListener("touchmove",i)}},[e]),r}])},91606,e=>{"use strict";e.s(["Seaweed",0,class{sway;vel;phase;feel;constructor(e){this.phase=e,this.sway=new Float32Array(e.length),this.vel=new Float32Array(e.length),this.feel=e.map(()=>.75+.5*Math.random())}push(e,t){this.vel[e]+=t*this.feel[e]}step(e,t,r=.22){let n=!1;for(let i=0;i<this.sway.length;i++){let o=t*r*Math.sin(7e-4*e+this.phase[i]);this.vel[i]+=-.012*(this.sway[i]-o)-.045*this.vel[i],this.sway[i]+=this.vel[i],Math.abs(this.sway[i])>t&&(this.sway[i]=Math.sign(this.sway[i])*t,this.vel[i]*=-.3),Math.abs(this.vel[i])>.15&&(n=!0)}return n}},"drawBent",0,function(e,t,r,n,i,o,s,l,a,c,u){for(let p=0;p<o;p+=3){let v=Math.min(3,o-p),d=Math.max(0,Math.min(1,(a-(p+v/2))/c));e.drawImage(t,r,n+p,i,v,s+u*d*d,l+p,i,v)}}])}]);

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.