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, },