SYMBOL INDEX (1081 symbols across 219 files) FILE: apps/editor/app/api/health/route.ts function GET (line 1) | function GET() { FILE: apps/editor/app/layout.tsx function RootLayout (line 24) | function RootLayout({ FILE: apps/editor/app/page.tsx constant SIDEBAR_TABS (line 10) | const SIDEBAR_TABS: (SidebarTab & { component: React.ComponentType })[] = [ function Home (line 18) | function Home() { FILE: apps/editor/app/privacy/page.tsx function PrivacyPage (line 9) | function PrivacyPage() { FILE: apps/editor/app/terms/page.tsx function TermsPage (line 9) | function TermsPage() { FILE: apps/editor/lib/utils.ts function cn (line 4) | function cn(...inputs: ClassValue[]) { constant BASE_URL (line 20) | const BASE_URL = (() => { FILE: packages/core/src/events/bus.ts type GridEvent (line 22) | interface GridEvent { type NodeEvent (line 27) | interface NodeEvent { type WallEvent (line 36) | type WallEvent = NodeEvent type ItemEvent (line 37) | type ItemEvent = NodeEvent type SiteEvent (line 38) | type SiteEvent = NodeEvent type BuildingEvent (line 39) | type BuildingEvent = NodeEvent type LevelEvent (line 40) | type LevelEvent = NodeEvent type ZoneEvent (line 41) | type ZoneEvent = NodeEvent type SlabEvent (line 42) | type SlabEvent = NodeEvent type CeilingEvent (line 43) | type CeilingEvent = NodeEvent type RoofEvent (line 44) | type RoofEvent = NodeEvent type RoofSegmentEvent (line 45) | type RoofSegmentEvent = NodeEvent type StairEvent (line 46) | type StairEvent = NodeEvent type StairSegmentEvent (line 47) | type StairSegmentEvent = NodeEvent type WindowEvent (line 48) | type WindowEvent = NodeEvent type DoorEvent (line 49) | type DoorEvent = NodeEvent type EventSuffix (line 63) | type EventSuffix = (typeof eventSuffixes)[number] type NodeEvents (line 65) | type NodeEvents = { type GridEvents (line 69) | type GridEvents = { type CameraControlEvent (line 73) | interface CameraControlEvent { type ThumbnailGenerateEvent (line 77) | interface ThumbnailGenerateEvent { type CameraControlEvents (line 81) | type CameraControlEvents = { type ToolEvents (line 91) | type ToolEvents = { type PresetEvents (line 95) | type PresetEvents = { type EditorEvents (line 100) | type EditorEvents = GridEvents & FILE: packages/core/src/hooks/scene-registry/scene-registry.ts method clear (line 30) | clear() { function useRegistry (line 38) | function useRegistry( FILE: packages/core/src/hooks/spatial-grid/spatial-grid-manager.ts function pointInPolygon (line 13) | function pointInPolygon(px: number, pz: number, polygon: Array<[number, ... function getItemFootprint (line 32) | function getItemFootprint( function segmentsIntersect (line 57) | function segmentsIntersect( function segmentIntersectsPolygon (line 97) | function segmentIntersectsPolygon( function itemOverlapsPolygon (line 129) | function itemOverlapsPolygon( function segmentsCollinearAndOverlap (line 172) | function segmentsCollinearAndOverlap( function wallOverlapsPolygon (line 216) | function wallOverlapsPolygon( class SpatialGridManager (line 275) | class SpatialGridManager { method constructor (line 286) | constructor(cellSize = 0.5) { method getFloorGrid (line 290) | private getFloorGrid(levelId: string): SpatialGrid { method getWallGrid (line 297) | private getWallGrid(levelId: string): WallSpatialGrid { method getWallLength (line 304) | private getWallLength(wallId: string): number { method getWallHeight (line 312) | private getWallHeight(wallId: string): number { method getCeilingGrid (line 317) | private getCeilingGrid(ceilingId: string): SpatialGrid { method getSlabMap (line 324) | private getSlabMap(levelId: string): Map { method handleNodeCreated (line 332) | handleNodeCreated(node: AnyNode, levelId: string) { method handleNodeUpdated (line 389) | handleNodeUpdated(node: AnyNode, levelId: string) { method handleNodeDeleted (line 452) | handleNodeDeleted(nodeId: string, nodeType: string, levelId: string) { method canPlaceOnFloor (line 477) | canPlaceOnFloor( method canPlaceOnWall (line 499) | canPlaceOnWall( method getWallForItem (line 531) | getWallForItem(levelId: string, itemId: string): string | undefined { method getSlabElevationAt (line 539) | getSlabElevationAt(levelId: string, x: number, z: number): number { method getSlabElevationForItem (line 572) | getSlabElevationForItem( method getSlabElevationForWall (line 615) | getSlabElevationForWall(levelId: string, start: [number, number], end:... method canPlaceOnCeiling (line 666) | canPlaceOnCeiling( method clearLevel (line 699) | clearLevel(levelId: string) { method clear (line 705) | clear() { FILE: packages/core/src/hooks/spatial-grid/spatial-grid-sync.ts function resolveLevelId (line 16) | function resolveLevelId(node: AnyNode, nodes: Record): ... function initSpatialGridSync (line 38) | function initSpatialGridSync() { function arraysEqual (line 118) | function arraysEqual(a: number[], b: number[]): boolean { function markNodesOverlappingSlab (line 125) | function markNodesOverlappingSlab( FILE: packages/core/src/hooks/spatial-grid/spatial-grid.ts type CellKey (line 1) | type CellKey = `${number},${number}` type GridCell (line 3) | interface GridCell { type SpatialGridConfig (line 7) | interface SpatialGridConfig { class SpatialGrid (line 11) | class SpatialGrid { method constructor (line 17) | constructor(config: SpatialGridConfig) { method posToCell (line 21) | private posToCell(x: number, z: number): [number, number] { method cellKey (line 25) | private cellKey(cx: number, cz: number): CellKey { method getItemCells (line 30) | private getItemCells( method insert (line 68) | insert( method remove (line 87) | remove(itemId: string) { method update (line 104) | update( method canPlace (line 115) | canPlace( method queryRadius (line 143) | queryRadius(x: number, z: number, radius: number): string[] { method getItemCount (line 161) | getItemCount(): number { FILE: packages/core/src/hooks/spatial-grid/use-spatial-query.ts function useSpatialQuery (line 5) | function useSpatialQuery() { FILE: packages/core/src/hooks/spatial-grid/wall-spatial-grid.ts type WallSide (line 1) | type WallSide = 'front' | 'back' type AttachType (line 2) | type AttachType = 'wall' | 'wall-side' constant EPSILON (line 5) | const EPSILON = 0.001 constant AUTO_SNAP_MARGIN (line 8) | const AUTO_SNAP_MARGIN = 0.05 type WallItemPlacement (line 10) | interface WallItemPlacement { function autoAdjustYPosition (line 25) | function autoAdjustYPosition( class WallSpatialGrid (line 51) | class WallSpatialGrid { method canPlaceOnWall (line 69) | canPlaceOnWall( method checkSideConflict (line 123) | private checkSideConflict( method insert (line 149) | insert(placement: WallItemPlacement) { method remove (line 159) | remove(wallId: string, itemId: string) { method removeByItemId (line 168) | removeByItemId(itemId: string) { method removeWall (line 176) | removeWall(wallId: string): string[] { method getWallForItem (line 189) | getWallForItem(itemId: string): string | undefined { method clear (line 193) | clear() { FILE: packages/core/src/lib/asset-storage.ts constant ASSET_PREFIX (line 3) | const ASSET_PREFIX = 'asset_data:' function saveAsset (line 11) | async function saveAsset(file: File): Promise { function loadAssetUrl (line 21) | async function loadAssetUrl(url: string): Promise { FILE: packages/core/src/lib/space-detection.ts type Space (line 7) | type Space = { function initSpaceDetectionSync (line 23) | function initSpaceDetectionSync( function runSpaceDetection (line 130) | function runSpaceDetection( type Grid (line 176) | type Grid = { type WallSideUpdate (line 187) | type WallSideUpdate = { function detectSpacesForLevel (line 201) | function detectSpacesForLevel( function buildGrid (line 238) | function buildGrid(walls: WallNode[], resolution: number): Grid { function markWallCells (line 285) | function markWallCells(grid: Grid, wall: WallNode): void { function floodFillFromEdges (line 333) | function floodFillFromEdges(grid: Grid): void { function findInteriorSpaces (line 385) | function findInteriorSpaces(grid: Grid, levelId: string): Space[] { function extractPolygonFromCells (line 459) | function extractPolygonFromCells(cells: Set, grid: Grid): Array<... function assignWallSides (line 492) | function assignWallSides(walls: WallNode[], grid: Grid): WallSideUpdate[] { function classifySide (line 543) | function classifySide(cell: string | undefined): 'interior' | 'exterior'... function getCellKey (line 557) | function getCellKey(grid: Grid, x: number, z: number): string | null { function getCellKeyFromIndex (line 571) | function getCellKeyFromIndex(x: number, z: number, width: number): string { function parseCellKey (line 578) | function parseCellKey(key: string): [number, number] { function wallTouchesOthers (line 591) | function wallTouchesOthers(wall: WallNode, otherWalls: WallNode[]): bool... function distanceToSegment (line 614) | function distanceToSegment( FILE: packages/core/src/schema/base.ts type BaseNode (line 32) | type BaseNode = z.infer FILE: packages/core/src/schema/camera.ts type Camera (line 13) | type Camera = z.infer FILE: packages/core/src/schema/collections.ts type CollectionId (line 4) | type CollectionId = `collection_${string}` type Collection (line 6) | type Collection = { FILE: packages/core/src/schema/material.ts type MaterialPreset (line 15) | type MaterialPreset = z.infer type MaterialProperties (line 25) | type MaterialProperties = z.infer type MaterialSchema (line 38) | type MaterialSchema = z.infer constant DEFAULT_MATERIALS (line 40) | const DEFAULT_MATERIALS: Record = { function resolveMaterial (line 123) | function resolveMaterial(material?: MaterialSchema): MaterialProperties { FILE: packages/core/src/schema/nodes/building.ts type BuildingNode (line 21) | type BuildingNode = z.infer FILE: packages/core/src/schema/nodes/ceiling.ts type CeilingNode (line 23) | type CeilingNode = z.infer FILE: packages/core/src/schema/nodes/door.ts type DoorSegment (line 19) | type DoorSegment = z.infer type DoorNode (line 85) | type DoorNode = z.infer FILE: packages/core/src/schema/nodes/guide.ts type GuideNode (line 14) | type GuideNode = z.infer FILE: packages/core/src/schema/nodes/item.ts type ToggleControl (line 68) | type ToggleControl = z.infer type SliderControl (line 69) | type SliderControl = z.infer type TemperatureControl (line 70) | type TemperatureControl = z.infer type Control (line 71) | type Control = z.infer type AnimationEffect (line 72) | type AnimationEffect = z.infer type LightEffect (line 73) | type LightEffect = z.infer type Effect (line 74) | type Effect = z.infer type Interactive (line 75) | type Interactive = z.infer type AssetInput (line 98) | type AssetInput = z.input type Asset (line 99) | type Asset = z.infer type ItemNode (line 132) | type ItemNode = z.infer function getScaledDimensions (line 138) | function getScaledDimensions(item: ItemNode): [number, number, number] { FILE: packages/core/src/schema/nodes/level.ts type LevelNode (line 40) | type LevelNode = z.infer FILE: packages/core/src/schema/nodes/roof-segment.ts type RoofType (line 8) | type RoofType = z.infer type RoofSegmentNode (line 45) | type RoofSegmentNode = z.infer FILE: packages/core/src/schema/nodes/roof.ts type RoofNode (line 27) | type RoofNode = z.infer FILE: packages/core/src/schema/nodes/scan.ts type ScanNode (line 14) | type ScanNode = z.infer FILE: packages/core/src/schema/nodes/site.ts type SiteNode (line 47) | type SiteNode = z.infer FILE: packages/core/src/schema/nodes/slab.ts type SlabNode (line 21) | type SlabNode = z.infer FILE: packages/core/src/schema/nodes/stair-segment.ts type StairSegmentType (line 8) | type StairSegmentType = z.infer type AttachmentSide (line 12) | type AttachmentSide = z.infer type StairSegmentNode (line 53) | type StairSegmentNode = z.infer FILE: packages/core/src/schema/nodes/stair.ts type StairNode (line 27) | type StairNode = z.infer FILE: packages/core/src/schema/nodes/wall.ts type WallNode (line 35) | type WallNode = z.infer FILE: packages/core/src/schema/nodes/window.ts type WindowNode (line 48) | type WindowNode = z.infer FILE: packages/core/src/schema/nodes/zone.ts type ZoneNode (line 27) | type ZoneNode = z.infer FILE: packages/core/src/schema/types.ts type AnyNode (line 38) | type AnyNode = z.infer type AnyNodeType (line 39) | type AnyNodeType = AnyNode['type'] type AnyNodeId (line 40) | type AnyNodeId = AnyNode['id'] FILE: packages/core/src/store/actions/node-actions.ts type AnyContainerNode (line 5) | type AnyContainerNode = AnyNode & { children: string[] } FILE: packages/core/src/store/use-interactive.ts type ControlValue (line 8) | type ControlValue = boolean | number type ItemInteractiveState (line 10) | type ItemInteractiveState = { type InteractiveStore (line 15) | type InteractiveStore = { FILE: packages/core/src/store/use-scene.ts function migrateNodes (line 14) | function migrateNodes(nodes: Record): Record> & { function clearTemporalTracking (line 331) | function clearTemporalTracking() { function clearSceneHistory (line 337) | function clearSceneHistory() { FILE: packages/core/src/systems/ceiling/ceiling-system.tsx function updateCeilingGeometry (line 39) | function updateCeilingGeometry(node: CeilingNode, mesh: THREE.Mesh) { function generateCeilingGeometry (line 58) | function generateCeilingGeometry(ceilingNode: CeilingNode): THREE.Buffer... FILE: packages/core/src/systems/door/door-system.tsx function addBox (line 58) | function addBox( function updateDoorMesh (line 73) | function updateDoorMesh(node: DoorNode, mesh: THREE.Mesh) { FILE: packages/core/src/systems/roof/roof-system.tsx constant MAX_ROOFS_PER_FRAME (line 24) | const MAX_ROOFS_PER_FRAME = 1 constant MAX_SEGMENTS_PER_FRAME (line 25) | const MAX_SEGMENTS_PER_FRAME = 3 function updateRoofSegmentGeometry (line 122) | function updateRoofSegmentGeometry(node: RoofSegmentNode, mesh: THREE.Me... function updateMergedRoofGeometry (line 134) | function updateMergedRoofGeometry( constant ROOF_MATERIAL_SLOT_COUNT (line 271) | const ROOF_MATERIAL_SLOT_COUNT = 4 function mapRoofGroupMaterialIndex (line 273) | function mapRoofGroupMaterialIndex( function normalizeRoofMaterialIndex (line 284) | function normalizeRoofMaterialIndex(materialIndex: number | undefined): ... constant SHINGLE_SURFACE_EPSILON (line 291) | const SHINGLE_SURFACE_EPSILON = 0.02 constant RAKE_FACE_NORMAL_EPSILON (line 292) | const RAKE_FACE_NORMAL_EPSILON = 0.3 constant RAKE_FACE_ALIGNMENT_EPSILON (line 293) | const RAKE_FACE_ALIGNMENT_EPSILON = 0.35 function getRoofSegmentBrushes (line 299) | function getRoofSegmentBrushes( function generateRoofSegmentGeometry (line 577) | function generateRoofSegmentGeometry(node: RoofSegmentNode): THREE.Buffe... type Insets (line 635) | type Insets = { function remapRoofShellFaces (line 643) | function remapRoofShellFaces(geometry: THREE.BufferGeometry, node: RoofS... function isRakeFace (line 718) | function isRakeFace( function getRakeAxis (line 748) | function getRakeAxis(node: RoofSegmentNode): 'x' | 'z' | null { function getModuleFaces (line 758) | function getModuleFaces( function createGeometryFromFaces (line 916) | function createGeometryFromFaces( FILE: packages/core/src/systems/slab/slab-system.tsx function updateSlabGeometry (line 40) | function updateSlabGeometry(node: SlabNode, mesh: THREE.Mesh) { constant SLAB_OUTSET (line 48) | const SLAB_OUTSET = 0.05 function outsetPolygon (line 54) | function outsetPolygon(polygon: Array<[number, number]>, amount: number)... function generateSlabGeometry (line 104) | function generateSlabGeometry(slabNode: SlabNode): THREE.BufferGeometry { FILE: packages/core/src/systems/stair/stair-system.tsx constant MAX_STAIRS_PER_FRAME (line 9) | const MAX_STAIRS_PER_FRAME = 2 constant MAX_SEGMENTS_PER_FRAME (line 10) | const MAX_SEGMENTS_PER_FRAME = 4 function generateStairSegmentGeometry (line 114) | function generateStairSegmentGeometry( function updateStairSegmentGeometry (line 189) | function updateStairSegmentGeometry(node: StairSegmentNode, mesh: THREE.... function syncSegmentMeshTransforms (line 207) | function syncSegmentMeshTransforms(stairNode: StairNode, nodes: Record type JunctionData (line 22) | type JunctionData = Map constant TOLERANCE (line 28) | const TOLERANCE = 0.001 function pointToKey (line 30) | function pointToKey(p: Point2D, tolerance = TOLERANCE): string { function createLineFromPointAndVector (line 35) | function createLineFromPointAndVector(p: Point2D, v: Point2D): LineEquat... function pointOnWallSegment (line 45) | function pointOnWallSegment(point: Point2D, wall: WallNode, tolerance = ... type Junction (line 79) | interface Junction { function findJunctions (line 84) | function findJunctions(walls: WallNode[]): Map { type ProcessedWall (line 134) | interface ProcessedWall { function calculateJunctionIntersections (line 142) | function calculateJunctionIntersections( type WallMiterData (line 244) | interface WallMiterData { function calculateLevelMiters (line 254) | function calculateLevelMiters(walls: WallNode[]): WallMiterData { function getAdjacentWallIds (line 270) | function getAdjacentWallIds(allWalls: WallNode[], dirtyWallIds: Set): Point2D[] { function isPointInsidePolygonWithHoles (line 1071) | function isPointInsidePolygonWithHoles( function isPointNearPlanPoint (line 1081) | function isPointNearPlanPoint(a: WallPlanPoint, b: WallPlanPoint, thresh... function calculatePolygonSnapPoint (line 1085) | function calculatePolygonSnapPoint( function snapPolygonDraftPoint (line 1112) | function snapPolygonDraftPoint({ function pointMatchesWallPlanPoint (line 1130) | function pointMatchesWallPlanPoint( function getWallHoverSidePaths (line 1142) | function getWallHoverSidePaths(polygon: Point2D[], wall: WallNode): [str... function buildDraftWall (line 1170) | function buildDraftWall(levelId: string, start: WallPlanPoint, end: Wall... function pointsEqual (line 1187) | function pointsEqual(a: WallPlanPoint, b: WallPlanPoint): boolean { function polygonsEqual (line 1191) | function polygonsEqual(a: WallPlanPoint[], b: Array<[number, number]>): ... function buildWallEndpointDraft (line 1205) | function buildWallEndpointDraft( function buildWallWithUpdatedEndpoints (line 1219) | function buildWallWithUpdatedEndpoints( function getFloorplanWallThickness (line 1231) | function getFloorplanWallThickness(wall: WallNode): number { function getFloorplanWall (line 1241) | function getFloorplanWall(wall: WallNode): WallNode { type WallMeasurementOverlay (line 1249) | type WallMeasurementOverlay = { function formatMeasurement (line 1262) | function formatMeasurement(value: number, unit: 'metric' | 'imperial') { function getPolygonAreaAndCentroid (line 1273) | function getPolygonAreaAndCentroid(polygon: Point2D[]) { function getSlabArea (line 1299) | function getSlabArea(polygon: Point2D[], holes: Point2D[][]) { function formatArea (line 1308) | function formatArea(areaSqM: number, unit: 'metric' | 'imperial') { function FloorplanMeasurementLine (line 1330) | function FloorplanMeasurementLine({ function getWallMeasurementOverlay (line 1376) | function getWallMeasurementOverlay( function getOpeningFootprint (line 1482) | function getOpeningFootprint(wall: WallNode, node: WindowNode | DoorNode... function getOpeningCenterLine (line 1518) | function getOpeningCenterLine(polygon: Point2D[]) { function normalizeGridCoordinate (line 1537) | function normalizeGridCoordinate(value: number): number { function isGridAligned (line 1541) | function isGridAligned(value: number, step: number): boolean { function getVisibleGridSteps (line 1551) | function getVisibleGridSteps( function buildGridPath (line 1571) | function buildGridPath( function findClosestWallPoint (line 1618) | function findClosestWallPoint( type GuideImageDimensions (line 1656) | type GuideImageDimensions = { function useResolvedAssetUrl (line 1661) | function useResolvedAssetUrl(url: string) { function useGuideImageDimensions (line 1687) | function useGuideImageDimensions(url: string | null) { function FloorplanGuideImage (line 1731) | function FloorplanGuideImage({ function FloorplanGuideSelectionOverlay (line 1896) | function FloorplanGuideSelectionOverlay({ function FloorplanGuideHandleHint (line 1998) | function FloorplanGuideHandleHint({ function FloorplanPanel (line 2998) | function FloorplanPanel() { FILE: packages/editor/src/components/editor/index.tsx constant CAMERA_CONTROLS_HINT_DISMISSED_STORAGE_KEY (line 56) | const CAMERA_CONTROLS_HINT_DISMISSED_STORAGE_KEY = 'editor-camera-contro... function initializeEditorRuntime (line 58) | function initializeEditorRuntime() { type EditorProps (line 66) | interface EditorProps { function EditorSceneCrashFallback (line 110) | function EditorSceneCrashFallback() { function SidebarSlot (line 140) | function SidebarSlot({ children }: { children: ReactNode }) { function ViewerOverlays (line 234) | function ViewerOverlays({ left, children }: { left: number; children: Re... function SelectionPersistenceManager (line 256) | function SelectionPersistenceManager({ enabled }: { enabled: boolean }) { type ShortcutKey (line 270) | type ShortcutKey = { type CameraControlHint (line 274) | type CameraControlHint = { constant EDITOR_CAMERA_CONTROL_HINTS (line 280) | const EDITOR_CAMERA_CONTROL_HINTS: CameraControlHint[] = [ constant PREVIEW_CAMERA_CONTROL_HINTS (line 289) | const PREVIEW_CAMERA_CONTROL_HINTS: CameraControlHint[] = [ constant CAMERA_SHORTCUT_KEY_META (line 295) | const CAMERA_SHORTCUT_KEY_META: Record = { FILE: packages/editor/src/components/editor/site-edge-labels.tsx function formatMeasurement (line 11) | function formatMeasurement(value: number, unit: 'metric' | 'imperial') { function SiteEdgeLabels (line 22) | function SiteEdgeLabels() { FILE: packages/editor/src/components/editor/thumbnail-generator.tsx constant THUMBNAIL_WIDTH (line 10) | const THUMBNAIL_WIDTH = 1920 constant THUMBNAIL_HEIGHT (line 11) | const THUMBNAIL_HEIGHT = 1080 constant AUTO_SAVE_DELAY (line 12) | const AUTO_SAVE_DELAY = 10_000 type ThumbnailGeneratorProps (line 14) | interface ThumbnailGeneratorProps { FILE: packages/editor/src/components/editor/wall-measurement-label.tsx constant GUIDE_Y_OFFSET (line 21) | const GUIDE_Y_OFFSET = 0.08 constant LABEL_LIFT (line 22) | const LABEL_LIFT = 0.08 constant BAR_THICKNESS (line 23) | const BAR_THICKNESS = 0.012 constant LINE_OPACITY (line 24) | const LINE_OPACITY = 0.95 constant BAR_AXIS (line 26) | const BAR_AXIS = new THREE.Vector3(0, 1, 0) type Vec3 (line 28) | type Vec3 = [number, number, number] type MeasurementGuide (line 30) | type MeasurementGuide = { function formatMeasurement (line 40) | function formatMeasurement(value: number, unit: 'metric' | 'imperial') { function WallMeasurementLabel (line 51) | function WallMeasurementLabel() { function getLevelWalls (line 80) | function getLevelWalls( function getWallMiddlePoints (line 96) | function getWallMiddlePoints( function worldPointToWallLocal (line 125) | function worldPointToWallLocal(wall: WallNode, point: Point2D): Vec3 { function buildMeasurementGuide (line 135) | function buildMeasurementGuide( function MeasurementBar (line 175) | function MeasurementBar({ start, end, color }: { start: Vec3; end: Vec3;... function WallMeasurementAnnotation (line 212) | function WallMeasurementAnnotation({ wall }: { wall: WallNode }) { FILE: packages/editor/src/components/feedback-dialog.tsx constant MAX_IMAGES (line 15) | const MAX_IMAGES = 5 constant MAX_IMAGE_SIZE (line 16) | const MAX_IMAGE_SIZE = 5 * 1024 * 1024 type ImagePreview (line 18) | type ImagePreview = { file: File; url: string } function FeedbackDialog (line 20) | function FeedbackDialog({ FILE: packages/editor/src/components/pascal-radio.tsx constant PLAYLIST (line 11) | const PLAYLIST = [ function shuffleArray (line 55) | function shuffleArray(array: T[]): T[] { function PascalRadio (line 64) | function PascalRadio() { FILE: packages/editor/src/components/preview-button.tsx function PreviewButton (line 6) | function PreviewButton() { FILE: packages/editor/src/components/systems/zone/zone-label-editor-system.tsx function ZoneLabelEditor (line 13) | function ZoneLabelEditor({ zoneId }: { zoneId: ZoneNode['id'] }) { function ZoneLabelEditorSystem (line 174) | function ZoneLabelEditorSystem() { FILE: packages/editor/src/components/tools/ceiling/ceiling-boundary-editor.tsx type CeilingBoundaryEditorProps (line 6) | interface CeilingBoundaryEditorProps { FILE: packages/editor/src/components/tools/ceiling/ceiling-hole-editor.tsx type CeilingHoleEditorProps (line 6) | interface CeilingHoleEditorProps { FILE: packages/editor/src/components/tools/ceiling/ceiling-tool.tsx constant CEILING_HEIGHT (line 11) | const CEILING_HEIGHT = 2.52 constant GRID_OFFSET (line 12) | const GRID_OFFSET = 0.02 FILE: packages/editor/src/components/tools/door/door-math.ts function wallLocalToWorld (line 14) | function wallLocalToWorld( function clampToWall (line 36) | function clampToWall( function hasWallChildOverlap (line 55) | function hasWallChildOverlap( FILE: packages/editor/src/components/tools/item/move-tool.tsx function getInitialState (line 12) | function getInitialState(node: { function MoveItemContent (line 26) | function MoveItemContent({ movingNode }: { movingNode: ItemNode }) { FILE: packages/editor/src/components/tools/item/placement-math.ts function snapToGrid (line 8) | function snapToGrid(position: number, dimension: number): number { function snapToHalf (line 18) | function snapToHalf(value: number): number { function calculateCursorRotation (line 25) | function calculateCursorRotation( function calculateItemRotation (line 46) | function calculateItemRotation(normal: [number, number, number] | undefi... function getSideFromNormal (line 57) | function getSideFromNormal(normal: [number, number, number] | undefined)... function isValidWallSideFace (line 73) | function isValidWallSideFace(normal: [number, number, number] | undefine... function stripTransient (line 81) | function stripTransient(meta: any): any { FILE: packages/editor/src/components/tools/item/placement-strategies.ts constant DEFAULT_DIMENSIONS (line 32) | const DEFAULT_DIMENSIONS: [number, number, number] = [1, 1, 1] method move (line 43) | move(ctx: PlacementContext, event: GridEvent): PlacementResult | null { method click (line 67) | click( method enter (line 108) | enter( method move (line 171) | move( method click (line 224) | click( method leave (line 262) | leave(ctx: PlacementContext): TransitionResult | null { method enter (line 288) | enter( method move (line 325) | move(ctx: PlacementContext, event: CeilingEvent): PlacementResult | null { method click (line 349) | click( method leave (line 387) | leave(ctx: PlacementContext): TransitionResult | null { method enter (line 413) | enter(ctx: PlacementContext, event: ItemEvent): TransitionResult | null { method move (line 455) | move(ctx: PlacementContext, event: ItemEvent): PlacementResult | null { method click (line 489) | click(ctx: PlacementContext, _event: ItemEvent): CommitResult | null { function checkCanPlace (line 513) | function checkCanPlace(ctx: PlacementContext, validators: SpatialValidat... FILE: packages/editor/src/components/tools/item/placement-types.ts type SurfaceType (line 15) | type SurfaceType = 'floor' | 'wall' | 'ceiling' | 'item-surface' type PlacementState (line 21) | interface PlacementState { type PlacementContext (line 35) | interface PlacementContext { type PlacementResult (line 50) | interface PlacementResult { type TransitionResult (line 62) | interface TransitionResult { type CommitResult (line 74) | interface CommitResult { type SpatialValidators (line 87) | interface SpatialValidators { type LevelResolver (line 117) | type LevelResolver = (node: AnyNode, nodes: Record) => ... FILE: packages/editor/src/components/tools/item/use-draft-node.ts type OriginalState (line 13) | interface OriginalState { type DraftNodeHandle (line 21) | interface DraftNodeHandle { function useDraftNode (line 49) | function useDraftNode(): DraftNodeHandle { FILE: packages/editor/src/components/tools/item/use-placement-coordinator.tsx constant DEFAULT_DIMENSIONS (line 45) | const DEFAULT_DIMENSIONS: [number, number, number] = [1, 1, 1] type PlacementCoordinatorConfig (line 69) | interface PlacementCoordinatorConfig { function usePlacementCoordinator (line 80) | function usePlacementCoordinator(config: PlacementCoordinatorConfig): Re... FILE: packages/editor/src/components/tools/roof/roof-tool.tsx constant DEFAULT_WALL_HEIGHT (line 22) | const DEFAULT_WALL_HEIGHT = 0.5 constant DEFAULT_ROOF_HEIGHT (line 23) | const DEFAULT_ROOF_HEIGHT = 2.5 constant GRID_OFFSET (line 24) | const GRID_OFFSET = 0.02 type PreviewState (line 121) | type PreviewState = { FILE: packages/editor/src/components/tools/select/box-select-tool.tsx type Bounds (line 44) | type Bounds = { minX: number; maxX: number; minZ: number; maxZ: number } function pointInBounds (line 46) | function pointInBounds(x: number, z: number, b: Bounds): boolean { function segmentsIntersect (line 50) | function segmentsIntersect( function cross (line 77) | function cross(ax: number, az: number, bx: number, bz: number, cx: numbe... function onSeg (line 81) | function onSeg(ax: number, az: number, bx: number, bz: number, cx: numbe... function segmentIntersectsBounds (line 90) | function segmentIntersectsBounds( function polygonIntersectsBounds (line 111) | function polygonIntersectsBounds(polygon: [number, number][], b: Bounds)... function pointInPolygon (line 139) | function pointInPolygon(x: number, z: number, polygon: [number, number][... function getNodeWorldXZ (line 155) | function getNodeWorldXZ(nodeId: string): [number, number] | null { function collectNodeIdsInBounds (line 162) | function collectNodeIdsInBounds(bounds: Bounds): string[] { function updateRectVisuals (line 248) | function updateRectVisuals( function createOutlineSegments (line 296) | function createOutlineSegments(): LineSegments { constant DRAG_THRESHOLD_PX (line 321) | const DRAG_THRESHOLD_PX = 4 constant BOX_SELECT_TOOLTIP (line 335) | const BOX_SELECT_TOOLTIP = ( FILE: packages/editor/src/components/tools/shared/cursor-sphere.tsx type CursorSphereProps (line 10) | interface CursorSphereProps extends Omit { FILE: packages/editor/src/components/tools/shared/polygon-editor.tsx constant Y_OFFSET (line 8) | const Y_OFFSET = 0.02 type DragState (line 10) | type DragState = { type PolygonEditorProps (line 17) | interface PolygonEditorProps { constant MIN_HANDLE_HEIGHT (line 32) | const MIN_HANDLE_HEIGHT = 0.15 FILE: packages/editor/src/components/tools/slab/slab-boundary-editor.tsx type SlabBoundaryEditorProps (line 6) | interface SlabBoundaryEditorProps { FILE: packages/editor/src/components/tools/slab/slab-hole-editor.tsx type SlabHoleEditorProps (line 6) | interface SlabHoleEditorProps { FILE: packages/editor/src/components/tools/slab/slab-tool.tsx constant Y_OFFSET (line 10) | const Y_OFFSET = 0.02 FILE: packages/editor/src/components/tools/stair/stair-tool.tsx constant GRID_OFFSET (line 16) | const GRID_OFFSET = 0.02 constant DEFAULT_WIDTH (line 19) | const DEFAULT_WIDTH = 1.0 constant DEFAULT_LENGTH (line 20) | const DEFAULT_LENGTH = 3.0 constant DEFAULT_HEIGHT (line 21) | const DEFAULT_HEIGHT = 2.5 constant DEFAULT_STEP_COUNT (line 22) | const DEFAULT_STEP_COUNT = 10 function createStairPreviewGeometry (line 28) | function createStairPreviewGeometry(): THREE.BufferGeometry { function commitStairPlacement (line 62) | function commitStairPlacement( FILE: packages/editor/src/components/tools/wall/wall-drafting.ts type WallPlanPoint (line 4) | type WallPlanPoint = [number, number] constant WALL_GRID_STEP (line 5) | const WALL_GRID_STEP = 0.5 constant WALL_JOIN_SNAP_RADIUS (line 6) | const WALL_JOIN_SNAP_RADIUS = 0.35 constant WALL_MIN_LENGTH (line 7) | const WALL_MIN_LENGTH = 0.5 function distanceSquared (line 8) | function distanceSquared(a: WallPlanPoint, b: WallPlanPoint): number { function snapScalarToGrid (line 13) | function snapScalarToGrid(value: number, step = WALL_GRID_STEP): number { function snapPointToGrid (line 16) | function snapPointToGrid(point: WallPlanPoint, step = WALL_GRID_STEP): W... function snapPointTo45Degrees (line 19) | function snapPointTo45Degrees(start: WallPlanPoint, cursor: WallPlanPoin... function projectPointOntoWall (line 30) | function projectPointOntoWall(point: WallPlanPoint, wall: WallNode): Wal... function findWallSnapTarget (line 45) | function findWallSnapTarget( function snapWallDraftPoint (line 80) | function snapWallDraftPoint(args: { function isWallLongEnough (line 95) | function isWallLongEnough(start: WallPlanPoint, end: WallPlanPoint): boo... function createWallOnCurrentLevel (line 98) | function createWallOnCurrentLevel( FILE: packages/editor/src/components/tools/wall/wall-tool.tsx constant WALL_HEIGHT (line 16) | const WALL_HEIGHT = 2.5 FILE: packages/editor/src/components/tools/window/window-math.ts function wallLocalToWorld (line 18) | function wallLocalToWorld( function clampToWall (line 39) | function clampToWall( function hasWallChildOverlap (line 62) | function hasWallChildOverlap( FILE: packages/editor/src/components/tools/zone/zone-boundary-editor.tsx type ZoneBoundaryEditorProps (line 5) | interface ZoneBoundaryEditorProps { FILE: packages/editor/src/components/tools/zone/zone-tool.tsx constant Y_OFFSET (line 10) | const Y_OFFSET = 0.02 type PreviewState (line 73) | type PreviewState = { FILE: packages/editor/src/components/ui/action-menu/action-button.tsx type ActionButtonProps (line 10) | interface ActionButtonProps extends React.ComponentProps { FILE: packages/editor/src/components/ui/action-menu/camera-actions.tsx function CameraActions (line 9) | function CameraActions() { FILE: packages/editor/src/components/ui/action-menu/control-modes.tsx type ControlId (line 12) | type ControlId = 'select' | 'box-select' | 'site-edit' | 'build' | 'delete' type ControlConfig (line 14) | type ControlConfig = { function ControlModes (line 67) | function ControlModes() { FILE: packages/editor/src/components/ui/action-menu/furnish-tools.tsx type FurnishToolConfig (line 8) | type FurnishToolConfig = { function FurnishTools (line 49) | function FurnishTools() { FILE: packages/editor/src/components/ui/action-menu/index.tsx function ActionMenu (line 15) | function ActionMenu({ className }: { className?: string }) { FILE: packages/editor/src/components/ui/action-menu/structure-tools.tsx type ToolConfig (line 14) | type ToolConfig = { function StructureTools (line 34) | function StructureTools() { FILE: packages/editor/src/components/ui/action-menu/view-toggles.tsx function useLevelGuides (line 21) | function useLevelGuides(): GuideNode[] { function useLevelScans (line 37) | function useLevelScans(): ScanNode[] { function GuidesControl (line 53) | function GuidesControl() { function ScansControl (line 172) | function ScansControl() { function ViewToggles (line 287) | function ViewToggles() { FILE: packages/editor/src/components/ui/command-palette/editor-commands.tsx function EditorCommands (line 43) | function EditorCommands() { FILE: packages/editor/src/components/ui/command-palette/index.tsx type CommandPaletteStore (line 18) | interface CommandPaletteStore { function resolve (line 57) | function resolve(value: string | (() => string)): string { function Shortcut (line 61) | function Shortcut({ keys }: { keys: string[] }) { function Item (line 76) | function Item({ function OptionItem (line 123) | function OptionItem({ constant PAGE_LABEL (line 154) | const PAGE_LABEL: Record = { function CommandPalette (line 166) | function CommandPalette() { FILE: packages/editor/src/components/ui/controls/action-button.tsx type ActionButtonProps (line 5) | interface ActionButtonProps extends React.ButtonHTMLAttributes = { constant PRESET_LABELS (line 19) | const PRESET_LABELS: Record = { type MaterialPickerProps (line 32) | type MaterialPickerProps = { function MaterialPicker (line 37) | function MaterialPicker({ value, onChange }: MaterialPickerProps) { FILE: packages/editor/src/components/ui/controls/metric-control.tsx type MetricControlProps (line 8) | interface MetricControlProps { function MetricControl (line 20) | function MetricControl({ FILE: packages/editor/src/components/ui/controls/panel-section.tsx type PanelSectionProps (line 8) | interface PanelSectionProps { function PanelSection (line 15) | function PanelSection({ FILE: packages/editor/src/components/ui/controls/segmented-control.tsx type SegmentedControlProps (line 5) | interface SegmentedControlProps { function SegmentedControl (line 12) | function SegmentedControl({ FILE: packages/editor/src/components/ui/controls/slider-control.tsx type SliderControlProps (line 7) | interface SliderControlProps { function SliderControl (line 19) | function SliderControl({ FILE: packages/editor/src/components/ui/controls/toggle-control.tsx type ToggleControlProps (line 6) | interface ToggleControlProps { function ToggleControl (line 13) | function ToggleControl({ label, checked, onChange, className }: ToggleCo... FILE: packages/editor/src/components/ui/floating-level-selector.tsx function getLevelDisplayLabel (line 8) | function getLevelDisplayLabel(level: LevelNode) { function FloatingLevelSelector (line 12) | function FloatingLevelSelector() { FILE: packages/editor/src/components/ui/helpers/ceiling-helper.tsx function CeilingHelper (line 3) | function CeilingHelper() { FILE: packages/editor/src/components/ui/helpers/helper-manager.tsx function HelperManager (line 10) | function HelperManager() { FILE: packages/editor/src/components/ui/helpers/item-helper.tsx type ItemHelperProps (line 3) | interface ItemHelperProps { function ItemHelper (line 7) | function ItemHelper({ showEsc }: ItemHelperProps) { FILE: packages/editor/src/components/ui/helpers/roof-helper.tsx function RoofHelper (line 3) | function RoofHelper() { FILE: packages/editor/src/components/ui/helpers/slab-helper.tsx function SlabHelper (line 3) | function SlabHelper() { FILE: packages/editor/src/components/ui/helpers/wall-helper.tsx function WallHelper (line 3) | function WallHelper() { FILE: packages/editor/src/components/ui/item-catalog/catalog-items.tsx constant CATALOG_ITEMS (line 2) | const CATALOG_ITEMS: AssetInput[] = [ FILE: packages/editor/src/components/ui/item-catalog/item-catalog.tsx constant PLACEMENT_TAGS (line 16) | const PLACEMENT_TAGS = new Set(['floor', 'wall', 'ceiling', 'countertop']) function ItemCatalog (line 18) | function ItemCatalog({ category }: { category: CatalogCategory }) { FILE: packages/editor/src/components/ui/panels/ceiling-panel.tsx function CeilingPanel (line 14) | function CeilingPanel() { FILE: packages/editor/src/components/ui/panels/collections/collections-popover.tsx type CollectionsPopoverProps (line 31) | interface CollectionsPopoverProps { function CollectionsPopover (line 37) | function CollectionsPopover({ nodeId, collectionIds, children }: Collect... FILE: packages/editor/src/components/ui/panels/door-panel.tsx function DoorPanel (line 20) | function DoorPanel() { FILE: packages/editor/src/components/ui/panels/item-panel.tsx function ItemPanel (line 16) | function ItemPanel() { FILE: packages/editor/src/components/ui/panels/panel-manager.tsx function PanelManager (line 18) | function PanelManager() { FILE: packages/editor/src/components/ui/panels/panel-wrapper.tsx type PanelWrapperProps (line 7) | interface PanelWrapperProps { function PanelWrapper (line 18) | function PanelWrapper({ FILE: packages/editor/src/components/ui/panels/presets/presets-popover.tsx type PresetType (line 28) | type PresetType = 'door' | 'window' type PresetData (line 30) | interface PresetData { type PresetsPopoverProps (line 41) | interface PresetsPopoverProps { function PresetsPopover (line 55) | function PresetsPopover({ function TabButton (line 288) | function TabButton({ function EmptyState (line 317) | function EmptyState({ tab, isAuthenticated }: { tab: PresetsTab; isAuthe... type PresetRowProps (line 332) | interface PresetRowProps { function PresetRow (line 352) | function PresetRow({ FILE: packages/editor/src/components/ui/panels/reference-panel.tsx type ReferenceNode (line 13) | type ReferenceNode = ScanNode | GuideNode function ReferencePanel (line 15) | function ReferencePanel() { FILE: packages/editor/src/components/ui/panels/roof-panel.tsx function RoofPanel (line 25) | function RoofPanel() { FILE: packages/editor/src/components/ui/panels/roof-segment-panel.tsx constant ROOF_TYPE_OPTIONS (line 25) | const ROOF_TYPE_OPTIONS: { label: string; value: RoofType }[] = [ constant ROOF_TYPE_OPTIONS_2 (line 32) | const ROOF_TYPE_OPTIONS_2: { label: string; value: RoofType }[] = [ function RoofSegmentPanel (line 38) | function RoofSegmentPanel() { FILE: packages/editor/src/components/ui/panels/slab-panel.tsx function SlabPanel (line 14) | function SlabPanel() { FILE: packages/editor/src/components/ui/panels/stair-panel.tsx function StairPanel (line 25) | function StairPanel() { FILE: packages/editor/src/components/ui/panels/stair-segment-panel.tsx constant SEGMENT_TYPE_OPTIONS (line 26) | const SEGMENT_TYPE_OPTIONS: { label: string; value: StairSegmentType }[]... constant ATTACHMENT_SIDE_OPTIONS (line 31) | const ATTACHMENT_SIDE_OPTIONS: { label: string; value: AttachmentSide }[... function StairSegmentPanel (line 37) | function StairSegmentPanel() { FILE: packages/editor/src/components/ui/panels/wall-panel.tsx function WallPanel (line 11) | function WallPanel() { FILE: packages/editor/src/components/ui/panels/window-panel.tsx function WindowPanel (line 19) | function WindowPanel() { FILE: packages/editor/src/components/ui/primitives/button.tsx function Button (line 37) | function Button({ FILE: packages/editor/src/components/ui/primitives/card.tsx function Card (line 5) | function Card({ className, ...props }: React.ComponentProps<'div'>) { function CardHeader (line 18) | function CardHeader({ className, ...props }: React.ComponentProps<'div'>) { function CardTitle (line 31) | function CardTitle({ className, ...props }: React.ComponentProps<'div'>) { function CardDescription (line 41) | function CardDescription({ className, ...props }: React.ComponentProps<'... function CardAction (line 51) | function CardAction({ className, ...props }: React.ComponentProps<'div'>) { function CardContent (line 61) | function CardContent({ className, ...props }: React.ComponentProps<'div'... function CardFooter (line 65) | function CardFooter({ className, ...props }: React.ComponentProps<'div'>) { FILE: packages/editor/src/components/ui/primitives/color-dot.tsx constant PALETTE_COLORS (line 7) | const PALETTE_COLORS = [ type ColorDotProps (line 22) | interface ColorDotProps { function ColorDot (line 27) | function ColorDot({ color, onChange }: ColorDotProps) { FILE: packages/editor/src/components/ui/primitives/context-menu.tsx function ContextMenu (line 9) | function ContextMenu({ ...props }: React.ComponentProps { method getDerivedStateFromError (line 21) | public static getDerivedStateFromError(error: Error): State { method componentDidCatch (line 25) | public componentDidCatch(error: Error, errorInfo: ErrorInfo) { method render (line 29) | public render() { FILE: packages/editor/src/components/ui/primitives/input.tsx function Input (line 5) | function Input({ className, type, ...props }: React.ComponentProps<'inpu... FILE: packages/editor/src/components/ui/primitives/number-input.tsx type NumberInputProps (line 7) | interface NumberInputProps { function NumberInput (line 18) | function NumberInput({ FILE: packages/editor/src/components/ui/primitives/opacity-control.tsx type OpacityControlProps (line 10) | interface OpacityControlProps { function OpacityControl (line 18) | function OpacityControl({ FILE: packages/editor/src/components/ui/primitives/popover.tsx function Popover (line 8) | function Popover({ ...props }: React.ComponentProps & { function ShortcutToken (line 30) | function ShortcutToken({ className, displayValue, value, ...props }: Sho... FILE: packages/editor/src/components/ui/primitives/sidebar.tsx constant SIDEBAR_COOKIE_NAME (line 29) | const SIDEBAR_COOKIE_NAME = 'sidebar_state' constant SIDEBAR_COOKIE_MAX_AGE (line 30) | const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7 constant SIDEBAR_WIDTH (line 31) | const SIDEBAR_WIDTH = '18rem' constant SIDEBAR_WIDTH_MOBILE (line 32) | const SIDEBAR_WIDTH_MOBILE = '18rem' constant SIDEBAR_WIDTH_ICON (line 33) | const SIDEBAR_WIDTH_ICON = '3rem' constant SIDEBAR_KEYBOARD_SHORTCUT (line 34) | const SIDEBAR_KEYBOARD_SHORTCUT = 'b' constant SIDEBAR_COLLAPSE_THRESHOLD (line 36) | const SIDEBAR_COLLAPSE_THRESHOLD = 220 constant SIDEBAR_MAX_WIDTH (line 37) | const SIDEBAR_MAX_WIDTH = 800 type SidebarStore (line 39) | type SidebarStore = { type SidebarContextProps (line 71) | type SidebarContextProps = { function useSidebar (line 83) | function useSidebar() { function SidebarProvider (line 92) | function SidebarProvider({ function SidebarResizer (line 191) | function SidebarResizer({ side }: { side: 'left' | 'right' }) { function Sidebar (line 237) | function Sidebar({ function SidebarTrigger (line 342) | function SidebarTrigger({ className, onClick, ...props }: React.Componen... function SidebarRail (line 364) | function SidebarRail({ className, ...props }: React.ComponentProps<'butt... function SidebarInset (line 389) | function SidebarInset({ className, ...props }: React.ComponentProps<'mai... function SidebarInput (line 403) | function SidebarInput({ className, ...props }: React.ComponentProps) { function SidebarMenuItem (line 567) | function SidebarMenuItem({ className, ...props }: React.ComponentProps<'... function SidebarMenuButton (line 600) | function SidebarMenuButton({ function SidebarMenuAction (line 662) | function SidebarMenuAction({ function SidebarMenuBadge (line 707) | function SidebarMenuBadge({ className, ...props }: React.ComponentProps<... function SidebarMenuSkeleton (line 726) | function SidebarMenuSkeleton({ function SidebarMenuSub (line 757) | function SidebarMenuSub({ className, ...props }: React.ComponentProps<'u... function SidebarMenuSubItem (line 772) | function SidebarMenuSubItem({ className, ...props }: React.ComponentProp... function SidebarMenuSubButton (line 783) | function SidebarMenuSubButton({ FILE: packages/editor/src/components/ui/primitives/skeleton.tsx function Skeleton (line 3) | function Skeleton({ className, ...props }: React.ComponentProps<'div'>) { FILE: packages/editor/src/components/ui/primitives/slider.tsx function Slider (line 8) | function Slider({ FILE: packages/editor/src/components/ui/primitives/tooltip.tsx function TooltipProvider (line 8) | function TooltipProvider({ function Tooltip (line 21) | function Tooltip({ ...props }: React.ComponentProps & { type SceneGraphNode (line 33) | type SceneGraphNode = { type SceneGraphValue (line 43) | type SceneGraphValue = { type ProjectVisibility (line 158) | interface ProjectVisibility { type SettingsPanelProps (line 164) | interface SettingsPanelProps { function SettingsPanel (line 173) | function SettingsPanel({ FILE: packages/editor/src/components/ui/sidebar/panels/settings-panel/keyboard-shortcuts-dialog.tsx type Shortcut (line 14) | type Shortcut = { type ShortcutCategory (line 20) | type ShortcutCategory = { constant KEY_DISPLAY_MAP (line 25) | const KEY_DISPLAY_MAP: Record = { constant SHORTCUT_CATEGORIES (line 33) | const SHORTCUT_CATEGORIES: ShortcutCategory[] = [ function getDisplayKey (line 117) | function getDisplayKey(key: string, isMac: boolean): string { function ShortcutKeys (line 123) | function ShortcutKeys({ keys }: { keys: string[] }) { function KeyboardShortcutsDialog (line 142) | function KeyboardShortcutsDialog() { FILE: packages/editor/src/components/ui/sidebar/panels/site-panel/building-tree-node.tsx type BuildingTreeNodeProps (line 13) | interface BuildingTreeNodeProps { function BuildingTreeNode (line 19) | function BuildingTreeNode({ node, depth, isLast }: BuildingTreeNodeProps) { FILE: packages/editor/src/components/ui/sidebar/panels/site-panel/ceiling-tree-node.tsx type CeilingTreeNodeProps (line 10) | interface CeilingTreeNodeProps { function CeilingTreeNode (line 16) | function CeilingTreeNode({ node, depth, isLast }: CeilingTreeNodeProps) { function calculatePolygonArea (line 113) | function calculatePolygonArea(polygon: Array<[number, number]>): number { FILE: packages/editor/src/components/ui/sidebar/panels/site-panel/door-tree-node.tsx type DoorTreeNodeProps (line 12) | interface DoorTreeNodeProps { function DoorTreeNode (line 18) | function DoorTreeNode({ node, depth, isLast }: DoorTreeNodeProps) { FILE: packages/editor/src/components/ui/sidebar/panels/site-panel/index.tsx function calculatePerimeter (line 45) | function calculatePerimeter(points: Array<[number, number]>): number { function calculatePolygonArea (line 56) | function calculatePolygonArea(polygon: Array<[number, number]>): number { function useSiteNode (line 70) | function useSiteNode(): SiteNode | null { function PropertyLineSection (line 82) | function PropertyLineSection() { function CameraPopover (line 226) | function CameraPopover({ function ReferenceItem (line 307) | function ReferenceItem({ constant MAX_FILE_SIZE (line 379) | const MAX_FILE_SIZE = 200 * 1024 * 1024 // 200MB type LevelReferencesProps (line 381) | interface LevelReferencesProps { function LevelReferences (line 389) | function LevelReferences({ function LevelItem (line 553) | function LevelItem({ function LevelsSection (line 783) | function LevelsSection({ function LayerToggle (line 862) | function LayerToggle() { function ZoneItem (line 992) | function ZoneItem({ zone, isLast }: { zone: ZoneNode; isLast?: boolean }) { function MultiSelectionBadge (line 1155) | function MultiSelectionBadge() { function ContentSection (line 1177) | function ContentSection() { function BuildingItem (line 1257) | function BuildingItem({ type SitePanelProps (line 1427) | interface SitePanelProps { function SitePanel (line 1433) | function SitePanel({ projectId, onUploadAsset, onDeleteAsset }: SitePane... FILE: packages/editor/src/components/ui/sidebar/panels/site-panel/inline-rename-input.tsx type InlineRenameInputProps (line 6) | interface InlineRenameInputProps { function InlineRenameInput (line 15) | function InlineRenameInput({ FILE: packages/editor/src/components/ui/sidebar/panels/site-panel/item-tree-node.tsx constant CATEGORY_ICONS (line 10) | const CATEGORY_ICONS: Record = { type ItemTreeNodeProps (line 20) | interface ItemTreeNodeProps { function ItemTreeNode (line 26) | function ItemTreeNode({ node, depth, isLast }: ItemTreeNodeProps) { FILE: packages/editor/src/components/ui/sidebar/panels/site-panel/level-tree-node.tsx type LevelTreeNodeProps (line 9) | interface LevelTreeNodeProps { function LevelTreeNode (line 15) | function LevelTreeNode({ node, depth, isLast }: LevelTreeNodeProps) { FILE: packages/editor/src/components/ui/sidebar/panels/site-panel/roof-tree-node.tsx type RoofTreeNodeProps (line 12) | interface RoofTreeNodeProps { function RoofTreeNode (line 18) | function RoofTreeNode({ node, depth, isLast }: RoofTreeNodeProps) { function RoofSegmentTreeNode (line 140) | function RoofSegmentTreeNode({ FILE: packages/editor/src/components/ui/sidebar/panels/site-panel/slab-tree-node.tsx type SlabTreeNodeProps (line 10) | interface SlabTreeNodeProps { function SlabTreeNode (line 16) | function SlabTreeNode({ node, depth, isLast }: SlabTreeNodeProps) { function calculatePolygonArea (line 83) | function calculatePolygonArea(polygon: Array<[number, number]>): number { FILE: packages/editor/src/components/ui/sidebar/panels/site-panel/stair-tree-node.tsx type StairTreeNodeProps (line 12) | interface StairTreeNodeProps { function StairTreeNode (line 18) | function StairTreeNode({ node, depth, isLast }: StairTreeNodeProps) { function StairSegmentTreeNode (line 140) | function StairSegmentTreeNode({ FILE: packages/editor/src/components/ui/sidebar/panels/site-panel/tree-node-actions.tsx type TreeNodeActionsProps (line 11) | interface TreeNodeActionsProps { function TreeNodeActions (line 15) | function TreeNodeActions({ node }: TreeNodeActionsProps) { FILE: packages/editor/src/components/ui/sidebar/panels/site-panel/tree-node-drag.tsx constant REPARENT_TARGETS (line 21) | const REPARENT_TARGETS: Record = { constant REMOVE_WHEN_EMPTY (line 26) | const REMOVE_WHEN_EMPTY = new Set(['roof']) function canDrag (line 28) | function canDrag(node: AnyNode): boolean { function canDrop (line 32) | function canDrop(draggedType: string, targetType: string): boolean { type Transform (line 40) | type Transform = { function getTransform (line 45) | function getTransform(node: AnyNode): Transform { function computeReparentTransform (line 58) | function computeReparentTransform( type DragState (line 87) | type DragState = { type DropTarget (line 96) | type DropTarget = { type TreeNodeDragContextValue (line 101) | type TreeNodeDragContextValue = { constant DRAG_THRESHOLD (line 128) | const DRAG_THRESHOLD = 4 function TreeNodeDragProvider (line 130) | function TreeNodeDragProvider({ children }: { children: ReactNode }) { function FloatingPreview (line 312) | function FloatingPreview({ drag }: { drag: NonNullable }) { function DropIndicatorLine (line 332) | function DropIndicatorLine() { FILE: packages/editor/src/components/ui/sidebar/panels/site-panel/tree-node.tsx function handleTreeSelection (line 6) | function handleTreeSelection( function focusTreeNode (line 52) | function focusTreeNode(nodeId: AnyNodeId) { type TreeNodeProps (line 69) | interface TreeNodeProps { function TreeNode (line 75) | function TreeNode({ nodeId, depth = 0, isLast }: TreeNodeProps) { type TreeNodeWrapperProps (line 108) | interface TreeNodeWrapperProps { FILE: packages/editor/src/components/ui/sidebar/panels/site-panel/wall-tree-node.tsx type WallTreeNodeProps (line 10) | interface WallTreeNodeProps { function WallTreeNode (line 16) | function WallTreeNode({ node, depth, isLast }: WallTreeNodeProps) { FILE: packages/editor/src/components/ui/sidebar/panels/site-panel/window-tree-node.tsx type WindowTreeNodeProps (line 12) | interface WindowTreeNodeProps { function WindowTreeNode (line 18) | function WindowTreeNode({ node, depth, isLast }: WindowTreeNodeProps) { FILE: packages/editor/src/components/ui/sidebar/panels/site-panel/zone-tree-node.tsx type ZoneTreeNodeProps (line 9) | interface ZoneTreeNodeProps { function ZoneTreeNode (line 15) | function ZoneTreeNode({ node, depth, isLast }: ZoneTreeNodeProps) { function calculatePolygonArea (line 74) | function calculatePolygonArea(polygon: Array<[number, number]>): number { FILE: packages/editor/src/components/ui/sidebar/panels/zone-panel/index.tsx function ZoneItem (line 14) | function ZoneItem({ zone }: { zone: ZoneNode }) { function ZonePanel (line 125) | function ZonePanel() { FILE: packages/editor/src/components/ui/sidebar/tab-bar.tsx type SidebarTab (line 5) | type SidebarTab = { type TabBarProps (line 10) | interface TabBarProps { function TabBar (line 16) | function TabBar({ tabs, activeTab, onTabChange }: TabBarProps) { FILE: packages/editor/src/components/ui/slider-demo.tsx function SliderDemo (line 6) | function SliderDemo() { FILE: packages/editor/src/components/ui/slider.tsx type SliderProps (line 54) | type SliderProps = React.ComponentProps & function Slider (line 57) | function Slider({ variant, className, ...props }: SliderProps) { FILE: packages/editor/src/components/ui/viewer-toolbar.tsx constant TOOLBAR_CONTAINER (line 16) | const TOOLBAR_CONTAINER = constant TOOLBAR_BTN (line 20) | const TOOLBAR_BTN = constant VIEW_MODES (line 25) | const VIEW_MODES: { id: ViewMode; label: string; icon: React.ReactNode }... function ViewModeControl (line 43) | function ViewModeControl() { function CollapseSidebarButton (line 74) | function CollapseSidebarButton() { function WalkthroughButton (line 98) | function WalkthroughButton() { function UnitToggle (line 125) | function UnitToggle() { function ThemeToggle (line 147) | function ThemeToggle() { function LevelModeToggle (line 177) | function LevelModeToggle() { function WallModeToggle (line 231) | function WallModeToggle() { function CameraModeToggle (line 268) | function CameraModeToggle() { function PreviewButton (line 299) | function PreviewButton() { function ViewerToolbarLeft (line 319) | function ViewerToolbarLeft() { function ViewerToolbarRight (line 328) | function ViewerToolbarRight() { FILE: packages/editor/src/components/viewer-overlay.tsx type ProjectOwner (line 22) | type ProjectOwner = { type ViewerOverlayProps (line 74) | interface ViewerOverlayProps { FILE: packages/editor/src/contexts/presets-context.tsx type PresetsTab (line 8) | type PresetsTab = 'community' | 'mine' type PresetsAdapter (line 10) | interface PresetsAdapter { function PresetsProvider (line 105) | function PresetsProvider({ function usePresetsAdapter (line 119) | function usePresetsAdapter(): PresetsAdapter { FILE: packages/editor/src/hooks/use-auto-save.ts constant AUTOSAVE_DEBOUNCE_MS (line 7) | const AUTOSAVE_DEBOUNCE_MS = 1000 type SaveStatus (line 9) | type SaveStatus = 'idle' | 'pending' | 'saving' | 'saved' | 'paused' | '... type UseAutoSaveOptions (line 11) | interface UseAutoSaveOptions { function useAutoSave (line 24) | function useAutoSave({ FILE: packages/editor/src/hooks/use-contextual-tools.ts function useContextualTools (line 6) | function useContextualTools() { FILE: packages/editor/src/hooks/use-grid-events.ts function useGridEvents (line 11) | function useGridEvents(gridY: number) { FILE: packages/editor/src/hooks/use-mobile.ts constant MOBILE_BREAKPOINT (line 3) | const MOBILE_BREAKPOINT = 768 function useIsMobile (line 5) | function useIsMobile() { FILE: packages/editor/src/hooks/use-reduced-motion.ts function useReducedMotion (line 7) | function useReducedMotion(): boolean { FILE: packages/editor/src/lib/constants.ts constant EDITOR_LAYER (line 3) | const EDITOR_LAYER = 1 FILE: packages/editor/src/lib/level-selection.ts function getAdjacentLevelIdForDeletion (line 5) | function getAdjacentLevelIdForDeletion(levelId: AnyNodeId): LevelNode['i... function deleteLevelWithFallbackSelection (line 22) | function deleteLevelWithFallbackSelection(levelId: AnyNodeId) { FILE: packages/editor/src/lib/scene.ts type SceneGraph (line 11) | type SceneGraph = { type PersistedSelectionPath (line 16) | type PersistedSelectionPath = { function toViewerSelection (line 27) | function toViewerSelection(s: PersistedSelectionPath) { constant EMPTY_PERSISTED_SELECTION (line 31) | const EMPTY_PERSISTED_SELECTION: PersistedSelectionPath = { constant SELECTION_STORAGE_KEY (line 38) | const SELECTION_STORAGE_KEY = 'pascal-editor-selection' function getSelectionStorageKey (line 40) | function getSelectionStorageKey(): string { function getSelectionStorageReadKeys (line 45) | function getSelectionStorageReadKeys(): string[] { function getDefaultLevelIdForBuilding (line 50) | function getDefaultLevelIdForBuilding( function normalizePersistedSelectionPath (line 81) | function normalizePersistedSelectionPath( function hasPersistedSelectionValue (line 94) | function hasPersistedSelectionValue(selection: PersistedSelectionPath): ... function readPersistedSelection (line 103) | function readPersistedSelection(): PersistedSelectionPath | null { function writePersistedSelection (line 126) | function writePersistedSelection(selection: { function getEditorUiStateForRestoredSelection (line 148) | function getEditorUiStateForRestoredSelection( function getValidatedSelectionForScene (line 198) | function getValidatedSelectionForScene( function getRestoredSelectionForScene (line 248) | function getRestoredSelectionForScene( function syncEditorSelectionFromCurrentScene (line 259) | function syncEditorSelectionFromCurrentScene() { function resetEditorInteractionState (line 329) | function resetEditorInteractionState() { function hasUsableSceneGraph (line 353) | function hasUsableSceneGraph(sceneGraph?: SceneGraph | null): sceneGraph... function applySceneGraphToEditor (line 361) | function applySceneGraphToEditor(sceneGraph?: SceneGraph | null) { constant LOCAL_STORAGE_KEY (line 372) | const LOCAL_STORAGE_KEY = 'pascal-editor-scene' function saveSceneToLocalStorage (line 374) | function saveSceneToLocalStorage(scene: SceneGraph): void { function loadSceneFromLocalStorage (line 382) | function loadSceneFromLocalStorage(): SceneGraph | null { FILE: packages/editor/src/lib/sfx-bus.ts type SFXEvents (line 7) | type SFXEvents = { function initSFXBus (line 27) | function initSFXBus() { function triggerSFX (line 43) | function triggerSFX(event: keyof SFXEvents) { FILE: packages/editor/src/lib/sfx-player.ts constant SFX (line 5) | const SFX = { type SFXName (line 15) | type SFXName = keyof typeof SFX function playSFX (line 33) | function playSFX(name: SFXName) { function updateSFXVolumes (line 53) | function updateSFXVolumes() { FILE: packages/editor/src/lib/utils.ts function cn (line 4) | function cn(...inputs: ClassValue[]) { constant BASE_URL (line 20) | const BASE_URL = (() => { FILE: packages/editor/src/store/use-audio.tsx type AudioState (line 6) | interface AudioState { FILE: packages/editor/src/store/use-command-registry.ts type CommandAction (line 4) | type CommandAction = { type CommandRegistryStore (line 21) | interface CommandRegistryStore { FILE: packages/editor/src/store/use-editor.tsx constant DEFAULT_ACTIVE_SIDEBAR_PANEL (line 21) | const DEFAULT_ACTIVE_SIDEBAR_PANEL = 'site' constant DEFAULT_FLOORPLAN_PANE_RATIO (line 22) | const DEFAULT_FLOORPLAN_PANE_RATIO = 0.5 constant MIN_FLOORPLAN_PANE_RATIO (line 23) | const MIN_FLOORPLAN_PANE_RATIO = 0.15 constant MAX_FLOORPLAN_PANE_RATIO (line 24) | const MAX_FLOORPLAN_PANE_RATIO = 0.85 type ViewMode (line 26) | type ViewMode = '3d' | '2d' | 'split' type SplitOrientation (line 27) | type SplitOrientation = 'horizontal' | 'vertical' type Phase (line 29) | type Phase = 'site' | 'structure' | 'furnish' type Mode (line 31) | type Mode = 'select' | 'edit' | 'delete' | 'build' type StructureTool (line 34) | type StructureTool = type FurnishTool (line 49) | type FurnishTool = 'item' type SiteTool (line 52) | type SiteTool = 'property-line' type CatalogCategory (line 55) | type CatalogCategory = type StructureLayer (line 64) | type StructureLayer = 'zones' | 'elements' type FloorplanSelectionTool (line 66) | type FloorplanSelectionTool = 'click' | 'marquee' type Tool (line 69) | type Tool = SiteTool | StructureTool | FurnishTool type EditorState (line 71) | type EditorState = { type PersistedEditorUiState (line 124) | type PersistedEditorUiState = Pick< type PersistedEditorLayoutState (line 129) | type PersistedEditorLayoutState = Pick< type PersistedEditorState (line 133) | type PersistedEditorState = PersistedEditorUiState & PersistedEditorLayo... constant DEFAULT_PERSISTED_EDITOR_UI_STATE (line 135) | const DEFAULT_PERSISTED_EDITOR_UI_STATE: PersistedEditorUiState = { constant DEFAULT_PERSISTED_EDITOR_LAYOUT_STATE (line 145) | const DEFAULT_PERSISTED_EDITOR_LAYOUT_STATE: PersistedEditorLayoutState = { function normalizeModeForPhase (line 152) | function normalizeModeForPhase(phase: Phase, mode: Mode | undefined): Mo... function normalizeFloorplanPaneRatio (line 160) | function normalizeFloorplanPaneRatio(value: unknown): number { function normalizePersistedEditorUiState (line 168) | function normalizePersistedEditorUiState( function normalizePersistedEditorLayoutState (line 243) | function normalizePersistedEditorLayoutState( function hasCustomPersistedEditorUiState (line 257) | function hasCustomPersistedEditorUiState( function selectDefaultBuildingAndLevel (line 277) | function selectDefaultBuildingAndLevel() { FILE: packages/editor/src/store/use-palette-view-registry.ts type PaletteViewProps (line 4) | type PaletteViewProps = { type PaletteView (line 9) | type PaletteView = { type PaletteViewRegistryStore (line 25) | interface PaletteViewRegistryStore { FILE: packages/editor/src/store/use-upload.ts type UploadStatus (line 3) | type UploadStatus = 'preparing' | 'uploading' | 'confirming' | 'done' | ... type UploadEntry (line 5) | interface UploadEntry { type UploadHandler (line 14) | type UploadHandler = ( type UploadState (line 21) | interface UploadState { FILE: packages/ui/src/button.tsx type ButtonProps (line 5) | interface ButtonProps { FILE: packages/ui/src/card.tsx function Card (line 3) | function Card({ FILE: packages/ui/src/code.tsx function Code (line 3) | function Code({ FILE: packages/viewer/src/components/error-boundary.tsx class ErrorBoundary (line 4) | class ErrorBoundary extends Component< method getDerivedStateFromError (line 9) | static getDerivedStateFromError() { method componentDidCatch (line 12) | componentDidCatch(_e: Error, _i: ErrorInfo) {} method render (line 13) | render() { FILE: packages/viewer/src/components/renderers/ceiling/ceiling-renderer.tsx function createCeilingMaterials (line 17) | function createCeilingMaterials(color: string = '#999999') { FILE: packages/viewer/src/components/renderers/site/site-renderer.tsx constant Y_OFFSET (line 7) | const Y_OFFSET = 0.01 FILE: packages/viewer/src/components/renderers/zone/zone-renderer.tsx constant Y_OFFSET (line 10) | const Y_OFFSET = 0.01 constant WALL_HEIGHT (line 11) | const WALL_HEIGHT = 2.3 FILE: packages/viewer/src/components/viewer/index.tsx function AnimatedBackground (line 32) | function AnimatedBackground({ isDark }: { isDark: boolean }) { type ThreeElements (line 60) | interface ThreeElements extends ThreeToJSXElements {} function GPUDeviceWatcher (line 72) | function GPUDeviceWatcher() { type ViewerProps (line 92) | interface ViewerProps { FILE: packages/viewer/src/components/viewer/lights.tsx function Lights (line 7) | function Lights() { FILE: packages/viewer/src/components/viewer/perf-monitor.tsx constant SAMPLE_INTERVAL (line 6) | const SAMPLE_INTERVAL = 0.5 // seconds between display updates FILE: packages/viewer/src/components/viewer/post-processing.tsx constant SSGI_PARAMS (line 29) | const SSGI_PARAMS = { constant MAX_PIPELINE_RETRIES (line 44) | const MAX_PIPELINE_RETRIES = 3 constant RETRY_DELAY_MS (line 45) | const RETRY_DELAY_MS = 500 constant DARK_BG (line 47) | const DARK_BG = '#1f2433' constant LIGHT_BG (line 48) | const LIGHT_BG = '#ffffff' function generateSelectedOutlinePass (line 200) | function generateSelectedOutlinePass() { function generateHoverOutlinePass (line 222) | function generateHoverOutlinePass() { FILE: packages/viewer/src/components/viewer/selection-manager.tsx constant EDGE_TOLERANCE (line 25) | const EDGE_TOLERANCE = 0.5 type SelectableNodeType (line 27) | type SelectableNodeType = type SelectionStrategy (line 78) | interface SelectionStrategy { FILE: packages/viewer/src/hooks/use-asset-url.ts function useAssetUrl (line 8) | function useAssetUrl(url: string): string | null { FILE: packages/viewer/src/hooks/use-node-events.ts type NodeConfig (line 36) | type NodeConfig = { type NodeType (line 53) | type NodeType = keyof NodeConfig function useNodeEvents (line 55) | function useNodeEvents(node: NodeConfig[T]['node'], ... FILE: packages/viewer/src/lib/asset-url.ts constant ASSETS_CDN_URL (line 3) | const ASSETS_CDN_URL = process.env.NEXT_PUBLIC_ASSETS_CDN_URL || 'https:... function resolveAssetUrl (line 12) | async function resolveAssetUrl(url: string | undefined | null): Promise<... function resolveCdnUrl (line 34) | function resolveCdnUrl(url: string | undefined | null): string | null { FILE: packages/viewer/src/lib/layers.ts constant SCENE_LAYER (line 2) | const SCENE_LAYER = 0 constant ZONE_LAYER (line 5) | const ZONE_LAYER = 2 FILE: packages/viewer/src/lib/materials.ts function getCacheKey (line 12) | function getCacheKey(props: MaterialProperties): string { function createMaterial (line 16) | function createMaterial(material?: MaterialSchema): THREE.MeshStandardMa... function createDefaultMaterial (line 37) | function createDefaultMaterial( constant DEFAULT_WALL_MATERIAL (line 49) | const DEFAULT_WALL_MATERIAL = createDefaultMaterial('#ffffff', 0.9) constant DEFAULT_SLAB_MATERIAL (line 50) | const DEFAULT_SLAB_MATERIAL = createDefaultMaterial('#e5e5e5', 0.8) constant DEFAULT_DOOR_MATERIAL (line 51) | const DEFAULT_DOOR_MATERIAL = createDefaultMaterial('#8b4513', 0.7) constant DEFAULT_WINDOW_MATERIAL (line 52) | const DEFAULT_WINDOW_MATERIAL = new THREE.MeshStandardMaterial({ constant DEFAULT_CEILING_MATERIAL (line 60) | const DEFAULT_CEILING_MATERIAL = createDefaultMaterial('#f5f5dc', 0.95) constant DEFAULT_ROOF_MATERIAL (line 61) | const DEFAULT_ROOF_MATERIAL = createDefaultMaterial('#808080', 0.85) constant DEFAULT_STAIR_MATERIAL (line 62) | const DEFAULT_STAIR_MATERIAL = createDefaultMaterial('#ffffff', 0.9) function disposeMaterial (line 64) | function disposeMaterial(material: THREE.Material): void { function clearMaterialCache (line 68) | function clearMaterialCache(): void { FILE: packages/viewer/src/r3f.d.ts type ThreeJSXElements (line 18) | interface ThreeJSXElements { type IntrinsicElements (line 82) | interface IntrinsicElements extends ThreeJSXElements {} type IntrinsicElements (line 88) | interface IntrinsicElements extends ThreeJSXElements {} type IntrinsicElements (line 94) | interface IntrinsicElements extends ThreeJSXElements {} FILE: packages/viewer/src/store/use-item-light-pool.ts type LightRegistration (line 4) | type LightRegistration = { type ItemLightPoolStore (line 14) | type ItemLightPoolStore = { FILE: packages/viewer/src/store/use-viewer.d.ts type SelectionPath (line 3) | type SelectionPath = { type Outliner (line 9) | type Outliner = { type ViewerState (line 13) | type ViewerState = { FILE: packages/viewer/src/store/use-viewer.ts type SelectionPath (line 9) | type SelectionPath = { type Outliner (line 16) | type Outliner = { type ViewerState (line 21) | type ViewerState = { FILE: packages/viewer/src/systems/export/export-system.tsx constant EDITOR_LAYER (line 12) | const EDITOR_LAYER = 1 // same constant used across the editor function downloadBlob (line 14) | function downloadBlob(blob: Blob, filename: string) { FILE: packages/viewer/src/systems/item-light/item-light-system.tsx constant POOL_SIZE (line 9) | const POOL_SIZE = 12 constant REASSIGN_INTERVAL (line 11) | const REASSIGN_INTERVAL = 0.2 constant HYSTERESIS (line 15) | const HYSTERESIS = 0.15 constant CAM_MOVE_DIST (line 18) | const CAM_MOVE_DIST = 0.5 // units constant CAM_ROT_DOT (line 19) | const CAM_ROT_DOT = 0.995 // cos(~5.7°) type SlotRuntime (line 21) | type SlotRuntime = { type SceneNodes (line 35) | type SceneNodes = ReturnType['nodes'] type InteractiveState (line 36) | type InteractiveState = ReturnType function scoreRegistration (line 38) | function scoreRegistration( function ItemLightSystem (line 89) | function ItemLightSystem() { FILE: packages/viewer/src/systems/level/level-system.tsx constant EXPLODED_GAP (line 7) | const EXPLODED_GAP = 5 type LevelEntry (line 17) | type LevelEntry = { FILE: packages/viewer/src/systems/level/level-utils.ts constant DEFAULT_LEVEL_HEIGHT (line 9) | const DEFAULT_LEVEL_HEIGHT = 2.5 function getLevelHeight (line 17) | function getLevelHeight( function snapLevelsToTruePositions (line 64) | function snapLevelsToTruePositions(): () => void { FILE: packages/viewer/src/systems/wall/wall-cutout.tsx type WallMaterials (line 30) | interface WallMaterials { function getMaterialHash (line 38) | function getMaterialHash(wallNode: WallNode): string { function getPresetColor (line 62) | function getPresetColor(preset: string): string { function getMaterialsForWall (line 66) | function getMaterialsForWall(wallNode: WallNode): WallMaterials { function getWallHideState (line 106) | function getWallHideState( FILE: packages/viewer/src/systems/zone/zone-system.tsx constant TRANSITION_DURATION (line 8) | const TRANSITION_DURATION = 400 // ms constant EXIT_DEBOUNCE_MS (line 9) | const EXIT_DEBOUNCE_MS = 50 // ignore rapid exit→re-enter within this wi...