* feat(editor): shelf placement validity box + sync tool for positioned presets Give the generic move tool a green/red footprint box for shelf placement, matching the GLB item cursor, and drop the vertical-arrow CursorSphere for shelves. Box colour comes from canPlaceOnFloor; an invalid (red) drop is refused unless Shift forces it, and R/T play the rotate sfx. Re-sync the box transform on node change so a re-armed clone isn't left at the previous rotation/position. Extract the box wireframe geometry helpers into a shared placement-box-geometry module reused by the item coordinator and the new declarative PlacementBox component. Export the Tool type so host apps can set the active tool for a positioned preset. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * chore: apply biome formatting + ignore generated next-env.d.ts Format files that predate the current biome config (lineWidth 100, single quotes, semicolons as-needed) so they stop showing as dirty on every checkout. Formatting only — no behavior change. Also exclude **/next-env.d.ts from biome: Next regenerates it (double quotes + semicolon) on every build, so biome kept reformatting it into a perpetual dirty diff. Ignoring it lets Next own the file. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
152 lines
4.2 KiB
TypeScript
152 lines
4.2 KiB
TypeScript
// Base
|
|
|
|
export {
|
|
SOLAR_PANEL_PRESET_LABELS,
|
|
SOLAR_PANEL_PRESETS,
|
|
type SolarPanelPresetDims,
|
|
SolarPanelPresetKey,
|
|
} from '../solar-panel-presets'
|
|
export { BaseNode, generateId, Material, nodeType, objectId } from './base'
|
|
// Camera
|
|
export { CameraSchema } from './camera'
|
|
// Collections
|
|
export { type Collection, type CollectionId, generateCollectionId } from './collections'
|
|
export type {
|
|
MaterialMapProperties,
|
|
MaterialMaps,
|
|
MaterialPresetPayload,
|
|
MaterialTarget as MaterialTargetValue,
|
|
TextureWrapMode as TextureWrapModeValue,
|
|
} from './material'
|
|
// Material
|
|
export {
|
|
DEFAULT_MATERIALS,
|
|
MaterialMapPropertiesSchema,
|
|
MaterialMapsSchema,
|
|
MaterialPreset,
|
|
MaterialPresetPayloadSchema,
|
|
MaterialProperties,
|
|
MaterialSchema,
|
|
MaterialTarget,
|
|
resolveMaterial,
|
|
TextureWrapMode,
|
|
} from './material'
|
|
export { BoxVentNode } from './nodes/box-vent'
|
|
export { BuildingNode } from './nodes/building'
|
|
export { CeilingNode } from './nodes/ceiling'
|
|
export { ChimneyMaterialRole, ChimneyNode } from './nodes/chimney'
|
|
export {
|
|
COLUMN_PRESETS,
|
|
ColumnBaseStyle,
|
|
ColumnCapitalStyle,
|
|
ColumnCarvingPlacement,
|
|
ColumnCrossSection,
|
|
ColumnNode,
|
|
ColumnPanelShape,
|
|
type ColumnPresetId,
|
|
ColumnRingPlacement,
|
|
ColumnShaftDetail,
|
|
ColumnShaftProfile,
|
|
ColumnStyle,
|
|
ColumnSupportStyle,
|
|
} from './nodes/column'
|
|
export { CupolaNode } from './nodes/cupola'
|
|
export { DoorNode, DoorSegment } from './nodes/door'
|
|
export {
|
|
DormerNode,
|
|
type DormerSurfaceMaterialRole,
|
|
type DormerSurfaceMaterialSpec,
|
|
getEffectiveDormerSurfaceMaterial,
|
|
} from './nodes/dormer'
|
|
export { DownspoutNode } from './nodes/downspout'
|
|
export {
|
|
ElevatorDoorPanelStyle,
|
|
ElevatorDoorStyle,
|
|
ElevatorNode,
|
|
ElevatorShaftStyle,
|
|
} from './nodes/elevator'
|
|
export { EyebrowVentNode } from './nodes/eyebrow-vent'
|
|
export { FenceBaseStyle, FenceNode, FenceStyle } from './nodes/fence'
|
|
export { GuideNode, GuideScaleReference } from './nodes/guide'
|
|
export { GutterNode, GutterOutlet } from './nodes/gutter'
|
|
export type {
|
|
AnimationEffect,
|
|
Asset,
|
|
AssetInput,
|
|
Control,
|
|
Effect,
|
|
Interactive,
|
|
LightEffect,
|
|
SliderControl,
|
|
TemperatureControl,
|
|
ToggleControl,
|
|
} from './nodes/item'
|
|
export {
|
|
getScaledDimensions,
|
|
ItemNode,
|
|
isLowProfileItemSurface,
|
|
LOW_PROFILE_ITEM_SURFACE_MAX_HEIGHT,
|
|
} from './nodes/item'
|
|
export { LevelNode } from './nodes/level'
|
|
// Nodes
|
|
export { RidgeVentNode } from './nodes/ridge-vent'
|
|
export type { RoofSurfaceMaterialRole, RoofSurfaceMaterialSpec } from './nodes/roof'
|
|
export { getEffectiveRoofSurfaceMaterial, RoofNode } from './nodes/roof'
|
|
export type {
|
|
RoofSegmentSurfaceMaterialRole,
|
|
RoofSegmentSurfaceMaterialSpec,
|
|
SegmentSlopeFrame,
|
|
} from './nodes/roof-segment'
|
|
export {
|
|
getActiveRoofHeight,
|
|
getEffectiveSegmentSurfaceMaterial,
|
|
getPitchFromActiveRoofHeight,
|
|
getSegmentSlopeFrame,
|
|
hasSegmentMaterialOverride,
|
|
ROOF_SHAPE_DEFAULTS,
|
|
RoofSegmentNode,
|
|
RoofType,
|
|
} from './nodes/roof-segment'
|
|
export { ScanNode } from './nodes/scan'
|
|
export { ShelfNode } from './nodes/shelf'
|
|
export { SiteNode } from './nodes/site'
|
|
export {
|
|
SKYLIGHT_TYPE_ORDER,
|
|
SKYLIGHT_TYPE_PRESETS,
|
|
SkylightMaterialRole,
|
|
SkylightNode,
|
|
SkylightOpeningSide,
|
|
SkylightSlideDirection,
|
|
SkylightType,
|
|
type SkylightTypePreset,
|
|
} from './nodes/skylight'
|
|
export { SlabNode } from './nodes/slab'
|
|
export {
|
|
SolarPanelMaterialRole,
|
|
SolarPanelNode,
|
|
} from './nodes/solar-panel'
|
|
export { SpawnNode } from './nodes/spawn'
|
|
export type { StairSurfaceMaterialRole, StairSurfaceMaterialSpec } from './nodes/stair'
|
|
export {
|
|
getEffectiveStairSurfaceMaterial,
|
|
StairNode,
|
|
StairRailingMode,
|
|
StairSlabOpeningMode,
|
|
StairTopLandingMode,
|
|
StairType,
|
|
} from './nodes/stair'
|
|
export { AttachmentSide, StairSegmentNode, StairSegmentType } from './nodes/stair-segment'
|
|
export { SurfaceHoleMetadata } from './nodes/surface-hole-metadata'
|
|
export { TurbineVentNode } from './nodes/turbine-vent'
|
|
export type { WallSurfaceMaterialSpec, WallSurfaceSide } from './nodes/wall'
|
|
export {
|
|
getEffectiveWallSurfaceMaterial,
|
|
getWallSurfaceMaterialSignature,
|
|
WallNode,
|
|
} from './nodes/wall'
|
|
export { WindowNode, WindowType } from './nodes/window'
|
|
export { ZoneNode } from './nodes/zone'
|
|
export type { AnyNodeId, AnyNodeType } from './types'
|
|
// Union types
|
|
export { AnyNode } from './types'
|