@pascal-app/editor 1.0.0 → 1.0.1

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 (97) hide show
  1. package/package.json +7 -6
  2. package/src/components/editor/bake-exporter.tsx +4 -0
  3. package/src/components/editor/bake-thumbnail.tsx +4 -1
  4. package/src/components/editor/floating-action-menu.tsx +14 -1
  5. package/src/components/editor/floorplan-panel.tsx +23 -3
  6. package/src/components/editor/handles/handle-placement.test.ts +111 -0
  7. package/src/components/editor/handles/handle-placement.ts +69 -0
  8. package/src/components/editor/handles/linear-resize-drag.ts +13 -2
  9. package/src/components/editor/handles/use-handle-drag.ts +5 -2
  10. package/src/components/editor/index.tsx +12 -4
  11. package/src/components/editor/node-arrow-handles.tsx +21 -62
  12. package/src/components/editor/selection-manager.tsx +49 -0
  13. package/src/components/editor/thumbnail-generator.tsx +11 -2
  14. package/src/components/editor-2d/floorplan-registry-action-menu.tsx +12 -1
  15. package/src/components/editor-2d/renderers/floorplan-registry-layer.tsx +46 -3
  16. package/src/components/procedural-items/inspector.tsx +223 -0
  17. package/src/components/systems/ceiling/ceiling-system.tsx +3 -1
  18. package/src/components/tools/item/item-surface-placement.test.ts +175 -0
  19. package/src/components/tools/item/item-surface-strategy-resolver.test.ts +210 -0
  20. package/src/components/tools/item/placement-strategies.ts +169 -169
  21. package/src/components/tools/item/placement-types.ts +4 -0
  22. package/src/components/tools/item/shelf-surface-strategy-resolver.test.ts +257 -0
  23. package/src/components/tools/item/use-draft-node.ts +95 -45
  24. package/src/components/tools/item/use-placement-coordinator.tsx +247 -106
  25. package/src/components/tools/registry/item-surface-child-frame.test.ts +90 -0
  26. package/src/components/tools/registry/item-surface-move.test.ts +501 -0
  27. package/src/components/tools/registry/item-surface-move.ts +441 -0
  28. package/src/components/tools/registry/item-surface-resolver.test.ts +257 -0
  29. package/src/components/tools/registry/move-registry-node-tool.tsx +215 -70
  30. package/src/components/tools/shared/pointer-support-cap.ts +11 -9
  31. package/src/components/tools/shared/shelf-stickiness.ts +54 -0
  32. package/src/components/tools/shared/surface-hit.test.ts +56 -0
  33. package/src/components/tools/shared/surface-hit.ts +23 -0
  34. package/src/components/tools/shared/surface-rejection.test.tsx +106 -0
  35. package/src/components/tools/shared/surface-rejection.tsx +29 -0
  36. package/src/components/tools/zone/zone-tool.tsx +13 -4
  37. package/src/components/ui/command-palette/editor-commands.tsx +54 -1
  38. package/src/components/ui/controls/metric-control.tsx +29 -13
  39. package/src/components/ui/controls/slider-control.tsx +25 -18
  40. package/src/components/ui/floating-level-selector.tsx +81 -5
  41. package/src/components/ui/panels/multi-parametric-inspector.tsx +6 -3
  42. package/src/components/ui/panels/parametric-field-control.tsx +1 -1
  43. package/src/components/ui/panels/parametric-inspector.tsx +6 -2
  44. package/src/components/ui/panels/reference-panel.tsx +3 -3
  45. package/src/components/ui/primitives/checkbox.tsx +34 -0
  46. package/src/components/ui/sidebar/panels/settings-panel/index.tsx +120 -3
  47. package/src/components/ui/sidebar/panels/settings-panel/print-export-button.test.ts +31 -4
  48. package/src/components/ui/sidebar/panels/settings-panel/print-export-button.tsx +29 -10
  49. package/src/components/ui/sidebar/panels/site-panel/building-tree-node.tsx +8 -1
  50. package/src/components/ui/sidebar/panels/site-panel/index.tsx +106 -4
  51. package/src/components/ui/sidebar/panels/site-panel/item-tree-node.tsx +2 -7
  52. package/src/components/ui/sidebar/panels/site-panel/shelf-tree-node.tsx +3 -8
  53. package/src/components/ui/sidebar/panels/site-panel/tree-node.tsx +6 -1
  54. package/src/components/ui/sidebar/panels/site-panel/unit-tree-node.tsx +224 -0
  55. package/src/components/ui/sidebar/panels/site-panel/zone-membership-checkbox.tsx +22 -0
  56. package/src/components/ui/sidebar/panels/site-panel/zone-tree-node.tsx +24 -7
  57. package/src/components/ui/snap-target-badge.tsx +2 -0
  58. package/src/components/viewer/viewer-scene-header.tsx +3 -0
  59. package/src/components/viewer/viewer-units-panel.tsx +116 -0
  60. package/src/hooks/use-ceiling-events.test.ts +24 -2
  61. package/src/hooks/use-ceiling-events.ts +5 -1
  62. package/src/hooks/use-keyboard.ts +3 -1
  63. package/src/index.tsx +5 -0
  64. package/src/lib/export-texture-utils.test.ts +167 -0
  65. package/src/lib/export-texture-utils.ts +121 -0
  66. package/src/lib/export-user-data.test.ts +48 -0
  67. package/src/lib/export-user-data.ts +69 -0
  68. package/src/lib/floorplan/floorplan-export.test.ts +139 -1
  69. package/src/lib/floorplan/floorplan-export.tsx +9 -3
  70. package/src/lib/floorplan/floorplan-readonly.ts +4 -0
  71. package/src/lib/fresh-planar-placement.ts +13 -5
  72. package/src/lib/glb-export-serialize.test.ts +280 -0
  73. package/src/lib/glb-export.test.ts +206 -0
  74. package/src/lib/glb-export.ts +171 -24
  75. package/src/lib/level-duplication.test.ts +73 -0
  76. package/src/lib/level-duplication.ts +32 -2
  77. package/src/lib/linear-display.test.ts +59 -0
  78. package/src/lib/linear-display.ts +39 -0
  79. package/src/lib/local-guide-image.test.ts +24 -0
  80. package/src/lib/local-guide-image.ts +34 -1
  81. package/src/lib/node-action-movement.ts +21 -0
  82. package/src/lib/portable-export.test.ts +89 -0
  83. package/src/lib/portable-export.ts +84 -11
  84. package/src/lib/print-shell-compiler-manifold-core.ts +59 -10
  85. package/src/lib/print-shell-compiler-manifold-worker.ts +14 -1
  86. package/src/lib/print-shell-compiler-manifold.worker.ts +1 -1
  87. package/src/lib/print-shell-compiler-protocol.ts +8 -0
  88. package/src/lib/scene-clipboard.ts +1 -1
  89. package/src/lib/send-to-app.test.ts +108 -0
  90. package/src/lib/send-to-app.ts +121 -0
  91. package/src/lib/sfx/movement-tick.ts +37 -0
  92. package/src/lib/surface-attachment.ts +77 -0
  93. package/src/lib/units.ts +254 -0
  94. package/src/lib/usdz-export.ts +43 -16
  95. package/src/lib/use-linear-display.ts +8 -32
  96. package/src/store/use-handle-group.ts +4 -0
  97. package/src/store/use-send-to-app.ts +21 -0
