diff --git a/apps/editor/app/viewer/[id]/viewer-overlay.tsx b/apps/editor/app/viewer/[id]/viewer-overlay.tsx index 0cbb053c..49c8fd5f 100644 --- a/apps/editor/app/viewer/[id]/viewer-overlay.tsx +++ b/apps/editor/app/viewer/[id]/viewer-overlay.tsx @@ -1,9 +1,26 @@ 'use client' -import { type AnyNode, type AnyNodeId, type BuildingNode, type LevelNode, type ZoneNode, useScene } from '@pascal-app/core' +import { + type AnyNode, + type AnyNodeId, + type BuildingNode, + type LevelNode, + useScene, + type ZoneNode, +} from '@pascal-app/core' import { useViewer } from '@pascal-app/viewer' +import { + ArrowLeft, + Box, + ChevronRight, + Diamond, + Eye, + EyeOff, + Image, + Layers, + Layers2, +} from 'lucide-react' import Link from 'next/link' -import { ArrowLeft, Box, ChevronRight, Diamond, Eye, EyeOff, Image, Layers, Layers2 } from 'lucide-react' import type { ProjectOwner } from '@/features/community/lib/projects/types' const getNodeName = (node: AnyNode): string => { @@ -23,7 +40,12 @@ interface ViewerOverlayProps { canShowGuides?: boolean } -export const ViewerOverlay = ({ projectName, owner, canShowScans = true, canShowGuides = true }: ViewerOverlayProps) => { +export const ViewerOverlay = ({ + projectName, + owner, + canShowScans = true, + canShowGuides = true, +}: ViewerOverlayProps) => { const selection = useViewer((s) => s.selection) const nodes = useScene((s) => s.nodes) const showScans = useViewer((s) => s.showScans) @@ -32,20 +54,24 @@ export const ViewerOverlay = ({ projectName, owner, canShowScans = true, canShow const levelMode = useViewer((s) => s.levelMode) const wallMode = useViewer((s) => s.wallMode) - const building = selection.buildingId ? (nodes[selection.buildingId] as BuildingNode | undefined) : null + const building = selection.buildingId + ? (nodes[selection.buildingId] as BuildingNode | undefined) + : null const level = selection.levelId ? (nodes[selection.levelId] as LevelNode | undefined) : null const zone = selection.zoneId ? (nodes[selection.zoneId] as ZoneNode | undefined) : null // Get the first selected item (if any) - const selectedNode = selection.selectedIds.length > 0 - ? (nodes[selection.selectedIds[0] as AnyNodeId] as AnyNode | undefined) - : null + const selectedNode = + selection.selectedIds.length > 0 + ? (nodes[selection.selectedIds[0] as AnyNodeId] as AnyNode | undefined) + : null // Get all levels for the selected building - const levels = building?.children - .map((id) => nodes[id as AnyNodeId] as LevelNode | undefined) - .filter((n): n is LevelNode => n?.type === 'level') - .sort((a, b) => a.level - b.level) ?? [] + const levels = + building?.children + .map((id) => nodes[id as AnyNodeId] as LevelNode | undefined) + .filter((n): n is LevelNode => n?.type === 'level') + .sort((a, b) => a.level - b.level) ?? [] const handleLevelClick = (levelId: LevelNode['id']) => { // When switching levels, deselect zone and items @@ -68,219 +94,249 @@ export const ViewerOverlay = ({ projectName, owner, canShowScans = true, canShow return ( <> - {/* Unified top-left card */} -
-
- {/* Project info + back */} -
- - - -
-
- {projectName || 'Untitled'} + {/* Unified top-left card */} +
+
+ {/* Project info + back */} +
+ + + +
+
+ {projectName || 'Untitled'} +
+ {owner?.username && ( + + @{owner.username} + + )}
- {owner?.username && ( - - @{owner.username} - - )}
-
- {/* Breadcrumb — only shown when navigated into a building */} - {building && ( -
-
- - - {building && ( - <> - + {/* Breadcrumb — only shown when navigated into a building */} + {building && ( +
+
- - )} - {level && ( - <> - - - - )} + {building && ( + <> + + + + )} - {zone && ( - <> - - - {zone.name} - - - )} + {level && ( + <> + + + + )} - {selectedNode && zone && ( - <> - - {getNodeName(selectedNode)} - - )} -
-
- )} -
+ {zone && ( + <> + + + {zone.name} + + + )} - {/* Level List (only when building is selected) */} - {building && levels.length > 0 && ( -
- Levels - {levels.map((lvl) => ( - - ))} -
- )} -
- - {/* Controls Panel - Top Right */} -
- {/* Visibility Controls */} - {(canShowScans || canShowGuides) && ( -
- Visibility - {canShowScans && ( - - )} - {canShowGuides && ( - - )} -
- )} - - {/* Camera Mode */} -
- Camera -
+
)} - {cameraMode === 'perspective' ? 'Perspective' : 'Orthographic'} - +
+ + {/* Level List (only when building is selected) */} + {building && levels.length > 0 && ( +
+ Levels + {levels.map((lvl) => ( + + ))} +
+ )}
- {/* Level Mode */} -
- Level Mode - - - -
+ {/* Controls Panel - Top Right */} +
+ {/* Visibility Controls */} + {(canShowScans || canShowGuides) && ( +
+ Visibility + {canShowScans && ( + + )} + {canShowGuides && ( + + )} +
+ )} - {/* Wall Mode */} -
- Wall Mode - - - + {/* Camera Mode */} +
+ Camera + +
+ + {/* Level Mode */} +
+ Level Mode + + + +
+ + {/* Wall Mode */} +
+ Wall Mode + + + +
-
) }