From ae10befd58c39491da468fc280af469f266d8531 Mon Sep 17 00:00:00 2001 From: Matysh Date: Thu, 16 Jul 2026 14:32:07 +0300 Subject: [PATCH] fix v1.21.2: space-dialog polish - scale (cm/cell) input compact again (generic width:100% dialog rule stretched it) - space with no background image gets a white paper canvas (.stage.noplan), so hand-drawn rooms read like a plan on paper - TESTING.md updated in the same commit --- custom_components/houseplan/const.py | 2 +- custom_components/houseplan/frontend/houseplan-card.js | 8 ++++++-- custom_components/houseplan/manifest.json | 2 +- demo/srv/assets/houseplan-card.js | 6 +++++- dist/houseplan-card.js | 8 ++++++-- docs/CHANGELOG.md | 6 ++++++ docs/STATUS.md | 2 +- docs/TESTING.md | 3 ++- package-lock.json | 4 ++-- package.json | 2 +- src/houseplan-card.ts | 4 ++-- src/styles.ts | 4 ++++ 12 files changed, 37 insertions(+), 14 deletions(-) diff --git a/custom_components/houseplan/const.py b/custom_components/houseplan/const.py index 5415c72..bbb044e 100755 --- a/custom_components/houseplan/const.py +++ b/custom_components/houseplan/const.py @@ -11,7 +11,7 @@ PLANS_DIR = "houseplan/plans" # relative to the HA configuration directory FILES_URL = "/houseplan_files/files" FILES_DIR = "houseplan/files" CONF_ADMIN_ONLY = "admin_only" -VERSION = "1.21.1" +VERSION = "1.21.2" DEFAULT_CONFIG: dict = { "spaces": [], diff --git a/custom_components/houseplan/frontend/houseplan-card.js b/custom_components/houseplan/frontend/houseplan-card.js index accc5ca..54fc896 100755 --- a/custom_components/houseplan/frontend/houseplan-card.js +++ b/custom_components/houseplan/frontend/houseplan-card.js @@ -137,6 +137,9 @@ const t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow opacity: 0.5; pointer-events: none; } + .stage.noplan { + background: #ffffff; + } .stage { position: relative; width: 100%; @@ -505,6 +508,7 @@ const t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow } /* beat the generic .dialog .body .namein { width:100% } rule */ .dialog .body .temprange .tempin { width: 56px; flex: none; padding: 3px 6px; } + .dialog .body .colorrow .tempin { width: 72px; flex: none; } .srcrow { flex-wrap: nowrap; } .srcrow > span:first-of-type { white-space: nowrap; } .colorrow .opl { color: var(--hp-muted); font-size: 12px; } @@ -1113,7 +1117,7 @@ const t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow ${this._markup?this._renderMarkupBar():W} -
this._markupClick(t)} @wheel=${t=>this._onWheel(t)} @@ -1469,4 +1473,4 @@ const t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow
- `}}Mi.properties={hass:{attribute:!1},_config:{state:!0},_space:{state:!0},_layout:{state:!0},_devices:{state:!0},_tip:{state:!0},_selId:{state:!0},_toast:{state:!0},_serverCfg:{state:!0},_markup:{state:!0},_tool:{state:!0},_path:{state:!0},_cursorPt:{state:!0},_mergeSel:{state:!0},_mergeDialog:{state:!0},_splitSel:{state:!0},_areaSel:{state:!0},_nameSel:{state:!0},_roomDialog:{state:!0},_spaceDialog:{state:!0},_infoCard:{state:!0},_rulesDialog:{state:!0},_importDialog:{state:!0},_markerDialog:{state:!0},_zoom:{state:!0},_view:{state:!0}},Mi.styles=li,customElements.get("houseplan-card")||customElements.define("houseplan-card",Mi),window.customCards=window.customCards||[],window.customCards.find(t=>"houseplan-card"===t.type)||window.customCards.push({type:"houseplan-card",name:"House Plan Card",description:"Interactive house plan: spaces, rooms and devices with live states and drag layout."}),console.info("%c HOUSEPLAN-CARD %c v1.21.1 ","background:#3ea6ff;color:#04121f;font-weight:700",""); + `}}Mi.properties={hass:{attribute:!1},_config:{state:!0},_space:{state:!0},_layout:{state:!0},_devices:{state:!0},_tip:{state:!0},_selId:{state:!0},_toast:{state:!0},_serverCfg:{state:!0},_markup:{state:!0},_tool:{state:!0},_path:{state:!0},_cursorPt:{state:!0},_mergeSel:{state:!0},_mergeDialog:{state:!0},_splitSel:{state:!0},_areaSel:{state:!0},_nameSel:{state:!0},_roomDialog:{state:!0},_spaceDialog:{state:!0},_infoCard:{state:!0},_rulesDialog:{state:!0},_importDialog:{state:!0},_markerDialog:{state:!0},_zoom:{state:!0},_view:{state:!0}},Mi.styles=li,customElements.get("houseplan-card")||customElements.define("houseplan-card",Mi),window.customCards=window.customCards||[],window.customCards.find(t=>"houseplan-card"===t.type)||window.customCards.push({type:"houseplan-card",name:"House Plan Card",description:"Interactive house plan: spaces, rooms and devices with live states and drag layout."}),console.info("%c HOUSEPLAN-CARD %c v1.21.2 ","background:#3ea6ff;color:#04121f;font-weight:700",""); diff --git a/custom_components/houseplan/manifest.json b/custom_components/houseplan/manifest.json index 7326958..667f9df 100755 --- a/custom_components/houseplan/manifest.json +++ b/custom_components/houseplan/manifest.json @@ -16,5 +16,5 @@ "issue_tracker": "https://github.com/Matysh/houseplan-card/issues", "requirements": [], "single_config_entry": true, - "version": "1.21.1" + "version": "1.21.2" } diff --git a/demo/srv/assets/houseplan-card.js b/demo/srv/assets/houseplan-card.js index accc5ca..ef262ed 100755 --- a/demo/srv/assets/houseplan-card.js +++ b/demo/srv/assets/houseplan-card.js @@ -137,6 +137,9 @@ const t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow opacity: 0.5; pointer-events: none; } + .stage.noplan { + background: #ffffff; + } .stage { position: relative; width: 100%; @@ -505,6 +508,7 @@ const t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow } /* beat the generic .dialog .body .namein { width:100% } rule */ .dialog .body .temprange .tempin { width: 56px; flex: none; padding: 3px 6px; } + .dialog .body .colorrow .tempin { width: 72px; flex: none; } .srcrow { flex-wrap: nowrap; } .srcrow > span:first-of-type { white-space: nowrap; } .colorrow .opl { color: var(--hp-muted); font-size: 12px; } @@ -1113,7 +1117,7 @@ const t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow ${this._markup?this._renderMarkupBar():W} -
this._markupClick(t)} @wheel=${t=>this._onWheel(t)} diff --git a/dist/houseplan-card.js b/dist/houseplan-card.js index accc5ca..54fc896 100755 --- a/dist/houseplan-card.js +++ b/dist/houseplan-card.js @@ -137,6 +137,9 @@ const t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow opacity: 0.5; pointer-events: none; } + .stage.noplan { + background: #ffffff; + } .stage { position: relative; width: 100%; @@ -505,6 +508,7 @@ const t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow } /* beat the generic .dialog .body .namein { width:100% } rule */ .dialog .body .temprange .tempin { width: 56px; flex: none; padding: 3px 6px; } + .dialog .body .colorrow .tempin { width: 72px; flex: none; } .srcrow { flex-wrap: nowrap; } .srcrow > span:first-of-type { white-space: nowrap; } .colorrow .opl { color: var(--hp-muted); font-size: 12px; } @@ -1113,7 +1117,7 @@ const t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow ${this._markup?this._renderMarkupBar():W}
-
this._markupClick(t)} @wheel=${t=>this._onWheel(t)} @@ -1469,4 +1473,4 @@ const t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow
- `}}Mi.properties={hass:{attribute:!1},_config:{state:!0},_space:{state:!0},_layout:{state:!0},_devices:{state:!0},_tip:{state:!0},_selId:{state:!0},_toast:{state:!0},_serverCfg:{state:!0},_markup:{state:!0},_tool:{state:!0},_path:{state:!0},_cursorPt:{state:!0},_mergeSel:{state:!0},_mergeDialog:{state:!0},_splitSel:{state:!0},_areaSel:{state:!0},_nameSel:{state:!0},_roomDialog:{state:!0},_spaceDialog:{state:!0},_infoCard:{state:!0},_rulesDialog:{state:!0},_importDialog:{state:!0},_markerDialog:{state:!0},_zoom:{state:!0},_view:{state:!0}},Mi.styles=li,customElements.get("houseplan-card")||customElements.define("houseplan-card",Mi),window.customCards=window.customCards||[],window.customCards.find(t=>"houseplan-card"===t.type)||window.customCards.push({type:"houseplan-card",name:"House Plan Card",description:"Interactive house plan: spaces, rooms and devices with live states and drag layout."}),console.info("%c HOUSEPLAN-CARD %c v1.21.1 ","background:#3ea6ff;color:#04121f;font-weight:700",""); + `}}Mi.properties={hass:{attribute:!1},_config:{state:!0},_space:{state:!0},_layout:{state:!0},_devices:{state:!0},_tip:{state:!0},_selId:{state:!0},_toast:{state:!0},_serverCfg:{state:!0},_markup:{state:!0},_tool:{state:!0},_path:{state:!0},_cursorPt:{state:!0},_mergeSel:{state:!0},_mergeDialog:{state:!0},_splitSel:{state:!0},_areaSel:{state:!0},_nameSel:{state:!0},_roomDialog:{state:!0},_spaceDialog:{state:!0},_infoCard:{state:!0},_rulesDialog:{state:!0},_importDialog:{state:!0},_markerDialog:{state:!0},_zoom:{state:!0},_view:{state:!0}},Mi.styles=li,customElements.get("houseplan-card")||customElements.define("houseplan-card",Mi),window.customCards=window.customCards||[],window.customCards.find(t=>"houseplan-card"===t.type)||window.customCards.push({type:"houseplan-card",name:"House Plan Card",description:"Interactive house plan: spaces, rooms and devices with live states and drag layout."}),console.info("%c HOUSEPLAN-CARD %c v1.21.2 ","background:#3ea6ff;color:#04121f;font-weight:700",""); diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 163bc45..662a14c 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## v1.21.2 — 2026-07-16 (space-dialog polish) +- The **"Scale (cm per cell)" input is compact** again — a generic `width:100%` + dialog rule was stretching it across the row. +- **A space with no background image now gets a white "paper" canvas** instead of + the dark stage, so hand-drawn rooms read like a floor plan on paper. + ## v1.21.1 — 2026-07-16 (audit: split snaps to the wall, docs for merge/split) - **Fix (found in audit):** Split required each click to land on a grid node, so it silently refused rooms whose walls are not grid-aligned (imported or older polygons) diff --git a/docs/STATUS.md b/docs/STATUS.md index a1b05f9..9fe847b 100644 --- a/docs/STATUS.md +++ b/docs/STATUS.md @@ -13,7 +13,7 @@ | Item | State | |---|---| -| Version | **v1.21.1** everywhere (manifest, const.py, package.json, CARD_VERSION) | +| Version | **v1.21.2** everywhere (manifest, const.py, package.json, CARD_VERSION) | | GitHub | https://github.com/Matysh/houseplan-card — branch `main`, releases v1.9.3…v1.11.2 | | CI | `.github/workflows/validate.yml` (hacs + hassfest + frontend + backend) — **fully green** since v1.11.1; `release.yml` auto-attaches the card bundle (needs `permissions: contents: write`, fixed) | | HACS | Works as custom repository (id 1290210112 on the home instance). **Inclusion PR: https://github.com/hacs/default/pull/9004** (queue ≈2 months as of 2026-07). Lesson: #8995 was auto-closed by hacs-bot — the PR body MUST be their exact template with every checkbox ticked and all 3 links (release, HACS action run, hassfest run); a custom body gets closed without discussion | diff --git a/docs/TESTING.md b/docs/TESTING.md index 1ac8989..c1c017c 100644 --- a/docs/TESTING.md +++ b/docs/TESTING.md @@ -43,7 +43,7 @@ Run the *core flows* (marked ★ below) in each environment at least once per mi - [ ] Create with an image (SVG, PNG, JPG, WebP) → correct aspect, crisp at zoom (SVG) - [ ] Oversized plan (>8 MB) → readable error toast, dialog stays open - [ ] Create with "No image — I'll outline rooms by hand": orientation landscape/portrait/square respected [auto]; borders+names default ON [auto] -- [ ] Draw-space renders an empty canvas (no black hole), markup works on it +- [ ] Draw-space (no background) renders a WHITE canvas (paper-like), markup works on it; room borders/names stay legible on white [auto] - [ ] Edit: rename; replace image; **switch image→draw detaches the plan** [auto] - [ ] Delete space with rooms/devices → tab disappears, layout of other spaces untouched - [ ] Display settings: borders toggle, names toggle, color picker + opacity slider live-preview after save, fill selector [auto] @@ -56,6 +56,7 @@ Run the *core flows* (marked ★ below) in each environment at least once per mi - [ ] Average room temperature counts ONLY thermometer/air-monitor devices — fridges, TRV heads, smart-plug chip temperatures (`*_device_temperature`) and diagnostic-category temps are excluded [auto] - [ ] Space dialog is 500 px wide; the comfort-bounds inputs are compact (56 px) +- [ ] The scale (cm per cell) input is compact (72 px), not full-width [auto] - [ ] Device icon badge is centred exactly on its point (no 1 px down-right drift) [auto] - [ ] Device glyph is centred within its badge (no vertical drift — real ha-icon is block+line-height) [auto] - [ ] Room hover highlight still works when custom borders/fills are on diff --git a/package-lock.json b/package-lock.json index 98bf60c..80fa746 100755 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "houseplan-card", - "version": "1.21.0", + "version": "1.21.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "houseplan-card", - "version": "1.21.0", + "version": "1.21.1", "license": "MIT", "dependencies": { "lit": "^3.1.3", diff --git a/package.json b/package.json index 0670c3d..40f5090 100755 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "houseplan-card", - "version": "1.21.1", + "version": "1.21.2", "description": "Interactive house plan Lovelace card for Home Assistant", "license": "MIT", "type": "module", diff --git a/src/houseplan-card.ts b/src/houseplan-card.ts index e03baa7..5b113d5 100755 --- a/src/houseplan-card.ts +++ b/src/houseplan-card.ts @@ -28,7 +28,7 @@ import './space-card'; import { cardStyles } from './styles'; import { langOf, t, type I18nKey } from './i18n'; -const CARD_VERSION = '1.21.1'; +const CARD_VERSION = '1.21.2'; const LS_KEY = 'houseplan_card_layout_v1'; const LS_CFG = 'houseplan_card_cfg_v1'; // cache of the server config+layout for instant rendering const LS_ZOOM = 'houseplan_card_zoom_v1'; @@ -2082,7 +2082,7 @@ class HouseplanCard extends LitElement { ${this._markup ? this._renderMarkupBar() : nothing} -
this._markupClick(e)} @wheel=${(e: WheelEvent) => this._onWheel(e)} diff --git a/src/styles.ts b/src/styles.ts index 8a3f79d..d6692c7 100644 --- a/src/styles.ts +++ b/src/styles.ts @@ -134,6 +134,9 @@ export const cardStyles = css` opacity: 0.5; pointer-events: none; } + .stage.noplan { + background: #ffffff; + } .stage { position: relative; width: 100%; @@ -502,6 +505,7 @@ export const cardStyles = css` } /* beat the generic .dialog .body .namein { width:100% } rule */ .dialog .body .temprange .tempin { width: 56px; flex: none; padding: 3px 6px; } + .dialog .body .colorrow .tempin { width: 72px; flex: none; } .srcrow { flex-wrap: nowrap; } .srcrow > span:first-of-type { white-space: nowrap; } .colorrow .opl { color: var(--hp-muted); font-size: 12px; }