diff --git a/src/components/ha-grid-size-picker.ts b/src/components/ha-grid-size-picker.ts index c7c15df287..813f1e17ff 100644 --- a/src/components/ha-grid-size-picker.ts +++ b/src/components/ha-grid-size-picker.ts @@ -14,6 +14,12 @@ import { } from "../panels/lovelace/common/compute-card-grid-size"; import { HomeAssistant } from "../types"; +declare global { + interface HASSDomEvents { + "grid-reset": undefined; + } +} + @customElement("ha-grid-size-picker") export class HaGridSizeEditor extends LitElement { @property({ attribute: false }) public hass!: HomeAssistant; @@ -184,12 +190,7 @@ export class HaGridSizeEditor extends LitElement { private _reset(ev) { ev.stopPropagation(); - fireEvent(this, "value-changed", { - value: { - rows: undefined, - columns: undefined, - }, - }); + fireEvent(this, "grid-reset"); } private _sliderMoved(ev) { diff --git a/src/panels/lovelace/common/compute-card-grid-size.ts b/src/panels/lovelace/common/compute-card-grid-size.ts index c27b5a55ba..ceb7b29be9 100644 --- a/src/panels/lovelace/common/compute-card-grid-size.ts +++ b/src/panels/lovelace/common/compute-card-grid-size.ts @@ -11,6 +11,8 @@ export type CardGridSize = { columns: number | "full"; }; +export const GRID_COLUMN_MULTIPLIER = 3; + export const computeCardGridSize = ( options: LovelaceLayoutOptions ): CardGridSize => { @@ -20,14 +22,16 @@ export const computeCardGridSize = ( const maxRows = options.grid_max_rows; const minColumns = options.grid_min_columns; const maxColumns = options.grid_max_columns; + const precisionMode = options.grid_precision_mode; const clampedRows = typeof rows === "string" ? rows : conditionalClamp(rows, minRows, maxRows); const clampedColumns = - typeof columns === "string" + typeof columns === "string" || precisionMode ? columns - : conditionalClamp(columns, minColumns, maxColumns); + : conditionalClamp(columns, minColumns, maxColumns) * + GRID_COLUMN_MULTIPLIER; return { rows: clampedRows, diff --git a/src/panels/lovelace/editor/card-editor/hui-card-layout-editor.ts b/src/panels/lovelace/editor/card-editor/hui-card-layout-editor.ts index 6ee81aba24..add84d392c 100644 --- a/src/panels/lovelace/editor/card-editor/hui-card-layout-editor.ts +++ b/src/panels/lovelace/editor/card-editor/hui-card-layout-editor.ts @@ -26,6 +26,7 @@ import { HuiCard } from "../../cards/hui-card"; import { CardGridSize, computeCardGridSize, + GRID_COLUMN_MULTIPLIER, } from "../../common/compute-card-grid-size"; import { LovelaceLayoutOptions } from "../../types"; @@ -57,11 +58,24 @@ export class HuiCardLayoutEditor extends LitElement { }) ); - private _computeCardGridSize = memoizeOne(computeCardGridSize); + private _computeCardGridSize = memoizeOne( + (options: LovelaceLayoutOptions) => { + const size = computeCardGridSize(options); + if (!options.grid_precision_mode) { + size.columns = + typeof size.columns === "number" + ? Math.round(size.columns / GRID_COLUMN_MULTIPLIER) + : size.columns; + } + return size; + } + ); private _isDefault = memoizeOne( (options?: LovelaceLayoutOptions) => - options?.grid_columns === undefined && options?.grid_rows === undefined + options?.grid_columns === undefined && + options?.grid_rows === undefined && + options?.grid_precision_mode === undefined ); render() { @@ -74,6 +88,8 @@ export class HuiCardLayoutEditor extends LitElement { const totalColumns = (this.sectionConfig.column_span ?? 1) * 4; + const precisionMode = options.grid_precision_mode ?? false; + return html`
@@ -135,20 +151,39 @@ export class HuiCardLayoutEditor extends LitElement {
>
`
: html`
-