gitextract_f568hpnc/ ├── .claude/ │ └── settings.json ├── .cursor/ │ └── rules/ │ ├── creating-rules.mdc │ ├── events.mdc │ ├── layers.mdc │ ├── node-schemas.mdc │ ├── renderers.mdc │ ├── scene-registry.mdc │ ├── selection-managers.mdc │ ├── spatial-queries.mdc │ ├── systems.mdc │ ├── tools.mdc │ └── viewer-isolation.mdc ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.yml │ │ ├── config.yml │ │ └── feature_request.yml │ ├── pull_request_template.md │ └── workflows/ │ └── release.yml ├── .gitignore ├── .npmrc ├── .vscode/ │ └── settings.json ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── SETUP.md ├── apps/ │ └── editor/ │ ├── .gitignore │ ├── README.md │ ├── app/ │ │ ├── api/ │ │ │ └── health/ │ │ │ └── route.ts │ │ ├── globals.css │ │ ├── layout.tsx │ │ ├── page.tsx │ │ ├── privacy/ │ │ │ └── page.tsx │ │ └── terms/ │ │ └── page.tsx │ ├── env.mjs │ ├── lib/ │ │ └── utils.ts │ ├── next.config.ts │ ├── package.json │ ├── postcss.config.mjs │ ├── public/ │ │ ├── demos/ │ │ │ └── demo_1.json │ │ └── items/ │ │ ├── ac-block/ │ │ │ └── model.glb │ │ ├── air-conditioner/ │ │ │ └── model.glb │ │ ├── air-conditioner-block/ │ │ │ └── model.glb │ │ ├── air-conditioning/ │ │ │ └── model.glb │ │ ├── alarm-keypad/ │ │ │ └── model.glb │ │ ├── ball/ │ │ │ └── model.glb │ │ ├── barbell/ │ │ │ └── model.glb │ │ ├── barbell-stand/ │ │ │ └── model.glb │ │ ├── basket-hoop/ │ │ │ └── model.glb │ │ ├── bathroom-sink/ │ │ │ └── model.glb │ │ ├── bathtub/ │ │ │ └── model.glb │ │ ├── bean-bag/ │ │ │ └── model.glb │ │ ├── bedside-table/ │ │ │ └── model.glb │ │ ├── books/ │ │ │ └── model.glb │ │ ├── bookshelf/ │ │ │ └── model.glb │ │ ├── bunkbed/ │ │ │ └── model.glb │ │ ├── bush/ │ │ │ └── model.glb │ │ ├── cactus/ │ │ │ └── model.glb │ │ ├── car-toy/ │ │ │ └── model.glb │ │ ├── ceiling-fan/ │ │ │ └── model.glb │ │ ├── ceiling-lamp/ │ │ │ └── model.glb │ │ ├── ceiling-light/ │ │ │ └── model.glb │ │ ├── circular-ceiling-light/ │ │ │ └── model.glb │ │ ├── closet/ │ │ │ └── model.glb │ │ ├── coat-rack/ │ │ │ └── model.glb │ │ ├── coffee-machine/ │ │ │ └── model.glb │ │ ├── coffee-table/ │ │ │ └── model.glb │ │ ├── column/ │ │ │ └── model.glb │ │ ├── computer/ │ │ │ └── model.glb │ │ ├── couch-medium/ │ │ │ └── model.glb │ │ ├── couch-small/ │ │ │ └── model.glb │ │ ├── cutting-board/ │ │ │ └── model.glb │ │ ├── desk/ │ │ │ └── model.glb │ │ ├── dining-chair/ │ │ │ └── model.glb │ │ ├── dining-table/ │ │ │ └── model.glb │ │ ├── door/ │ │ │ └── model.glb │ │ ├── door-bar/ │ │ │ └── model.glb │ │ ├── door-with-bar/ │ │ │ └── model.glb │ │ ├── doorway-front/ │ │ │ └── model.glb │ │ ├── double-bed/ │ │ │ └── model.glb │ │ ├── dresser/ │ │ │ └── model.glb │ │ ├── drying-rack/ │ │ │ └── model.glb │ │ ├── easel/ │ │ │ └── model.glb │ │ ├── electric-panel/ │ │ │ └── model.glb │ │ ├── ev-wall-charger/ │ │ │ └── model.glb │ │ ├── exercise-bike/ │ │ │ └── model.glb │ │ ├── exit-sign/ │ │ │ └── model.glb │ │ ├── fence/ │ │ │ └── model.glb │ │ ├── fir-tree/ │ │ │ └── model.glb │ │ ├── fire-alarm/ │ │ │ └── model.glb │ │ ├── fire-detector/ │ │ │ └── model.glb │ │ ├── fire-extinguisher/ │ │ │ └── model.glb │ │ ├── flat-screen-tv/ │ │ │ └── model.glb │ │ ├── floor-lamp/ │ │ │ └── model.glb │ │ ├── freezer/ │ │ │ └── model.glb │ │ ├── fridge/ │ │ │ └── model.glb │ │ ├── fruits/ │ │ │ └── model.glb │ │ ├── frying-pan/ │ │ │ └── model.glb │ │ ├── glass-door/ │ │ │ └── model.glb │ │ ├── guitar/ │ │ │ └── model.glb │ │ ├── hedge/ │ │ │ └── model.glb │ │ ├── high-fence/ │ │ │ └── model.glb │ │ ├── hood/ │ │ │ └── model.glb │ │ ├── hydrant/ │ │ │ └── model.glb │ │ ├── indoor-plant/ │ │ │ └── model.glb │ │ ├── iron/ │ │ │ └── model.glb │ │ ├── ironing-board/ │ │ │ └── model.glb │ │ ├── kettle/ │ │ │ └── model.glb │ │ ├── kitchen/ │ │ │ └── model.glb │ │ ├── kitchen-cabinet/ │ │ │ └── model.glb │ │ ├── kitchen-counter/ │ │ │ └── model.glb │ │ ├── kitchen-fridge/ │ │ │ └── model.glb │ │ ├── kitchen-shelf/ │ │ │ └── model.glb │ │ ├── kitchen-utensils/ │ │ │ └── model.glb │ │ ├── laundry-bag/ │ │ │ └── model.glb │ │ ├── livingroom-chair/ │ │ │ └── model.glb │ │ ├── lounge-chair/ │ │ │ └── model.glb │ │ ├── low-fence/ │ │ │ └── model.glb │ │ ├── medium-fence/ │ │ │ └── model.glb │ │ ├── microwave/ │ │ │ └── model.glb │ │ ├── office-chair/ │ │ │ └── model.glb │ │ ├── office-table/ │ │ │ └── model.glb │ │ ├── outdoor-playhouse/ │ │ │ └── model.glb │ │ ├── palm/ │ │ │ └── model.glb │ │ ├── parking-spot/ │ │ │ └── model.glb │ │ ├── patio-umbrella/ │ │ │ └── model.glb │ │ ├── piano/ │ │ │ ├── Fireplace_13.glb │ │ │ └── model.glb │ │ ├── picture/ │ │ │ └── model.glb │ │ ├── pillar/ │ │ │ └── model.glb │ │ ├── pool-table/ │ │ │ └── model.glb │ │ ├── recessed-light/ │ │ │ └── model.glb │ │ ├── rectangular-carpet/ │ │ │ └── model.glb │ │ ├── rectangular-ceiling-light/ │ │ │ └── model.glb │ │ ├── rectangular-mirror/ │ │ │ └── model.glb │ │ ├── round-carpet/ │ │ │ └── model.glb │ │ ├── round-mirror/ │ │ │ └── model.glb │ │ ├── scooter/ │ │ │ └── model.glb │ │ ├── sewing-machine/ │ │ │ └── model.glb │ │ ├── shelf/ │ │ │ └── model.glb │ │ ├── shower/ │ │ │ └── model.glb │ │ ├── shower-angle/ │ │ │ └── model.glb │ │ ├── shower-rug/ │ │ │ └── model.glb │ │ ├── shower-square/ │ │ │ └── model.glb │ │ ├── single-bed/ │ │ │ └── model.glb │ │ ├── sink-cabinet/ │ │ │ └── model.glb │ │ ├── skate/ │ │ │ └── model.glb │ │ ├── small-indoor-plant/ │ │ │ └── model.glb │ │ ├── small-kitchen-cabinet/ │ │ │ └── model.glb │ │ ├── smoke-detector/ │ │ │ └── model.glb │ │ ├── sofa/ │ │ │ └── model.glb │ │ ├── sprinkler/ │ │ │ └── model.glb │ │ ├── stairs/ │ │ │ └── model.glb │ │ ├── stereo-speaker/ │ │ │ └── model.glb │ │ ├── stool/ │ │ │ └── model.glb │ │ ├── stove/ │ │ │ └── model.glb │ │ ├── sunbed/ │ │ │ └── model.glb │ │ ├── suspended-fireplace/ │ │ │ └── model.glb │ │ ├── table/ │ │ │ └── model.glb │ │ ├── table-lamp/ │ │ │ └── model.glb │ │ ├── television/ │ │ │ └── model.glb │ │ ├── tesla/ │ │ │ └── model.glb │ │ ├── thermostat/ │ │ │ └── model.glb │ │ ├── threadmill/ │ │ │ └── model.glb │ │ ├── toaster/ │ │ │ └── model.glb │ │ ├── toilet/ │ │ │ └── model.glb │ │ ├── toilet-brush/ │ │ │ └── model.glb │ │ ├── toilet-paper/ │ │ │ └── model.glb │ │ ├── toy/ │ │ │ └── model.glb │ │ ├── trash-bin/ │ │ │ └── model.glb │ │ ├── tree/ │ │ │ └── model.glb │ │ ├── tub/ │ │ │ └── model.glb │ │ ├── tv-stand/ │ │ │ └── model.glb │ │ ├── wall-art-06/ │ │ │ └── model.glb │ │ ├── wall-sink/ │ │ │ └── model.glb │ │ ├── washing-machine/ │ │ │ └── model.glb │ │ ├── window-double/ │ │ │ └── model.glb │ │ ├── window-large/ │ │ │ └── model.glb │ │ ├── window-rectangle/ │ │ │ └── model.glb │ │ ├── window-round/ │ │ │ └── model.glb │ │ ├── window-simple/ │ │ │ └── model.glb │ │ ├── window-small/ │ │ │ └── model.glb │ │ ├── window-small-2/ │ │ │ └── model.glb │ │ ├── window-square/ │ │ │ └── model.glb │ │ ├── window1-black-open-1731/ │ │ │ └── model.glb │ │ └── wine-bottle/ │ │ └── model.glb │ └── tsconfig.json ├── biome.jsonc ├── package.json ├── packages/ │ ├── core/ │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── events/ │ │ │ │ └── bus.ts │ │ │ ├── hooks/ │ │ │ │ ├── scene-registry/ │ │ │ │ │ └── scene-registry.ts │ │ │ │ └── spatial-grid/ │ │ │ │ ├── spatial-grid-manager.ts │ │ │ │ ├── spatial-grid-sync.ts │ │ │ │ ├── spatial-grid.ts │ │ │ │ ├── use-spatial-query.ts │ │ │ │ └── wall-spatial-grid.ts │ │ │ ├── index.ts │ │ │ ├── lib/ │ │ │ │ ├── asset-storage.ts │ │ │ │ └── space-detection.ts │ │ │ ├── schema/ │ │ │ │ ├── base.ts │ │ │ │ ├── camera.ts │ │ │ │ ├── collections.ts │ │ │ │ ├── index.ts │ │ │ │ ├── material.ts │ │ │ │ ├── nodes/ │ │ │ │ │ ├── building.ts │ │ │ │ │ ├── ceiling.ts │ │ │ │ │ ├── door.ts │ │ │ │ │ ├── guide.ts │ │ │ │ │ ├── item.ts │ │ │ │ │ ├── level.ts │ │ │ │ │ ├── roof-segment.ts │ │ │ │ │ ├── roof.ts │ │ │ │ │ ├── scan.ts │ │ │ │ │ ├── site.ts │ │ │ │ │ ├── slab.ts │ │ │ │ │ ├── stair-segment.ts │ │ │ │ │ ├── stair.ts │ │ │ │ │ ├── wall.ts │ │ │ │ │ ├── window.ts │ │ │ │ │ └── zone.ts │ │ │ │ └── types.ts │ │ │ ├── store/ │ │ │ │ ├── actions/ │ │ │ │ │ └── node-actions.ts │ │ │ │ ├── use-interactive.ts │ │ │ │ └── use-scene.ts │ │ │ ├── systems/ │ │ │ │ ├── ceiling/ │ │ │ │ │ └── ceiling-system.tsx │ │ │ │ ├── door/ │ │ │ │ │ └── door-system.tsx │ │ │ │ ├── item/ │ │ │ │ │ └── item-system.tsx │ │ │ │ ├── roof/ │ │ │ │ │ └── roof-system.tsx │ │ │ │ ├── slab/ │ │ │ │ │ └── slab-system.tsx │ │ │ │ ├── stair/ │ │ │ │ │ └── stair-system.tsx │ │ │ │ ├── wall/ │ │ │ │ │ ├── wall-footprint.ts │ │ │ │ │ ├── wall-mitering.ts │ │ │ │ │ └── wall-system.tsx │ │ │ │ └── window/ │ │ │ │ └── window-system.tsx │ │ │ └── utils/ │ │ │ ├── clone-scene-graph.ts │ │ │ └── types.ts │ │ └── tsconfig.json │ ├── editor/ │ │ ├── package.json │ │ ├── src/ │ │ │ ├── components/ │ │ │ │ ├── editor/ │ │ │ │ │ ├── custom-camera-controls.tsx │ │ │ │ │ ├── editor-layout-v2.tsx │ │ │ │ │ ├── export-manager.tsx │ │ │ │ │ ├── first-person-controls.tsx │ │ │ │ │ ├── floating-action-menu.tsx │ │ │ │ │ ├── floorplan-panel.tsx │ │ │ │ │ ├── grid.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── node-action-menu.tsx │ │ │ │ │ ├── preset-thumbnail-generator.tsx │ │ │ │ │ ├── selection-manager.tsx │ │ │ │ │ ├── site-edge-labels.tsx │ │ │ │ │ ├── thumbnail-generator.tsx │ │ │ │ │ └── wall-measurement-label.tsx │ │ │ │ ├── feedback-dialog.tsx │ │ │ │ ├── pascal-radio.tsx │ │ │ │ ├── preview-button.tsx │ │ │ │ ├── systems/ │ │ │ │ │ ├── ceiling/ │ │ │ │ │ │ └── ceiling-system.tsx │ │ │ │ │ ├── roof/ │ │ │ │ │ │ └── roof-edit-system.tsx │ │ │ │ │ ├── stair/ │ │ │ │ │ │ └── stair-edit-system.tsx │ │ │ │ │ └── zone/ │ │ │ │ │ ├── zone-label-editor-system.tsx │ │ │ │ │ └── zone-system.tsx │ │ │ │ ├── tools/ │ │ │ │ │ ├── ceiling/ │ │ │ │ │ │ ├── ceiling-boundary-editor.tsx │ │ │ │ │ │ ├── ceiling-hole-editor.tsx │ │ │ │ │ │ └── ceiling-tool.tsx │ │ │ │ │ ├── door/ │ │ │ │ │ │ ├── door-math.ts │ │ │ │ │ │ ├── door-tool.tsx │ │ │ │ │ │ └── move-door-tool.tsx │ │ │ │ │ ├── item/ │ │ │ │ │ │ ├── item-tool.tsx │ │ │ │ │ │ ├── move-tool.tsx │ │ │ │ │ │ ├── placement-math.ts │ │ │ │ │ │ ├── placement-strategies.ts │ │ │ │ │ │ ├── placement-types.ts │ │ │ │ │ │ ├── use-draft-node.ts │ │ │ │ │ │ └── use-placement-coordinator.tsx │ │ │ │ │ ├── roof/ │ │ │ │ │ │ ├── move-roof-tool.tsx │ │ │ │ │ │ └── roof-tool.tsx │ │ │ │ │ ├── select/ │ │ │ │ │ │ └── box-select-tool.tsx │ │ │ │ │ ├── shared/ │ │ │ │ │ │ ├── cursor-sphere.tsx │ │ │ │ │ │ └── polygon-editor.tsx │ │ │ │ │ ├── site/ │ │ │ │ │ │ └── site-boundary-editor.tsx │ │ │ │ │ ├── slab/ │ │ │ │ │ │ ├── slab-boundary-editor.tsx │ │ │ │ │ │ ├── slab-hole-editor.tsx │ │ │ │ │ │ └── slab-tool.tsx │ │ │ │ │ ├── stair/ │ │ │ │ │ │ └── stair-tool.tsx │ │ │ │ │ ├── tool-manager.tsx │ │ │ │ │ ├── wall/ │ │ │ │ │ │ ├── wall-drafting.ts │ │ │ │ │ │ └── wall-tool.tsx │ │ │ │ │ ├── window/ │ │ │ │ │ │ ├── move-window-tool.tsx │ │ │ │ │ │ ├── window-math.ts │ │ │ │ │ │ └── window-tool.tsx │ │ │ │ │ └── zone/ │ │ │ │ │ ├── zone-boundary-editor.tsx │ │ │ │ │ └── zone-tool.tsx │ │ │ │ ├── ui/ │ │ │ │ │ ├── action-menu/ │ │ │ │ │ │ ├── action-button.tsx │ │ │ │ │ │ ├── camera-actions.tsx │ │ │ │ │ │ ├── control-modes.tsx │ │ │ │ │ │ ├── furnish-tools.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── structure-tools.tsx │ │ │ │ │ │ └── view-toggles.tsx │ │ │ │ │ ├── command-palette/ │ │ │ │ │ │ ├── editor-commands.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── controls/ │ │ │ │ │ │ ├── action-button.tsx │ │ │ │ │ │ ├── material-picker.tsx │ │ │ │ │ │ ├── metric-control.tsx │ │ │ │ │ │ ├── panel-section.tsx │ │ │ │ │ │ ├── segmented-control.tsx │ │ │ │ │ │ ├── slider-control.tsx │ │ │ │ │ │ └── toggle-control.tsx │ │ │ │ │ ├── floating-level-selector.tsx │ │ │ │ │ ├── helpers/ │ │ │ │ │ │ ├── ceiling-helper.tsx │ │ │ │ │ │ ├── helper-manager.tsx │ │ │ │ │ │ ├── item-helper.tsx │ │ │ │ │ │ ├── roof-helper.tsx │ │ │ │ │ │ ├── slab-helper.tsx │ │ │ │ │ │ └── wall-helper.tsx │ │ │ │ │ ├── item-catalog/ │ │ │ │ │ │ ├── catalog-items.tsx │ │ │ │ │ │ └── item-catalog.tsx │ │ │ │ │ ├── panels/ │ │ │ │ │ │ ├── ceiling-panel.tsx │ │ │ │ │ │ ├── collections/ │ │ │ │ │ │ │ └── collections-popover.tsx │ │ │ │ │ │ ├── door-panel.tsx │ │ │ │ │ │ ├── item-panel.tsx │ │ │ │ │ │ ├── panel-manager.tsx │ │ │ │ │ │ ├── panel-wrapper.tsx │ │ │ │ │ │ ├── presets/ │ │ │ │ │ │ │ └── presets-popover.tsx │ │ │ │ │ │ ├── reference-panel.tsx │ │ │ │ │ │ ├── roof-panel.tsx │ │ │ │ │ │ ├── roof-segment-panel.tsx │ │ │ │ │ │ ├── slab-panel.tsx │ │ │ │ │ │ ├── stair-panel.tsx │ │ │ │ │ │ ├── stair-segment-panel.tsx │ │ │ │ │ │ ├── wall-panel.tsx │ │ │ │ │ │ └── window-panel.tsx │ │ │ │ │ ├── primitives/ │ │ │ │ │ │ ├── button.tsx │ │ │ │ │ │ ├── card.tsx │ │ │ │ │ │ ├── color-dot.tsx │ │ │ │ │ │ ├── context-menu.tsx │ │ │ │ │ │ ├── dialog.tsx │ │ │ │ │ │ ├── dropdown-menu.tsx │ │ │ │ │ │ ├── error-boundary.tsx │ │ │ │ │ │ ├── input.tsx │ │ │ │ │ │ ├── number-input.tsx │ │ │ │ │ │ ├── opacity-control.tsx │ │ │ │ │ │ ├── popover.tsx │ │ │ │ │ │ ├── separator.tsx │ │ │ │ │ │ ├── sheet.tsx │ │ │ │ │ │ ├── shortcut-token.tsx │ │ │ │ │ │ ├── sidebar.tsx │ │ │ │ │ │ ├── skeleton.tsx │ │ │ │ │ │ ├── slider.tsx │ │ │ │ │ │ ├── switch.tsx │ │ │ │ │ │ └── tooltip.tsx │ │ │ │ │ ├── scene-loader.tsx │ │ │ │ │ ├── sidebar/ │ │ │ │ │ │ ├── app-sidebar.tsx │ │ │ │ │ │ ├── icon-rail.tsx │ │ │ │ │ │ ├── panels/ │ │ │ │ │ │ │ ├── settings-panel/ │ │ │ │ │ │ │ │ ├── audio-settings-dialog.tsx │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ └── keyboard-shortcuts-dialog.tsx │ │ │ │ │ │ │ ├── site-panel/ │ │ │ │ │ │ │ │ ├── building-tree-node.tsx │ │ │ │ │ │ │ │ ├── ceiling-tree-node.tsx │ │ │ │ │ │ │ │ ├── door-tree-node.tsx │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ ├── inline-rename-input.tsx │ │ │ │ │ │ │ │ ├── item-tree-node.tsx │ │ │ │ │ │ │ │ ├── level-tree-node.tsx │ │ │ │ │ │ │ │ ├── roof-tree-node.tsx │ │ │ │ │ │ │ │ ├── slab-tree-node.tsx │ │ │ │ │ │ │ │ ├── stair-tree-node.tsx │ │ │ │ │ │ │ │ ├── tree-node-actions.tsx │ │ │ │ │ │ │ │ ├── tree-node-drag.tsx │ │ │ │ │ │ │ │ ├── tree-node.tsx │ │ │ │ │ │ │ │ ├── wall-tree-node.tsx │ │ │ │ │ │ │ │ ├── window-tree-node.tsx │ │ │ │ │ │ │ │ └── zone-tree-node.tsx │ │ │ │ │ │ │ └── zone-panel/ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ └── tab-bar.tsx │ │ │ │ │ ├── slider-demo.tsx │ │ │ │ │ ├── slider.tsx │ │ │ │ │ └── viewer-toolbar.tsx │ │ │ │ ├── viewer-overlay.tsx │ │ │ │ └── viewer-zone-system.tsx │ │ │ ├── contexts/ │ │ │ │ └── presets-context.tsx │ │ │ ├── hooks/ │ │ │ │ ├── use-auto-save.ts │ │ │ │ ├── use-contextual-tools.ts │ │ │ │ ├── use-grid-events.ts │ │ │ │ ├── use-keyboard.ts │ │ │ │ ├── use-mobile.ts │ │ │ │ └── use-reduced-motion.ts │ │ │ ├── index.tsx │ │ │ ├── lib/ │ │ │ │ ├── constants.ts │ │ │ │ ├── level-selection.ts │ │ │ │ ├── scene.ts │ │ │ │ ├── sfx/ │ │ │ │ │ └── index.ts │ │ │ │ ├── sfx-bus.ts │ │ │ │ ├── sfx-player.ts │ │ │ │ └── utils.ts │ │ │ ├── store/ │ │ │ │ ├── use-audio.tsx │ │ │ │ ├── use-command-registry.ts │ │ │ │ ├── use-editor.tsx │ │ │ │ ├── use-palette-view-registry.ts │ │ │ │ └── use-upload.ts │ │ │ └── three-types.ts │ │ └── tsconfig.json │ ├── eslint-config/ │ │ ├── README.md │ │ ├── base.js │ │ ├── next.js │ │ ├── package.json │ │ └── react-internal.js │ ├── typescript-config/ │ │ ├── base.json │ │ ├── nextjs.json │ │ ├── package.json │ │ └── react-library.json │ ├── ui/ │ │ ├── eslint.config.mjs │ │ ├── package.json │ │ ├── src/ │ │ │ ├── button.tsx │ │ │ ├── card.tsx │ │ │ └── code.tsx │ │ └── tsconfig.json │ └── viewer/ │ ├── README.md │ ├── package.json │ ├── src/ │ │ ├── components/ │ │ │ ├── error-boundary.tsx │ │ │ ├── renderers/ │ │ │ │ ├── building/ │ │ │ │ │ └── building-renderer.tsx │ │ │ │ ├── ceiling/ │ │ │ │ │ └── ceiling-renderer.tsx │ │ │ │ ├── door/ │ │ │ │ │ └── door-renderer.tsx │ │ │ │ ├── guide/ │ │ │ │ │ └── guide-renderer.tsx │ │ │ │ ├── item/ │ │ │ │ │ └── item-renderer.tsx │ │ │ │ ├── level/ │ │ │ │ │ └── level-renderer.tsx │ │ │ │ ├── node-renderer.tsx │ │ │ │ ├── roof/ │ │ │ │ │ ├── roof-materials.ts │ │ │ │ │ └── roof-renderer.tsx │ │ │ │ ├── roof-segment/ │ │ │ │ │ └── roof-segment-renderer.tsx │ │ │ │ ├── scan/ │ │ │ │ │ └── scan-renderer.tsx │ │ │ │ ├── scene-renderer.tsx │ │ │ │ ├── site/ │ │ │ │ │ └── site-renderer.tsx │ │ │ │ ├── slab/ │ │ │ │ │ └── slab-renderer.tsx │ │ │ │ ├── stair/ │ │ │ │ │ └── stair-renderer.tsx │ │ │ │ ├── stair-segment/ │ │ │ │ │ └── stair-segment-renderer.tsx │ │ │ │ ├── wall/ │ │ │ │ │ └── wall-renderer.tsx │ │ │ │ ├── window/ │ │ │ │ │ └── window-renderer.tsx │ │ │ │ └── zone/ │ │ │ │ └── zone-renderer.tsx │ │ │ └── viewer/ │ │ │ ├── ground-occluder.tsx │ │ │ ├── index.tsx │ │ │ ├── lights.tsx │ │ │ ├── perf-monitor.tsx │ │ │ ├── post-processing.tsx │ │ │ ├── selection-manager.tsx │ │ │ └── viewer-camera.tsx │ │ ├── hooks/ │ │ │ ├── use-asset-url.ts │ │ │ ├── use-gltf-ktx2.tsx │ │ │ └── use-node-events.ts │ │ ├── index.ts │ │ ├── lib/ │ │ │ ├── asset-url.ts │ │ │ ├── layers.ts │ │ │ └── materials.ts │ │ ├── r3f.d.ts │ │ ├── store/ │ │ │ ├── use-item-light-pool.ts │ │ │ ├── use-viewer.d.ts │ │ │ └── use-viewer.ts │ │ └── systems/ │ │ ├── export/ │ │ │ └── export-system.tsx │ │ ├── guide/ │ │ │ └── guide-system.tsx │ │ ├── interactive/ │ │ │ └── interactive-system.tsx │ │ ├── item-light/ │ │ │ └── item-light-system.tsx │ │ ├── level/ │ │ │ ├── level-system.d.ts │ │ │ ├── level-system.tsx │ │ │ └── level-utils.ts │ │ ├── scan/ │ │ │ └── scan-system.tsx │ │ ├── wall/ │ │ │ └── wall-cutout.tsx │ │ └── zone/ │ │ └── zone-system.tsx │ └── tsconfig.json ├── tooling/ │ ├── release/ │ │ ├── android-playstore-release.sh │ │ ├── ios-appstore-release.sh │ │ └── release.sh │ └── typescript/ │ ├── base.json │ ├── expo.json │ ├── nextjs.json │ ├── package.json │ └── react-library.json └── turbo.json