# Mark's house — modular SVG trial

Open **index.html** after extracting the whole ZIP. It works from a local folder with no network dependencies. The complete vector overview is **house-overview.svg**, with a PNG in **previews/**.

## What's included
- Three separately editable floor structures in `floors/`.
- Nine fitted SVGs: oak cabinet run, sink island, black glazing, hinged door, raised/lowered roller blind, bathtub, vanity, wardrobe.
- Eight furnishing SVGs: dining table with benches, black sofa, mustard sofa, sage bed, pedestal stool, potted plant, buffet, study desk.
- Six equipment SVGs: fridge, oven/hood, washer-dryer, TV, DJ deck and generic dark EV.
- Two interface SVG mockups: room controls and floor selector. These are disconnected graphic examples.
- Three furnished compositions, manifest, source builder and validator.

## Geometry and placement
World coordinates use metres: x runs from entry to garage; y runs from plan-left (far side) to plan-right (near side); z is elevation. The shared 30-degree isometric projection is:

    screen_x = (x - y) × 60 × cos(30°)
    screen_y = (x + y) × 30 - z × 60

Every object SVG uses projected local origin `(0,0)` at its floor anchor. Transparent bounds allow its height; a viewBox's top-left is **not** its insertion point. `manifest.json` records dimensions, viewBoxes, anchors, category, mock state and each placed instance. Some small details extend beyond nominal dimensions (e.g. bench overhangs, leaves, taps). Interface SVGs are 2D screen graphics, intentionally not isometric objects.

The assembled files embed copies of the separately editable object geometry for reliable offline viewing. No external `<use>` requests or browser fetches are needed. Each placed copy has its own ID. Placement uses explicit world coordinates and stable far-to-near ordering. Transparent glazing and TV reveal the room behind; the large structural surfaces are drawn first. These are cutaway compositions, not a general 3D occlusion engine.

## Edit and rebuild
Python 3's standard library is enough to rebuild SVG/HTML. No packages need installing.

1. Edit individual assets in `assets/`, or structures in `floors/`, using a vector editor or text editor.
2. Move instances by editing `placements` in `manifest.json`. x/y/z are metres; scale is uniform. Opacity is 0–1.
3. Run `python3 build.py --compose-only` from this folder. This preserves your asset and structure edits and reads the saved placements, then rebuilds compositions and the page.
4. Run `python3 validate.py` to check SVG/XML, IDs, references, categories, files and placements.

To regenerate the original asset artwork and placements from source, run `python3 build.py` instead. **This resets SVG edits and manifest placements.** Modify source geometry in build.py if you want those changes to persist through a full regeneration. The interface SVGs are independent authored assets and are retained in either mode.

PNG previews are optional. If Inkscape is already installed:

    inkscape house-overview.svg --export-filename=previews/house-overview.png --export-width=1880

## Interpretation of the plan
Entry is left, garage right. The indoor corridor continues down the far side of the courtyard to the laundry beside the master bedroom. Middle/top structures occupy only the front block. The stair origin is identical across floors. Ground living, kitchen/dining, courtyard, master, service rooms and garage retain their front-to-back order. Bedrooms 3 and 4 are at the front; bedroom 2 and loft are at the rear.

The kitchen follows the photographed pale-oak run, white sink island, black appliances and four black stools. The timber dining table and benches are opposite. The ground sofa is black and crosses the room; the loft sofa is mustard. Other furniture locations are inferred trial placements. The EV is a generic box-form stand-in, not a model-accurate Tesla asset. No photos or private source images are packaged.

## Deliberate simplifications
Not measured CAD: shell proportions, room divisions, heights, object sizes and fixtures are approximate. Near walls are omitted, interior walls lowered, and a continuous far wall is retained as the visual cutaway backdrop. Openings and doors are representative rather than a construction schedule. Room labels identify locations, not exact dimensions. Dining-table benches extend around their shared anchor.

The page's structure toggle and asset-category filter are local display controls only. The two interface panels are static demos; no real device entities, automation logic or Home Assistant integration exists.

## Verification
SVG artwork was rendered with Inkscape and visually inspected. The validation report records structural checks. The offline HTML and its links were statically checked; interactive browser runtime was not tested because browser launch was unavailable in this session.
