@nuxt/schema-nightly 4.5.2-2610051829-580e4b9 → 4.5.2-2610052030-052d82e

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.mjs +1 -1
  2. package/package.json +6 -6
package/dist/index.mjs CHANGED
@@ -595,7 +595,7 @@ const template = (messages) => {
595
595
  ..._messages,
596
596
  ...messages
597
597
  };
598
- return "<!DOCTYPE html><html lang=\"en\"><head><title data-app-name=\"" + escapeHtml(messages.appName) + "\">" + escapeHtml(messages.loading) + " | " + escapeHtml(messages.appName) + "</title><meta charset=\"utf-8\"><meta content=\"width=device-width,initial-scale=1,minimum-scale=1\" name=\"viewport\"><style>:root{--nuxt-mint:#00dc82;--nuxt-mist:#e8fff4e0;--nuxt-dim:#00dc828c;--nuxt-logo:calc(min(10vw, 68px))}*,:after,:before{box-sizing:border-box}body,html{width:100%;height:100%;color:var(--nuxt-mist);background:#000;margin:0}body{-webkit-font-smoothing:antialiased;justify-content:center;align-items:center;font-family:ui-sans-serif,system-ui,sans-serif;display:flex;overflow:hidden}#nuxt-shader,svg{display:block}#nuxt-shader{z-index:0;touch-action:none;opacity:0;width:100%;height:100%;transition:opacity .4s;position:fixed;inset:0}.nuxt-lockup{z-index:1;color:inherit;cursor:pointer;background:0 0;border:0;align-items:center;padding:0;display:flex;position:relative}.nuxt-logo-slot{width:var(--nuxt-logo);height:calc(.66667 * var(--nuxt-logo));flex:0 0 var(--nuxt-logo);color:var(--nuxt-mint)}.nuxt-logo-slot>svg{width:100%;height:100%}.nuxt-logo-slot>svg>path{fill:currentColor}.nuxt-loader-bar{z-index:1;width:var(--nuxt-progress,4%);background:var(--nuxt-mint);height:2px;transition:width .3s;position:fixed;bottom:0;left:0;right:auto}.nuxt-season{z-index:1;width:30px;height:30px;color:var(--nuxt-mint);cursor:pointer;background:#00dc8214;border:1px solid #00dc823d;border-radius:8px;justify-content:center;align-items:center;padding:0;transition:opacity .2s,background-color .2s;display:flex;position:fixed;bottom:26px;right:22px}.nuxt-season[hidden]{display:none}.nuxt-season:hover{background:#00dc8229}.nuxt-season>svg{width:16px;height:16px}.nuxt-sr{clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}@media (prefers-color-scheme:light){:root{--nuxt-mist:#0a0a0ac2;--nuxt-dim:#0a0a0a6b;--nuxt-accent:#00a86a}body,html{background:#fff}}</style><script>var e=/swiftshader|llvmpipe|softpipe|software|basic render/i,t=.55;function n(e,n,t,o){let a=1-Math.exp(-Math.min(Math.max(t,0),.05)/Math.max(o,.001));return[e[0]+(n[0]-e[0])*a,e[1]+(n[1]-e[1])*a]}function r(){try{let e=new URLSearchParams(window.location.search).get(\"winter\");if(null!==e)return\"0\"!==e&&\"false\"!==e}catch{}let e=new Date,n=e.getFullYear(),t=-new Date(n,0,1).getTimezoneOffset(),o=-new Date(n,6,1).getTimezoneOffset();return t!==o&&(t-o>0?[4,5,6]:[10,11,0]).includes(e.getMonth())}function i(o,a,i){let s,l,c,h,d,f,u=!1,p=0,v=1,m=1,g=[.5,.5],w=[.1,.1],x=[.5,.5],y=0,E=new Float32Array(8).fill(-1),L=-1,k=0,b=-1/0,A=!1,S=!1,P=!1,R=!1,M=0,_=0,C=0,N=window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches,O=window.matchMedia(\"(prefers-color-scheme: light)\"),z=+!!O.matches,T=+!!r(),F=()=>{u||S||!A||(b=-1/0,p||=requestAnimationFrame(B))},I=e=>{z=+!!e.matches,W(),F()},W=()=>{s&&(z>0?s.blendFuncSeparate(s.ONE,s.ONE_MINUS_SRC_ALPHA,s.ZERO,s.ONE):s.blendFuncSeparate(s.ONE,s.ONE,s.ONE,s.ONE))},q=()=>{if(!s)return;let e=o.getBoundingClientRect();if(e.width<=0||e.height<=0)return;let n=Math.min(window.devicePixelRatio||1,1.75,2688/e.width),t=[Math.max(1,Math.floor(e.width*n)),Math.max(1,Math.floor(e.height*n))];(t[0]!==v||t[1]!==m)&&(v=t[0],m=t[1],o.width=v,o.height=m,s.viewport(0,0,v,m));let r=a.getBoundingClientRect();g=[(r.left+r.width/2-e.left)/Math.max(1,e.width),(r.top+r.height/2-e.top)/Math.max(1,e.height)],w=[Math.max(.001,r.width/Math.max(1,e.width)),Math.max(.001,r.height/Math.max(1,e.height))]},H=e=>{if(\"touch\"===e.pointerType)return;let n=o.getBoundingClientRect();h=[Math.min(1,Math.max(0,(e.clientX-n.left)/Math.max(1,n.width))),Math.min(1,Math.max(0,(e.clientY-n.top)/Math.max(1,n.height)))]},D=()=>{h=void 0},U=()=>{let e=E.findIndex(e=>e<0);e<0&&(e=E.indexOf(Math.max(...E))),E[e]=0,F()},K=e=>{\"touch\"!==e.pointerType&&(L=0,F())},Z=e=>{e.preventDefault(),Y(),o.remove()},X=e=>{if(e!==S&&!u){if(e&&!A)return void(P=!0);if(S=e,S)return M=_,h=void 0,p&&cancelAnimationFrame(p),void(p=0);P=!1,R=!0,p||=requestAnimationFrame(B)}},B=e=>{if(u||(p=requestAnimationFrame(B),_=e,R&&(R=!1,C+=e-M,b=-1/0,k=(e-C)/1e3),e-b<33)||!s||!l||!d)return;b=e;let o=(e-C)/1e3,a=Math.min(Math.max(o-k,0),.05);k=o,x=n(x,h??x,a,.22),y+=(+!!h-y)*(1-Math.exp(-a/.35));for(let e=0;e<E.length;e++)E[e]<0||(E[e]+=a*t,E[e]>=1&&(E[e]=-1));L>=0&&(L+=a*t,L>=1&&(L=-1)),s.uniform2f(d.uLogoCentre,g[0],g[1]),s.uniform2f(d.uLogoScale,w[0],w[1]),s.uniform2f(d.uResolution,v,m),s.uniform2f(d.uPointer,x[0],x[1]),s.uniform1fv(d.uWave,E),s.uniform1f(d.uHoverWave,L),s.uniform2f(d.uMisc,o,y),s.uniform2f(d.uSeason,T,z),s.uniform1f(d.uLight,z);let r=+(z>0);s.clearColor(r,r,r,1),s.clear(s.COLOR_BUFFER_BIT),s.drawArrays(s.TRIANGLES,0,T>0?1111440:1098240),A||(A=!0,V.onFirstFrame?.(),P&&X(!0)),N&&(cancelAnimationFrame(p),p=0)},Y=()=>{u||(u=!0,p&&cancelAnimationFrame(p),p=0,c?.disconnect(),window.removeEventListener(\"pointermove\",H),document.documentElement.removeEventListener(\"pointerleave\",D),i?.removeEventListener(\"click\",U),i?.removeEventListener(\"pointerenter\",K),O.removeEventListener(\"change\",I),o.removeEventListener(\"webglcontextlost\",Z),s&&l&&s.deleteProgram(l),s=void 0,l=void 0)},G=(e,n,t)=>{let o=e.createShader(n);if(!o)throw Error(\"Could not create shader.\");if(e.shaderSource(o,t),e.compileShader(o),!e.getShaderParameter(o,e.COMPILE_STATUS)){let n=e.getShaderInfoLog(o);throw e.deleteShader(o),Error(`Shader failed to compile: ${n}`)}return o};try{(()=>{let n=o.getContext(\"webgl2\",{alpha:!1,antialias:!1,depth:!1,stencil:!1,powerPreference:\"low-power\"});if(!n)throw Error(\"No WebGL2 context.\");let t=n.getExtension(\"WEBGL_debug_renderer_info\"),r=String(t&&n.getParameter(t.UNMASKED_RENDERER_WEBGL)||n.getParameter(n.RENDERER)||\"\");if(e.test(r))throw Error(`Software renderer (${r}); falling back to the lockup.`);s=n;let h=G(n,n.VERTEX_SHADER,\"#version 300 es\\n// A particle mountain range for the dev-server loading screen.\\n//\\n// One draw call and no vertex buffers: every particle is a quad whose position\\n// is derived from gl_VertexID, sampled from a ridged heightfield in\\n// perspective, so the field reads as a range of peaks seen at a grazing angle.\\n// Nothing here depends on build progress — the screen looks the same at one\\n// second and at two minutes.\\n//\\n// Motion, all continuous loops:\\n// · per-particle drift and shimmer\\n// · slow luminosity waves crossing the field\\n// · a ripple radiating from the lockup\\n// · overlapping shockwaves fired by clicking the lockup\\nprecision highp float;\\n\\nuniform vec2 uLogoCentre;\\nuniform vec2 uLogoScale;\\nuniform vec2 uResolution;\\n/** pointer position in canvas space, smoothed */\\nuniform vec2 uPointer;\\n/** shockwave phases 0..1; negative entries are inactive */\\nuniform float uWave[8];\\n/** subtle pointer-enter wave phase; negative while inactive */\\nuniform float uHoverWave;\\n/** x: seconds, y: pointer presence 0..1 */\\nuniform vec2 uMisc;\\n/** x: winter 0..1 — snow on the peaks and falling flakes; y: 1 in light mode */\\nuniform vec2 uSeason;\\n\\nout vec2 vLocal;\\n/** dark: emitted colour, w unused. light: ink colour, w its coverage. */\\nout vec4 vTint;\\n\\nconst vec3 MINT = vec3(0.0, 0.8627451, 0.5098039);\\nconst vec3 MINT_PALE = vec3(0.6235294, 1.0, 0.8156863);\\nconst vec3 SNOW = vec3(0.88, 1.0, 0.96);\\n\\n// Light mode draws the same range as ink on paper. Emitted light becomes\\n// coverage, and the renderer blends it over the page instead of adding it to\\n// the dark. Alpha rather than subtraction, so a crest that many particles\\n// land on settles on the brand green instead of running away to black.\\nconst vec3 INK = vec3(0.0);\\nconst vec3 LUMA = vec3(0.2126, 0.7152, 0.0722);\\n\\n// grid of particles\\nconst uint COLS = 704u;\\nconst uint ROWS = 260u;\\nconst uint TERRAIN_COUNT = COLS * ROWS;\\n\\n// camera\\nconst float Z_NEAR = 1.3;\\nconst float Z_FAR = 26.0;\\nconst float CAM_Y = 2.4;\\nconst float FOCAL = 1.3;\\nconst float HORIZON = 0.30;\\n\\n// the two summits that shape the skyline, in screen-x units\\nconst float PEAK1_X = -0.40;\\nconst float PEAK1_H = 3.2;\\nconst float PEAK2_X = 0.40;\\nconst float PEAK2_H = 2.2;\\n\\nconst vec2 QUAD[6] = vec2[6](\\n vec2(-1.0, -1.0), vec2(1.0, -1.0), vec2(-1.0, 1.0),\\n vec2(-1.0, 1.0), vec2(1.0, -1.0), vec2(1.0, 1.0)\\n);\\n\\nfloat hash21 (vec2 p) {\\n vec2 q = fract(p * vec2(0.1031, 0.1030));\\n q += dot(q, q.yx + 33.33);\\n return fract((q.x + q.y) * q.x);\\n}\\n\\nfloat noise2 (vec2 p) {\\n vec2 i = floor(p);\\n vec2 f = fract(p);\\n vec2 u = f * f * (3.0 - 2.0 * f);\\n float a = hash21(i);\\n float b = hash21(i + vec2(1.0, 0.0));\\n float c = hash21(i + vec2(0.0, 1.0));\\n float d = hash21(i + vec2(1.0, 1.0));\\n return mix(mix(a, b, u.x), mix(c, d, u.x), u.y);\\n}\\n\\nfloat shockwave (float phase, float dist) {\\n if (phase < 0.0) { return 0.0; }\\n float radius = phase * 1.7;\\n float width = 0.09 + phase * 0.20;\\n return exp(-((dist - radius) * (dist - radius)) / (width * width))\\n * (1.0 - smoothstep(0.55, 1.0, phase))\\n * smoothstep(0.0, 0.04, phase);\\n}\\n\\n// `shape` flattens the relief on narrow screens. A summit covers the same\\n// fraction of screen height whatever the aspect, but far fewer pixels of width\\n// in portrait, so without this the peaks turn into needles.\\nfloat terrain (float x, float z, float u, float shape) {\\n // ridged noise stretched along the view axis gives crest lines that flow\\n // into the distance rather than a lumpy field\\n vec2 q = vec2(x * 0.30, z * 0.085);\\n float r = 0.0;\\n float amp = 0.55;\\n mat2 rot = mat2(1.6, 1.2, -1.2, 1.6);\\n for (int i = 0; i < 5; i++) {\\n r += amp * (1.0 - abs(2.0 * noise2(q) - 1.0));\\n q = rot * q;\\n amp *= 0.55;\\n }\\n float h = pow(max(r, 0.0), 1.5) * 2.6;\\n h *= 0.70 + 0.60 * noise2(vec2(x * 0.05, z * 0.05) + 7.0);\\n // two designed summits, far enough back to break the horizon\\n float rise = smoothstep(3.0, 9.0, z);\\n h += rise * PEAK1_H * max(0.0, 1.0 - abs(u - PEAK1_X) * 3.2);\\n h += rise * PEAK2_H * max(0.0, 1.0 - abs(u - PEAK2_X) * 3.6);\\n return max(h, 0.0) * shape;\\n}\\n\\nvoid main () {\\n uint id = uint(gl_VertexID) / 6u;\\n int corner = gl_VertexID % 6;\\n float t = uMisc.x;\\n vec2 resolution = max(uResolution, vec2(1.0));\\n float aspect = max(resolution.x / resolution.y, 0.5);\\n float winter = uSeason.x;\\n float light = uSeason.y;\\n\\n // the icon centre is needed by both the terrain and the flakes\\n float logoH = max(uLogoScale.y, 0.01);\\n vec2 centre = vec2(\\n uLogoCentre.x * 2.0 - 1.0,\\n 1.0 - 2.0 * uLogoCentre.y\\n );\\n vec2 offset = QUAD[corner];\\n\\n // A flake drifting down the screen, in its own parallax layer. Independent of\\n // the terrain: it lives in screen space and wraps around forever. Flakes are\\n // drawn from the indices past the terrain, so winter costs nothing out of\\n // season — the draw call is simply shorter.\\n if (id >= TERRAIN_COUNT) {\\n float fi = float(id - TERRAIN_COUNT);\\n float r1 = hash21(vec2(fi, 1.7));\\n float r2 = hash21(vec2(fi, 5.3));\\n float r3 = hash21(vec2(fi, 9.1));\\n // near flakes are bigger, brighter and fall faster\\n float depth = 0.30 + r3 * 0.70;\\n float x = (r1 * 2.4 - 1.2) + sin(t * (0.25 + r2 * 0.35) + r1 * 40.0) * 0.05 * depth;\\n float y = 1.2 - fract(r2 + t * (0.020 + r3 * 0.035)) * 2.5;\\n vec2 pos = vec2(x, y);\\n\\n // flakes thin out over the icon so they never sit on the mark\\n vec2 toCentre = vec2((pos.x - centre.x) * aspect, pos.y - centre.y);\\n vec2 clear = abs(toCentre / vec2(logoH * 3.4, logoH * 2.8));\\n float clearing = 0.25 + 0.75 * smoothstep(0.5, 1.2, pow(pow(clear.x, 3.0) + pow(clear.y, 3.0), 1.0 / 3.0));\\n float twinkle = 0.75 + 0.25 * sin(t * (1.1 + r1 * 2.0) + r2 * 30.0);\\n float sizePx = (0.55 + depth * 1.5) * (resolution.y / 900.0);\\n float amount = (0.16 + 0.48 * depth) * twinkle * clearing * winter;\\n\\n gl_Position = vec4(pos + offset * sizePx * 2.0 / resolution, 0.5, 1.0);\\n vLocal = offset;\\n // white flakes cannot show on paper, so light mode draws them as ink\\n vTint = light > 0.5 ? vec4(INK, amount * 1.6) : vec4(SNOW * amount, 1.0);\\n return;\\n }\\n\\n uint col = id % COLS;\\n uint row = id / COLS;\\n vec2 seed = vec2(float(col), float(row));\\n float jitterX = hash21(seed) - 0.5;\\n float jitterY = hash21(seed + 17.0) - 0.5;\\n float rnd = hash21(seed + 41.0);\\n\\n // screen-x is fixed per column; depth is biased so the near field is denser\\n float u = ((float(col) + jitterX) / float(COLS)) * 2.3 - 1.15;\\n float v = clamp((float(row) + jitterY) / float(ROWS), 0.0, 1.0);\\n float z = mix(Z_NEAR, Z_FAR, pow(v, 1.5));\\n // widen the field of view and flatten the range as the window narrows, so a\\n // phone shows a range rather than a row of spikes\\n float shape = clamp(aspect / 1.6, 0.5, 1.0);\\n float tanX = max(aspect, 0.95) / FOCAL;\\n float xw = u * z * tanX;\\n\\n float h = terrain(xw, z, u, shape);\\n h += (noise2(vec2(xw * 1.6, z * 1.6)) - 0.5) * 0.05 * shape;\\n\\n // shading from the surface itself: one fixed light, plus a convexity term\\n // that picks out the crests\\n float e = 0.22;\\n float hxp = terrain(xw + e, z, u, shape);\\n float hxm = terrain(xw - e, z, u, shape);\\n float hzp = terrain(xw, z + e, u, shape);\\n vec3 normal = normalize(vec3(-(hxp - hxm) / (2.0 * e), 1.0, -(hzp - h) / e));\\n vec3 lightDir = normalize(vec3(-0.12, 0.60, -0.42));\\n float diffuse = pow(max(dot(normal, lightDir), 0.0), 1.3);\\n float crest = smoothstep(0.0, 1.5, (2.0 * h - hxp - hxm) / (e * e) * 0.2);\\n\\n float sy = (h - CAM_Y) / z * FOCAL + HORIZON;\\n\\n // nearer ridges hide what lies behind them, which is what makes the skyline\\n float occluded = 0.0;\\n for (int k = 1; k <= 4; k++) {\\n float zs = Z_NEAR + (z - Z_NEAR) * float(k) / 5.0;\\n float hs = terrain(u * zs * tanX, zs, u, shape);\\n occluded = max(occluded, step(sy + 0.012, (hs - CAM_Y) / zs * FOCAL + HORIZON));\\n }\\n\\n // the icon sits in a tight clearing so it always reads on plain ground.\\n // Waves and ripples are measured from this same point, so they leave the mark.\\n vec2 toCentre = vec2((u - centre.x) * aspect, sy - centre.y);\\n float dist = length(toCentre);\\n // The clearing has to read as haze, not as a hole cut out of the scene, so it\\n // fades over a short distance and its edge is broken up by noise. A squircle\\n // around the icon, not the old icon+wordmark block.\\n vec2 clear = abs(toCentre / vec2(logoH * 3.6, logoH * 3.0));\\n float clearEdge = pow(pow(clear.x, 3.0) + pow(clear.y, 3.0), 1.0 / 3.0)\\n + (noise2(vec2(xw * 0.55, z * 0.55)) - 0.5) * 0.30;\\n float clearing = smoothstep(0.46, 1.30, clearEdge);\\n\\n // ambient ripple, always running\\n float ripplePhase = fract(t * 0.30);\\n float rippleRadius = ripplePhase * 2.4;\\n float rippleWidth = 0.16 + ripplePhase * 0.25;\\n float ripple = exp(-((dist - rippleRadius) * (dist - rippleRadius)) / (rippleWidth * rippleWidth))\\n * (1.0 - smoothstep(0.55, 0.95, ripplePhase))\\n * smoothstep(0.0, 0.05, ripplePhase);\\n\\n // Every click has an independent phase, so its ring keeps travelling even\\n // when another click starts a new one.\\n float shock = 0.0;\\n for (int i = 0; i < 8; i++) {\\n shock += shockwave(uWave[i], dist);\\n }\\n shock += shockwave(uHoverWave, dist) * 0.25;\\n\\n float fog = exp(-(z - Z_NEAR) * 0.075) * (1.0 - smoothstep(0.86, 1.0, v));\\n float nearFade = smoothstep(Z_NEAR, 2.6, z);\\n // in winter the snowline drops a long way and the caps turn properly white\\n float snowline = 2.6 - winter * 1.7;\\n float snow = smoothstep(snowline, snowline + 1.0 - winter * 0.45, h);\\n float shimmer = 0.88 + 0.12 * sin(t * (0.7 + rnd * 1.4) + rnd * 31.0);\\n float grain = 0.88 + 0.24 * noise2(vec2(xw * 3.0, z * 3.0));\\n\\n // a fifth of the particles pulse on their own cycle, so the field never\\n // settles into a repeating pattern\\n float pulses = step(0.82, hash21(seed + 63.0));\\n float pulse = pow(0.5 + 0.5 * sin(t * (0.5 + rnd * 1.1) + rnd * 61.0), 6.0);\\n\\n // two slow noise waves drifting across the field\\n float waveA = noise2(vec2(xw * 0.22 - t * 0.20, z * 0.22)) - 0.5;\\n float waveB = noise2(vec2(xw * 0.55 + t * 0.09, z * 0.55 - t * 0.14)) - 0.5;\\n float wave = 1.0 + waveA * 0.24 + waveB * 0.16;\\n\\n // snow throws light back, so the caps read brighter as well as whiter\\n float lit = diffuse * 0.18 + crest * (0.34 + diffuse * 0.45) + snow * (0.06 + winter * 0.30);\\n float brightness = (0.008 + lit * grain)\\n * fog * nearFade * wave * shimmer\\n * (1.0 + pulse * (0.18 + pulses * 1.1))\\n * (1.0 + ripple * 0.75 + shock * 3.0);\\n vec3 tint = mix(MINT * 0.75, MINT_PALE, clamp(crest + snow * 0.5, 0.0, 1.0));\\n tint = mix(tint, SNOW, winter * snow) * brightness;\\n\\n float glint = step(0.993, rnd) * diffuse * (0.5 + 0.5 * sin(t * 2.0 + rnd * 47.0));\\n tint += vec3(0.85, 1.0, 0.93) * glint * fog * 0.55;\\n\\n // the pointer stirs nearby dust\\n vec2 pointer = vec2((uPointer.x - 0.5) * 2.0, (0.5 - uPointer.y) * 2.0);\\n vec2 toPointer = vec2((u - pointer.x) * aspect, sy - pointer.y);\\n float excite = (1.0 - smoothstep(0.0, 0.55, length(toPointer))) * uMisc.y;\\n vec2 push = normalize(toPointer + vec2(0.0001, 0.0)) * excite * (0.006 + 0.010 * rnd);\\n tint *= 1.0 + excite * 1.3;\\n\\n // Light mode reuses every lighting term above and only reinterprets it: how\\n // much light a particle emits becomes how much ink it lays down. Taking the\\n // luminance keeps the two themes at matching density, and the crests that go\\n // palest on black carry the brand green on paper. Snow is the one term that\\n // has to invert — a white cap can only read on paper by leaving it bare.\\n if (light > 0.5) {\\n // lifted, since faint dust that reads fine against black all but vanishes\\n // against white\\n float coverage = pow(clamp(dot(tint, LUMA) * 2.2, 0.0, 1.0), 0.8) * (1.0 - winter * snow * 0.6);\\n vTint = vec4(INK, coverage * (1.0 - occluded) * clearing);\\n } else {\\n vTint = vec4(tint * (1.0 - occluded) * clearing, 1.0);\\n }\\n\\n // particles float around their anchor, more freely up close\\n float floatAmp = (0.0015 + (1.0 - v) * 0.006) * (1.0 + excite * 2.5);\\n vec2 drift = vec2(\\n sin(t * (0.35 + rnd * 0.5) + rnd * 40.0),\\n cos(t * (0.28 + rnd * 0.45) + rnd * 23.0) * 1.4\\n ) * floatAmp;\\n\\n // the shockwave shoves particles outward as it passes\\n vec2 shockPush = vec2(toCentre.x / max(dist, 0.02) / aspect, toCentre.y / max(dist, 0.02)) * shock * 0.045;\\n\\n float sizePx = clamp(16.0 / z, 0.65, 1.9)\\n * (0.75 + 0.5 * hash21(seed + 27.0))\\n * (1.0 + glint * 0.25 + ripple * 0.20 + shock * 0.75);\\n\\n gl_Position = vec4(\\n vec2(u, sy) + drift + push + shockPush + offset * sizePx * 2.0 / resolution,\\n 0.5,\\n 1.0\\n );\\n vLocal = offset;\\n}\\n\"),f=G(n,n.FRAGMENT_SHADER,\"#version 300 es\\nprecision highp float;\\n\\nin vec2 vLocal;\\nin vec4 vTint;\\n/** 1 in light mode; uniform across the draw, so the branch is free */\\nuniform float uLight;\\nout vec4 fragColor;\\n\\nvoid main () {\\n float falloff = 1.0 - smoothstep(0.45, 1.0, length(vLocal));\\n if (uLight > 0.5) {\\n // premultiplied, so it composites over the page and settles on the ink\\n // colour however much dust lands on it\\n float alpha = vTint.a * falloff;\\n fragColor = vec4(vTint.rgb * alpha, alpha);\\n } else {\\n fragColor = vec4(vTint.rgb * falloff, 1.0);\\n }\\n}\\n\"),u=n.createProgram();if(!u)throw Error(\"Could not create program.\");if(n.attachShader(u,h),n.attachShader(u,f),n.linkProgram(u),n.deleteShader(h),n.deleteShader(f),!n.getProgramParameter(u,n.LINK_STATUS)){let e=n.getProgramInfoLog(u);throw n.deleteProgram(u),Error(`Program failed to link: ${e}`)}l=u,n.useProgram(u);let v=e=>n.getUniformLocation(u,e);d={uLogoCentre:v(\"uLogoCentre\"),uLogoScale:v(\"uLogoScale\"),uResolution:v(\"uResolution\"),uPointer:v(\"uPointer\"),uWave:v(\"uWave[0]\"),uHoverWave:v(\"uHoverWave\"),uMisc:v(\"uMisc\"),uSeason:v(\"uSeason\"),uLight:v(\"uLight\")},n.bindVertexArray(n.createVertexArray()),n.disable(n.DEPTH_TEST),n.enable(n.BLEND),W(),q(),c=typeof ResizeObserver>\"u\"?void 0:new ResizeObserver(q),c?.observe(o),c?.observe(a),window.addEventListener(\"pointermove\",H),document.documentElement.addEventListener(\"pointerleave\",D),i?.addEventListener(\"click\",U),i?.addEventListener(\"pointerenter\",K),O.addEventListener(\"change\",I),o.addEventListener(\"webglcontextlost\",Z),p||=requestAnimationFrame(B)})(),f=Promise.resolve()}catch(e){Y(),f=Promise.reject(e instanceof Error?e:Error(String(e)))}let V={ready:f,dispose:Y,setPaused:X,setWinter:e=>{let n=+!!e;n!==T&&(T=n,F())}};return V}var a=\"nuxt-snow\";function o(){try{return\"false\"!==window.localStorage.getItem(a)}catch{return!0}}function s(e){let n=r(),t=o();if(e.setWinter(n&&t),!n)return;let i=document.querySelector(\"#nuxt-season\");if(!i)return;let s=()=>{i.style.opacity=t?\"1\":\"0.4\",i.setAttribute(\"aria-pressed\",String(t)),i.title=t?\"Turn off snow\":\"Turn on snow\"};s(),i.hidden=!1,i.addEventListener(\"click\",()=>{t=!t,e.setWinter(t),s();try{window.localStorage.setItem(a,String(t))}catch{}})}function c(){try{let e=new URLSearchParams(window.location.search).get(\"shader\");return\"0\"===e||\"false\"===e}catch{return!1}}function l(){let e=document.querySelector(\"#nuxt-shader\"),n=document.querySelector(\"#nuxt-logo-slot\");if(!e||!n||!window.WebGL2RenderingContext||c())return void e?.remove();let t=i(e,n,document.querySelector(\".nuxt-lockup\"));s(t),t.onFirstFrame=()=>{e.style.opacity=\"1\"},t.ready.catch(()=>e.remove()),window.addEventListener(\"pagehide\",()=>t.dispose(),{once:!0});let o=e=>t.setPaused(e);window===window.top?(window.addEventListener(\"blur\",()=>o(!0)),window.addEventListener(\"focus\",()=>o(!1)),document.addEventListener(\"visibilitychange\",()=>{document.hidden?o(!0):document.hasFocus()&&o(!1)}),(document.hidden||!document.hasFocus())&&o(!0)):(document.addEventListener(\"visibilitychange\",()=>o(document.hidden)),document.hidden&&o(!0))}\"loading\"===document.readyState?document.addEventListener(\"DOMContentLoaded\",l,{once:!0}):l();<\/script></head><body><canvas id=\"nuxt-shader\" aria-hidden=\"true\"></canvas><button type=\"button\" class=\"nuxt-lockup\" id=\"nuxtImg\" aria-label=\"" + escapeHtml(messages.appName) + "\"><span id=\"nuxt-logo-slot\" class=\"nuxt-logo-slot\"> <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" aria-hidden=\"true\" viewBox=\"0 0 48 32\"><path d=\"M26.88 32h17.76c.567 0 1.11-.2 1.6-.48s.997-.633 1.28-1.12c.283-.486.48-1.038.48-1.6s-.196-1.114-.48-1.6l-12-20.64a2.9 2.9 0 0 0-1.12-1.12c-.49-.28-1.193-.48-1.76-.48s-1.11.2-1.6.48-.837.634-1.12 1.12l-3.04 5.28L20.8 1.6c-.284-.487-.63-1-1.12-1.28S18.647 0 18.08 0s-1.11.04-1.6.32-.997.793-1.28 1.28L.32 27.2c-.284.486-.32 1.038-.32 1.6 0 .561.037 1.113.32 1.6.283.486.79.84 1.28 1.12s1.033.48 1.6.48h11.2c4.438 0 7.668-1.99 9.92-5.76l5.44-9.44 2.88-4.96 8.8 15.04H29.76zm-12.64-5.12H6.4L18.08 6.72 24 16.8l-3.921 6.836c-1.496 2.446-3.201 3.244-5.839 3.244\"/></svg> </span></button> <button class=\"nuxt-season\" id=\"nuxt-season\" type=\"button\" hidden aria-pressed=\"true\" title=\"Turn off snow\"><svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.3\" aria-hidden=\"true\" viewBox=\"0 0 16 16\"><path d=\"M8 1.6v12.8M2.46 4.8l11.08 6.4m-11.08 0 11.08-6.4M6.1 3.1 8 4.2l1.9-1.1m-3.8 9.8L8 11.8l1.9 1.1\"/></svg> <span class=\"nuxt-sr\">Snow</span></button> <div class=\"nuxt-loader-bar\"></div><script>const loadingRoot=document.documentElement,loadingTitleElement=document.querySelector(\"title\"),loadingAppName=loadingTitleElement?.dataset.appName||\"Nuxt\",loadingSuffix=` | ${loadingAppName}`,updateLoadingTitle=()=>{const e=loadingRoot.style.getPropertyValue(\"--nuxt-progress\").trim(),t=e.endsWith(\"%\")?Number.parseFloat(e):Number.NaN;let i=document.title.replace(/^\\d+% \\| /,\"\");i.endsWith(loadingSuffix)&&(i=i.slice(0,-loadingSuffix.length));const n=Number.isFinite(t)?`${Math.round(Math.min(100,Math.max(0,t)))}% | `:\"\";document.title=`${n}${i}${loadingSuffix}`};\"undefined\"!=typeof MutationObserver&&(new MutationObserver(updateLoadingTitle).observe(loadingRoot,{attributes:!0,attributeFilter:[\"style\"]}),updateLoadingTitle());<\/script><script>if(!window.frameElement)if(void 0===window.fetch)setTimeout(()=>window.location.reload(),200);else{let t=200;const e=async()=>{try{if(!(await window.fetch(window.location.href,{headers:{accept:\"text/html\"}}).then(t=>t.text())).includes(\"__NUXT_LOADING__\"))return window.location.reload()}catch{}setTimeout(e,t),t=Math.min(Math.round(1.5*t),1e3)};e()}<\/script></body></html>";
598
+ return "<!DOCTYPE html><html lang=\"en\"><head><title data-app-name=\"" + escapeHtml(messages.appName) + "\">" + escapeHtml(messages.loading) + " | " + escapeHtml(messages.appName) + "</title><meta charset=\"utf-8\"><meta content=\"width=device-width,initial-scale=1,minimum-scale=1\" name=\"viewport\"><style>:root{--nuxt-mint:#00dc82;--nuxt-mist:#e8fff4e0;--nuxt-dim:#00dc828c;--nuxt-logo:calc(min(10vw, 68px))}*,:after,:before{box-sizing:border-box}body,html{width:100%;height:100%;color:var(--nuxt-mist);background:#000;margin:0}body{-webkit-font-smoothing:antialiased;justify-content:center;align-items:center;font-family:ui-sans-serif,system-ui,sans-serif;display:flex;overflow:hidden}#nuxt-shader,svg{display:block}#nuxt-shader{z-index:0;touch-action:none;opacity:0;width:100%;height:100%;transition:opacity .4s;position:fixed;inset:0}.nuxt-lockup{z-index:1;color:inherit;cursor:pointer;background:0 0;border:0;align-items:center;padding:0;display:flex;position:relative}.nuxt-logo-slot{width:var(--nuxt-logo);height:calc(var(--nuxt-logo) * 2 / 3);flex:0 0 var(--nuxt-logo);color:var(--nuxt-mint)}.nuxt-logo-slot>svg{width:100%;height:100%}.nuxt-logo-slot>svg>path{fill:currentColor}.nuxt-loader-bar{z-index:1;width:var(--nuxt-progress,4%);background:var(--nuxt-mint);height:2px;transition:width .3s;position:fixed;bottom:0;left:0;right:auto}.nuxt-season{z-index:1;width:30px;height:30px;color:var(--nuxt-mint);cursor:pointer;background:#00dc8214;border:1px solid #00dc823d;border-radius:8px;justify-content:center;align-items:center;padding:0;transition:opacity .2s,background-color .2s;display:flex;position:fixed;bottom:26px;right:22px}.nuxt-season[hidden]{display:none}.nuxt-season:hover{background:#00dc8229}.nuxt-season>svg{width:16px;height:16px}.nuxt-sr{clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}@media(prefers-color-scheme:light){:root{--nuxt-mist:#0a0a0ac2;--nuxt-dim:#0a0a0a6b;--nuxt-accent:#00a86a}body,html{background:#fff}}</style><script>var e=/swiftshader|llvmpipe|softpipe|software|basic render/i,t=.55;function n(e,n,t,o){let a=1-Math.exp(-Math.min(Math.max(t,0),.05)/Math.max(o,.001));return[e[0]+(n[0]-e[0])*a,e[1]+(n[1]-e[1])*a]}function r(){try{let e=new URLSearchParams(window.location.search).get(\"winter\");if(null!==e)return\"0\"!==e&&\"false\"!==e}catch{}let e=new Date,n=e.getFullYear(),t=-new Date(n,0,1).getTimezoneOffset(),o=-new Date(n,6,1).getTimezoneOffset();return t!==o&&(t-o>0?[4,5,6]:[10,11,0]).includes(e.getMonth())}function i(o,a,i){let s,l,c,h,d,f,u=!1,p=0,v=1,m=1,g=[.5,.5],w=[.1,.1],x=[.5,.5],y=0,E=new Float32Array(8).fill(-1),L=-1,k=0,b=-1/0,A=!1,S=!1,P=!1,R=!1,M=0,_=0,C=0,N=window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches,O=window.matchMedia(\"(prefers-color-scheme: light)\"),z=+!!O.matches,T=+!!r(),F=()=>{u||S||!A||(b=-1/0,p||=requestAnimationFrame(B))},I=e=>{z=+!!e.matches,W(),F()},W=()=>{s&&(z>0?s.blendFuncSeparate(s.ONE,s.ONE_MINUS_SRC_ALPHA,s.ZERO,s.ONE):s.blendFuncSeparate(s.ONE,s.ONE,s.ONE,s.ONE))},q=()=>{if(!s)return;let e=o.getBoundingClientRect();if(e.width<=0||e.height<=0)return;let n=Math.min(window.devicePixelRatio||1,1.75,2688/e.width),t=[Math.max(1,Math.floor(e.width*n)),Math.max(1,Math.floor(e.height*n))];(t[0]!==v||t[1]!==m)&&(v=t[0],m=t[1],o.width=v,o.height=m,s.viewport(0,0,v,m));let r=a.getBoundingClientRect();g=[(r.left+r.width/2-e.left)/Math.max(1,e.width),(r.top+r.height/2-e.top)/Math.max(1,e.height)],w=[Math.max(.001,r.width/Math.max(1,e.width)),Math.max(.001,r.height/Math.max(1,e.height))]},H=e=>{if(\"touch\"===e.pointerType)return;let n=o.getBoundingClientRect();h=[Math.min(1,Math.max(0,(e.clientX-n.left)/Math.max(1,n.width))),Math.min(1,Math.max(0,(e.clientY-n.top)/Math.max(1,n.height)))]},D=()=>{h=void 0},U=()=>{let e=E.findIndex(e=>e<0);e<0&&(e=E.indexOf(Math.max(...E))),E[e]=0,F()},K=e=>{\"touch\"!==e.pointerType&&(L=0,F())},Z=e=>{e.preventDefault(),Y(),o.remove()},X=e=>{if(e!==S&&!u){if(e&&!A)return void(P=!0);if(S=e,S)return M=_,h=void 0,p&&cancelAnimationFrame(p),void(p=0);P=!1,R=!0,p||=requestAnimationFrame(B)}},B=e=>{if(u||(p=requestAnimationFrame(B),_=e,R&&(R=!1,C+=e-M,b=-1/0,k=(e-C)/1e3),e-b<33)||!s||!l||!d)return;b=e;let o=(e-C)/1e3,a=Math.min(Math.max(o-k,0),.05);k=o,x=n(x,h??x,a,.22),y+=(+!!h-y)*(1-Math.exp(-a/.35));for(let e=0;e<E.length;e++)E[e]<0||(E[e]+=a*t,E[e]>=1&&(E[e]=-1));L>=0&&(L+=a*t,L>=1&&(L=-1)),s.uniform2f(d.uLogoCentre,g[0],g[1]),s.uniform2f(d.uLogoScale,w[0],w[1]),s.uniform2f(d.uResolution,v,m),s.uniform2f(d.uPointer,x[0],x[1]),s.uniform1fv(d.uWave,E),s.uniform1f(d.uHoverWave,L),s.uniform2f(d.uMisc,o,y),s.uniform2f(d.uSeason,T,z),s.uniform1f(d.uLight,z);let r=+(z>0);s.clearColor(r,r,r,1),s.clear(s.COLOR_BUFFER_BIT),s.drawArrays(s.TRIANGLES,0,T>0?1111440:1098240),A||(A=!0,V.onFirstFrame?.(),P&&X(!0)),N&&(cancelAnimationFrame(p),p=0)},Y=()=>{u||(u=!0,p&&cancelAnimationFrame(p),p=0,c?.disconnect(),window.removeEventListener(\"pointermove\",H),document.documentElement.removeEventListener(\"pointerleave\",D),i?.removeEventListener(\"click\",U),i?.removeEventListener(\"pointerenter\",K),O.removeEventListener(\"change\",I),o.removeEventListener(\"webglcontextlost\",Z),s&&l&&s.deleteProgram(l),s=void 0,l=void 0)},G=(e,n,t)=>{let o=e.createShader(n);if(!o)throw Error(\"Could not create shader.\");if(e.shaderSource(o,t),e.compileShader(o),!e.getShaderParameter(o,e.COMPILE_STATUS)){let n=e.getShaderInfoLog(o);throw e.deleteShader(o),Error(`Shader failed to compile: ${n}`)}return o};try{(()=>{let n=o.getContext(\"webgl2\",{alpha:!1,antialias:!1,depth:!1,stencil:!1,powerPreference:\"low-power\"});if(!n)throw Error(\"No WebGL2 context.\");let t=n.getExtension(\"WEBGL_debug_renderer_info\"),r=String(t&&n.getParameter(t.UNMASKED_RENDERER_WEBGL)||n.getParameter(n.RENDERER)||\"\");if(e.test(r))throw Error(`Software renderer (${r}); falling back to the lockup.`);s=n;let h=G(n,n.VERTEX_SHADER,\"#version 300 es\\n// A particle mountain range for the dev-server loading screen.\\n//\\n// One draw call and no vertex buffers: every particle is a quad whose position\\n// is derived from gl_VertexID, sampled from a ridged heightfield in\\n// perspective, so the field reads as a range of peaks seen at a grazing angle.\\n// Nothing here depends on build progress — the screen looks the same at one\\n// second and at two minutes.\\n//\\n// Motion, all continuous loops:\\n// · per-particle drift and shimmer\\n// · slow luminosity waves crossing the field\\n// · a ripple radiating from the lockup\\n// · overlapping shockwaves fired by clicking the lockup\\nprecision highp float;\\n\\nuniform vec2 uLogoCentre;\\nuniform vec2 uLogoScale;\\nuniform vec2 uResolution;\\n/** pointer position in canvas space, smoothed */\\nuniform vec2 uPointer;\\n/** shockwave phases 0..1; negative entries are inactive */\\nuniform float uWave[8];\\n/** subtle pointer-enter wave phase; negative while inactive */\\nuniform float uHoverWave;\\n/** x: seconds, y: pointer presence 0..1 */\\nuniform vec2 uMisc;\\n/** x: winter 0..1 — snow on the peaks and falling flakes; y: 1 in light mode */\\nuniform vec2 uSeason;\\n\\nout vec2 vLocal;\\n/** dark: emitted colour, w unused. light: ink colour, w its coverage. */\\nout vec4 vTint;\\n\\nconst vec3 MINT = vec3(0.0, 0.8627451, 0.5098039);\\nconst vec3 MINT_PALE = vec3(0.6235294, 1.0, 0.8156863);\\nconst vec3 SNOW = vec3(0.88, 1.0, 0.96);\\n\\n// Light mode draws the same range as ink on paper. Emitted light becomes\\n// coverage, and the renderer blends it over the page instead of adding it to\\n// the dark. Alpha rather than subtraction, so a crest that many particles\\n// land on settles on the brand green instead of running away to black.\\nconst vec3 INK = vec3(0.0);\\nconst vec3 LUMA = vec3(0.2126, 0.7152, 0.0722);\\n\\n// grid of particles\\nconst uint COLS = 704u;\\nconst uint ROWS = 260u;\\nconst uint TERRAIN_COUNT = COLS * ROWS;\\n\\n// camera\\nconst float Z_NEAR = 1.3;\\nconst float Z_FAR = 26.0;\\nconst float CAM_Y = 2.4;\\nconst float FOCAL = 1.3;\\nconst float HORIZON = 0.30;\\n\\n// the two summits that shape the skyline, in screen-x units\\nconst float PEAK1_X = -0.40;\\nconst float PEAK1_H = 3.2;\\nconst float PEAK2_X = 0.40;\\nconst float PEAK2_H = 2.2;\\n\\nconst vec2 QUAD[6] = vec2[6](\\n vec2(-1.0, -1.0), vec2(1.0, -1.0), vec2(-1.0, 1.0),\\n vec2(-1.0, 1.0), vec2(1.0, -1.0), vec2(1.0, 1.0)\\n);\\n\\nfloat hash21 (vec2 p) {\\n vec2 q = fract(p * vec2(0.1031, 0.1030));\\n q += dot(q, q.yx + 33.33);\\n return fract((q.x + q.y) * q.x);\\n}\\n\\nfloat noise2 (vec2 p) {\\n vec2 i = floor(p);\\n vec2 f = fract(p);\\n vec2 u = f * f * (3.0 - 2.0 * f);\\n float a = hash21(i);\\n float b = hash21(i + vec2(1.0, 0.0));\\n float c = hash21(i + vec2(0.0, 1.0));\\n float d = hash21(i + vec2(1.0, 1.0));\\n return mix(mix(a, b, u.x), mix(c, d, u.x), u.y);\\n}\\n\\nfloat shockwave (float phase, float dist) {\\n if (phase < 0.0) { return 0.0; }\\n float radius = phase * 1.7;\\n float width = 0.09 + phase * 0.20;\\n return exp(-((dist - radius) * (dist - radius)) / (width * width))\\n * (1.0 - smoothstep(0.55, 1.0, phase))\\n * smoothstep(0.0, 0.04, phase);\\n}\\n\\n// `shape` flattens the relief on narrow screens. A summit covers the same\\n// fraction of screen height whatever the aspect, but far fewer pixels of width\\n// in portrait, so without this the peaks turn into needles.\\nfloat terrain (float x, float z, float u, float shape) {\\n // ridged noise stretched along the view axis gives crest lines that flow\\n // into the distance rather than a lumpy field\\n vec2 q = vec2(x * 0.30, z * 0.085);\\n float r = 0.0;\\n float amp = 0.55;\\n mat2 rot = mat2(1.6, 1.2, -1.2, 1.6);\\n for (int i = 0; i < 5; i++) {\\n r += amp * (1.0 - abs(2.0 * noise2(q) - 1.0));\\n q = rot * q;\\n amp *= 0.55;\\n }\\n float h = pow(max(r, 0.0), 1.5) * 2.6;\\n h *= 0.70 + 0.60 * noise2(vec2(x * 0.05, z * 0.05) + 7.0);\\n // two designed summits, far enough back to break the horizon\\n float rise = smoothstep(3.0, 9.0, z);\\n h += rise * PEAK1_H * max(0.0, 1.0 - abs(u - PEAK1_X) * 3.2);\\n h += rise * PEAK2_H * max(0.0, 1.0 - abs(u - PEAK2_X) * 3.6);\\n return max(h, 0.0) * shape;\\n}\\n\\nvoid main () {\\n uint id = uint(gl_VertexID) / 6u;\\n int corner = gl_VertexID % 6;\\n float t = uMisc.x;\\n vec2 resolution = max(uResolution, vec2(1.0));\\n float aspect = max(resolution.x / resolution.y, 0.5);\\n float winter = uSeason.x;\\n float light = uSeason.y;\\n\\n // the icon centre is needed by both the terrain and the flakes\\n float logoH = max(uLogoScale.y, 0.01);\\n vec2 centre = vec2(\\n uLogoCentre.x * 2.0 - 1.0,\\n 1.0 - 2.0 * uLogoCentre.y\\n );\\n vec2 offset = QUAD[corner];\\n\\n // A flake drifting down the screen, in its own parallax layer. Independent of\\n // the terrain: it lives in screen space and wraps around forever. Flakes are\\n // drawn from the indices past the terrain, so winter costs nothing out of\\n // season — the draw call is simply shorter.\\n if (id >= TERRAIN_COUNT) {\\n float fi = float(id - TERRAIN_COUNT);\\n float r1 = hash21(vec2(fi, 1.7));\\n float r2 = hash21(vec2(fi, 5.3));\\n float r3 = hash21(vec2(fi, 9.1));\\n // near flakes are bigger, brighter and fall faster\\n float depth = 0.30 + r3 * 0.70;\\n float x = (r1 * 2.4 - 1.2) + sin(t * (0.25 + r2 * 0.35) + r1 * 40.0) * 0.05 * depth;\\n float y = 1.2 - fract(r2 + t * (0.020 + r3 * 0.035)) * 2.5;\\n vec2 pos = vec2(x, y);\\n\\n // flakes thin out over the icon so they never sit on the mark\\n vec2 toCentre = vec2((pos.x - centre.x) * aspect, pos.y - centre.y);\\n vec2 clear = abs(toCentre / vec2(logoH * 3.4, logoH * 2.8));\\n float clearing = 0.25 + 0.75 * smoothstep(0.5, 1.2, pow(pow(clear.x, 3.0) + pow(clear.y, 3.0), 1.0 / 3.0));\\n float twinkle = 0.75 + 0.25 * sin(t * (1.1 + r1 * 2.0) + r2 * 30.0);\\n float sizePx = (0.55 + depth * 1.5) * (resolution.y / 900.0);\\n float amount = (0.16 + 0.48 * depth) * twinkle * clearing * winter;\\n\\n gl_Position = vec4(pos + offset * sizePx * 2.0 / resolution, 0.5, 1.0);\\n vLocal = offset;\\n // white flakes cannot show on paper, so light mode draws them as ink\\n vTint = light > 0.5 ? vec4(INK, amount * 1.6) : vec4(SNOW * amount, 1.0);\\n return;\\n }\\n\\n uint col = id % COLS;\\n uint row = id / COLS;\\n vec2 seed = vec2(float(col), float(row));\\n float jitterX = hash21(seed) - 0.5;\\n float jitterY = hash21(seed + 17.0) - 0.5;\\n float rnd = hash21(seed + 41.0);\\n\\n // screen-x is fixed per column; depth is biased so the near field is denser\\n float u = ((float(col) + jitterX) / float(COLS)) * 2.3 - 1.15;\\n float v = clamp((float(row) + jitterY) / float(ROWS), 0.0, 1.0);\\n float z = mix(Z_NEAR, Z_FAR, pow(v, 1.5));\\n // widen the field of view and flatten the range as the window narrows, so a\\n // phone shows a range rather than a row of spikes\\n float shape = clamp(aspect / 1.6, 0.5, 1.0);\\n float tanX = max(aspect, 0.95) / FOCAL;\\n float xw = u * z * tanX;\\n\\n float h = terrain(xw, z, u, shape);\\n h += (noise2(vec2(xw * 1.6, z * 1.6)) - 0.5) * 0.05 * shape;\\n\\n // shading from the surface itself: one fixed light, plus a convexity term\\n // that picks out the crests\\n float e = 0.22;\\n float hxp = terrain(xw + e, z, u, shape);\\n float hxm = terrain(xw - e, z, u, shape);\\n float hzp = terrain(xw, z + e, u, shape);\\n vec3 normal = normalize(vec3(-(hxp - hxm) / (2.0 * e), 1.0, -(hzp - h) / e));\\n vec3 lightDir = normalize(vec3(-0.12, 0.60, -0.42));\\n float diffuse = pow(max(dot(normal, lightDir), 0.0), 1.3);\\n float crest = smoothstep(0.0, 1.5, (2.0 * h - hxp - hxm) / (e * e) * 0.2);\\n\\n float sy = (h - CAM_Y) / z * FOCAL + HORIZON;\\n\\n // nearer ridges hide what lies behind them, which is what makes the skyline\\n float occluded = 0.0;\\n for (int k = 1; k <= 4; k++) {\\n float zs = Z_NEAR + (z - Z_NEAR) * float(k) / 5.0;\\n float hs = terrain(u * zs * tanX, zs, u, shape);\\n occluded = max(occluded, step(sy + 0.012, (hs - CAM_Y) / zs * FOCAL + HORIZON));\\n }\\n\\n // the icon sits in a tight clearing so it always reads on plain ground.\\n // Waves and ripples are measured from this same point, so they leave the mark.\\n vec2 toCentre = vec2((u - centre.x) * aspect, sy - centre.y);\\n float dist = length(toCentre);\\n // The clearing has to read as haze, not as a hole cut out of the scene, so it\\n // fades over a short distance and its edge is broken up by noise. A squircle\\n // around the icon, not the old icon+wordmark block.\\n vec2 clear = abs(toCentre / vec2(logoH * 3.6, logoH * 3.0));\\n float clearEdge = pow(pow(clear.x, 3.0) + pow(clear.y, 3.0), 1.0 / 3.0)\\n + (noise2(vec2(xw * 0.55, z * 0.55)) - 0.5) * 0.30;\\n float clearing = smoothstep(0.46, 1.30, clearEdge);\\n\\n // ambient ripple, always running\\n float ripplePhase = fract(t * 0.30);\\n float rippleRadius = ripplePhase * 2.4;\\n float rippleWidth = 0.16 + ripplePhase * 0.25;\\n float ripple = exp(-((dist - rippleRadius) * (dist - rippleRadius)) / (rippleWidth * rippleWidth))\\n * (1.0 - smoothstep(0.55, 0.95, ripplePhase))\\n * smoothstep(0.0, 0.05, ripplePhase);\\n\\n // Every click has an independent phase, so its ring keeps travelling even\\n // when another click starts a new one.\\n float shock = 0.0;\\n for (int i = 0; i < 8; i++) {\\n shock += shockwave(uWave[i], dist);\\n }\\n shock += shockwave(uHoverWave, dist) * 0.25;\\n\\n float fog = exp(-(z - Z_NEAR) * 0.075) * (1.0 - smoothstep(0.86, 1.0, v));\\n float nearFade = smoothstep(Z_NEAR, 2.6, z);\\n // in winter the snowline drops a long way and the caps turn properly white\\n float snowline = 2.6 - winter * 1.7;\\n float snow = smoothstep(snowline, snowline + 1.0 - winter * 0.45, h);\\n float shimmer = 0.88 + 0.12 * sin(t * (0.7 + rnd * 1.4) + rnd * 31.0);\\n float grain = 0.88 + 0.24 * noise2(vec2(xw * 3.0, z * 3.0));\\n\\n // a fifth of the particles pulse on their own cycle, so the field never\\n // settles into a repeating pattern\\n float pulses = step(0.82, hash21(seed + 63.0));\\n float pulse = pow(0.5 + 0.5 * sin(t * (0.5 + rnd * 1.1) + rnd * 61.0), 6.0);\\n\\n // two slow noise waves drifting across the field\\n float waveA = noise2(vec2(xw * 0.22 - t * 0.20, z * 0.22)) - 0.5;\\n float waveB = noise2(vec2(xw * 0.55 + t * 0.09, z * 0.55 - t * 0.14)) - 0.5;\\n float wave = 1.0 + waveA * 0.24 + waveB * 0.16;\\n\\n // snow throws light back, so the caps read brighter as well as whiter\\n float lit = diffuse * 0.18 + crest * (0.34 + diffuse * 0.45) + snow * (0.06 + winter * 0.30);\\n float brightness = (0.008 + lit * grain)\\n * fog * nearFade * wave * shimmer\\n * (1.0 + pulse * (0.18 + pulses * 1.1))\\n * (1.0 + ripple * 0.75 + shock * 3.0);\\n vec3 tint = mix(MINT * 0.75, MINT_PALE, clamp(crest + snow * 0.5, 0.0, 1.0));\\n tint = mix(tint, SNOW, winter * snow) * brightness;\\n\\n float glint = step(0.993, rnd) * diffuse * (0.5 + 0.5 * sin(t * 2.0 + rnd * 47.0));\\n tint += vec3(0.85, 1.0, 0.93) * glint * fog * 0.55;\\n\\n // the pointer stirs nearby dust\\n vec2 pointer = vec2((uPointer.x - 0.5) * 2.0, (0.5 - uPointer.y) * 2.0);\\n vec2 toPointer = vec2((u - pointer.x) * aspect, sy - pointer.y);\\n float excite = (1.0 - smoothstep(0.0, 0.55, length(toPointer))) * uMisc.y;\\n vec2 push = normalize(toPointer + vec2(0.0001, 0.0)) * excite * (0.006 + 0.010 * rnd);\\n tint *= 1.0 + excite * 1.3;\\n\\n // Light mode reuses every lighting term above and only reinterprets it: how\\n // much light a particle emits becomes how much ink it lays down. Taking the\\n // luminance keeps the two themes at matching density, and the crests that go\\n // palest on black carry the brand green on paper. Snow is the one term that\\n // has to invert — a white cap can only read on paper by leaving it bare.\\n if (light > 0.5) {\\n // lifted, since faint dust that reads fine against black all but vanishes\\n // against white\\n float coverage = pow(clamp(dot(tint, LUMA) * 2.2, 0.0, 1.0), 0.8) * (1.0 - winter * snow * 0.6);\\n vTint = vec4(INK, coverage * (1.0 - occluded) * clearing);\\n } else {\\n vTint = vec4(tint * (1.0 - occluded) * clearing, 1.0);\\n }\\n\\n // particles float around their anchor, more freely up close\\n float floatAmp = (0.0015 + (1.0 - v) * 0.006) * (1.0 + excite * 2.5);\\n vec2 drift = vec2(\\n sin(t * (0.35 + rnd * 0.5) + rnd * 40.0),\\n cos(t * (0.28 + rnd * 0.45) + rnd * 23.0) * 1.4\\n ) * floatAmp;\\n\\n // the shockwave shoves particles outward as it passes\\n vec2 shockPush = vec2(toCentre.x / max(dist, 0.02) / aspect, toCentre.y / max(dist, 0.02)) * shock * 0.045;\\n\\n float sizePx = clamp(16.0 / z, 0.65, 1.9)\\n * (0.75 + 0.5 * hash21(seed + 27.0))\\n * (1.0 + glint * 0.25 + ripple * 0.20 + shock * 0.75);\\n\\n gl_Position = vec4(\\n vec2(u, sy) + drift + push + shockPush + offset * sizePx * 2.0 / resolution,\\n 0.5,\\n 1.0\\n );\\n vLocal = offset;\\n}\\n\"),f=G(n,n.FRAGMENT_SHADER,\"#version 300 es\\nprecision highp float;\\n\\nin vec2 vLocal;\\nin vec4 vTint;\\n/** 1 in light mode; uniform across the draw, so the branch is free */\\nuniform float uLight;\\nout vec4 fragColor;\\n\\nvoid main () {\\n float falloff = 1.0 - smoothstep(0.45, 1.0, length(vLocal));\\n if (uLight > 0.5) {\\n // premultiplied, so it composites over the page and settles on the ink\\n // colour however much dust lands on it\\n float alpha = vTint.a * falloff;\\n fragColor = vec4(vTint.rgb * alpha, alpha);\\n } else {\\n fragColor = vec4(vTint.rgb * falloff, 1.0);\\n }\\n}\\n\"),u=n.createProgram();if(!u)throw Error(\"Could not create program.\");if(n.attachShader(u,h),n.attachShader(u,f),n.linkProgram(u),n.deleteShader(h),n.deleteShader(f),!n.getProgramParameter(u,n.LINK_STATUS)){let e=n.getProgramInfoLog(u);throw n.deleteProgram(u),Error(`Program failed to link: ${e}`)}l=u,n.useProgram(u);let v=e=>n.getUniformLocation(u,e);d={uLogoCentre:v(\"uLogoCentre\"),uLogoScale:v(\"uLogoScale\"),uResolution:v(\"uResolution\"),uPointer:v(\"uPointer\"),uWave:v(\"uWave[0]\"),uHoverWave:v(\"uHoverWave\"),uMisc:v(\"uMisc\"),uSeason:v(\"uSeason\"),uLight:v(\"uLight\")},n.bindVertexArray(n.createVertexArray()),n.disable(n.DEPTH_TEST),n.enable(n.BLEND),W(),q(),c=typeof ResizeObserver>\"u\"?void 0:new ResizeObserver(q),c?.observe(o),c?.observe(a),window.addEventListener(\"pointermove\",H),document.documentElement.addEventListener(\"pointerleave\",D),i?.addEventListener(\"click\",U),i?.addEventListener(\"pointerenter\",K),O.addEventListener(\"change\",I),o.addEventListener(\"webglcontextlost\",Z),p||=requestAnimationFrame(B)})(),f=Promise.resolve()}catch(e){Y(),f=Promise.reject(e instanceof Error?e:Error(String(e)))}let V={ready:f,dispose:Y,setPaused:X,setWinter:e=>{let n=+!!e;n!==T&&(T=n,F())}};return V}var a=\"nuxt-snow\";function o(){try{return\"false\"!==window.localStorage.getItem(a)}catch{return!0}}function s(e){let n=r(),t=o();if(e.setWinter(n&&t),!n)return;let i=document.querySelector(\"#nuxt-season\");if(!i)return;let s=()=>{i.style.opacity=t?\"1\":\"0.4\",i.setAttribute(\"aria-pressed\",String(t)),i.title=t?\"Turn off snow\":\"Turn on snow\"};s(),i.hidden=!1,i.addEventListener(\"click\",()=>{t=!t,e.setWinter(t),s();try{window.localStorage.setItem(a,String(t))}catch{}})}function c(){try{let e=new URLSearchParams(window.location.search).get(\"shader\");return\"0\"===e||\"false\"===e}catch{return!1}}function l(){let e=document.querySelector(\"#nuxt-shader\"),n=document.querySelector(\"#nuxt-logo-slot\");if(!e||!n||!window.WebGL2RenderingContext||c())return void e?.remove();let t=i(e,n,document.querySelector(\".nuxt-lockup\"));s(t),t.onFirstFrame=()=>{e.style.opacity=\"1\"},t.ready.catch(()=>e.remove()),window.addEventListener(\"pagehide\",()=>t.dispose(),{once:!0});let o=e=>t.setPaused(e);window===window.top?(window.addEventListener(\"blur\",()=>o(!0)),window.addEventListener(\"focus\",()=>o(!1)),document.addEventListener(\"visibilitychange\",()=>{document.hidden?o(!0):document.hasFocus()&&o(!1)}),(document.hidden||!document.hasFocus())&&o(!0)):(document.addEventListener(\"visibilitychange\",()=>o(document.hidden)),document.hidden&&o(!0))}\"loading\"===document.readyState?document.addEventListener(\"DOMContentLoaded\",l,{once:!0}):l();<\/script></head><body><canvas id=\"nuxt-shader\" aria-hidden=\"true\"></canvas><button type=\"button\" class=\"nuxt-lockup\" id=\"nuxtImg\" aria-label=\"" + escapeHtml(messages.appName) + "\"><span id=\"nuxt-logo-slot\" class=\"nuxt-logo-slot\"> <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" aria-hidden=\"true\" viewBox=\"0 0 48 32\"><path d=\"M26.88 32h17.76c.567 0 1.11-.2 1.6-.48s.997-.633 1.28-1.12c.283-.486.48-1.038.48-1.6s-.196-1.114-.48-1.6l-12-20.64a2.9 2.9 0 0 0-1.12-1.12c-.49-.28-1.193-.48-1.76-.48s-1.11.2-1.6.48-.837.634-1.12 1.12l-3.04 5.28L20.8 1.6c-.284-.487-.63-1-1.12-1.28S18.647 0 18.08 0s-1.11.04-1.6.32-.997.793-1.28 1.28L.32 27.2c-.284.486-.32 1.038-.32 1.6 0 .561.037 1.113.32 1.6.283.486.79.84 1.28 1.12s1.033.48 1.6.48h11.2c4.438 0 7.668-1.99 9.92-5.76l5.44-9.44 2.88-4.96 8.8 15.04H29.76zm-12.64-5.12H6.4L18.08 6.72 24 16.8l-3.921 6.836c-1.496 2.446-3.201 3.244-5.839 3.244\"/></svg> </span></button> <button class=\"nuxt-season\" id=\"nuxt-season\" type=\"button\" hidden aria-pressed=\"true\" title=\"Turn off snow\"><svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.3\" aria-hidden=\"true\" viewBox=\"0 0 16 16\"><path d=\"M8 1.6v12.8M2.46 4.8l11.08 6.4m-11.08 0 11.08-6.4M6.1 3.1 8 4.2l1.9-1.1m-3.8 9.8L8 11.8l1.9 1.1\"/></svg> <span class=\"nuxt-sr\">Snow</span></button> <div class=\"nuxt-loader-bar\"></div><script>const loadingRoot=document.documentElement,loadingTitleElement=document.querySelector(\"title\"),loadingAppName=loadingTitleElement?.dataset.appName||\"Nuxt\",loadingSuffix=` | ${loadingAppName}`,updateLoadingTitle=()=>{const e=loadingRoot.style.getPropertyValue(\"--nuxt-progress\").trim(),t=e.endsWith(\"%\")?Number.parseFloat(e):Number.NaN;let i=document.title.replace(/^\\d+% \\| /,\"\");i.endsWith(loadingSuffix)&&(i=i.slice(0,-loadingSuffix.length));const n=Number.isFinite(t)?`${Math.round(Math.min(100,Math.max(0,t)))}% | `:\"\";document.title=`${n}${i}${loadingSuffix}`};\"undefined\"!=typeof MutationObserver&&(new MutationObserver(updateLoadingTitle).observe(loadingRoot,{attributes:!0,attributeFilter:[\"style\"]}),updateLoadingTitle());<\/script><script>if(!window.frameElement)if(void 0===window.fetch)setTimeout(()=>window.location.reload(),200);else{let t=200;const e=async()=>{try{if(!(await window.fetch(window.location.href,{headers:{accept:\"text/html\"}}).then(t=>t.text())).includes(\"__NUXT_LOADING__\"))return window.location.reload()}catch{}setTimeout(e,t),t=Math.min(Math.round(1.5*t),1e3)};e()}<\/script></body></html>";
599
599
  };
