Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
76 commits
Select commit Hold shift + click to select a range
3731eb3
Add roof surface placement support for items
sudhir9297 May 18, 2026
ed53bc2
Merge branch 'main' of github.com:pascalorg/editor
sudhir9297 May 20, 2026
fd8e02c
Merge branch 'main' of github.com:pascalorg/editor
sudhir9297 May 20, 2026
7c1e383
fixed conflict
sudhir9297 May 20, 2026
b3377da
Merge branch 'main' of github.com:pascalorg/editor
sudhir9297 May 20, 2026
f177a65
Merge branch 'main' of github.com:pascalorg/editor
sudhir9297 May 22, 2026
9af7491
Merge branch 'main' of github.com:pascalorg/editor
sudhir9297 May 22, 2026
fd27524
Merge branch 'main' of github.com:pascalorg/editor
sudhir9297 May 27, 2026
b516298
Merge branch 'main' of github.com:pascalorg/editor
sudhir9297 May 28, 2026
ebfc8ce
Merge branch 'main' of github.com:pascalorg/editor
sudhir9297 Jun 3, 2026
b7b313b
Merge branch 'main' of github.com:pascalorg/editor
sudhir9297 Jun 4, 2026
b2ad645
Merge branch 'main' of github.com:pascalorg/editor
sudhir9297 Jun 4, 2026
bffdb4a
Merge branch 'main' of github.com:pascalorg/editor
sudhir9297 Jun 8, 2026
ee7b10c
Merge branch 'main' of github.com:pascalorg/editor
sudhir9297 Jun 9, 2026
7d4b474
Merge branch 'main' of github.com:pascalorg/editor
sudhir9297 Jun 10, 2026
87ec427
feat(core): add NodePort and def.ports to the node registry
sudhir9297 Jun 11, 2026
fa14953
feat(core): add HVAC node schemas
sudhir9297 Jun 11, 2026
af5711b
feat(editor): extract generic DimensionPill from MeasurementPill
sudhir9297 Jun 11, 2026
80f6f39
feat(editor): rotation-axis state and HVAC structure tool ids
sudhir9297 Jun 11, 2026
406a36e
feat(editor): rotation-axis pill above the floating action menu
sudhir9297 Jun 11, 2026
956c465
feat(nodes): duct-segment kind — draw tool, drag handles, floorplan
sudhir9297 Jun 11, 2026
8e2f66b
feat(nodes): duct-fitting kind — elbow / tee / reducer with typed ports
sudhir9297 Jun 11, 2026
4b67eff
feat(nodes): duct-terminal kind — registers, diffusers, return grilles
sudhir9297 Jun 11, 2026
59905c8
feat(nodes): hvac-equipment kind — furnace, air handler, condenser
sudhir9297 Jun 11, 2026
92c5a7d
feat(nodes): register HVAC kinds in the builtin plugin
sudhir9297 Jun 11, 2026
2ddd6c0
feat(app): Build tab tiles for the HVAC tools
sudhir9297 Jun 11, 2026
1afd739
feat(nodes): detailed HVAC equipment models + duct-terminal mounting
sudhir9297 Jun 11, 2026
3b48cc3
chore(ifc-converter): refresh generated next-env route-types reference
sudhir9297 Jun 11, 2026
d4b2331
feat(core): port-connectivity service
sudhir9297 Jun 11, 2026
239a946
feat(core): cursorAttached and portSnap options on the movable capabi…
sudhir9297 Jun 11, 2026
59a7f31
feat(nodes): system-scoped port queries
sudhir9297 Jun 11, 2026
a515698
fix(viewer): keep a node's X/Z rotation under live move transforms
sudhir9297 Jun 11, 2026
4122f65
feat(editor): port snap, cursor attach, and connectivity in the move …
sudhir9297 Jun 11, 2026
2ad4ea7
feat(nodes): ceiling mode and diameter stepping in the duct draw tool
sudhir9297 Jun 11, 2026
5d74051
feat(nodes): connectivity-aware duct endpoint drags
sudhir9297 Jun 11, 2026
c5d8232
feat(nodes): fittings ride the cursor, terminals snap to duct ports
sudhir9297 Jun 11, 2026
ef41b6d
feat(nodes): refrigerant service ports on HVAC equipment
sudhir9297 Jun 11, 2026
64e568e
feat(nodes): lineset kind — refrigerant suction + liquid pair
sudhir9297 Jun 11, 2026
5815877
feat(nodes): auto-elbow insertion at duct corners
sudhir9297 Jun 11, 2026
aab0d36
fix(nodes): auto-elbow sits ON the drawn corner, trimming the joined run
sudhir9297 Jun 11, 2026
6e7449c
feat(nodes): tee taps — branch off the side of a trunk
sudhir9297 Jun 11, 2026
d5499cb
fix(nodes): re-aim an existing elbow when a run lands on its collar
sudhir9297 Jun 11, 2026
f566c24
feat(core,editor): system graph + system pill on selected HVAC nodes
sudhir9297 Jun 11, 2026
fa4afc0
feat(nodes): rectangular trunk cross-section for duct runs
sudhir9297 Jun 11, 2026
2cfee84
feat(nodes): profile inheritance while drawing + rect fittings
sudhir9297 Jun 11, 2026
31baa9e
fix(nodes): mitered rect elbow — one folded solid instead of boxes
sudhir9297 Jun 11, 2026
b49de55
feat(app): proper vector icons for the HVAC Build tiles
sudhir9297 Jun 11, 2026
d1f46e0
feat(nodes): DWV pipe-segment — plumbing phase opens with sloped drains
sudhir9297 Jun 11, 2026
82d6f0a
feat(nodes): DWV fittings — bends, wyes, sanitary tees auto-minted
sudhir9297 Jun 11, 2026
f232b1b
feat(nodes): plumbing fixtures — toilets, sinks, tubs with drain ports
sudhir9297 Jun 11, 2026
3e70bfa
refactor(nodes): replace plumbing-fixture node with pipe-trap
sudhir9297 Jun 12, 2026
0b2364b
feat(core): parametric derive/reconcile inspector hooks
sudhir9297 Jun 12, 2026
6af9559
feat(nodes): oval duct fittings + lateral tees
sudhir9297 Jun 12, 2026
444d658
feat(nodes): pipe-segment auto-slope start lift + selection handles
sudhir9297 Jun 12, 2026
0aafe9d
feat: DWV riser diagram + validation services
sudhir9297 Jun 12, 2026
857c9d4
fix(nodes): pipe-segment draws level by default, slope opt-in via S
sudhir9297 Jun 12, 2026
fe4fdd5
feat(nodes): pipe-fitting placement tool + Build tab Add Fitting panel
sudhir9297 Jun 12, 2026
ac5be08
refactor(nodes): address architecture-review findings on DWV/HVAC branch
sudhir9297 Jun 12, 2026
3a3318c
Merge branch 'main' of github.com:pascalorg/editor
sudhir9297 Jun 13, 2026
0f1ae46
Merge remote-tracking branch 'origin/main' into fix/wed-jun-10
sudhir9297 Jun 13, 2026
279cb2e
style(editor): fix import order in editor/index after merge
sudhir9297 Jun 13, 2026
11d51bf
style(nodes): biome format + import cleanup on HVAC/DWV files
sudhir9297 Jun 13, 2026
fdfa0e1
feat(nodes): ghost-preview duplicate/move for HVAC/DWV runs + univers…
sudhir9297 Jun 15, 2026
31ee5ea
feat(nodes): raster tool icons + 3D draw-cursor parity for HVAC/DWV
sudhir9297 Jun 15, 2026
8bc1e9b
feat(nodes): standalone liquid-line MEP tool with click-to-trace follow
sudhir9297 Jun 15, 2026
254d0db
Merge remote-tracking branch 'upstream/main' into fix/wed-jun-10
sudhir9297 Jun 15, 2026
bf66342
feat(nodes): auto tee/cross fittings for duct & DWV runs
sudhir9297 Jun 16, 2026
74b7351
fix(nodes): register snaps onto slab top / real ceiling
sudhir9297 Jun 16, 2026
a3b5e4d
fix(lint): resolve all biome check issues
sudhir9297 Jun 16, 2026
c1bfb88
fix(viewer): restore appearance-change dirty-mark in GeometrySystem
sudhir9297 Jun 16, 2026
0d96cb5
revert(lint): undo over-eager --unsafe dep-array rewrites
sudhir9297 Jun 16, 2026
05129d6
chore: restore auto-generated next-env.d.ts to branch baseline
sudhir9297 Jun 16, 2026
463dee4
fix(lint): clear the 7 biome warnings (dead suppressions, optional ch…
sudhir9297 Jun 16, 2026
306a705
fix(nodes,editor): two stale-closure bugs surfaced by dep-array audit
sudhir9297 Jun 16, 2026
1ab570e
fix(lint): clear the 88 useExhaustiveDependencies infos
sudhir9297 Jun 16, 2026
8e76a88
Merge branch 'main' into fix/wed-jun-10
sudhir9297 Jun 16, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
208 changes: 203 additions & 5 deletions apps/editor/components/build-tab.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import { nodeRegistry } from '@pascal-app/core'
import { MaterialPaintPanel, triggerSFX, useEditor } from '@pascal-app/editor'
import { useLiquidLineToolOptions } from '@pascal-app/nodes'
import Image from 'next/image'
import { useCallback, useEffect, useMemo, useRef, useState } from 'react'
import {
Expand Down Expand Up @@ -30,17 +31,40 @@ type BuildToolKind =
| 'shelf'
| 'spawn'

/**
* MEP (mechanical / plumbing) tool kinds surfaced under the Build tab's "MEP"
* group tile — its own sub-grid, like Roof's "Features".
*/
type MepToolKind =
| 'duct-segment'
| 'duct-fitting'
| 'duct-terminal'
| 'hvac-equipment'
| 'lineset'
| 'liquid-line'
| 'pipe-segment'
| 'pipe-fitting'

type BuildType = {
/** Selection id — equals `kind` for tool types, `'painting'` for paint mode. */
/** Selection id — equals `kind` for tool types, `'painting'` for paint mode, `'mep'` for the MEP group. */
id: string
label: string
/** Raster asset tile (legacy Build sidebar artwork). */
iconSrc: string
/** Present for structure-tool types (absent for the paint mode). */
/** Present for structure-tool types (absent for paint mode and the MEP group). */
kind?: BuildToolKind
/** Non-placement special mode. */
mode?: 'material-paint'
}

type MepItem = {
/** Selection id — equals `kind`. */
id: string
label: string
iconSrc: string
kind: MepToolKind
}

// Same icons + ordering as the community Build sidebar, minus presets.
const BUILD_TYPES: BuildType[] = [
{ id: 'wall', label: 'Wall', iconSrc: '/icons/wall.png', kind: 'wall' },
Expand All @@ -55,14 +79,32 @@ const BUILD_TYPES: BuildType[] = [
{ id: 'column', label: 'Column', iconSrc: '/icons/column.png', kind: 'column' },
{ id: 'shelf', label: 'Shelf', iconSrc: '/icons/shelf.png', kind: 'shelf' },
{ id: 'spawn', label: 'Spawn Point', iconSrc: '/icons/spawn-point.png', kind: 'spawn' },
// Group tile — no tool of its own; opens the MEP sub-grid below (like Roof).
{ id: 'mep', label: 'MEP', iconSrc: '/icons/HVAC.png' },
{ id: 'painting', label: 'Painting', iconSrc: '/icons/paint.png', mode: 'material-paint' },
]

// MEP sub-grid surfaced under the "MEP" tile — same icons + ordering the MEP
// tools had in the community Build sidebar.
const MEP_ITEMS: MepItem[] = [
{ id: 'duct-segment', label: 'Duct', iconSrc: '/icons/duct.png', kind: 'duct-segment' },
{
id: 'duct-terminal',
label: 'Register',
iconSrc: '/icons/registers.png',
kind: 'duct-terminal',
},
{ id: 'hvac-equipment', label: 'HVAC Unit', iconSrc: '/icons/HVAC.png', kind: 'hvac-equipment' },
{ id: 'lineset', label: 'Lineset', iconSrc: '/icons/lineset.png', kind: 'lineset' },
{ id: 'liquid-line', label: 'Liquid Line', iconSrc: '/icons/lineset.png', kind: 'liquid-line' },
{ id: 'pipe-segment', label: 'DWV Pipe', iconSrc: '/icons/dwv-pipes.png', kind: 'pipe-segment' },
]

/**
* Activate a raw structure draw/cursor tool. Mirrors the editor's own
* structure-tool activation (`setPhase`/`setStructureLayer`/`setMode`/`setTool`).
*/
function activateBuildTool(kind: BuildToolKind): void {
function activateBuildTool(kind: BuildToolKind | MepToolKind): void {
const ed = useEditor.getState()
ed.setPhase('structure')
ed.setStructureLayer('elements')
Expand Down Expand Up @@ -111,10 +153,31 @@ function activateRoofFeatureTool(kind: string): void {
export function BuildTab() {
const activeTool = useEditor((s) => s.tool)
const mode = useEditor((s) => s.mode)
// Which build tile's panel is showing. Roof is the only tile with a panel
// (its Features group); others arm a tool and show nothing below.
const follow = useLiquidLineToolOptions((s) => s.follow)
const toggleFollow = useLiquidLineToolOptions((s) => s.toggleFollow)
// Which build tile's panel is showing. Roof (Features) and MEP (its tool
// sub-grid) are the tiles with a panel; others arm a tool and show nothing
// below.
const [selectedTypeId, setSelectedTypeId] = useState<string | null>(null)

// The fitting / follow tools are armed from a segment's panel, not a grid
// tile — keep the segment tile lit so the panel (and the way back) stays
// visible.
const ductContext =
mode === 'build' && (activeTool === 'duct-segment' || activeTool === 'duct-fitting')
const pipeContext =
mode === 'build' && (activeTool === 'pipe-segment' || activeTool === 'pipe-fitting')
const liquidLineContext = mode === 'build' && activeTool === 'liquid-line'

const isMepItemActive = (item: MepItem) =>
item.kind === 'duct-segment'
? ductContext
: item.kind === 'pipe-segment'
? pipeContext
: item.kind === 'liquid-line'
? liquidLineContext
: mode === 'build' && activeTool === item.kind

// Read at render time (not module scope): the registry is populated by the
// app bootstrap, so enumerating earlier would race it and see no kinds.
const roofFeatures = useMemo<RoofFeature[]>(() => {
Expand All @@ -141,6 +204,10 @@ export function BuildTab() {
const handleTypeClick = useCallback((type: BuildType) => {
if (type.mode === 'material-paint') {
activatePaintMode()
} else if (type.id === 'mep') {
// MEP is a group tile: arm its first tool so a usable tool is active
// (and we leave any prior paint mode), then reveal the MEP sub-grid.
activateBuildTool('duct-segment')
} else if (type.kind) {
activateBuildTool(type.kind)
}
Expand Down Expand Up @@ -250,6 +317,137 @@ export function BuildTab() {
</div>
</TooltipProvider>
</div>
) : selectedTypeId === 'mep' ? (
<div className="flex min-h-0 flex-1 flex-col gap-2 overflow-y-auto">
<div className="px-0.5 pt-1 font-medium text-muted-foreground text-xs">MEP</div>
<TooltipProvider delayDuration={0} disableHoverableContent>
<div
className="grid gap-1.5 px-0.5"
style={{ gridTemplateColumns: 'repeat(auto-fill, minmax(56px, 1fr))' }}
>
{MEP_ITEMS.map((item) => {
const active = isMepItemActive(item)
return (
<Tooltip key={item.id}>
<TooltipTrigger asChild>
<button
className={cn(
'group relative flex aspect-square items-center justify-center rounded-xl transition-all duration-200',
active
? 'bg-primary/10 ring-1 ring-primary/50'
: 'bg-muted/40 opacity-70 grayscale hover:bg-muted hover:opacity-100 hover:grayscale-0',
)}
onClick={() => {
triggerSFX('sfx:menu-click')
activateBuildTool(item.kind)
}}
onMouseEnter={() => triggerSFX('sfx:menu-hover')}
type="button"
>
<Image
alt={item.label}
className="size-full object-contain transition-transform duration-200 group-hover:scale-110"
height={48}
src={item.iconSrc}
width={48}
/>
</button>
</TooltipTrigger>
<TooltipContent className="pointer-events-none" side="top">
{item.label}
</TooltipContent>
</Tooltip>
)
})}
</div>
</TooltipProvider>

{ductContext ? (
<div className="flex flex-col gap-1.5">
<span className="text-muted-foreground text-xs">Duct</span>
<button
className={cn(
'flex items-center gap-2 rounded-lg px-3 py-2 text-sm transition-all duration-200',
activeTool === 'duct-fitting'
? 'bg-primary/10 ring-1 ring-primary/50'
: 'bg-muted/40 hover:bg-muted',
)}
onClick={() => {
triggerSFX('sfx:menu-click')
activateBuildTool(activeTool === 'duct-fitting' ? 'duct-segment' : 'duct-fitting')
}}
onMouseEnter={() => triggerSFX('sfx:menu-hover')}
type="button"
>
<Image
alt=""
aria-hidden
className="size-4 object-contain"
height={16}
src="/icons/duct-fitting.png"
width={16}
/>
Add Fitting
</button>
</div>
) : null}

{pipeContext ? (
<div className="flex flex-col gap-1.5">
<span className="text-muted-foreground text-xs">DWV Pipe</span>
<button
className={cn(
'flex items-center gap-2 rounded-lg px-3 py-2 text-sm transition-all duration-200',
activeTool === 'pipe-fitting'
? 'bg-primary/10 ring-1 ring-primary/50'
: 'bg-muted/40 hover:bg-muted',
)}
onClick={() => {
triggerSFX('sfx:menu-click')
activateBuildTool(activeTool === 'pipe-fitting' ? 'pipe-segment' : 'pipe-fitting')
}}
onMouseEnter={() => triggerSFX('sfx:menu-hover')}
type="button"
>
<Image
alt=""
aria-hidden
className="size-4 object-contain"
height={16}
src="/icons/duct-fitting.png"
width={16}
/>
Add Fitting
</button>
</div>
) : null}

{liquidLineContext ? (
<div className="flex flex-col gap-1.5">
<span className="text-muted-foreground text-xs">Liquid Line</span>
<button
className={cn(
'flex items-center justify-between gap-2 rounded-lg px-3 py-2 text-sm transition-all duration-200',
follow ? 'bg-primary/10 ring-1 ring-primary/50' : 'bg-muted/40 hover:bg-muted',
)}
onClick={() => {
triggerSFX('sfx:menu-click')
toggleFollow()
}}
onMouseEnter={() => triggerSFX('sfx:menu-hover')}
type="button"
>
<span>Follow lineset</span>
<span className="text-muted-foreground text-xs">{follow ? 'On' : 'Off'}</span>
</button>
<span className="px-1 text-[11px] text-muted-foreground">
{follow
? 'Click a lineset to lay the line beside it.'
: 'Trace a line alongside an existing lineset (F).'}
</span>
</div>
) : null}
</div>
) : null}
</div>
)
Expand Down
Binary file added apps/editor/public/icons/HVAC.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added apps/editor/public/icons/duct-fitting.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added apps/editor/public/icons/duct.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added apps/editor/public/icons/dwv-pipes.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added apps/editor/public/icons/lineset.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added apps/editor/public/icons/registers.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 3 additions & 1 deletion apps/ifc-converter/components/IfcConverter.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@ export default function IfcConverter() {
return results
}, [pascalData, searchQuery])

// biome-ignore lint/correctness/useExhaustiveDependencies: runs once on mount to load the initial file from the URL.
useEffect(() => {
const params = new URLSearchParams(window.location.search)
const requested = params.get('file')
Expand Down Expand Up @@ -201,6 +202,7 @@ export default function IfcConverter() {
}
}

// biome-ignore lint/correctness/useExhaustiveDependencies: stable drop handler; handleFile only calls setState setters, so a mount-time capture stays correct.
const handleDrop = useCallback((e: React.DragEvent) => {
e.preventDefault()
setIsDragging(false)
Expand Down Expand Up @@ -234,7 +236,7 @@ export default function IfcConverter() {
const url = URL.createObjectURL(blob)
const a = document.createElement('a')
a.href = url
a.download = fileName.replace('.ifc', '') + '_pascal.json'
a.download = `${fileName.replace('.ifc', '')}_pascal.json`
a.click()
URL.revokeObjectURL(url)
}
Expand Down
2 changes: 1 addition & 1 deletion apps/ifc-converter/next-env.d.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/// <reference types="next" />
/// <reference types="next/image-types/global" />
import "./.next/types/routes.d.ts";
import "./.next/dev/types/routes.d.ts";

// NOTE: This file should not be edited
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
27 changes: 27 additions & 0 deletions packages/core/src/events/bus.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,22 @@ import type {
DoorNode,
DormerNode,
DownspoutNode,
DuctFittingNode,
DuctSegmentNode,
DuctTerminalNode,
ElevatorNode,
EyebrowVentNode,
FenceNode,
GuideNode,
GutterNode,
HvacEquipmentNode,
ItemNode,
LevelNode,
LinesetNode,
LiquidLineNode,
PipeFittingNode,
PipeSegmentNode,
PipeTrapNode,
RidgeVentNode,
RoofNode,
RoofSegmentNode,
Expand Down Expand Up @@ -107,6 +116,15 @@ export type SolarPanelEvent = NodeEvent<SolarPanelNode>
export type SkylightEvent = NodeEvent<SkylightNode>
export type DormerEvent = NodeEvent<DormerNode>
export type DownspoutEvent = NodeEvent<DownspoutNode>
export type DuctSegmentEvent = NodeEvent<DuctSegmentNode>
export type DuctFittingEvent = NodeEvent<DuctFittingNode>
export type DuctTerminalEvent = NodeEvent<DuctTerminalNode>
export type HvacEquipmentEvent = NodeEvent<HvacEquipmentNode>
export type PipeSegmentEvent = NodeEvent<PipeSegmentNode>
export type PipeFittingEvent = NodeEvent<PipeFittingNode>
export type PipeTrapEvent = NodeEvent<PipeTrapNode>
export type LinesetEvent = NodeEvent<LinesetNode>
export type LiquidLineEvent = NodeEvent<LiquidLineNode>

// Event suffixes - exported for use in hooks
export const eventSuffixes = [
Expand Down Expand Up @@ -261,6 +279,15 @@ type EditorEvents = GridEvents &
NodeEvents<'skylight', SkylightEvent> &
NodeEvents<'dormer', DormerEvent> &
NodeEvents<'downspout', DownspoutEvent> &
NodeEvents<'duct-segment', DuctSegmentEvent> &
NodeEvents<'duct-fitting', DuctFittingEvent> &
NodeEvents<'duct-terminal', DuctTerminalEvent> &
NodeEvents<'hvac-equipment', HvacEquipmentEvent> &
NodeEvents<'pipe-segment', PipeSegmentEvent> &
NodeEvents<'pipe-fitting', PipeFittingEvent> &
NodeEvents<'pipe-trap', PipeTrapEvent> &
NodeEvents<'lineset', LinesetEvent> &
NodeEvents<'liquid-line', LiquidLineEvent> &
CameraControlEvents &
ToolEvents &
GuideEvents &
Expand Down
2 changes: 2 additions & 0 deletions packages/core/src/registry/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ export type {
Capabilities,
CapabilityCtx,
CuttableConfig,
DistributionRole,
DragAction,
EditorCtx,
FloorPlacedConfig,
Expand Down Expand Up @@ -85,6 +86,7 @@ export type {
MovableConfig,
NodeCategory,
NodeDefinition,
NodePort,
NodeRegistry,
PaintCapability,
PaintEffectiveMaterialArgs,
Expand Down
Loading
Loading