@pascal-app/editor 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/package.json +9 -5
  2. package/src/components/editor/bottom-sheet.tsx +149 -0
  3. package/src/components/editor/custom-camera-controls.tsx +75 -7
  4. package/src/components/editor/editor-layout-mobile.tsx +264 -0
  5. package/src/components/editor/editor-layout-v2.tsx +20 -0
  6. package/src/components/editor/first-person/build-collider-world.ts +365 -0
  7. package/src/components/editor/first-person/bvh-ecctrl.tsx +795 -0
  8. package/src/components/editor/first-person-controls.tsx +496 -143
  9. package/src/components/editor/floating-action-menu.tsx +32 -55
  10. package/src/components/editor/floorplan-background-selection.ts +113 -0
  11. package/src/components/editor/floorplan-panel.tsx +9855 -3298
  12. package/src/components/editor/index.tsx +269 -21
  13. package/src/components/editor/selection-manager.tsx +575 -13
  14. package/src/components/editor/thumbnail-generator.tsx +38 -7
  15. package/src/components/editor/use-floorplan-background-placement.ts +257 -0
  16. package/src/components/editor/use-floorplan-hit-testing.ts +171 -0
  17. package/src/components/editor/use-floorplan-scene-data.ts +189 -0
  18. package/src/components/editor/wall-measurement-label.tsx +267 -36
  19. package/src/components/editor-2d/floorplan-action-menu-layer.tsx +95 -0
  20. package/src/components/editor-2d/floorplan-cursor-indicator-overlay.tsx +160 -0
  21. package/src/components/editor-2d/floorplan-hotkey-handlers.tsx +92 -0
  22. package/src/components/editor-2d/renderers/floorplan-draft-layer.tsx +119 -0
  23. package/src/components/editor-2d/renderers/floorplan-marquee-layer.tsx +58 -0
  24. package/src/components/editor-2d/renderers/floorplan-measurements-layer.tsx +197 -0
  25. package/src/components/editor-2d/renderers/floorplan-roof-layer.tsx +113 -0
  26. package/src/components/editor-2d/renderers/floorplan-stair-layer.tsx +474 -0
  27. package/src/components/editor-2d/svg-paths.ts +119 -0
  28. package/src/components/tools/ceiling/ceiling-boundary-editor.tsx +1 -0
  29. package/src/components/tools/ceiling/ceiling-hole-editor.tsx +1 -0
  30. package/src/components/tools/ceiling/ceiling-tool.tsx +5 -5
  31. package/src/components/tools/column/column-tool.tsx +97 -0
  32. package/src/components/tools/column/move-column-tool.tsx +105 -0
  33. package/src/components/tools/door/door-tool.tsx +7 -0
  34. package/src/components/tools/door/move-door-tool.tsx +28 -8
  35. package/src/components/tools/fence/fence-drafting.ts +10 -3
  36. package/src/components/tools/fence/fence-tool.tsx +159 -3
  37. package/src/components/tools/fence/move-fence-endpoint-tool.tsx +129 -18
  38. package/src/components/tools/fence/move-fence-tool.tsx +101 -34
  39. package/src/components/tools/item/move-tool.tsx +10 -1
  40. package/src/components/tools/item/placement-math.ts +30 -1
  41. package/src/components/tools/item/placement-strategies.ts +109 -31
  42. package/src/components/tools/item/placement-types.ts +7 -0
  43. package/src/components/tools/item/use-draft-node.ts +2 -0
  44. package/src/components/tools/item/use-placement-coordinator.tsx +660 -52
  45. package/src/components/tools/roof/move-roof-tool.tsx +22 -15
  46. package/src/components/tools/shared/polygon-editor.tsx +153 -28
  47. package/src/components/tools/shared/segment-angle.ts +156 -0
  48. package/src/components/tools/slab/slab-boundary-editor.tsx +1 -0
  49. package/src/components/tools/slab/slab-hole-editor.tsx +1 -0
  50. package/src/components/tools/spawn/move-spawn-tool.tsx +101 -0
  51. package/src/components/tools/spawn/spawn-tool.tsx +130 -0
  52. package/src/components/tools/tool-manager.tsx +18 -3
  53. package/src/components/tools/wall/move-wall-endpoint-tool.tsx +121 -20
  54. package/src/components/tools/wall/wall-drafting.ts +18 -9
  55. package/src/components/tools/wall/wall-tool.tsx +134 -2
  56. package/src/components/tools/window/move-window-tool.tsx +18 -0
  57. package/src/components/tools/window/window-tool.tsx +5 -0
  58. package/src/components/ui/action-menu/camera-actions.tsx +37 -33
  59. package/src/components/ui/action-menu/control-modes.tsx +28 -1
  60. package/src/components/ui/action-menu/index.tsx +91 -1
  61. package/src/components/ui/action-menu/structure-tools.tsx +2 -0
  62. package/src/components/ui/action-menu/view-toggles.tsx +424 -35
  63. package/src/components/ui/command-palette/editor-commands.tsx +18 -1
  64. package/src/components/ui/controls/material-picker.tsx +152 -165
  65. package/src/components/ui/controls/slider-control.tsx +66 -18
  66. package/src/components/ui/floating-level-selector.tsx +286 -55
  67. package/src/components/ui/helpers/helper-manager.tsx +5 -0
  68. package/src/components/ui/item-catalog/catalog-items.tsx +1116 -1219
  69. package/src/components/ui/item-catalog/item-catalog.tsx +42 -175
  70. package/src/components/ui/level-duplicate-dialog.tsx +115 -0
  71. package/src/components/ui/panels/ceiling-panel.tsx +1 -25
  72. package/src/components/ui/panels/column-panel.tsx +715 -0
  73. package/src/components/ui/panels/door-panel.tsx +981 -289
  74. package/src/components/ui/panels/fence-panel.tsx +3 -45
  75. package/src/components/ui/panels/mobile-panel-sheet.tsx +108 -0
  76. package/src/components/ui/panels/mobile-selection-bar.tsx +100 -0
  77. package/src/components/ui/panels/node-display.ts +39 -0
  78. package/src/components/ui/panels/paint-panel.tsx +138 -0
  79. package/src/components/ui/panels/panel-manager.tsx +210 -1
  80. package/src/components/ui/panels/panel-wrapper.tsx +48 -39
  81. package/src/components/ui/panels/reference-panel.tsx +238 -5
  82. package/src/components/ui/panels/roof-panel.tsx +4 -105
  83. package/src/components/ui/panels/roof-segment-panel.tsx +0 -25
  84. package/src/components/ui/panels/slab-panel.tsx +4 -30
  85. package/src/components/ui/panels/spawn-panel.tsx +155 -0
  86. package/src/components/ui/panels/stair-panel.tsx +11 -117
  87. package/src/components/ui/panels/stair-segment-panel.tsx +0 -25
  88. package/src/components/ui/panels/wall-panel.tsx +1 -95
  89. package/src/components/ui/panels/window-panel.tsx +660 -139
  90. package/src/components/ui/sidebar/mobile-tab-bar.tsx +46 -0
  91. package/src/components/ui/sidebar/panels/settings-panel/keyboard-shortcuts-dialog.tsx +2 -2
  92. package/src/components/ui/sidebar/panels/site-panel/building-tree-node.tsx +2 -2
  93. package/src/components/ui/sidebar/panels/site-panel/column-tree-node.tsx +77 -0
  94. package/src/components/ui/sidebar/panels/site-panel/index.tsx +109 -24
  95. package/src/components/ui/sidebar/panels/site-panel/level-tree-node.tsx +2 -2
  96. package/src/components/ui/sidebar/panels/site-panel/spawn-tree-node.tsx +82 -0
  97. package/src/components/ui/sidebar/panels/site-panel/tree-node.tsx +9 -3
  98. package/src/components/ui/sidebar/panels/site-panel/zone-tree-node.tsx +8 -5
  99. package/src/components/ui/sidebar/tab-bar.tsx +3 -0
  100. package/src/components/ui/viewer-toolbar.tsx +42 -1
  101. package/src/hooks/use-auto-frame.ts +45 -0
  102. package/src/hooks/use-keyboard.ts +64 -7
  103. package/src/hooks/use-mobile.ts +12 -12
  104. package/src/lib/door-interaction.ts +88 -0
  105. package/src/lib/floorplan/geometry.ts +263 -0
  106. package/src/lib/floorplan/index.ts +38 -0
  107. package/src/lib/floorplan/items.ts +179 -0
  108. package/src/lib/floorplan/selection-tool.ts +231 -0
  109. package/src/lib/floorplan/stairs.ts +478 -0
  110. package/src/lib/floorplan/types.ts +57 -0
  111. package/src/lib/floorplan/walls.ts +23 -0
  112. package/src/lib/guide-events.ts +10 -0
  113. package/src/lib/level-duplication.test.ts +72 -0
  114. package/src/lib/level-duplication.ts +153 -0
  115. package/src/lib/local-guide-image.ts +42 -0
  116. package/src/lib/material-paint.ts +284 -0
  117. package/src/lib/roof-duplication.ts +214 -0
  118. package/src/lib/scene-bounds.test.ts +183 -0
  119. package/src/lib/scene-bounds.ts +169 -0
  120. package/src/lib/stair-duplication.ts +126 -0
  121. package/src/lib/window-interaction.ts +86 -0
  122. package/src/store/use-editor.tsx +164 -8
