Files
houseplan-card/docs/FURNITURE.md
T
Matysh 7909ab6eed feat: expand furniture library
Issue: #159
User-Visible: yes
2026-08-28 18:52:03 +03:00

3.9 KiB

Furniture library

Status: implemented and expanded by issue #159. The Background editor stores furniture as ordinary decor:

{ kind: "furniture", symbol, x, y, w, h, color, opacity, width_cm, angle? }

The schema and saved coordinates did not change. Existing furniture therefore keeps its position, size, rotation and styling; only 18 built-in drawings gain the new artwork after an update.

Library and source

The public library contains 56 top-view symbols:

  • 44 designer symbols from assets/furniture/houseplan-0.3.0/svg/plan;
  • 12 retained built-ins: refrigerator, dishwasher, washer, dryer, air conditioner, water heater, shower, sink, stairs, fireplace, plant and rug.

The designer pack also contains 33 front-view category illustrations in svg/menu. Four of them (computer, oven, hood, exercise) currently have no top-view symbol and are intentionally hidden instead of opening an empty category.

pack.json is the source of truth for stable ids, categories, names, default centimetre dimensions and SVG paths. Run:

npm run furniture:generate
npm run furniture:check

The generator validates a deliberately small, inert SVG subset and produces:

  • src/furniture-plan-art.generated.ts for the initial View graph;
  • src/furniture-menu-art.generated.ts for the lazy editor graph only.

Generated files are never edited manually. The 77 drawings were created by Sergey Matyushin (Matysh) and granted to the project under its MIT License in issue #159. No separate attribution is required in the interface.

Palette interaction

Furniture is a two-level non-modal palette in the editor context tray:

  1. The first level shows front-view categories, grouped as Furniture, Appliances, Plumbing and Other.
  2. Every category opens a second level, including categories that have only one variant.
  3. The second level shows the real top-view drawings. Back returns to the category list and clears any armed symbol.
  4. Picking a variant arms one placement and reveals editable Width and Depth in the Home Assistant length unit.
  5. Clicking the plan places the object and returns to Select. Shift keeps the established free-placement behaviour.

The properties dialog remains a flat native select, grouped by category. Its optgroup label includes both the parent group and category because HTML selects cannot nest optgroups.

Rendering contract

Each object is still one <path> and one erase hit path. Designer artwork keeps its native SVG viewBox; the renderer applies the user's stored width and depth with a non-uniform transform and uses vector-effect="non-scaling-stroke". Consequently:

  • resizing changes the physical object box without distorting line weight;
  • the user's decor colour, opacity and physical line width remain authoritative;
  • data-hp="decor", data-kind="furniture", data-id and data-symbol remain stable for card-mod;
  • an id unknown to an older card remains valid data and simply renders nothing instead of breaking the plan.

The top edge of every drawing is BACK (y = 0). Placement and dragging use the established wall magnet, absolute saved coordinates and the shared selection/resize/rotate frame. Furniture is decor: it has no entity, state, room aggregation, collision model or automatic binding to later wall edits.

Compatibility and performance

No backend schema, configuration version or migration was added. The 18 replacement ids preserve their identity; the remaining old ids remain available. Default dimensions change only for a newly picked replacement—an already saved object's w and h are never rewritten.

Plan artwork is available in View and kiosk. Front-view menu art is imported only after the editor runtime is requested. Touch View/kiosk support is blocking; editor ergonomics on touch remain best effort under docs/TOUCH-SUPPORT.md.