@@ -1,40 +1,16 @@
1
1
  'use client'
2
2
 
3
3
  import { useViewer } from '@pascal-app/viewer'
4
- import { useCallback } from 'react'
5
- import { getLinearUnitLabel, linearUnitToMeters, metersToLinearUnit } from './measurements'
4
+ import { useMemo } from 'react'
5
+ import { getLinearDisplay } from './linear-display'
6
6
 
7
- /**
8
- * Shared display/storage conversion for numeric property controls so that
9
- * every length input honors the metric/imperial toggle identically.
10
- *
11
- * Values are always STORED in the field's own unit (meters for `unit === 'm'`).
12
- * When the viewer preference is imperial AND the field is a meter length, the
13
- * value is DISPLAYED (and edited) in feet; otherwise the conversions are the
14
- * identity, so metric fields and non-length units (`'°'`, `'%'`, `'in'`, `''`,
15
- * …) behave exactly as before.
16
- *
17
- * Used by both `SliderControl` and `MetricControl` — keep the two in sync via
18
- * this single source of truth.
19
- */
20
- export function useLinearDisplay(unit: string, precision: number) {
7
+ /** Shared display/input conversion; values and bounds stay in the stored unit. */
8
+ export function useLinearDisplay(unit: string, precision: number, step = 1) {
21
9
  const viewerUnit = useViewer((state) => state.unit)
22
- const isImperial = viewerUnit === 'imperial' && unit === 'm'
23
- const displayUnit = isImperial ? getLinearUnitLabel('imperial') : unit
10
+ const metricNotation = useViewer((state) => state.metricNotation)
24
11
 
25
- const toDisplay = useCallback(
26
- (stored: number) => (isImperial ? metersToLinearUnit(stored, 'imperial') : stored),
27
- [isImperial],
12
+ return useMemo(
13
+ () => getLinearDisplay(unit, viewerUnit, metricNotation, precision, step),
14
+ [unit, viewerUnit, metricNotation, precision, step],
28
15
  )
29
- const toStored = useCallback(
30
- (display: number) => (isImperial ? linearUnitToMeters(display, 'imperial') : display),
31
- [isImperial],
32
- )
33
- // Round a stored value so it lands on a clean number of DISPLAY-unit digits.
34
- const roundStored = useCallback(
35
- (stored: number) => toStored(Number.parseFloat(toDisplay(stored).toFixed(precision))),
36
- [toDisplay, toStored, precision],
37
- )
38
-
39
- return { isImperial, displayUnit, toDisplay, toStored, roundStored }
40
16
  }
@@ -0,0 +1,4 @@
1
+ import { create } from 'zustand'
2
+ export const useHandleGroup = create<{ active: { nodeId: string; group: string } | null }>(() => ({
3
+ active: null,
4
+ }))
@@ -0,0 +1,21 @@
1
+ import { create } from 'zustand'
2
+
3
+ /** Progress of a "Send to Blender" hand-off. Lives outside the settings panel so
4
+ * switching tabs mid-send neither drops the lock nor loses the outcome. */
5
+ export type SendToAppStep = 'probing' | 'exporting' | 'sending' | 'importing'
6
+
7
+ export type SendToAppMessage = { tone: 'info' | 'error'; text: string }
8
+
9
+ type SendToAppState = {
10
+ step: SendToAppStep | null
11
+ message: SendToAppMessage | null
12
+ setStep: (step: SendToAppStep | null) => void
13
+ setMessage: (message: SendToAppMessage | null) => void
14
+ }
15
+
16
+ export const useSendToApp = create<SendToAppState>((set) => ({
17
+ step: null,
18
+ message: null,
19
+ setStep: (step) => set({ step }),
20
+ setMessage: (message) => set({ message }),
21
+ }))