@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.
- package/package.json +7 -6
- package/src/components/editor/bake-exporter.tsx +4 -0
- package/src/components/editor/bake-thumbnail.tsx +4 -1
- package/src/components/editor/floating-action-menu.tsx +14 -1
- package/src/components/editor/floorplan-panel.tsx +23 -3
- package/src/components/editor/handles/handle-placement.test.ts +111 -0
- package/src/components/editor/handles/handle-placement.ts +69 -0
- package/src/components/editor/handles/linear-resize-drag.ts +13 -2
- package/src/components/editor/handles/use-handle-drag.ts +5 -2
- package/src/components/editor/index.tsx +12 -4
- package/src/components/editor/node-arrow-handles.tsx +21 -62
- package/src/components/editor/selection-manager.tsx +49 -0
- package/src/components/editor/thumbnail-generator.tsx +11 -2
- package/src/components/editor-2d/floorplan-registry-action-menu.tsx +12 -1
- package/src/components/editor-2d/renderers/floorplan-registry-layer.tsx +46 -3
- package/src/components/procedural-items/inspector.tsx +223 -0
- package/src/components/systems/ceiling/ceiling-system.tsx +3 -1
- package/src/components/tools/item/item-surface-placement.test.ts +175 -0
- package/src/components/tools/item/item-surface-strategy-resolver.test.ts +210 -0
- package/src/components/tools/item/placement-strategies.ts +169 -169
- package/src/components/tools/item/placement-types.ts +4 -0
- package/src/components/tools/item/shelf-surface-strategy-resolver.test.ts +257 -0
- package/src/components/tools/item/use-draft-node.ts +95 -45
- package/src/components/tools/item/use-placement-coordinator.tsx +247 -106
- package/src/components/tools/registry/item-surface-child-frame.test.ts +90 -0
- package/src/components/tools/registry/item-surface-move.test.ts +501 -0
- package/src/components/tools/registry/item-surface-move.ts +441 -0
- package/src/components/tools/registry/item-surface-resolver.test.ts +257 -0
- package/src/components/tools/registry/move-registry-node-tool.tsx +215 -70
- package/src/components/tools/shared/pointer-support-cap.ts +11 -9
- package/src/components/tools/shared/shelf-stickiness.ts +54 -0
- package/src/components/tools/shared/surface-hit.test.ts +56 -0
- package/src/components/tools/shared/surface-hit.ts +23 -0
- package/src/components/tools/shared/surface-rejection.test.tsx +106 -0
- package/src/components/tools/shared/surface-rejection.tsx +29 -0
- package/src/components/tools/zone/zone-tool.tsx +13 -4
- package/src/components/ui/command-palette/editor-commands.tsx +54 -1
- package/src/components/ui/controls/metric-control.tsx +29 -13
- package/src/components/ui/controls/slider-control.tsx +25 -18
- package/src/components/ui/floating-level-selector.tsx +81 -5
- package/src/components/ui/panels/multi-parametric-inspector.tsx +6 -3
- package/src/components/ui/panels/parametric-field-control.tsx +1 -1
- package/src/components/ui/panels/parametric-inspector.tsx +6 -2
- package/src/components/ui/panels/reference-panel.tsx +3 -3
- package/src/components/ui/primitives/checkbox.tsx +34 -0
- package/src/components/ui/sidebar/panels/settings-panel/index.tsx +120 -3
- package/src/components/ui/sidebar/panels/settings-panel/print-export-button.test.ts +31 -4
- package/src/components/ui/sidebar/panels/settings-panel/print-export-button.tsx +29 -10
- package/src/components/ui/sidebar/panels/site-panel/building-tree-node.tsx +8 -1
- package/src/components/ui/sidebar/panels/site-panel/index.tsx +106 -4
- package/src/components/ui/sidebar/panels/site-panel/item-tree-node.tsx +2 -7
- package/src/components/ui/sidebar/panels/site-panel/shelf-tree-node.tsx +3 -8
- package/src/components/ui/sidebar/panels/site-panel/tree-node.tsx +6 -1
- package/src/components/ui/sidebar/panels/site-panel/unit-tree-node.tsx +224 -0
- package/src/components/ui/sidebar/panels/site-panel/zone-membership-checkbox.tsx +22 -0
- package/src/components/ui/sidebar/panels/site-panel/zone-tree-node.tsx +24 -7
- package/src/components/ui/snap-target-badge.tsx +2 -0
- package/src/components/viewer/viewer-scene-header.tsx +3 -0
- package/src/components/viewer/viewer-units-panel.tsx +116 -0
- package/src/hooks/use-ceiling-events.test.ts +24 -2
- package/src/hooks/use-ceiling-events.ts +5 -1
- package/src/hooks/use-keyboard.ts +3 -1
- package/src/index.tsx +5 -0
- package/src/lib/export-texture-utils.test.ts +167 -0
- package/src/lib/export-texture-utils.ts +121 -0
- package/src/lib/export-user-data.test.ts +48 -0
- package/src/lib/export-user-data.ts +69 -0
- package/src/lib/floorplan/floorplan-export.test.ts +139 -1
- package/src/lib/floorplan/floorplan-export.tsx +9 -3
- package/src/lib/floorplan/floorplan-readonly.ts +4 -0
- package/src/lib/fresh-planar-placement.ts +13 -5
- package/src/lib/glb-export-serialize.test.ts +280 -0
- package/src/lib/glb-export.test.ts +206 -0
- package/src/lib/glb-export.ts +171 -24
- package/src/lib/level-duplication.test.ts +73 -0
- package/src/lib/level-duplication.ts +32 -2
- package/src/lib/linear-display.test.ts +59 -0
- package/src/lib/linear-display.ts +39 -0
- package/src/lib/local-guide-image.test.ts +24 -0
- package/src/lib/local-guide-image.ts +34 -1
- package/src/lib/node-action-movement.ts +21 -0
- package/src/lib/portable-export.test.ts +89 -0
- package/src/lib/portable-export.ts +84 -11
- package/src/lib/print-shell-compiler-manifold-core.ts +59 -10
- package/src/lib/print-shell-compiler-manifold-worker.ts +14 -1
- package/src/lib/print-shell-compiler-manifold.worker.ts +1 -1
- package/src/lib/print-shell-compiler-protocol.ts +8 -0
- package/src/lib/scene-clipboard.ts +1 -1
- package/src/lib/send-to-app.test.ts +108 -0
- package/src/lib/send-to-app.ts +121 -0
- package/src/lib/sfx/movement-tick.ts +37 -0
- package/src/lib/surface-attachment.ts +77 -0
- package/src/lib/units.ts +254 -0
- package/src/lib/usdz-export.ts +43 -16
- package/src/lib/use-linear-display.ts +8 -32
- package/src/store/use-handle-group.ts +4 -0
- 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 {
|
|
5
|
-
import {
|
|
4
|
+
import { useMemo } from 'react'
|
|
5
|
+
import { getLinearDisplay } from './linear-display'
|
|
6
6
|
|
|
7
|
-
/**
|
|
8
|
-
|
|
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
|
|
23
|
-
const displayUnit = isImperial ? getLinearUnitLabel('imperial') : unit
|
|
10
|
+
const metricNotation = useViewer((state) => state.metricNotation)
|
|
24
11
|
|
|
25
|
-
|
|
26
|
-
(
|
|
27
|
-
[
|
|
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,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
|
+
}))
|