mirror of
https://github.com/Matysh/houseplan-card
synced 2026-07-31 16:38:31 +00:00
Merge ux-1212: space-dialog polish v1.21.2
This commit is contained in:
@@ -11,7 +11,7 @@ PLANS_DIR = "houseplan/plans" # relative to the HA configuration directory
|
|||||||
FILES_URL = "/houseplan_files/files"
|
FILES_URL = "/houseplan_files/files"
|
||||||
FILES_DIR = "houseplan/files"
|
FILES_DIR = "houseplan/files"
|
||||||
CONF_ADMIN_ONLY = "admin_only"
|
CONF_ADMIN_ONLY = "admin_only"
|
||||||
VERSION = "1.21.1"
|
VERSION = "1.21.2"
|
||||||
|
|
||||||
DEFAULT_CONFIG: dict = {
|
DEFAULT_CONFIG: dict = {
|
||||||
"spaces": [],
|
"spaces": [],
|
||||||
|
|||||||
@@ -137,6 +137,9 @@ const t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow
|
|||||||
opacity: 0.5;
|
opacity: 0.5;
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
}
|
}
|
||||||
|
.stage.noplan {
|
||||||
|
background: #ffffff;
|
||||||
|
}
|
||||||
.stage {
|
.stage {
|
||||||
position: relative;
|
position: relative;
|
||||||
width: 100%;
|
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 */
|
/* beat the generic .dialog .body .namein { width:100% } rule */
|
||||||
.dialog .body .temprange .tempin { width: 56px; flex: none; padding: 3px 6px; }
|
.dialog .body .temprange .tempin { width: 56px; flex: none; padding: 3px 6px; }
|
||||||
|
.dialog .body .colorrow .tempin { width: 72px; flex: none; }
|
||||||
.srcrow { flex-wrap: nowrap; }
|
.srcrow { flex-wrap: nowrap; }
|
||||||
.srcrow > span:first-of-type { white-space: nowrap; }
|
.srcrow > span:first-of-type { white-space: nowrap; }
|
||||||
.colorrow .opl { color: var(--hp-muted); font-size: 12px; }
|
.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._markup?this._renderMarkupBar():W}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="stage ${this._markup?"markup":""}"
|
<div class="stage ${this._markup?"markup":""} ${e.bg?"":"noplan"}"
|
||||||
style="height:calc(100dvh - 118px)"
|
style="height:calc(100dvh - 118px)"
|
||||||
@click=${t=>this._markupClick(t)}
|
@click=${t=>this._markupClick(t)}
|
||||||
@wheel=${t=>this._onWheel(t)}
|
@wheel=${t=>this._onWheel(t)}
|
||||||
@@ -1469,4 +1473,4 @@ const t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow
|
|||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>`}}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","");
|
</div>`}}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","");
|
||||||
|
|||||||
@@ -16,5 +16,5 @@
|
|||||||
"issue_tracker": "https://github.com/Matysh/houseplan-card/issues",
|
"issue_tracker": "https://github.com/Matysh/houseplan-card/issues",
|
||||||
"requirements": [],
|
"requirements": [],
|
||||||
"single_config_entry": true,
|
"single_config_entry": true,
|
||||||
"version": "1.21.1"
|
"version": "1.21.2"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -137,6 +137,9 @@ const t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow
|
|||||||
opacity: 0.5;
|
opacity: 0.5;
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
}
|
}
|
||||||
|
.stage.noplan {
|
||||||
|
background: #ffffff;
|
||||||
|
}
|
||||||
.stage {
|
.stage {
|
||||||
position: relative;
|
position: relative;
|
||||||
width: 100%;
|
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 */
|
/* beat the generic .dialog .body .namein { width:100% } rule */
|
||||||
.dialog .body .temprange .tempin { width: 56px; flex: none; padding: 3px 6px; }
|
.dialog .body .temprange .tempin { width: 56px; flex: none; padding: 3px 6px; }
|
||||||
|
.dialog .body .colorrow .tempin { width: 72px; flex: none; }
|
||||||
.srcrow { flex-wrap: nowrap; }
|
.srcrow { flex-wrap: nowrap; }
|
||||||
.srcrow > span:first-of-type { white-space: nowrap; }
|
.srcrow > span:first-of-type { white-space: nowrap; }
|
||||||
.colorrow .opl { color: var(--hp-muted); font-size: 12px; }
|
.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._markup?this._renderMarkupBar():W}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="stage ${this._markup?"markup":""}"
|
<div class="stage ${this._markup?"markup":""} ${e.bg?"":"noplan"}"
|
||||||
style="height:calc(100dvh - 118px)"
|
style="height:calc(100dvh - 118px)"
|
||||||
@click=${t=>this._markupClick(t)}
|
@click=${t=>this._markupClick(t)}
|
||||||
@wheel=${t=>this._onWheel(t)}
|
@wheel=${t=>this._onWheel(t)}
|
||||||
|
|||||||
Vendored
+6
-2
@@ -137,6 +137,9 @@ const t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow
|
|||||||
opacity: 0.5;
|
opacity: 0.5;
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
}
|
}
|
||||||
|
.stage.noplan {
|
||||||
|
background: #ffffff;
|
||||||
|
}
|
||||||
.stage {
|
.stage {
|
||||||
position: relative;
|
position: relative;
|
||||||
width: 100%;
|
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 */
|
/* beat the generic .dialog .body .namein { width:100% } rule */
|
||||||
.dialog .body .temprange .tempin { width: 56px; flex: none; padding: 3px 6px; }
|
.dialog .body .temprange .tempin { width: 56px; flex: none; padding: 3px 6px; }
|
||||||
|
.dialog .body .colorrow .tempin { width: 72px; flex: none; }
|
||||||
.srcrow { flex-wrap: nowrap; }
|
.srcrow { flex-wrap: nowrap; }
|
||||||
.srcrow > span:first-of-type { white-space: nowrap; }
|
.srcrow > span:first-of-type { white-space: nowrap; }
|
||||||
.colorrow .opl { color: var(--hp-muted); font-size: 12px; }
|
.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._markup?this._renderMarkupBar():W}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="stage ${this._markup?"markup":""}"
|
<div class="stage ${this._markup?"markup":""} ${e.bg?"":"noplan"}"
|
||||||
style="height:calc(100dvh - 118px)"
|
style="height:calc(100dvh - 118px)"
|
||||||
@click=${t=>this._markupClick(t)}
|
@click=${t=>this._markupClick(t)}
|
||||||
@wheel=${t=>this._onWheel(t)}
|
@wheel=${t=>this._onWheel(t)}
|
||||||
@@ -1469,4 +1473,4 @@ const t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow
|
|||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>`}}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","");
|
</div>`}}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","");
|
||||||
|
|||||||
@@ -1,5 +1,11 @@
|
|||||||
# Changelog
|
# 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)
|
## 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
|
- **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)
|
silently refused rooms whose walls are not grid-aligned (imported or older polygons)
|
||||||
|
|||||||
+1
-1
@@ -13,7 +13,7 @@
|
|||||||
|
|
||||||
| Item | State |
|
| 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 |
|
| 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) |
|
| 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 |
|
| 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 |
|
||||||
|
|||||||
+2
-1
@@ -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)
|
- [ ] Create with an image (SVG, PNG, JPG, WebP) → correct aspect, crisp at zoom (SVG)
|
||||||
- [ ] Oversized plan (>8 MB) → readable error toast, dialog stays open
|
- [ ] 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]
|
- [ ] 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]
|
- [ ] Edit: rename; replace image; **switch image→draw detaches the plan** [auto]
|
||||||
- [ ] Delete space with rooms/devices → tab disappears, layout of other spaces untouched
|
- [ ] 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]
|
- [ ] 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,
|
- [ ] 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]
|
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)
|
- [ ] 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 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]
|
- [ ] 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
|
- [ ] Room hover highlight still works when custom borders/fills are on
|
||||||
|
|||||||
Generated
+2
-2
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "houseplan-card",
|
"name": "houseplan-card",
|
||||||
"version": "1.21.0",
|
"version": "1.21.1",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "houseplan-card",
|
"name": "houseplan-card",
|
||||||
"version": "1.21.0",
|
"version": "1.21.1",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"lit": "^3.1.3",
|
"lit": "^3.1.3",
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "houseplan-card",
|
"name": "houseplan-card",
|
||||||
"version": "1.21.1",
|
"version": "1.21.2",
|
||||||
"description": "Interactive house plan Lovelace card for Home Assistant",
|
"description": "Interactive house plan Lovelace card for Home Assistant",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ import './space-card';
|
|||||||
import { cardStyles } from './styles';
|
import { cardStyles } from './styles';
|
||||||
import { langOf, t, type I18nKey } from './i18n';
|
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_KEY = 'houseplan_card_layout_v1';
|
||||||
const LS_CFG = 'houseplan_card_cfg_v1'; // cache of the server config+layout for instant rendering
|
const LS_CFG = 'houseplan_card_cfg_v1'; // cache of the server config+layout for instant rendering
|
||||||
const LS_ZOOM = 'houseplan_card_zoom_v1';
|
const LS_ZOOM = 'houseplan_card_zoom_v1';
|
||||||
@@ -2082,7 +2082,7 @@ class HouseplanCard extends LitElement {
|
|||||||
${this._markup ? this._renderMarkupBar() : nothing}
|
${this._markup ? this._renderMarkupBar() : nothing}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="stage ${this._markup ? 'markup' : ''}"
|
<div class="stage ${this._markup ? 'markup' : ''} ${space.bg ? '' : 'noplan'}"
|
||||||
style="height:calc(100dvh - 118px)"
|
style="height:calc(100dvh - 118px)"
|
||||||
@click=${(e: MouseEvent) => this._markupClick(e)}
|
@click=${(e: MouseEvent) => this._markupClick(e)}
|
||||||
@wheel=${(e: WheelEvent) => this._onWheel(e)}
|
@wheel=${(e: WheelEvent) => this._onWheel(e)}
|
||||||
|
|||||||
@@ -134,6 +134,9 @@ export const cardStyles = css`
|
|||||||
opacity: 0.5;
|
opacity: 0.5;
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
}
|
}
|
||||||
|
.stage.noplan {
|
||||||
|
background: #ffffff;
|
||||||
|
}
|
||||||
.stage {
|
.stage {
|
||||||
position: relative;
|
position: relative;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
@@ -502,6 +505,7 @@ export const cardStyles = css`
|
|||||||
}
|
}
|
||||||
/* beat the generic .dialog .body .namein { width:100% } rule */
|
/* beat the generic .dialog .body .namein { width:100% } rule */
|
||||||
.dialog .body .temprange .tempin { width: 56px; flex: none; padding: 3px 6px; }
|
.dialog .body .temprange .tempin { width: 56px; flex: none; padding: 3px 6px; }
|
||||||
|
.dialog .body .colorrow .tempin { width: 72px; flex: none; }
|
||||||
.srcrow { flex-wrap: nowrap; }
|
.srcrow { flex-wrap: nowrap; }
|
||||||
.srcrow > span:first-of-type { white-space: nowrap; }
|
.srcrow > span:first-of-type { white-space: nowrap; }
|
||||||
.colorrow .opl { color: var(--hp-muted); font-size: 12px; }
|
.colorrow .opl { color: var(--hp-muted); font-size: 12px; }
|
||||||
|
|||||||
Reference in New Issue
Block a user