@@ -5,18 +5,20 @@ import {
5
5
  type AssetInput,
6
6
  type BuildingNode,
7
7
  type CeilingNode,
8
+ type ColumnNode,
8
9
  type DoorNode,
9
10
  type FenceNode,
10
11
  type ItemNode,
11
12
  type LevelNode,
12
- type RoofSurfaceMaterialRole,
13
13
  type RoofNode,
14
14
  type RoofSegmentNode,
15
+ type RoofSurfaceMaterialRole,
15
16
  type SlabNode,
16
17
  type Space,
17
- type StairSurfaceMaterialRole,
18
+ type SpawnNode,
18
19
  type StairNode,
19
20
  type StairSegmentNode,
21
+ type StairSurfaceMaterialRole,
20
22
  useScene,
21
23
  type WallNode,
22
24
  type WallSurfaceSide,
@@ -26,6 +28,13 @@ import { useViewer } from '@pascal-app/viewer'
26
28
  import { create } from 'zustand'
27
29
  import { persist } from 'zustand/middleware'
28
30
  import { getDefaultCatalogItem } from '../components/ui/item-catalog/catalog-items'
31
+ import {
32
+ type ActivePaintMaterial,
33
+ type PaintableMaterialTarget,
34
+ resolveActivePaintMaterialFromSelection,
35
+ resolvePaintTargetFromSelection,
36
+ type SingleSurfaceMaterialRole,
37
+ } from '../lib/material-paint'
29
38
 
30
39
  const DEFAULT_ACTIVE_SIDEBAR_PANEL = 'site'
31
40
  const DEFAULT_FLOORPLAN_PANE_RATIO = 0.5
@@ -37,7 +46,7 @@ export type SplitOrientation = 'horizontal' | 'vertical'
37
46
 
38
47
  export type Phase = 'site' | 'structure' | 'furnish'
39
48
 
40
- export type Mode = 'select' | 'edit' | 'delete' | 'build'
49
+ export type Mode = 'select' | 'edit' | 'delete' | 'build' | 'material-paint'
41
50
 
42
51
  // Structure mode tools (building elements)
43
52
  export type StructureTool =
@@ -52,6 +61,7 @@ export type StructureTool =
52
61
  | 'stair'
53
62
  | 'item'
54
63
  | 'zone'
64
+ | 'spawn'
55
65
  | 'window'
56
66
  | 'door'
57
67
 
@@ -89,13 +99,28 @@ export type MovingFenceEndpoint = {
89
99
  endpoint: 'start' | 'end'
90
100
  }
91
101
 
92
- export type MaterialTargetRole = WallSurfaceSide | StairSurfaceMaterialRole | RoofSurfaceMaterialRole
102
+ export type MaterialTargetRole =
103
+ | WallSurfaceSide
104
+ | StairSurfaceMaterialRole
105
+ | RoofSurfaceMaterialRole
106
+ | SingleSurfaceMaterialRole
93
107
 
94
108
  export type SelectedMaterialTarget = {
95
109
  nodeId: AnyNodeId
96
110
  role: MaterialTargetRole
97
111
  }
98
112
 
113
+ type MaterialPaintSelectionSnapshot = {
114
+ selectedId: string | null
115
+ activePaintTarget: PaintableMaterialTarget
116
+ activePaintMaterial: ActivePaintMaterial | null
117
+ }
118
+
119
+ export type GuideUiState = {
120
+ locked?: boolean
121
+ scaleReferenceVisible?: boolean
122
+ }
123
+
99
124
  type EditorState = {
100
125
  phase: Phase
101
126
  setPhase: (phase: Phase) => void
@@ -115,10 +140,12 @@ type EditorState = {
115
140
  | DoorNode
116
141
  | FenceNode
117
142
  | CeilingNode
143
+ | ColumnNode
118
144
  | SlabNode
119
145
  | WallNode
120
146
  | RoofNode
121
147
  | RoofSegmentNode
148
+ | SpawnNode
122
149
  | StairNode
123
150
  | StairSegmentNode
124
151
  | BuildingNode
@@ -130,10 +157,12 @@ type EditorState = {
130
157
  | DoorNode
131
158
  | FenceNode
132
159
  | CeilingNode
160
+ | ColumnNode
133
161
  | SlabNode
134
162
  | WallNode
135
163
  | RoofNode
136
164
  | RoofSegmentNode
165
+ | SpawnNode
137
166
  | StairNode
138
167
  | StairSegmentNode
139
168
  | BuildingNode
@@ -149,8 +178,21 @@ type EditorState = {
149
178
  setCurvingFence: (fence: FenceNode | null) => void
150
179
  selectedMaterialTarget: SelectedMaterialTarget | null
151
180
  setSelectedMaterialTarget: (target: SelectedMaterialTarget | null) => void
181
+ activePaintMaterial: ActivePaintMaterial | null
182
+ setActivePaintMaterial: (material: ActivePaintMaterial | null) => void
183
+ activePaintTarget: PaintableMaterialTarget
184
+ setActivePaintTarget: (target: PaintableMaterialTarget) => void
185
+ primeMaterialPaintFromSelection: () => MaterialPaintSelectionSnapshot
186
+ hoveredPaintTarget: PaintableMaterialTarget | null
187
+ setHoveredPaintTarget: (target: PaintableMaterialTarget | null) => void
188
+ isPaintPanelOpen: boolean
189
+ setPaintPanelOpen: (open: boolean) => void
152
190
  selectedReferenceId: string | null
153
191
  setSelectedReferenceId: (id: string | null) => void
192
+ guideUi: Record<string, GuideUiState>
193
+ setGuideLocked: (guideId: string, locked: boolean) => void
194
+ setGuideScaleReferenceVisible: (guideId: string, visible: boolean) => void
195
+ clearGuideUi: (guideId: string) => void
154
196
  // Space detection for cutaway mode
155
197
  spaces: Record<string, Space>
156
198
  setSpaces: (spaces: Record<string, Space>) => void
@@ -175,6 +217,13 @@ type EditorState = {
175
217
  setFloorplanSelectionTool: (tool: FloorplanSelectionTool) => void
176
218
  gridSnapStep: GridSnapStep
177
219
  setGridSnapStep: (step: GridSnapStep) => void
220
+ showReferenceFloor: boolean
221
+ toggleReferenceFloor: () => void
222
+ setShowReferenceFloor: (show: boolean) => void
223
+ referenceFloorOffset: number
224
+ setReferenceFloorOffset: (offset: number) => void
225
+ referenceFloorOpacity: number
226
+ setReferenceFloorOpacity: (opacity: number) => void
178
227
  // First-person walkthrough mode (street view)
179
228
  isFirstPersonMode: boolean
180
229
  _viewModeBeforeFirstPerson: ViewMode | null
@@ -184,6 +233,10 @@ type EditorState = {
184
233
  setAllowUndergroundCamera: (enabled: boolean) => void
185
234
  activeSidebarPanel: string
186
235
  setActiveSidebarPanel: (id: string) => void
236
+ mobilePanelSheetHeight: number
237
+ setMobilePanelSheetHeight: (height: number) => void
238
+ isCaptureMode: boolean
239
+ setIsCaptureMode: (enabled: boolean) => void
187
240
  floorplanPaneRatio: number
188
241
  setFloorplanPaneRatio: (ratio: number) => void
189
242
  }
@@ -200,6 +253,9 @@ type PersistedEditorLayoutState = Pick<
200
253
  | 'splitOrientation'
201
254
  | 'floorplanSelectionTool'
202
255
  | 'gridSnapStep'
256
+ | 'showReferenceFloor'
257
+ | 'referenceFloorOffset'
258
+ | 'referenceFloorOpacity'
203
259
  >
204
260
  type PersistedEditorState = PersistedEditorUiState & PersistedEditorLayoutState
205
261
 
@@ -219,6 +275,9 @@ export const DEFAULT_PERSISTED_EDITOR_LAYOUT_STATE: PersistedEditorLayoutState =
219
275
  splitOrientation: 'horizontal',
220
276
  floorplanSelectionTool: 'click',
221
277
  gridSnapStep: 0.5,
278
+ showReferenceFloor: false,
279
+ referenceFloorOffset: 1,
280
+ referenceFloorOpacity: 0.35,
222
281
  }
223
282
 
224
283
  const GRID_SNAP_STEPS: GridSnapStep[] = [0.5, 0.25, 0.1, 0.05]
@@ -228,7 +287,7 @@ function normalizeModeForPhase(phase: Phase, mode: Mode | undefined): Mode {
228
287
  return 'select'
229
288
  }
230
289
 
231
- return mode === 'build' || mode === 'delete' ? mode : 'select'
290
+ return mode === 'build' || mode === 'delete' || mode === 'material-paint' ? mode : 'select'
232
291
  }
233
292
 
234
293
  function normalizeFloorplanPaneRatio(value: unknown): number {
@@ -328,6 +387,16 @@ function normalizePersistedEditorLayoutState(
328
387
  gridSnapStep: GRID_SNAP_STEPS.includes(state?.gridSnapStep as GridSnapStep)
329
388
  ? (state?.gridSnapStep as GridSnapStep)
330
389
  : DEFAULT_PERSISTED_EDITOR_LAYOUT_STATE.gridSnapStep,
390
+ showReferenceFloor: state?.showReferenceFloor === true,
391
+ referenceFloorOffset:
392
+ typeof state?.referenceFloorOffset === 'number' && state.referenceFloorOffset >= 1
393
+ ? Math.floor(state.referenceFloorOffset)
394
+ : DEFAULT_PERSISTED_EDITOR_LAYOUT_STATE.referenceFloorOffset,
395
+ referenceFloorOpacity:
396
+ typeof state?.referenceFloorOpacity === 'number' &&
397
+ Number.isFinite(state.referenceFloorOpacity)
398
+ ? Math.min(0.8, Math.max(0.1, state.referenceFloorOpacity))
399
+ : DEFAULT_PERSISTED_EDITOR_LAYOUT_STATE.referenceFloorOpacity,
331
400
  }
332
401
  }
333
402
 
@@ -466,6 +535,8 @@ const useEditor = create<EditorState>()(
466
535
  const category = get().catalogCategory ?? 'furniture'
467
536
  set({ selectedItem: getDefaultSelectedItemForCategory(category) })
468
537
  }
538
+ } else if (mode === 'material-paint') {
539
+ get().primeMaterialPaintFromSelection()
469
540
  }
470
541
  // When leaving build mode, clear tool
471
542
  else if (tool) {
@@ -530,8 +601,79 @@ const useEditor = create<EditorState>()(
530
601
  setCurvingFence: (fence) => set({ curvingFence: fence }),
531
602
  selectedMaterialTarget: null,
532
603
  setSelectedMaterialTarget: (target) => set({ selectedMaterialTarget: target }),
604
+ activePaintMaterial: null,
605
+ setActivePaintMaterial: (material) => set({ activePaintMaterial: material }),
606
+ activePaintTarget: 'wall',
607
+ setActivePaintTarget: (target) =>
608
+ set((state) =>
609
+ state.activePaintTarget === target ? state : { activePaintTarget: target },
610
+ ),
611
+ primeMaterialPaintFromSelection: () => {
612
+ const selectedId =
613
+ useViewer.getState().selection.selectedIds.length === 1
614
+ ? (useViewer.getState().selection.selectedIds[0] ?? null)
615
+ : null
616
+ const activePaintTarget =
617
+ resolvePaintTargetFromSelection({
618
+ nodes: useScene.getState().nodes,
619
+ selectedId,
620
+ }) ?? get().activePaintTarget
621
+ const activePaintMaterial = resolveActivePaintMaterialFromSelection({
622
+ nodes: useScene.getState().nodes,
623
+ selectedId,
624
+ selectedMaterialTarget: get().selectedMaterialTarget,
625
+ })
626
+
627
+ set({
628
+ activePaintTarget,
629
+ ...(activePaintMaterial ? { activePaintMaterial } : {}),
630
+ })
631
+
632
+ return {
633
+ selectedId,
634
+ activePaintTarget,
635
+ activePaintMaterial: activePaintMaterial ?? get().activePaintMaterial,
636
+ }
637
+ },
638
+ hoveredPaintTarget: null,
639
+ setHoveredPaintTarget: (target) =>
640
+ set((state) =>
641
+ state.hoveredPaintTarget === target ? state : { hoveredPaintTarget: target },
642
+ ),
643
+ isPaintPanelOpen: false,
644
+ setPaintPanelOpen: (open) => set({ isPaintPanelOpen: open }),
533
645
  selectedReferenceId: null,
534
646
  setSelectedReferenceId: (id) => set({ selectedReferenceId: id }),
647
+ guideUi: {},
648
+ setGuideLocked: (guideId, locked) =>
649
+ set((state) => ({
650
+ guideUi: {
651
+ ...state.guideUi,
652
+ [guideId]: {
653
+ ...state.guideUi[guideId],
654
+ locked,
655
+ },
656
+ },
657
+ })),
658
+ setGuideScaleReferenceVisible: (guideId, visible) =>
659
+ set((state) => ({
660
+ guideUi: {
661
+ ...state.guideUi,
662
+ [guideId]: {
663
+ ...state.guideUi[guideId],
664
+ scaleReferenceVisible: visible,
665
+ },
666
+ },
667
+ })),
668
+ clearGuideUi: (guideId) =>
669
+ set((state) => {
670
+ if (!state.guideUi[guideId]) {
671
+ return state
672
+ }
673
+ const guideUi = { ...state.guideUi }
674
+ delete guideUi[guideId]
675
+ return { guideUi }
676
+ }),
535
677
  spaces: {},
536
678
  setSpaces: (spaces) => set({ spaces }),
537
679
  editingHole: null,
@@ -563,6 +705,16 @@ const useEditor = create<EditorState>()(
563
705
  setFloorplanSelectionTool: (tool) => set({ floorplanSelectionTool: tool }),
564
706
  gridSnapStep: DEFAULT_PERSISTED_EDITOR_LAYOUT_STATE.gridSnapStep,
565
707
  setGridSnapStep: (step) => set({ gridSnapStep: step }),
708
+ showReferenceFloor: DEFAULT_PERSISTED_EDITOR_LAYOUT_STATE.showReferenceFloor,
709
+ toggleReferenceFloor: () =>
710
+ set((state) => ({ showReferenceFloor: !state.showReferenceFloor })),
711
+ setShowReferenceFloor: (show) => set({ showReferenceFloor: show }),
712
+ referenceFloorOffset: DEFAULT_PERSISTED_EDITOR_LAYOUT_STATE.referenceFloorOffset,
713
+ setReferenceFloorOffset: (offset) =>
714
+ set({ referenceFloorOffset: Math.max(1, Math.floor(offset)) }),
715
+ referenceFloorOpacity: DEFAULT_PERSISTED_EDITOR_LAYOUT_STATE.referenceFloorOpacity,
716
+ setReferenceFloorOpacity: (opacity) =>
717
+ set({ referenceFloorOpacity: Math.min(0.8, Math.max(0.1, opacity)) }),
566
718
  allowUndergroundCamera: false,
567
719
  setAllowUndergroundCamera: (enabled) => set({ allowUndergroundCamera: enabled }),
568
720
  isFirstPersonMode: false,
@@ -570,8 +722,6 @@ const useEditor = create<EditorState>()(
570
722
  setFirstPersonMode: (enabled) => {
571
723
  if (enabled) {
572
724
  const currentViewMode = get().viewMode
573
- useViewer.getState().setCameraMode('perspective')
574
- useViewer.getState().setWallMode('up')
575
725
  set({
576
726
  isFirstPersonMode: true,
577
727
  _viewModeBeforeFirstPerson: currentViewMode,
@@ -581,7 +731,6 @@ const useEditor = create<EditorState>()(
581
731
  tool: null,
582
732
  catalogCategory: null,
583
733
  })
584
- useViewer.getState().setSelection({ selectedIds: [], zoneId: null })
585
734
  } else {
586
735
  const prevMode = get()._viewModeBeforeFirstPerson
587
736
  set({
@@ -593,6 +742,10 @@ const useEditor = create<EditorState>()(
593
742
  },
594
743
  activeSidebarPanel: DEFAULT_ACTIVE_SIDEBAR_PANEL,
595
744
  setActiveSidebarPanel: (id) => set({ activeSidebarPanel: id }),
745
+ mobilePanelSheetHeight: 0,
746
+ setMobilePanelSheetHeight: (height) => set({ mobilePanelSheetHeight: height }),
747
+ isCaptureMode: false,
748
+ setIsCaptureMode: (enabled) => set({ isCaptureMode: enabled }),
596
749
  floorplanPaneRatio: DEFAULT_PERSISTED_EDITOR_LAYOUT_STATE.floorplanPaneRatio,
597
750
  setFloorplanPaneRatio: (ratio) =>
598
751
  set({ floorplanPaneRatio: normalizeFloorplanPaneRatio(ratio) }),
@@ -629,6 +782,9 @@ const useEditor = create<EditorState>()(
629
782
  splitOrientation: state.splitOrientation,
630
783
  floorplanSelectionTool: state.floorplanSelectionTool,
631
784
  gridSnapStep: state.gridSnapStep,
785
+ showReferenceFloor: state.showReferenceFloor,
786
+ referenceFloorOffset: state.referenceFloorOffset,
787
+ referenceFloorOpacity: state.referenceFloorOpacity,
632
788
  }),
633
789
  },
634
790
  ),