Merge origin/main into feat/placement-interaction-overhaul
Resolve 7 conflicts keeping our snapping migration + floorplan perf work as source of truth, combined with main's MEP run-continuation / Alt-detach / latch handles. Rebuilt two import blocks the auto-merge silently truncated (node-arrow-handles.tsx, duct-fitting/move-tool.tsx). Verified: tsc clean across core/viewer/editor/nodes/mcp, 451 tests pass, biome clean. Floorplan view-transform re-render storm confirmed pre-existing (not introduced by this merge). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -7,7 +7,7 @@ A 3D building editor built with React Three Fiber and WebGPU.
|
||||
This is a Turborepo monorepo with three main packages:
|
||||
|
||||
```
|
||||
editor-v2/
|
||||
editor/
|
||||
├── apps/
|
||||
│ └── editor/ # Next.js application (this package)
|
||||
├── packages/
|
||||
|
||||
@@ -172,7 +172,8 @@ export function BuildTab() {
|
||||
const ductContext =
|
||||
mode === 'build' && (activeTool === 'duct-segment' || activeTool === 'duct-fitting')
|
||||
const pipeContext =
|
||||
mode === 'build' && (activeTool === 'pipe-segment' || activeTool === 'pipe-fitting')
|
||||
mode === 'build' &&
|
||||
(activeTool === 'pipe-segment' || activeTool === 'pipe-fitting' || activeTool === 'pipe-trap')
|
||||
const liquidLineContext = mode === 'build' && activeTool === 'liquid-line'
|
||||
|
||||
const isMepItemActive = (item: MepItem) =>
|
||||
@@ -445,6 +446,30 @@ export function BuildTab() {
|
||||
/>
|
||||
Add Fitting
|
||||
</button>
|
||||
<button
|
||||
className={cn(
|
||||
'flex items-center gap-2 rounded-lg px-3 py-2 text-sm transition-all duration-200',
|
||||
activeTool === 'pipe-trap'
|
||||
? 'bg-primary/10 ring-1 ring-primary/50'
|
||||
: 'bg-muted/40 hover:bg-muted',
|
||||
)}
|
||||
onClick={() => {
|
||||
triggerSFX('sfx:menu-click')
|
||||
activateBuildTool(activeTool === 'pipe-trap' ? 'pipe-segment' : 'pipe-trap')
|
||||
}}
|
||||
onMouseEnter={() => triggerSFX('sfx:menu-hover')}
|
||||
type="button"
|
||||
>
|
||||
<Image
|
||||
alt=""
|
||||
aria-hidden
|
||||
className="size-4 object-contain"
|
||||
height={16}
|
||||
src="/icons/dwv-pipes.png"
|
||||
width={16}
|
||||
/>
|
||||
Add Trap
|
||||
</button>
|
||||
</div>
|
||||
) : null}
|
||||
|
||||
|
||||
@@ -119,11 +119,12 @@ const levelModeLabels: Record<string, string> = {
|
||||
solo: 'Solo',
|
||||
}
|
||||
|
||||
const wallModeOrder = ['cutaway', 'up', 'down'] as const
|
||||
const wallModeOrder = ['cutaway', 'up', 'down', 'translucent'] as const
|
||||
const wallModeConfig: Record<string, { icon: string; label: string }> = {
|
||||
up: { icon: '/icons/room.webp', label: 'Full height' },
|
||||
cutaway: { icon: '/icons/wallcut.webp', label: 'Cutaway' },
|
||||
down: { icon: '/icons/walllow.webp', label: 'Low' },
|
||||
translucent: { icon: '/icons/wall.webp', label: 'Translucent' },
|
||||
}
|
||||
|
||||
const SHADING_OPTIONS = [
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
"build": "dotenv -e ../../.env.local -- next build",
|
||||
"start": "next start",
|
||||
"lint": "biome lint",
|
||||
"check-types": "next typegen && tsc --noEmit"
|
||||
"check-types": "next typegen && tsgo --noEmit"
|
||||
},
|
||||
"dependencies": {
|
||||
"@iconify/react": "^6.0.2",
|
||||
@@ -25,7 +25,7 @@
|
||||
"clsx": "^2.1.1",
|
||||
"geist": "^1.7.0",
|
||||
"lucide-react": "^1.7.0",
|
||||
"next": "16.2.6",
|
||||
"next": "16.2.9",
|
||||
"postcss": "^8.5.6",
|
||||
"react": "^19.2.4",
|
||||
"react-dom": "^19.2.4",
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -14,7 +14,7 @@ import { Box, Grid2x2, Layers, Layers2, Maximize, ScanLine, Square } from 'lucid
|
||||
import { type ReactNode, useMemo } from 'react'
|
||||
|
||||
const levelModes = ['stacked', 'solo', 'exploded', 'manual'] as const
|
||||
const wallModes = ['up', 'cutaway', 'down'] as const
|
||||
const wallModes = ['up', 'cutaway', 'down', 'translucent'] as const
|
||||
|
||||
const levelLabel: Record<(typeof levelModes)[number], string> = {
|
||||
stacked: 'Stack',
|
||||
@@ -27,6 +27,7 @@ const wallLabel: Record<(typeof wallModes)[number], string> = {
|
||||
up: 'Full',
|
||||
cutaway: 'Cutaway',
|
||||
down: 'Down',
|
||||
translucent: 'Translucent',
|
||||
}
|
||||
|
||||
function cycle<T>(list: readonly T[], current: T): T {
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
"build": "next build",
|
||||
"start": "next start",
|
||||
"lint": "biome lint",
|
||||
"check-types": "next typegen && tsc --noEmit"
|
||||
"check-types": "next typegen && tsgo --noEmit"
|
||||
},
|
||||
"dependencies": {
|
||||
"@pascal-app/core": "*",
|
||||
@@ -23,7 +23,7 @@
|
||||
"@react-three/fiber": "^9.5.0",
|
||||
"@tailwindcss/postcss": "^4.2.1",
|
||||
"clsx": "^2.1.1",
|
||||
"next": "16.2.6",
|
||||
"next": "16.2.9",
|
||||
"postcss": "^8.5.6",
|
||||
"react": "^19.2.4",
|
||||
"react-dom": "^19.2.4",
|
||||
|
||||
Reference in New Issue
Block a user