import type { ObjectShapeKind } from './types' // The seven placeable object kinds with their palette presentation and sensible // default sizes (cm), per the #11 brief. export interface KindDef { kind: string label: string icon: string shape: ObjectShapeKind widthCm: number heightCm: number // Default z-index at placement. Paths/structures/in-ground sit under beds (0); // beds and containers sit at 1; trees float above (2). Explicit z still wins. defaultZ: number } export const OBJECT_KINDS: KindDef[] = [ { kind: 'bed', label: 'Bed', icon: '▭', shape: 'rect', widthCm: 120, heightCm: 240, defaultZ: 1 }, { kind: 'grow_bag', label: 'Grow bag', icon: '🛍️', shape: 'circle', widthCm: 40, heightCm: 40, defaultZ: 1 }, { kind: 'container', label: 'Container', icon: '🪴', shape: 'circle', widthCm: 60, heightCm: 60, defaultZ: 1 }, { kind: 'in_ground', label: 'In-ground', icon: '🟫', shape: 'rect', widthCm: 200, heightCm: 200, defaultZ: 0 }, { kind: 'tree', label: 'Tree', icon: '🌳', shape: 'circle', widthCm: 300, heightCm: 300, defaultZ: 2 }, { kind: 'path', label: 'Path', icon: '🧱', shape: 'rect', widthCm: 100, heightCm: 300, defaultZ: 0 }, { kind: 'structure', label: 'Structure', icon: '🏠', shape: 'rect', widthCm: 200, heightCm: 200, defaultZ: 0 }, ] export function kindDef(kind: string): KindDef | undefined { return OBJECT_KINDS.find((k) => k.kind === kind) } /** A human label for an object: its name, else its kind's label, else "Object". */ export function objectDisplayName(o: { name: string; kind: string }): string { return o.name || kindDef(o.kind)?.label || 'Object' }