diff --git a/packages/core/src/registry/types.ts b/packages/core/src/registry/types.ts
index 5dd582da..137c73ae 100644
--- a/packages/core/src/registry/types.ts
+++ b/packages/core/src/registry/types.ts
@@ -230,6 +230,10 @@ export type IconRef =
/** Iconify identifier, e.g. `lucide:square`. Matches the @iconify-react
* setup the editor app already uses for tool icons. */
| { kind: 'iconify'; name: string }
+ /** URL path to a raster or vector asset (PNG/SVG/...). Matches the
+ * palette's PNG/SVG assets — use this to share the same artwork
+ * between the bottom toolbar and the inspector title. */
+ | { kind: 'url'; src: string }
/** Inline SVG path data. Use for asset packs or plugins that want a custom
* mark without contributing a React component. */
| { kind: 'svg'; viewBox: string; path: string }
diff --git a/packages/editor/src/components/ui/panels/parametric-inspector.tsx b/packages/editor/src/components/ui/panels/parametric-inspector.tsx
index eec0dba5..fe7d5d17 100644
--- a/packages/editor/src/components/ui/panels/parametric-inspector.tsx
+++ b/packages/editor/src/components/ui/panels/parametric-inspector.tsx
@@ -137,6 +137,12 @@ export function ParametricInspector() {
function renderIcon(ref: IconRef | undefined): React.ReactNode | undefined {
if (!ref) return undefined
+ if (ref.kind === 'url') {
+ // Plain
here so the inspector doesn't pull in next/image's
+ // server-only requirements (the file is `'use client'`). Same
+ // 16x16 box the legacy panels use.
+ return
+ }
if (ref.kind === 'iconify') {
return
}
diff --git a/packages/nodes/src/ceiling/definition.ts b/packages/nodes/src/ceiling/definition.ts
index 515c21b4..cbf981a9 100644
--- a/packages/nodes/src/ceiling/definition.ts
+++ b/packages/nodes/src/ceiling/definition.ts
@@ -86,7 +86,7 @@ export const ceilingDefinition: NodeDefinition = {
presentation: {
label: 'Ceiling',
description: 'A polygon-bounded ceiling surface that hosts ceiling-mounted items.',
- icon: { kind: 'iconify', name: 'lucide:square-dashed' },
+ icon: { kind: 'url', src: '/icons/ceiling.png' },
paletteSection: 'structure',
paletteOrder: 40,
},
diff --git a/packages/nodes/src/fence/definition.ts b/packages/nodes/src/fence/definition.ts
index 3b12e4eb..3c33484c 100644
--- a/packages/nodes/src/fence/definition.ts
+++ b/packages/nodes/src/fence/definition.ts
@@ -94,7 +94,7 @@ export const fenceDefinition: NodeDefinition = {
presentation: {
label: 'Fence',
description: 'A straight or curved fence segment with configurable posts and infill.',
- icon: { kind: 'iconify', name: 'lucide:fence' },
+ icon: { kind: 'url', src: '/icons/fence.png' },
paletteSection: 'structure',
paletteOrder: 20,
},
diff --git a/packages/nodes/src/shelf/definition.ts b/packages/nodes/src/shelf/definition.ts
index be1fb1e3..e384ea2a 100644
--- a/packages/nodes/src/shelf/definition.ts
+++ b/packages/nodes/src/shelf/definition.ts
@@ -64,7 +64,7 @@ export const shelfDefinition: NodeDefinition = {
presentation: {
label: 'Shelf',
description: 'A horizontal surface for stacking other items.',
- icon: { kind: 'iconify', name: 'lucide:layers' },
+ icon: { kind: 'url', src: '/icons/column.png' },
paletteSection: 'structure',
paletteOrder: 50,
},
diff --git a/packages/nodes/src/slab/definition.ts b/packages/nodes/src/slab/definition.ts
index d843a675..8a3349af 100644
--- a/packages/nodes/src/slab/definition.ts
+++ b/packages/nodes/src/slab/definition.ts
@@ -83,7 +83,7 @@ export const slabDefinition: NodeDefinition = {
presentation: {
label: 'Slab',
description: 'A polygon-bounded floor surface that hosts items on top.',
- icon: { kind: 'iconify', name: 'lucide:square' },
+ icon: { kind: 'url', src: '/icons/floor.png' },
paletteSection: 'structure',
paletteOrder: 30,
},
diff --git a/packages/nodes/src/spawn/definition.ts b/packages/nodes/src/spawn/definition.ts
index c270949c..0a6afcee 100644
--- a/packages/nodes/src/spawn/definition.ts
+++ b/packages/nodes/src/spawn/definition.ts
@@ -52,7 +52,7 @@ export const spawnDefinition: NodeDefinition = {
presentation: {
label: 'Spawn Point',
description: 'Player or camera origin within a level. One per level.',
- icon: { kind: 'iconify', name: 'lucide:flag' },
+ icon: { kind: 'url', src: '/icons/site.png' },
paletteSection: 'structure',
paletteOrder: 90, // bottom of structure list — matches legacy palette order
},
diff --git a/packages/nodes/src/wall/definition.ts b/packages/nodes/src/wall/definition.ts
index cba0cd5a..aa08e0fb 100644
--- a/packages/nodes/src/wall/definition.ts
+++ b/packages/nodes/src/wall/definition.ts
@@ -82,7 +82,7 @@ export const wallDefinition: NodeDefinition = {
presentation: {
label: 'Wall',
description: 'A straight or curved wall segment. Hosts doors, windows, and wall-mounted items.',
- icon: { kind: 'iconify', name: 'lucide:wall' },
+ icon: { kind: 'url', src: '/icons/wall.png' },
paletteSection: 'structure',
paletteOrder: 10,
},