update: fix packages

This commit is contained in:
Tom Boullay
2026-04-03 13:45:23 +02:00
parent 7ce3d61110
commit adeca383bc
6 changed files with 253 additions and 338 deletions
+6
View File
@@ -0,0 +1,6 @@
*.glb filter=lfs diff=lfs merge=lfs -text
*.gltf filter=lfs diff=lfs merge=lfs -text
*.png filter=lfs diff=lfs merge=lfs -text
*.jpg filter=lfs diff=lfs merge=lfs -text
*.jpeg filter=lfs diff=lfs merge=lfs -text
*.webp filter=lfs diff=lfs merge=lfs -text
+23 -25
View File
@@ -1,21 +1,6 @@
'use client' 'use client'
import { Suspense } from 'react' import { useEffect, useState } from 'react'
import { Canvas } from '@react-three/fiber'
import { Stage, OrbitControls, useGLTF } from '@react-three/drei'
function Model({ url }: { url: string }) {
const { scene } = useGLTF(url)
return <primitive object={scene} />
}
function Loader() {
return (
<div className="absolute inset-0 flex items-center justify-center">
<div className="w-6 h-6 border-2 border-gray-500 border-t-gray-300 rounded-full animate-spin" />
</div>
)
}
interface ModelViewerProps { interface ModelViewerProps {
url: string url: string
@@ -24,8 +9,28 @@ interface ModelViewerProps {
} }
export default function ModelViewer({ url, filename, size }: ModelViewerProps) { export default function ModelViewer({ url, filename, size }: ModelViewerProps) {
const [Scene, setScene] = useState<React.ComponentType<{ url: string }> | null>(null)
useEffect(() => {
let cancel = false
import('./SceneViewer').then((mod) => {
if (!cancel) setScene(() => mod.default)
})
return () => { cancel = true }
}, [])
if (!Scene) {
return (
<div className="w-full h-[450px] bg-black-800 border border-white/20 rounded-xl overflow-hidden flex items-center justify-center">
<div className="w-6 h-6 border-2 border-gray-500 border-t-gray-300 rounded-full animate-spin" />
</div>
)
}
return ( return (
<div className="w-full h-[450px] bg-black-800 border border-black-700 rounded-xl overflow-hidden relative"> <div className="w-full h-[450px] bg-black-800 border border-white/20 rounded-xl overflow-hidden relative">
<div className="absolute top-3 left-3 z-10 flex items-center gap-2"> <div className="absolute top-3 left-3 z-10 flex items-center gap-2">
<span className="text-xs text-gray-400 font-mono bg-black-900/60 px-2 py-1 rounded"> <span className="text-xs text-gray-400 font-mono bg-black-900/60 px-2 py-1 rounded">
{filename} {filename}
@@ -34,14 +39,7 @@ export default function ModelViewer({ url, filename, size }: ModelViewerProps) {
{size} {size}
</span> </span>
</div> </div>
<Canvas shadows dpr={[1, 2]} camera={{ fov: 50 }}> <Scene url={url} />
<Suspense fallback={null}>
<Stage environment="city" intensity={0.6} adjustCamera={1.2}>
<Model url={url} />
</Stage>
</Suspense>
<OrbitControls makeDefault autoRotate autoRotateSpeed={0.5} />
</Canvas>
</div> </div>
) )
} }
+23
View File
@@ -0,0 +1,23 @@
'use client'
import { Suspense } from 'react'
import { Canvas } from '@react-three/fiber'
import { Stage, OrbitControls, useGLTF } from '@react-three/drei'
function Model({ url }: { url: string }) {
const { scene } = useGLTF(url)
return <primitive object={scene} />
}
export default function SceneViewer({ url }: { url: string }) {
return (
<Canvas dpr={[1, 2]} camera={{ fov: 50 }}>
<Suspense fallback={null}>
<Stage environment="city" intensity={0.6} adjustCamera={1.2}>
<Model url={url} />
</Stage>
</Suspense>
<OrbitControls makeDefault autoRotate autoRotateSpeed={0.5} />
</Canvas>
)
}
+73 -52
View File
@@ -15,6 +15,7 @@ interface FileEntry {
error?: string error?: string
filename?: string filename?: string
previewUrl?: string previewUrl?: string
viewerOpen?: boolean
} }
interface UploadResult { interface UploadResult {
@@ -174,7 +175,7 @@ export default function UploadZone() {
const newEntries: FileEntry[] = acceptedFiles const newEntries: FileEntry[] = acceptedFiles
.filter((f) => !existingNames.has(f.name)) .filter((f) => !existingNames.has(f.name))
.map((file) => { .map((file) => {
const entry: FileEntry = { file, status: 'pending', progress: 0 } const entry: FileEntry = { file, status: 'pending', progress: 0, viewerOpen: true }
const type = getFileType(file.name) const type = getFileType(file.name)
if (type === 'model') { if (type === 'model') {
entry.previewUrl = URL.createObjectURL(file) entry.previewUrl = URL.createObjectURL(file)
@@ -190,7 +191,7 @@ export default function UploadZone() {
accept: ACCEPTED_FORMATS, accept: ACCEPTED_FORMATS,
maxSize: 2 * 1024 * 1024 * 1024, maxSize: 2 * 1024 * 1024 * 1024,
disabled: isUploading, disabled: isUploading,
multiple: true, multiple: false,
}) })
const allDone = files.length > 0 && files.every((f) => f.status === 'success') const allDone = files.length > 0 && files.every((f) => f.status === 'success')
@@ -207,9 +208,9 @@ export default function UploadZone() {
onChange={(e) => setSecret(e.target.value)} onChange={(e) => setSecret(e.target.value)}
placeholder="Enter secret key..." placeholder="Enter secret key..."
disabled={isUploading} disabled={isUploading}
className="w-full bg-black-800 border border-black-700 rounded-xl px-4 py-2.5 pr-12 className="w-full bg-black-800 border border-white/30 rounded-xl px-4 py-2.5 pr-12
text-gray-100 placeholder-gray-500 text-sm text-gray-100 placeholder-gray-500 text-sm
focus:outline-none focus:ring-2 focus:ring-gray-600 focus:border-gray-500 focus:outline-none focus:ring-2 focus:ring-white/50 focus:border-white/50
disabled:opacity-50 disabled:cursor-not-allowed transition" disabled:opacity-50 disabled:cursor-not-allowed transition"
/> />
<button <button
@@ -243,52 +244,53 @@ export default function UploadZone() {
onChange={(e) => setAssetName(e.target.value)} onChange={(e) => setAssetName(e.target.value)}
placeholder="e.g., tower, stone_floor, brick_wall..." placeholder="e.g., tower, stone_floor, brick_wall..."
disabled={isUploading} disabled={isUploading}
className="w-full bg-black-800 border border-black-700 rounded-xl px-4 py-2.5 className="w-full bg-black-800 border border-white/30 rounded-xl px-4 py-2.5
text-gray-100 placeholder-gray-500 text-sm font-mono text-gray-100 placeholder-gray-500 text-sm font-mono
focus:outline-none focus:ring-2 focus:ring-gray-600 focus:border-gray-500 focus:outline-none focus:ring-2 focus:ring-white/50 focus:border-white/50
disabled:opacity-50 disabled:cursor-not-allowed transition" disabled:opacity-50 disabled:cursor-not-allowed transition"
/> />
</div> </div>
<div {files.length === 0 && (
{...getRootProps()} <div
className={` {...getRootProps()}
relative border-2 border-dashed rounded-2xl p-8 text-center cursor-pointer transition-all duration-200 bg-black-800 className={`
${isUploading ? 'cursor-not-allowed opacity-60 border-black-700' : ''} relative border-2 border-dashed rounded-2xl p-8 text-center cursor-pointer transition-all duration-200 bg-black-800
${isDragReject ? 'border-red-500 bg-red-900/20' : ''} ${isUploading ? 'cursor-not-allowed opacity-60 border-white/20' : ''}
${isDragActive && !isDragReject ? 'border-gray-400 bg-black-700 scale-[1.01]' : ''} ${isDragReject ? 'border-red-500 bg-red-900/20' : ''}
${!isDragActive && !isDragReject && !isUploading ${isDragActive && !isDragReject ? 'border-white/50 bg-black-700 scale-[1.01]' : ''}
? 'border-black-600 hover:border-gray-500 hover:bg-black-700' ${!isDragActive && !isDragReject && !isUploading
: ''} ? 'border-white/30 hover:border-white/50 hover:bg-black-700'
`} : ''}
> `}
<input {...getInputProps()} /> >
<div className="flex justify-center mb-3"> <input {...getInputProps()} />
<div className={`w-12 h-12 rounded-full flex items-center justify-center transition <div className="flex justify-center mb-3">
${isDragActive ? 'bg-gray-700' : 'bg-black-700'}`}> <div className={`w-12 h-12 rounded-full flex items-center justify-center transition ${isDragActive ? 'bg-gray-700' : 'bg-black-700'}`}>
<svg className={`w-6 h-6 transition ${isDragActive ? 'text-white' : 'text-gray-400'}`} <svg className={`w-6 h-6 transition ${isDragActive ? 'text-white' : 'text-gray-400'}`}
fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={1.5}> fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={1.5}>
<path strokeLinecap="round" strokeLinejoin="round" <path strokeLinecap="round" strokeLinejoin="round"
d="M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5m-13.5-9L12 3m0 0l4.5 4.5M12 3v13.5" /> d="M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5m-13.5-9L12 3m0 0l4.5 4.5M12 3v13.5" />
</svg> </svg>
</div>
</div> </div>
{isDragReject ? (
<p className="text-sm font-medium text-red-400">Unsupported format</p>
) : isDragActive ? (
<p className="text-sm font-medium text-gray-200">Release to add</p>
) : (
<>
<p className="text-sm font-medium text-gray-300">
Drag files here
<span className="text-gray-500 font-normal"> or click to browse</span>
</p>
<p className="text-xs text-gray-500 mt-1">
Models: .glb, .gltf · Textures: .png, .jpg, .webp
</p>
</>
)}
</div> </div>
{isDragReject ? ( )}
<p className="text-sm font-medium text-red-400">Unsupported format</p>
) : isDragActive ? (
<p className="text-sm font-medium text-gray-200">Release to add</p>
) : (
<>
<p className="text-sm font-medium text-gray-300">
Drag files here
<span className="text-gray-500 font-normal"> or click to browse</span>
</p>
<p className="text-xs text-gray-500 mt-1">
Models: .glb, .gltf · Textures: .png, .jpg, .webp
</p>
</>
)}
</div>
{globalError && ( {globalError && (
<p className="text-xs text-red-400 text-center">{globalError}</p> <p className="text-xs text-red-400 text-center">{globalError}</p>
@@ -300,7 +302,7 @@ export default function UploadZone() {
const type = getFileType(entry.file.name) const type = getFileType(entry.file.name)
return ( return (
<div key={`${entry.file.name}-${i}`}> <div key={`${entry.file.name}-${i}`}>
<div className="flex items-center gap-3 bg-black-800 border border-black-700 rounded-xl px-4 py-3"> <div className="flex items-center gap-3 bg-black-800 border border-white/20 rounded-xl px-4 py-3">
<div className="shrink-0"> <div className="shrink-0">
{entry.status === 'success' ? ( {entry.status === 'success' ? (
@@ -323,11 +325,25 @@ export default function UploadZone() {
</svg> </svg>
</div> </div>
) : ( ) : (
<div className="w-8 h-8 rounded-full bg-black-700 flex items-center justify-center"> <button
<svg className="w-4 h-4 text-gray-500" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={1.5}> onClick={() => {
if (entry.previewUrl && type === 'model') {
updateFile(i, { viewerOpen: !entry.viewerOpen })
}
}}
className={`shrink-0 w-8 h-8 rounded-full flex items-center justify-center transition ${
entry.previewUrl && type === 'model'
? 'bg-black-700 hover:bg-gray-700 cursor-pointer'
: 'bg-black-700 cursor-default'
}`}
>
<svg
className={`w-4 h-4 text-gray-500 transition-transform ${entry.viewerOpen ? 'rotate-180' : ''}`}
fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={1.5}
>
<path strokeLinecap="round" strokeLinejoin="round" d="M19 9l-7 7-7-7" /> <path strokeLinecap="round" strokeLinejoin="round" d="M19 9l-7 7-7-7" />
</svg> </svg>
</div> </button>
)} )}
</div> </div>
@@ -373,7 +389,11 @@ export default function UploadZone() {
</div> </div>
{entry.previewUrl && type === 'model' && entry.status !== 'success' && ( {entry.previewUrl && type === 'model' && entry.status !== 'success' && (
<div className="mt-2"> <div
className={`transition-all duration-300 ease-in-out ${
entry.viewerOpen ? 'max-h-[500px] opacity-100 mt-2' : 'max-h-0 opacity-0'
}`}
>
<ModelViewer <ModelViewer
url={entry.previewUrl} url={entry.previewUrl}
filename={entry.file.name} filename={entry.file.name}
@@ -392,8 +412,9 @@ export default function UploadZone() {
<button <button
onClick={handleUpload} onClick={handleUpload}
className="flex-1 bg-white text-black font-medium text-sm className="flex-1 bg-white text-black font-medium text-sm
py-2.5 px-6 rounded-xl transition-opacity duration-150 py-2.5 px-6 rounded-xl transition-all duration-150
hover:bg-gray-200 focus:outline-none focus:ring-2 focus:ring-gray-400" hover:bg-gray-200 focus:outline-none focus:ring-2 focus:ring-white/50 border border-white/20"
style={{ color: '#000000' }}
> >
Upload {files.filter(f => f.status !== 'success').length > 1 Upload {files.filter(f => f.status !== 'success').length > 1
? `${files.filter(f => f.status !== 'success').length} files` ? `${files.filter(f => f.status !== 'success').length} files`
+111 -246
View File
@@ -8,23 +8,25 @@
"name": "asset-bridge-3d", "name": "asset-bridge-3d",
"version": "0.1.0", "version": "0.1.0",
"dependencies": { "dependencies": {
"@react-three/drei": "^9.117.0", "@react-three/drei": "~10.7.0",
"@react-three/fiber": "^8.17.10", "@react-three/fiber": "~9.5.0",
"next": "^16.1.7", "next": "~16.2.1",
"react": "^18.3.0", "react": "~19.0.0",
"react-dom": "^18.3.0", "react-dom": "~19.0.0",
"react-dropzone": "^14.2.3", "react-dropzone": "~14.2.3",
"three": "^0.170.0" "three": "~0.183.0",
"zustand": "~5.0.3"
}, },
"devDependencies": { "devDependencies": {
"@types/busboy": "^1.5.4", "@types/busboy": "~1.5.4",
"@types/node": "20.19.37", "@types/node": "~22.13.0",
"@types/react": "18.3.28", "@types/react": "~19.0.0",
"@types/react-dom": "^18.3.0", "@types/react-dom": "~19.0.0",
"autoprefixer": "^10.4.19", "@types/three": "~0.183.0",
"postcss": "^8.4.38", "autoprefixer": "~10.4.20",
"tailwindcss": "^3.4.4", "postcss": "~8.5.1",
"typescript": "5.9.3" "tailwindcss": "~3.4.17",
"typescript": "~5.7.3"
} }
}, },
"node_modules/@alloc/quick-lru": { "node_modules/@alloc/quick-lru": {
@@ -820,113 +822,39 @@
"node": ">= 8" "node": ">= 8"
} }
}, },
"node_modules/@react-spring/animated": {
"version": "9.7.5",
"resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.7.5.tgz",
"integrity": "sha512-Tqrwz7pIlsSDITzxoLS3n/v/YCUHQdOIKtOJf4yL6kYVSDTSmVK1LI1Q3M/uu2Sx4X3pIWF3xLUhlsA6SPNTNg==",
"license": "MIT",
"dependencies": {
"@react-spring/shared": "~9.7.5",
"@react-spring/types": "~9.7.5"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0"
}
},
"node_modules/@react-spring/core": {
"version": "9.7.5",
"resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.7.5.tgz",
"integrity": "sha512-rmEqcxRcu7dWh7MnCcMXLvrf6/SDlSokLaLTxiPlAYi11nN3B5oiCUAblO72o+9z/87j2uzxa2Inm8UbLjXA+w==",
"license": "MIT",
"dependencies": {
"@react-spring/animated": "~9.7.5",
"@react-spring/shared": "~9.7.5",
"@react-spring/types": "~9.7.5"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/react-spring/donate"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0"
}
},
"node_modules/@react-spring/rafz": {
"version": "9.7.5",
"resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.7.5.tgz",
"integrity": "sha512-5ZenDQMC48wjUzPAm1EtwQ5Ot3bLIAwwqP2w2owG5KoNdNHpEJV263nGhCeKKmuA3vG2zLLOdu3or6kuDjA6Aw==",
"license": "MIT"
},
"node_modules/@react-spring/shared": {
"version": "9.7.5",
"resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.7.5.tgz",
"integrity": "sha512-wdtoJrhUeeyD/PP/zo+np2s1Z820Ohr/BbuVYv+3dVLW7WctoiN7std8rISoYoHpUXtbkpesSKuPIw/6U1w1Pw==",
"license": "MIT",
"dependencies": {
"@react-spring/rafz": "~9.7.5",
"@react-spring/types": "~9.7.5"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0"
}
},
"node_modules/@react-spring/three": {
"version": "9.7.5",
"resolved": "https://registry.npmjs.org/@react-spring/three/-/three-9.7.5.tgz",
"integrity": "sha512-RxIsCoQfUqOS3POmhVHa1wdWS0wyHAUway73uRLp3GAL5U2iYVNdnzQsep6M2NZ994BlW8TcKuMtQHUqOsy6WA==",
"license": "MIT",
"dependencies": {
"@react-spring/animated": "~9.7.5",
"@react-spring/core": "~9.7.5",
"@react-spring/shared": "~9.7.5",
"@react-spring/types": "~9.7.5"
},
"peerDependencies": {
"@react-three/fiber": ">=6.0",
"react": "^16.8.0 || ^17.0.0 || ^18.0.0",
"three": ">=0.126"
}
},
"node_modules/@react-spring/types": {
"version": "9.7.5",
"resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.7.5.tgz",
"integrity": "sha512-HVj7LrZ4ReHWBimBvu2SKND3cDVUPWKLqRTmWe/fNY6o1owGOX0cAHbdPDTMelgBlVbrTKrre6lFkhqGZErK/g==",
"license": "MIT"
},
"node_modules/@react-three/drei": { "node_modules/@react-three/drei": {
"version": "9.122.0", "version": "10.7.7",
"resolved": "https://registry.npmjs.org/@react-three/drei/-/drei-9.122.0.tgz", "resolved": "https://registry.npmjs.org/@react-three/drei/-/drei-10.7.7.tgz",
"integrity": "sha512-SEO/F/rBCTjlLez7WAlpys+iGe9hty4rNgjZvgkQeXFSiwqD4Hbk/wNHMAbdd8vprO2Aj81mihv4dF5bC7D0CA==", "integrity": "sha512-ff+J5iloR0k4tC++QtD/j9u3w5fzfgFAWDtAGQah9pF2B1YgOq/5JxqY0/aVoQG5r3xSZz0cv5tk2YuBob4xEQ==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/runtime": "^7.26.0", "@babel/runtime": "^7.26.0",
"@mediapipe/tasks-vision": "0.10.17", "@mediapipe/tasks-vision": "0.10.17",
"@monogrid/gainmap-js": "^3.0.6", "@monogrid/gainmap-js": "^3.0.6",
"@react-spring/three": "~9.7.5",
"@use-gesture/react": "^10.3.1", "@use-gesture/react": "^10.3.1",
"camera-controls": "^2.9.0", "camera-controls": "^3.1.0",
"cross-env": "^7.0.3", "cross-env": "^7.0.3",
"detect-gpu": "^5.0.56", "detect-gpu": "^5.0.56",
"glsl-noise": "^0.0.0", "glsl-noise": "^0.0.0",
"hls.js": "^1.5.17", "hls.js": "^1.5.17",
"maath": "^0.10.8", "maath": "^0.10.8",
"meshline": "^3.3.1", "meshline": "^3.3.1",
"react-composer": "^5.0.3",
"stats-gl": "^2.2.8", "stats-gl": "^2.2.8",
"stats.js": "^0.17.0", "stats.js": "^0.17.0",
"suspend-react": "^0.1.3", "suspend-react": "^0.1.3",
"three-mesh-bvh": "^0.7.8", "three-mesh-bvh": "^0.8.3",
"three-stdlib": "^2.35.6", "three-stdlib": "^2.35.6",
"troika-three-text": "^0.52.0", "troika-three-text": "^0.52.4",
"tunnel-rat": "^0.1.2", "tunnel-rat": "^0.1.2",
"use-sync-external-store": "^1.4.0",
"utility-types": "^3.11.0", "utility-types": "^3.11.0",
"zustand": "^5.0.1" "zustand": "^5.0.1"
}, },
"peerDependencies": { "peerDependencies": {
"@react-three/fiber": "^8", "@react-three/fiber": "^9.0.0",
"react": "^18", "react": "^19",
"react-dom": "^18", "react-dom": "^19",
"three": ">=0.137" "three": ">=0.159"
}, },
"peerDependenciesMeta": { "peerDependenciesMeta": {
"react-dom": { "react-dom": {
@@ -935,32 +863,31 @@
} }
}, },
"node_modules/@react-three/fiber": { "node_modules/@react-three/fiber": {
"version": "8.18.0", "version": "9.5.0",
"resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-8.18.0.tgz", "resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-9.5.0.tgz",
"integrity": "sha512-FYZZqD0UUHUswKz3LQl2Z7H24AhD14XGTsIRw3SJaXUxyfVMi+1yiZGmqTcPt/CkPpdU7rrxqcyQ1zJE5DjvIQ==", "integrity": "sha512-FiUzfYW4wB1+PpmsE47UM+mCads7j2+giRBltfwH7SNhah95rqJs3ltEs9V3pP8rYdS0QlNne+9Aj8dS/SiaIA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/runtime": "^7.17.8", "@babel/runtime": "^7.17.8",
"@types/react-reconciler": "^0.26.7",
"@types/webxr": "*", "@types/webxr": "*",
"base64-js": "^1.5.1", "base64-js": "^1.5.1",
"buffer": "^6.0.3", "buffer": "^6.0.3",
"its-fine": "^1.0.6", "its-fine": "^2.0.0",
"react-reconciler": "^0.27.0",
"react-use-measure": "^2.1.7", "react-use-measure": "^2.1.7",
"scheduler": "^0.21.0", "scheduler": "^0.27.0",
"suspend-react": "^0.1.3", "suspend-react": "^0.1.3",
"zustand": "^3.7.1" "use-sync-external-store": "^1.4.0",
"zustand": "^5.0.3"
}, },
"peerDependencies": { "peerDependencies": {
"expo": ">=43.0", "expo": ">=43.0",
"expo-asset": ">=8.4", "expo-asset": ">=8.4",
"expo-file-system": ">=11.0", "expo-file-system": ">=11.0",
"expo-gl": ">=11.0", "expo-gl": ">=11.0",
"react": ">=18 <19", "react": ">=19 <19.3",
"react-dom": ">=18 <19", "react-dom": ">=19 <19.3",
"react-native": ">=0.64", "react-native": ">=0.78",
"three": ">=0.133" "three": ">=0.156"
}, },
"peerDependenciesMeta": { "peerDependenciesMeta": {
"expo": { "expo": {
@@ -983,23 +910,6 @@
} }
} }
}, },
"node_modules/@react-three/fiber/node_modules/zustand": {
"version": "3.7.2",
"resolved": "https://registry.npmjs.org/zustand/-/zustand-3.7.2.tgz",
"integrity": "sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==",
"license": "MIT",
"engines": {
"node": ">=12.7.0"
},
"peerDependencies": {
"react": ">=16.8"
},
"peerDependenciesMeta": {
"react": {
"optional": true
}
}
},
"node_modules/@swc/helpers": { "node_modules/@swc/helpers": {
"version": "0.5.15", "version": "0.5.15",
"resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz",
@@ -1032,13 +942,13 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "20.19.37", "version": "22.13.17",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.37.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.17.tgz",
"integrity": "sha512-8kzdPJ3FsNsVIurqBs7oodNnCEVbni9yUEkaHbgptDACOPW04jimGagZ51E6+lXUwJjgnBw+hyko/lkFWCldqw==", "integrity": "sha512-nAJuQXoyPj04uLgu+obZcSmsfOenUg6DxPKogeUy6yNCFwWaj5sBF8/G/pNo8EtBJjAfSVgfIlugR/BCOleO+g==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"undici-types": "~6.21.0" "undici-types": "~6.20.0"
} }
}, },
"node_modules/@types/offscreencanvas": { "node_modules/@types/offscreencanvas": {
@@ -1047,38 +957,31 @@
"integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==", "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/@types/prop-types": {
"version": "15.7.15",
"resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz",
"integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==",
"license": "MIT"
},
"node_modules/@types/react": { "node_modules/@types/react": {
"version": "18.3.28", "version": "19.0.14",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.28.tgz", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.14.tgz",
"integrity": "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==", "integrity": "sha512-ixLZ7zG7j1fM0DijL9hDArwhwcCb4vqmePgwtV0GfnkHRSCUEv4LvzarcTdhoqgyMznUx/EhoTUv31CKZzkQlw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@types/prop-types": "*", "csstype": "^3.0.2"
"csstype": "^3.2.2"
} }
}, },
"node_modules/@types/react-dom": { "node_modules/@types/react-dom": {
"version": "18.3.7", "version": "19.0.6",
"resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.0.6.tgz",
"integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", "integrity": "sha512-lo6MuY+rFr8kIiFnr+7TzO+Av0wUPcEcepiPV4epGP0eTQpkDfp9czudg73isV8UxKauCUNlL1N8fXhcnx4iBw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peerDependencies": { "peerDependencies": {
"@types/react": "^18.0.0" "@types/react": "^19.0.0"
} }
}, },
"node_modules/@types/react-reconciler": { "node_modules/@types/react-reconciler": {
"version": "0.26.7", "version": "0.28.9",
"resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.26.7.tgz", "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.9.tgz",
"integrity": "sha512-mBDYl8x+oyPX/VBb3E638N0B7xG+SPk/EAMcVPeexqus/5aTpTphQi0curhhshOqRrc9t6OPoJfEUkbymse/lQ==", "integrity": "sha512-HHM3nxyUZ3zAylX8ZEyrDNd2XZOnQ0D5XfunJF5FLQnZbHHYq4UWvW1QfelQNXv1ICNkwYhfxjwfnqivYB6bFg==",
"license": "MIT", "license": "MIT",
"dependencies": { "peerDependencies": {
"@types/react": "*" "@types/react": "*"
} }
}, },
@@ -1343,10 +1246,14 @@
} }
}, },
"node_modules/camera-controls": { "node_modules/camera-controls": {
"version": "2.10.1", "version": "3.1.2",
"resolved": "https://registry.npmjs.org/camera-controls/-/camera-controls-2.10.1.tgz", "resolved": "https://registry.npmjs.org/camera-controls/-/camera-controls-3.1.2.tgz",
"integrity": "sha512-KnaKdcvkBJ1Irbrzl8XD6WtZltkRjp869Jx8c0ujs9K+9WD+1D7ryBsCiVqJYUqt6i/HR5FxT7RLASieUD+Q5w==", "integrity": "sha512-xkxfpG2ECZ6Ww5/9+kf4mfg1VEYAoe9aDSY+IwF0UEs7qEzwy0aVRfs2grImIECs/PoBtWFrh7RXsQkwG922JA==",
"license": "MIT", "license": "MIT",
"engines": {
"node": ">=22.0.0",
"npm": ">=10.5.1"
},
"peerDependencies": { "peerDependencies": {
"three": ">=0.126.1" "three": ">=0.126.1"
} }
@@ -1579,12 +1486,12 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/file-selector": { "node_modules/file-selector": {
"version": "2.1.2", "version": "0.6.0",
"resolved": "https://registry.npmjs.org/file-selector/-/file-selector-2.1.2.tgz", "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.6.0.tgz",
"integrity": "sha512-QgXo+mXTe8ljeqUFaX3QVHc5osSItJ/Km+xpocx0aSqWGMSCf6qYs/VnzZgS864Pjn5iceMRFigeAV7AfTlaig==", "integrity": "sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"tslib": "^2.7.0" "tslib": "^2.4.0"
}, },
"engines": { "engines": {
"node": ">= 12" "node": ">= 12"
@@ -1781,24 +1688,15 @@
"license": "ISC" "license": "ISC"
}, },
"node_modules/its-fine": { "node_modules/its-fine": {
"version": "1.2.5", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/its-fine/-/its-fine-1.2.5.tgz", "resolved": "https://registry.npmjs.org/its-fine/-/its-fine-2.0.0.tgz",
"integrity": "sha512-fXtDA0X0t0eBYAGLVM5YsgJGsJ5jEmqZEPrGbzdf5awjv0xE7nqv3TVnvtUF060Tkes15DbDAKW/I48vsb6SyA==", "integrity": "sha512-KLViCmWx94zOvpLwSlsx6yOCeMhZYaxrJV87Po5k/FoZzcPSahvK5qJ7fYhS61sZi5ikmh2S3Hz55A2l3U69ng==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@types/react-reconciler": "^0.28.0" "@types/react-reconciler": "^0.28.9"
}, },
"peerDependencies": { "peerDependencies": {
"react": ">=18.0" "react": "^19.0.0"
}
},
"node_modules/its-fine/node_modules/@types/react-reconciler": {
"version": "0.28.9",
"resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.9.tgz",
"integrity": "sha512-HHM3nxyUZ3zAylX8ZEyrDNd2XZOnQ0D5XfunJF5FLQnZbHHYq4UWvW1QfelQNXv1ICNkwYhfxjwfnqivYB6bFg==",
"license": "MIT",
"peerDependencies": {
"@types/react": "*"
} }
}, },
"node_modules/jiti": { "node_modules/jiti": {
@@ -2321,59 +2219,40 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/react": { "node_modules/react": {
"version": "18.3.1", "version": "19.0.4",
"resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "resolved": "https://registry.npmjs.org/react/-/react-19.0.4.tgz",
"integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "integrity": "sha512-6RpEg9/n0sThnO+2CaMLWuvL1iyctm9/lcSTwvmyCoJYD5eiIrwxevXtrMqrtUr96HCdQB8/Yf+oK1QGy8kXEQ==",
"license": "MIT", "license": "MIT",
"dependencies": {
"loose-envify": "^1.1.0"
},
"engines": { "engines": {
"node": ">=0.10.0" "node": ">=0.10.0"
} }
}, },
"node_modules/react-composer": {
"version": "5.0.3",
"resolved": "https://registry.npmjs.org/react-composer/-/react-composer-5.0.3.tgz",
"integrity": "sha512-1uWd07EME6XZvMfapwZmc7NgCZqDemcvicRi3wMJzXsQLvZ3L7fTHVyPy1bZdnWXM4iPjYuNE+uJ41MLKeTtnA==",
"license": "MIT",
"dependencies": {
"prop-types": "^15.6.0"
},
"peerDependencies": {
"react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0"
}
},
"node_modules/react-dom": { "node_modules/react-dom": {
"version": "18.3.1", "version": "19.0.4",
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.0.4.tgz",
"integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "integrity": "sha512-JiVlwQwuINIQf2+XUjtRFtLxhTE6hcyX7ZyCmY0HM7I/Kgi7qyXThkzwzg6uCfu3rTg9Ofe1x8qWYrfqthIrzg==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"loose-envify": "^1.1.0", "scheduler": "^0.25.0"
"scheduler": "^0.23.2"
}, },
"peerDependencies": { "peerDependencies": {
"react": "^18.3.1" "react": "^19.0.4"
} }
}, },
"node_modules/react-dom/node_modules/scheduler": { "node_modules/react-dom/node_modules/scheduler": {
"version": "0.23.2", "version": "0.25.0",
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz",
"integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==",
"license": "MIT", "license": "MIT"
"dependencies": {
"loose-envify": "^1.1.0"
}
}, },
"node_modules/react-dropzone": { "node_modules/react-dropzone": {
"version": "14.4.1", "version": "14.2.10",
"resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.4.1.tgz", "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.2.10.tgz",
"integrity": "sha512-QDuV76v3uKbHiH34SpwifZ+gOLi1+RdsCO1kl5vxMT4wW8R82+sthjvBw4th3NHF/XX6FBsqDYZVNN+pnhaw0g==", "integrity": "sha512-Y98LOCYxGO2jOFWREeKJlL7gbrHcOlTBp+9DCM1dh9XQ8+P/8ThhZT7kFb05C+bPcTXq/rixpU+5+LzwYrFLUw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"attr-accept": "^2.2.4", "attr-accept": "^2.2.2",
"file-selector": "^2.1.0", "file-selector": "^0.6.0",
"prop-types": "^15.8.1" "prop-types": "^15.8.1"
}, },
"engines": { "engines": {
@@ -2389,22 +2268,6 @@
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/react-reconciler": {
"version": "0.27.0",
"resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.27.0.tgz",
"integrity": "sha512-HmMDKciQjYmBRGuuhIaKA1ba/7a+UsM5FzOZsMO2JYHt9Jh8reCb7j1eDC95NOyUlKM9KRyvdx0flBuDvYSBoA==",
"license": "MIT",
"dependencies": {
"loose-envify": "^1.1.0",
"scheduler": "^0.21.0"
},
"engines": {
"node": ">=0.10.0"
},
"peerDependencies": {
"react": "^18.0.0"
}
},
"node_modules/react-use-measure": { "node_modules/react-use-measure": {
"version": "2.1.7", "version": "2.1.7",
"resolved": "https://registry.npmjs.org/react-use-measure/-/react-use-measure-2.1.7.tgz", "resolved": "https://registry.npmjs.org/react-use-measure/-/react-use-measure-2.1.7.tgz",
@@ -2509,13 +2372,10 @@
} }
}, },
"node_modules/scheduler": { "node_modules/scheduler": {
"version": "0.21.0", "version": "0.27.0",
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.21.0.tgz", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
"integrity": "sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==", "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==",
"license": "MIT", "license": "MIT"
"dependencies": {
"loose-envify": "^1.1.0"
}
}, },
"node_modules/semver": { "node_modules/semver": {
"version": "7.7.4", "version": "7.7.4",
@@ -2619,6 +2479,12 @@
"three": "*" "three": "*"
} }
}, },
"node_modules/stats-gl/node_modules/three": {
"version": "0.170.0",
"resolved": "https://registry.npmjs.org/three/-/three-0.170.0.tgz",
"integrity": "sha512-FQK+LEpYc0fBD+J8g6oSEyyNzjp+Q7Ks1C568WWaoMRLW+TkNNWmenWeGgJjV105Gd+p/2ql1ZcjYvNiPZBhuQ==",
"license": "MIT"
},
"node_modules/stats.js": { "node_modules/stats.js": {
"version": "0.17.0", "version": "0.17.0",
"resolved": "https://registry.npmjs.org/stats.js/-/stats.js-0.17.0.tgz", "resolved": "https://registry.npmjs.org/stats.js/-/stats.js-0.17.0.tgz",
@@ -2755,19 +2621,18 @@
} }
}, },
"node_modules/three": { "node_modules/three": {
"version": "0.170.0", "version": "0.183.2",
"resolved": "https://registry.npmjs.org/three/-/three-0.170.0.tgz", "resolved": "https://registry.npmjs.org/three/-/three-0.183.2.tgz",
"integrity": "sha512-FQK+LEpYc0fBD+J8g6oSEyyNzjp+Q7Ks1C568WWaoMRLW+TkNNWmenWeGgJjV105Gd+p/2ql1ZcjYvNiPZBhuQ==", "integrity": "sha512-di3BsL2FEQ1PA7Hcvn4fyJOlxRRgFYBpMTcyOgkwJIaDOdJMebEFPA+t98EvjuljDx4hNulAGwF6KIjtwI5jgQ==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/three-mesh-bvh": { "node_modules/three-mesh-bvh": {
"version": "0.7.8", "version": "0.8.3",
"resolved": "https://registry.npmjs.org/three-mesh-bvh/-/three-mesh-bvh-0.7.8.tgz", "resolved": "https://registry.npmjs.org/three-mesh-bvh/-/three-mesh-bvh-0.8.3.tgz",
"integrity": "sha512-BGEZTOIC14U0XIRw3tO4jY7IjP7n7v24nv9JXS1CyeVRWOCkcOMhRnmENUjuV39gktAw4Ofhr0OvIAiTspQrrw==", "integrity": "sha512-4G5lBaF+g2auKX3P0yqx+MJC6oVt6sB5k+CchS6Ob0qvH0YIhuUk1eYr7ktsIpY+albCqE80/FVQGV190PmiAg==",
"deprecated": "Deprecated due to three.js version incompatibility. Please use v0.8.0, instead.",
"license": "MIT", "license": "MIT",
"peerDependencies": { "peerDependencies": {
"three": ">= 0.151.0" "three": ">= 0.159.0"
} }
}, },
"node_modules/three-stdlib": { "node_modules/three-stdlib": {
@@ -2935,9 +2800,9 @@
} }
}, },
"node_modules/typescript": { "node_modules/typescript": {
"version": "5.9.3", "version": "5.7.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz",
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==",
"dev": true, "dev": true,
"license": "Apache-2.0", "license": "Apache-2.0",
"bin": { "bin": {
@@ -2949,9 +2814,9 @@
} }
}, },
"node_modules/undici-types": { "node_modules/undici-types": {
"version": "6.21.0", "version": "6.20.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz",
"integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==",
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
+17 -15
View File
@@ -1,6 +1,6 @@
{ {
"name": "asset-bridge-3d", "name": "upload-gltf",
"version": "0.1.0", "version": "0.0.2",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "next dev", "dev": "next dev",
@@ -9,22 +9,24 @@
"lint": "next lint" "lint": "next lint"
}, },
"dependencies": { "dependencies": {
"next": "^16.1.7", "next": "^16.2.1",
"react": "^18.3.0", "react": "^19.0.0",
"react-dom": "^18.3.0", "react-dom": "^19.0.0",
"react-dropzone": "^14.2.3", "react-dropzone": "^14.2.3",
"three": "^0.170.0", "three": "^0.183.0",
"@react-three/fiber": "^8.17.10", "@react-three/fiber": "^9.5.0",
"@react-three/drei": "^9.117.0" "@react-three/drei": "^10.7.0",
"zustand": "^5.0.3"
}, },
"devDependencies": { "devDependencies": {
"@types/busboy": "^1.5.4", "@types/busboy": "^1.5.4",
"@types/node": "20.19.37", "@types/node": "^22.13.0",
"@types/react": "18.3.28", "@types/react": "^19.0.0",
"@types/react-dom": "^18.3.0", "@types/react-dom": "^19.0.0",
"autoprefixer": "^10.4.19", "@types/three": "^0.183.0",
"postcss": "^8.4.38", "autoprefixer": "^10.4.20",
"tailwindcss": "^3.4.4", "postcss": "^8.5.1",
"typescript": "5.9.3" "tailwindcss": "^3.4.17",
"typescript": "^5.7.3"
} }
} }