600
600
  //#endregion
601
601
  //#region src/config/dev.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nuxt/schema-nightly",
3
- "version": "4.5.2-2610051829-580e4b9",
3
+ "version": "4.5.2-2610052030-052d82e",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/nuxt/nuxt.git",
@@ -37,18 +37,18 @@
37
37
  "nostics": "^1.3.0",
38
38
  "pathe": "^2.0.3",
39
39
  "pkg-types": "^2.3.3",
40
- "std-env": "^4.2.0"
40
+ "std-env": "^4.3.0"
41
41
  },
42
42
  "devDependencies": {
43
43
  "@types/pug": "2.0.10",
44
44
  "@types/webpack-bundle-analyzer": "4.7.0",
45
45
  "@types/webpack-hot-middleware": "2.25.12",
46
- "@unhead/vue": "^3.4.1",
46
+ "@unhead/vue": "^3.4.2",
47
47
  "@vitejs/plugin-vue": "^6.0.9",
48
48
  "@vitejs/plugin-vue-jsx": "^5.1.6",
49
49
  "@vue/compiler-core": "3.5.43",
50
50
  "@vue/compiler-sfc": "3.5.43",
51
- "@vue/language-core": "3.3.11",
51
+ "@vue/language-core": "3.3.12",
52
52
  "chokidar": "^5.0.0",
53
53
  "compatx": "^0.2.0",
54
54
  "css-minimizer-webpack-plugin": "^8.0.0",
@@ -58,7 +58,7 @@
58
58
  "h3-next": "npm:h3@2.0.1-rc.32",
59
59
  "mini-css-extract-plugin": "^2.10.2",
60
60
  "ofetch": "^1.5.1",
61
- "oxc-transform": "0.151.0",
61
+ "oxc-transform": "0.152.0",
62
62
  "postcss": "^8.5.28",
63
63
  "rollup-plugin-visualizer": "7.1.1",
64
64
  "tsdown": "0.23.0",
@@ -66,7 +66,7 @@
66
66
  "unimport": "^7.0.2",
67
67
  "untyped": "^2.0.0",
68
68
  "vite": "^8.3.1",
69
- "vitest": "5.0.2",
69
+ "vitest": "5.0.3",
70
70
  "vue": "^3.5.43",
71
71
  "vue-bundle-renderer": "^2.4.0",
72
72
  "vue-loader": "^17.4.2",