From 8ac372125ac7fdd2dd35c95f91eda94e541eaf24 Mon Sep 17 00:00:00 2001 From: DavidHerran Date: Wed, 6 May 2026 15:15:44 -0500 Subject: [PATCH] feat: dedicated 3D Models bucket in AssetBucketBrowser Add a "3D Models" bucket (path: models, accept: .glb/.gltf/.usdz) to the cases scope. Previously 3D files were mixed into the Media bucket at the root. Now they have their own tab with proper file type hints and purple accent color matching the AR viewer UI. - cases/media bucket no longer lists .glb/.gltf/.usdz in accept - New bucketHint for models bucket warns on non-3D file uploads - Network page 3D tab updated with purple accent + "3D Models" button label pointing to the dedicated bucket Co-Authored-By: Claude Opus 4.6 --- src/app/hq-command/dashboard/network/page.tsx | 8 ++++---- src/components/hq/AssetBucketBrowser.tsx | 6 ++++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/app/hq-command/dashboard/network/page.tsx b/src/app/hq-command/dashboard/network/page.tsx index 2ba2098..0dfe24e 100644 --- a/src/app/hq-command/dashboard/network/page.tsx +++ b/src/app/hq-command/dashboard/network/page.tsx @@ -402,12 +402,12 @@ export default function NetworkManager() {

3D models, dimensions, and renders for the AR viewer.

- +
- - + +
-

GLB for Android/desktop. USDZ (iOS) auto-derived.

+

GLB for Android/desktop. USDZ (iOS) auto-derived. Files stored in the dedicated 3D Models bucket.

{/* DIMENSIONS PANEL */} diff --git a/src/components/hq/AssetBucketBrowser.tsx b/src/components/hq/AssetBucketBrowser.tsx index 4ee87a3..9c9d70a 100644 --- a/src/components/hq/AssetBucketBrowser.tsx +++ b/src/components/hq/AssetBucketBrowser.tsx @@ -57,8 +57,9 @@ export interface BucketDef { const BUCKETS_BY_SCOPE: Record = { cases: [ - { id: "media", path: "", label: "Media", description: "Cover, gallery, 3D models — files at the case root", icon: ImageIcon, accept: "image/*,.glb,.gltf,.usdz", accentColor: "#00F0FF" }, + { id: "media", path: "", label: "Media", description: "Cover and gallery images at the case root", icon: ImageIcon, accept: "image/*", accentColor: "#00F0FF" }, { id: "videos", path: "videos", label: "Videos", description: "MP4 clips of the installation in operation", icon: Video, accept: "video/*", accentColor: "#4DA6FF" }, + { id: "models", path: "models", label: "3D Models", description: "GLB/USDZ for AR viewer and 3D display", icon: Box, accept: ".glb,.gltf,.usdz", accentColor: "#A855F7" }, { id: "renders", path: "renders", label: "Renders", description: "3D rendered images of the equipment", icon: Box, accept: "image/*", accentColor: "#FF6B9D" }, ], applications: [ @@ -88,7 +89,8 @@ function bucketHint(bucket: BucketDef, fileName: string): string | null { const isModel = ["glb", "gltf", "usdz"].includes(ext); if (bucket.id === "videos" && !isVideo) return "Videos bucket usually holds .mp4 — this file may not display correctly."; if (bucket.id === "renders" && !isImage) return "Renders bucket expects images (PNG/JPG/WebP)."; - if (bucket.id === "media" && !isImage && !isVideo && !isModel) return "Most pages expect images, videos or 3D model files here."; + if (bucket.id === "models" && !isModel) return "Models bucket expects 3D files (.glb, .gltf, .usdz)."; + if (bucket.id === "media" && !isImage && !isVideo) return "Media bucket expects images or videos here."; return null; }