From 6305999e64265e4eae533c8559d22cb524931c2c Mon Sep 17 00:00:00 2001 From: Carla Goncalves Date: Fri, 20 Mar 2026 10:37:14 +0000 Subject: [PATCH 1/4] Add 404 page --- apps/site/next.config.mjs | 3 - apps/site/src/app/not-found.tsx | 58 +--- apps/site/src/components/glitch-particles.tsx | 267 ++++++++++++++++++ 3 files changed, 279 insertions(+), 49 deletions(-) create mode 100644 apps/site/src/components/glitch-particles.tsx diff --git a/apps/site/next.config.mjs b/apps/site/next.config.mjs index 368952c548..2f6c737d97 100644 --- a/apps/site/next.config.mjs +++ b/apps/site/next.config.mjs @@ -216,9 +216,6 @@ const config = { reactStrictMode: true, images: { unoptimized: true }, transpilePackages: ["@prisma/eclipse"], - experimental: { - globalNotFound: true, - }, async headers() { return [ { diff --git a/apps/site/src/app/not-found.tsx b/apps/site/src/app/not-found.tsx index 31dfc673a8..5cad37dc6c 100644 --- a/apps/site/src/app/not-found.tsx +++ b/apps/site/src/app/not-found.tsx @@ -1,57 +1,23 @@ -import type { Metadata } from 'next'; -import Link from 'next/link'; +import GlitchParticles from "@/components/glitch-particles"; +import type { Metadata } from "next"; +import Link from "next/link"; export const metadata: Metadata = { - title: '404 - Page Not Found', - description: 'The page you were looking for could not be found.', + title: "404 - Page Not Found", + description: "The page you were looking for could not be found.", }; export default function NotFound() { - return (
-

- Blog +

+ Prisma Website | 404

-
-

- 404 -

-

- We could not find the page you were looking for -

- - Back to Blog - +
+ +

+ page not found +

); diff --git a/apps/site/src/components/glitch-particles.tsx b/apps/site/src/components/glitch-particles.tsx new file mode 100644 index 0000000000..0866d4edab --- /dev/null +++ b/apps/site/src/components/glitch-particles.tsx @@ -0,0 +1,267 @@ +"use client"; + +import { useEffect, useRef } from "react"; + +const SVG_PATH = + "M64.7997 131.22V37.8H64.9797L39.2397 75.42H120.96V104.58H-0.000312462V79.2L57.9597 1.44003H101.88V131.22H64.7997ZM190.03 132.84C180.07 132.84 171.31 131.28 163.75 128.16C156.19 124.92 149.95 120.42 145.03 114.66C140.11 108.78 136.39 101.76 133.87 93.6C131.35 85.44 130.09 76.32 130.09 66.24C130.09 51.36 132.55 39.06 137.47 29.34C142.51 19.5 149.53 12.18 158.53 7.38003C167.65 2.46003 178.21 2.59876e-05 190.21 2.59876e-05C200.29 2.59876e-05 209.05 1.62003 216.49 4.86003C223.93 7.98002 230.11 12.42 235.03 18.18C240.07 23.94 243.79 30.9 246.19 39.06C248.71 47.22 249.97 56.34 249.97 66.42C249.97 81.3 247.51 93.66 242.59 103.5C237.67 113.34 230.65 120.72 221.53 125.64C212.53 130.44 202.03 132.84 190.03 132.84ZM190.03 102.6C193.87 102.6 197.17 101.82 199.93 100.26C202.69 98.7 204.97 96.36 206.77 93.24C208.57 90.12 209.89 86.34 210.73 81.9C211.69 77.34 212.17 72.18 212.17 66.42C212.17 59.82 211.63 54.24 210.55 49.68C209.47 45.12 207.97 41.4 206.05 38.52C204.13 35.64 201.79 33.54 199.03 32.22C196.39 30.9 193.45 30.24 190.21 30.24C186.25 30.24 182.89 31.02 180.13 32.58C177.37 34.14 175.09 36.48 173.29 39.6C171.49 42.6 170.17 46.38 169.33 50.94C168.49 55.38 168.07 60.54 168.07 66.42C168.07 73.02 168.55 78.66 169.51 83.34C170.59 87.9 172.09 91.62 174.01 94.5C175.93 97.38 178.27 99.48 181.03 100.8C183.79 102 186.79 102.6 190.03 102.6ZM164.65 96.66V72.9L215.95 36.18V59.94L164.65 96.66ZM323.901 131.22V37.8H324.081L298.341 75.42H380.061V104.58H259.101V79.2L317.061 1.44003H360.981V131.22H323.901Z"; + +interface Particle { + homeX: number; + homeY: number; + x: number; + y: number; + vx: number; + vy: number; + size: number; +} + +interface Glitch { + offsetX1: number; + offsetX2: number; + offsetY1: number; + offsetY2: number; + slices: number[]; + showGlitch: boolean; +} + +interface GlitchParticlesProps { + /** Background color of the container */ + background?: string; + /** Width of the content area (canvas = this + padding * 2) */ + contentWidth?: number; + /** Height of the content area (canvas = this + padding * 2) */ + contentHeight?: number; + /** Space around the content */ + padding?: number; +} + +export default function GlitchParticles({ + background = "transparent", + contentWidth = 427, + contentHeight = 178, + padding = 300, +}: GlitchParticlesProps) { + const canvasRef = useRef(null); + + useEffect(() => { + const canvas = canvasRef.current; + if (!canvas) return; + + const ctx = canvas.getContext("2d"); + if (!ctx) return; + + const canvasWidth = contentWidth + padding * 2; + const canvasHeight = contentHeight + padding * 2; + canvas.width = canvasWidth; + canvas.height = canvasHeight; + + const particles: Particle[] = []; + const mouse = { x: 0, y: 0 }; + let isPressed = false; + let glitch: Glitch = { + offsetX1: 0, + offsetX2: 0, + offsetY1: 0, + offsetY2: 0, + slices: [0, 0, 0, 0, 0], + showGlitch: true, + }; + let rafId: number; + + // — Init particles from SVG path — + const offscreen = document.createElement("canvas"); + offscreen.width = contentWidth; + offscreen.height = contentHeight; + const offCtx = offscreen.getContext("2d")!; + const path2d = new Path2D(SVG_PATH); + offCtx.save(); + offCtx.scale(contentWidth / 381, contentHeight / 133); + offCtx.fillStyle = "var(--background-default)"; + offCtx.fill(path2d); + offCtx.restore(); + + const imageData = offCtx.getImageData(0, 0, contentWidth, contentHeight); + const sampleGap = 4; + const particleSize = 6; + + for (let y = 0; y < contentHeight; y += sampleGap) { + for (let x = 0; x < contentWidth; x += sampleGap) { + const i = (y * contentWidth + x) * 4; + if (imageData.data[i + 3] > 128) { + const px = x + padding; + const py = y + padding; + particles.push({ + homeX: px, + homeY: py, + x: px, + y: py, + vx: 0, + vy: 0, + size: particleSize, + }); + } + } + } + + // — Glitch updater — + const glitchInterval = setInterval(() => { + const isHeavy = Math.random() > 0.07; + glitch = { + offsetX1: (Math.random() - 0.5) * (isHeavy ? 8 : 4), + offsetX2: (Math.random() - 0.5) * (isHeavy ? 8 : 4), + offsetY1: (Math.random() - 0.5) * 2, + offsetY2: (Math.random() - 0.5) * 2, + slices: [ + (Math.random() - 0.5) * (isHeavy ? 16 : 6), + (Math.random() - 0.5) * (isHeavy ? 20 : 8), + (Math.random() - 0.5) * (isHeavy ? 16 : 6), + (Math.random() - 0.5) * (isHeavy ? 12 : 6), + (Math.random() - 0.5) * (isHeavy ? 16 : 5), + ], + showGlitch: Math.random() > 0.008, + }; + }, 50); + + // — Animation loop — + function animate() { + ctx.clearRect(0, 0, canvasWidth, canvasHeight); + + const repelRadius = isPressed ? 200 : 80; + const repelStrength = isPressed ? 50 : 15; + + particles.forEach((p) => { + const dx = p.x - mouse.x; + const dy = p.y - mouse.y; + const dist = Math.sqrt(dx * dx + dy * dy); + + if (dist < repelRadius && dist > 0) { + const force = (repelRadius - dist) / repelRadius; + const angle = Math.atan2(dy, dx); + p.vx += Math.cos(angle) * force * repelStrength; + p.vy += Math.sin(angle) * force * repelStrength; + } + + if (isPressed) { + p.vx += (Math.random() - 0.5) * 6; + p.vy += (Math.random() - 0.5) * 6; + } + + p.vx += (p.homeX - p.x) * 0.08; + p.vy += (p.homeY - p.y) * 0.08; + p.vx *= 0.85; + p.vy *= 0.85; + p.x += p.vx; + p.y += p.vy; + }); + + if (!glitch.showGlitch) { + ctx.globalAlpha = 0.3; + particles.forEach((p) => { + ctx.fillStyle = "#E0E7FF"; + ctx.fillRect(p.x, p.y, p.size, p.size); + }); + ctx.globalAlpha = 1; + } else { + ctx.globalAlpha = 0.6; + particles.forEach((p) => { + const sliceIndex = Math.floor((p.homeY - padding) / 27); + const sliceOffset = + glitch.slices[Math.min(Math.max(sliceIndex, 0), 4)]; + ctx.fillStyle = "#CCFBF1"; + ctx.fillRect( + p.x + glitch.offsetX1 + sliceOffset * 0.3, + p.y + glitch.offsetY1, + p.size, + p.size, + ); + }); + particles.forEach((p) => { + const sliceIndex = Math.floor((p.homeY - padding) / 27); + const sliceOffset = + glitch.slices[Math.min(Math.max(sliceIndex, 0), 4)]; + ctx.fillStyle = "#E0E7FF"; + ctx.fillRect( + p.x + glitch.offsetX2 + sliceOffset * 0.3, + p.y + glitch.offsetY2, + p.size, + p.size, + ); + }); + ctx.globalAlpha = 1; + particles.forEach((p) => { + const sliceIndex = Math.floor((p.homeY - padding) / 27); + const sliceOffset = + glitch.slices[Math.min(Math.max(sliceIndex, 0), 4)]; + ctx.fillStyle = "#FFFFFF"; + ctx.fillRect(p.x + sliceOffset, p.y, p.size, p.size); + }); + } + + rafId = requestAnimationFrame(animate); + } + + animate(); + + // — Event listeners — + const onMouseMove = (e: MouseEvent) => { + const rect = canvas.getBoundingClientRect(); + // Scale mouse coords to canvas resolution + const scaleX = canvasWidth / rect.width; + const scaleY = canvasHeight / rect.height; + mouse.x = (e.clientX - rect.left) * scaleX; + mouse.y = (e.clientY - rect.top) * scaleY; + }; + const onMouseDown = () => { + isPressed = true; + }; + const onMouseUp = () => { + isPressed = false; + }; + + const onTouchMove = (e: TouchEvent) => { + e.preventDefault(); + const rect = canvas.getBoundingClientRect(); + const scaleX = canvasWidth / rect.width; + const scaleY = canvasHeight / rect.height; + const touch = e.touches[0]; + mouse.x = (touch.clientX - rect.left) * scaleX; + mouse.y = (touch.clientY - rect.top) * scaleY; + }; + const onTouchStart = (e: TouchEvent) => { + isPressed = true; + const rect = canvas.getBoundingClientRect(); + const scaleX = canvasWidth / rect.width; + const scaleY = canvasHeight / rect.height; + const touch = e.touches[0]; + mouse.x = (touch.clientX - rect.left) * scaleX; + mouse.y = (touch.clientY - rect.top) * scaleY; + }; + const onTouchEnd = () => { + isPressed = false; + }; + + canvas.addEventListener("mousemove", onMouseMove); + window.addEventListener("mousedown", onMouseDown); + window.addEventListener("mouseup", onMouseUp); + canvas.addEventListener("touchmove", onTouchMove, { passive: false }); + canvas.addEventListener("touchstart", onTouchStart); + canvas.addEventListener("touchend", onTouchEnd); + + return () => { + cancelAnimationFrame(rafId); + clearInterval(glitchInterval); + canvas.removeEventListener("mousemove", onMouseMove); + window.removeEventListener("mousedown", onMouseDown); + window.removeEventListener("mouseup", onMouseUp); + canvas.removeEventListener("touchmove", onTouchMove); + canvas.removeEventListener("touchstart", onTouchStart); + canvas.removeEventListener("touchend", onTouchEnd); + }; + }, [contentWidth, contentHeight, padding]); + + return ( +
+ +
+ ); +} From 0916d4d6b0f4e562da829f912463d0a87c532d80 Mon Sep 17 00:00:00 2001 From: Carla Goncalves Date: Fri, 20 Mar 2026 11:59:37 +0000 Subject: [PATCH 2/4] ammend --- apps/site/src/components/glitch-particles.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/site/src/components/glitch-particles.tsx b/apps/site/src/components/glitch-particles.tsx index 0866d4edab..f5ba0105d5 100644 --- a/apps/site/src/components/glitch-particles.tsx +++ b/apps/site/src/components/glitch-particles.tsx @@ -124,6 +124,7 @@ export default function GlitchParticles({ // — Animation loop — function animate() { + if (!ctx) return; ctx.clearRect(0, 0, canvasWidth, canvasHeight); const repelRadius = isPressed ? 200 : 80; From 3cc61324e5bf88413176ac4d71674fa888db3d87 Mon Sep 17 00:00:00 2001 From: Carla Goncalves Date: Fri, 20 Mar 2026 12:09:00 +0000 Subject: [PATCH 3/4] add three types --- apps/site/package.json | 1 + pnpm-lock.yaml | 51 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/apps/site/package.json b/apps/site/package.json index f89768ff49..54026d7511 100644 --- a/apps/site/package.json +++ b/apps/site/package.json @@ -32,6 +32,7 @@ "@types/node": "catalog:", "@types/react": "catalog:", "@types/react-dom": "catalog:", + "@types/three": "^0.183.1", "next-validate-link": "catalog:", "postcss": "catalog:", "tailwindcss": "catalog:", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f11ecc6306..1c39010bde 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -634,6 +634,9 @@ importers: '@types/react-dom': specifier: 'catalog:' version: 19.2.3(@types/react@19.2.14) + '@types/three': + specifier: ^0.183.1 + version: 0.183.1 babel-plugin-react-compiler: specifier: 'catalog:' version: 1.0.0 @@ -1166,6 +1169,9 @@ packages: resolution: {integrity: sha512-ZaaBr0pTvNxmyUbIn+nVPXPr383VqJzfUDMWicgTjJIeo2+T2hOq2kNpgpvTIrWtZrsZnSP8oXms1+sKTjcvkw==} engines: {node: '>=20'} + '@dimforge/rapier3d-compat@0.12.0': + resolution: {integrity: sha512-uekIGetywIgopfD97oDL5PfeezkFpNhwlzlaEYNOA0N6ghdsOvh/HYjSMek5Q2O1PYvRSDFcqFVJl4r4ZBwOow==} + '@emnapi/core@1.8.1': resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==} @@ -3592,6 +3598,9 @@ packages: peerDependencies: react: ^18 || ^19 + '@tweenjs/tween.js@23.1.3': + resolution: {integrity: sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==} + '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} @@ -3678,9 +3687,15 @@ packages: '@types/react@19.2.14': resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} + '@types/stats.js@0.17.4': + resolution: {integrity: sha512-jIBvWWShCvlBqBNIZt0KAshWpvSjhkwkEu4ZUcASoAvhmrgAUI2t1dXrjSL4xXVLB4FznPrIsX3nKXFl/Dt4vA==} + '@types/tedious@4.0.14': resolution: {integrity: sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==} + '@types/three@0.183.1': + resolution: {integrity: sha512-f2Pu5Hrepfgavttdye3PsH5RWyY/AvdZQwIVhrc4uNtvF7nOWJacQKcoVJn0S4f0yYbmAE6AR+ve7xDcuYtMGw==} + '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} @@ -3693,6 +3708,9 @@ packages: '@types/use-sync-external-store@0.0.6': resolution: {integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==} + '@types/webxr@0.5.24': + resolution: {integrity: sha512-h8fgEd/DpoS9CBrjEQXR+dIDraopAEfu4wYVNY2tEPwk60stPWhvZMf4Foo5FakuQ7HFZoa8WceaWFervK2Ovg==} + '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} @@ -3741,6 +3759,9 @@ packages: '@webassemblyjs/wast-printer@1.14.1': resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} + '@webgpu/types@0.1.69': + resolution: {integrity: sha512-RPmm6kgRbI8e98zSD3RVACvnuktIja5+yLgDAkTmxLr90BEwdTXRQWNLF3ETTTyH/8mKhznZuN5AveXYFEsMGQ==} + '@xtuc/ieee754@1.2.0': resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} @@ -4258,6 +4279,9 @@ packages: fflate@0.4.8: resolution: {integrity: sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==} + fflate@0.8.2: + resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -4822,6 +4846,9 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} + meshoptimizer@1.0.1: + resolution: {integrity: sha512-Vix+QlA1YYT3FwmBBZ+49cE5y/b+pRrcXKqGpS5ouh33d3lSp2PoTpCw19E0cKDFWalembrHnIaZetf27a+W2g==} + micromark-core-commonmark@2.0.3: resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} @@ -6311,6 +6338,8 @@ snapshots: '@cspell/url@9.7.0': {} + '@dimforge/rapier3d-compat@0.12.0': {} + '@emnapi/core@1.8.1': dependencies: '@emnapi/wasi-threads': 1.1.0 @@ -8362,6 +8391,8 @@ snapshots: '@tanstack/query-core': 5.90.20 react: 19.2.4 + '@tweenjs/tween.js@23.1.3': {} + '@tybys/wasm-util@0.10.1': dependencies: tslib: 2.8.1 @@ -8457,10 +8488,22 @@ snapshots: dependencies: csstype: 3.2.3 + '@types/stats.js@0.17.4': {} + '@types/tedious@4.0.14': dependencies: '@types/node': 25.3.5 + '@types/three@0.183.1': + dependencies: + '@dimforge/rapier3d-compat': 0.12.0 + '@tweenjs/tween.js': 23.1.3 + '@types/stats.js': 0.17.4 + '@types/webxr': 0.5.24 + '@webgpu/types': 0.1.69 + fflate: 0.8.2 + meshoptimizer: 1.0.1 + '@types/trusted-types@2.0.7': optional: true @@ -8470,6 +8513,8 @@ snapshots: '@types/use-sync-external-store@0.0.6': {} + '@types/webxr@0.5.24': {} + '@ungap/structured-clone@1.3.0': {} '@webassemblyjs/ast@1.14.1': @@ -8548,6 +8593,8 @@ snapshots: '@webassemblyjs/ast': 1.14.1 '@xtuc/long': 4.2.2 + '@webgpu/types@0.1.69': {} + '@xtuc/ieee754@1.2.0': {} '@xtuc/long@4.2.2': {} @@ -9068,6 +9115,8 @@ snapshots: fflate@0.4.8: {} + fflate@0.8.2: {} + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -9743,6 +9792,8 @@ snapshots: merge2@1.4.1: {} + meshoptimizer@1.0.1: {} + micromark-core-commonmark@2.0.3: dependencies: decode-named-character-reference: 1.3.0 From a7eedf313a7174d0da05b4b44eb0cd88ea3d7e23 Mon Sep 17 00:00:00 2001 From: Carla Goncalves Date: Fri, 20 Mar 2026 12:14:19 +0000 Subject: [PATCH 4/4] remove three types --- apps/site/package.json | 1 - pnpm-lock.yaml | 51 ------------------------------------------ 2 files changed, 52 deletions(-) diff --git a/apps/site/package.json b/apps/site/package.json index 54026d7511..f89768ff49 100644 --- a/apps/site/package.json +++ b/apps/site/package.json @@ -32,7 +32,6 @@ "@types/node": "catalog:", "@types/react": "catalog:", "@types/react-dom": "catalog:", - "@types/three": "^0.183.1", "next-validate-link": "catalog:", "postcss": "catalog:", "tailwindcss": "catalog:", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1c39010bde..f11ecc6306 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -634,9 +634,6 @@ importers: '@types/react-dom': specifier: 'catalog:' version: 19.2.3(@types/react@19.2.14) - '@types/three': - specifier: ^0.183.1 - version: 0.183.1 babel-plugin-react-compiler: specifier: 'catalog:' version: 1.0.0 @@ -1169,9 +1166,6 @@ packages: resolution: {integrity: sha512-ZaaBr0pTvNxmyUbIn+nVPXPr383VqJzfUDMWicgTjJIeo2+T2hOq2kNpgpvTIrWtZrsZnSP8oXms1+sKTjcvkw==} engines: {node: '>=20'} - '@dimforge/rapier3d-compat@0.12.0': - resolution: {integrity: sha512-uekIGetywIgopfD97oDL5PfeezkFpNhwlzlaEYNOA0N6ghdsOvh/HYjSMek5Q2O1PYvRSDFcqFVJl4r4ZBwOow==} - '@emnapi/core@1.8.1': resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==} @@ -3598,9 +3592,6 @@ packages: peerDependencies: react: ^18 || ^19 - '@tweenjs/tween.js@23.1.3': - resolution: {integrity: sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==} - '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} @@ -3687,15 +3678,9 @@ packages: '@types/react@19.2.14': resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} - '@types/stats.js@0.17.4': - resolution: {integrity: sha512-jIBvWWShCvlBqBNIZt0KAshWpvSjhkwkEu4ZUcASoAvhmrgAUI2t1dXrjSL4xXVLB4FznPrIsX3nKXFl/Dt4vA==} - '@types/tedious@4.0.14': resolution: {integrity: sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==} - '@types/three@0.183.1': - resolution: {integrity: sha512-f2Pu5Hrepfgavttdye3PsH5RWyY/AvdZQwIVhrc4uNtvF7nOWJacQKcoVJn0S4f0yYbmAE6AR+ve7xDcuYtMGw==} - '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} @@ -3708,9 +3693,6 @@ packages: '@types/use-sync-external-store@0.0.6': resolution: {integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==} - '@types/webxr@0.5.24': - resolution: {integrity: sha512-h8fgEd/DpoS9CBrjEQXR+dIDraopAEfu4wYVNY2tEPwk60stPWhvZMf4Foo5FakuQ7HFZoa8WceaWFervK2Ovg==} - '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} @@ -3759,9 +3741,6 @@ packages: '@webassemblyjs/wast-printer@1.14.1': resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} - '@webgpu/types@0.1.69': - resolution: {integrity: sha512-RPmm6kgRbI8e98zSD3RVACvnuktIja5+yLgDAkTmxLr90BEwdTXRQWNLF3ETTTyH/8mKhznZuN5AveXYFEsMGQ==} - '@xtuc/ieee754@1.2.0': resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} @@ -4279,9 +4258,6 @@ packages: fflate@0.4.8: resolution: {integrity: sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==} - fflate@0.8.2: - resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} - fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -4846,9 +4822,6 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - meshoptimizer@1.0.1: - resolution: {integrity: sha512-Vix+QlA1YYT3FwmBBZ+49cE5y/b+pRrcXKqGpS5ouh33d3lSp2PoTpCw19E0cKDFWalembrHnIaZetf27a+W2g==} - micromark-core-commonmark@2.0.3: resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} @@ -6338,8 +6311,6 @@ snapshots: '@cspell/url@9.7.0': {} - '@dimforge/rapier3d-compat@0.12.0': {} - '@emnapi/core@1.8.1': dependencies: '@emnapi/wasi-threads': 1.1.0 @@ -8391,8 +8362,6 @@ snapshots: '@tanstack/query-core': 5.90.20 react: 19.2.4 - '@tweenjs/tween.js@23.1.3': {} - '@tybys/wasm-util@0.10.1': dependencies: tslib: 2.8.1 @@ -8488,22 +8457,10 @@ snapshots: dependencies: csstype: 3.2.3 - '@types/stats.js@0.17.4': {} - '@types/tedious@4.0.14': dependencies: '@types/node': 25.3.5 - '@types/three@0.183.1': - dependencies: - '@dimforge/rapier3d-compat': 0.12.0 - '@tweenjs/tween.js': 23.1.3 - '@types/stats.js': 0.17.4 - '@types/webxr': 0.5.24 - '@webgpu/types': 0.1.69 - fflate: 0.8.2 - meshoptimizer: 1.0.1 - '@types/trusted-types@2.0.7': optional: true @@ -8513,8 +8470,6 @@ snapshots: '@types/use-sync-external-store@0.0.6': {} - '@types/webxr@0.5.24': {} - '@ungap/structured-clone@1.3.0': {} '@webassemblyjs/ast@1.14.1': @@ -8593,8 +8548,6 @@ snapshots: '@webassemblyjs/ast': 1.14.1 '@xtuc/long': 4.2.2 - '@webgpu/types@0.1.69': {} - '@xtuc/ieee754@1.2.0': {} '@xtuc/long@4.2.2': {} @@ -9115,8 +9068,6 @@ snapshots: fflate@0.4.8: {} - fflate@0.8.2: {} - fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -9792,8 +9743,6 @@ snapshots: merge2@1.4.1: {} - meshoptimizer@1.0.1: {} - micromark-core-commonmark@2.0.3: dependencies: decode-named-character-reference: 1.3.0