feat(paint-slots): add node.slots field to fence/stair/column/elevator schemas

Pre-adds the unified slot-ref field (Record<slotId, MaterialRef>) to the
four kinds being migrated onto the paint-slot model, so per-kind work can
proceed in parallel worktrees without cross-package core edits.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Wassim SAMAD
2026-06-17 15:20:21 -04:00
co-authored by Claude Opus 4.8
parent 4c27558a4f
commit a8f32dd47a
4 changed files with 12 additions and 0 deletions
+3
View File
@@ -159,6 +159,9 @@ export const ColumnNode = BaseNode.extend({
bracePlateEnabled: z.boolean().default(true), bracePlateEnabled: z.boolean().default(true),
material: MaterialSchema.optional(), material: MaterialSchema.optional(),
materialPreset: z.string().optional(), materialPreset: z.string().optional(),
// Unified paint-slot refs (`scene:`/`library:` MaterialRef per slot id),
// matching the slot model items/slab/shelf use. Absent = declared default.
slots: z.record(z.string(), z.string()).optional(),
}).describe(dedent` }).describe(dedent`
Column node - used to represent structural or decorative pillars/columns. Column node - used to represent structural or decorative pillars/columns.
- style: visual approach such as plain, lathe-turned, carved, or cluster - style: visual approach such as plain, lathe-turned, carved, or cluster
@@ -16,6 +16,9 @@ export const ElevatorNode = BaseNode.extend({
type: nodeType('elevator'), type: nodeType('elevator'),
material: MaterialSchema.optional(), material: MaterialSchema.optional(),
materialPreset: z.string().optional(), materialPreset: z.string().optional(),
// Unified paint-slot refs (`scene:`/`library:` MaterialRef per slot id),
// matching the slot model items/slab/shelf use. Absent = declared default.
slots: z.record(z.string(), z.string()).optional(),
position: z.tuple([z.number(), z.number(), z.number()]).default([0, 0, 0]), position: z.tuple([z.number(), z.number(), z.number()]).default([0, 0, 0]),
// Rotation around the Y axis in radians. // Rotation around the Y axis in radians.
rotation: z.number().default(0), rotation: z.number().default(0),
+3
View File
@@ -11,6 +11,9 @@ export const FenceNode = BaseNode.extend({
type: nodeType('fence'), type: nodeType('fence'),
material: MaterialSchema.optional(), material: MaterialSchema.optional(),
materialPreset: z.string().optional(), materialPreset: z.string().optional(),
// Unified paint-slot refs (`scene:`/`library:` MaterialRef per slot id),
// matching the slot model items/slab/shelf use. Absent = declared default.
slots: z.record(z.string(), z.string()).optional(),
start: z.tuple([z.number(), z.number()]), start: z.tuple([z.number(), z.number()]),
end: z.tuple([z.number(), z.number()]), end: z.tuple([z.number(), z.number()]),
height: z.number().default(1.8), height: z.number().default(1.8),
+3
View File
@@ -31,6 +31,9 @@ export const StairNode = BaseNode.extend({
treadMaterialPreset: z.string().optional(), treadMaterialPreset: z.string().optional(),
sideMaterial: MaterialSchema.optional(), sideMaterial: MaterialSchema.optional(),
sideMaterialPreset: z.string().optional(), sideMaterialPreset: z.string().optional(),
// Unified paint-slot refs (`scene:`/`library:` MaterialRef per slot id),
// matching the slot model items/slab/shelf use. Absent = declared default.
slots: z.record(z.string(), z.string()).optional(),
position: z.tuple([z.number(), z.number(), z.number()]).default([0, 0, 0]), position: z.tuple([z.number(), z.number(), z.number()]).default([0, 0, 0]),
// Rotation around Y axis in radians // Rotation around Y axis in radians
rotation: z.number().default(0), rotation: z.number().default(0),