* Fix editing nested multiple object selectors
* Fix nested form dialog close and focus restoration
Cancel all pending nested form levels when the physical dialog closes, and restore focus to the opener after nested submit or cancel.
Add regression coverage for both behaviors.
* Fix selector object test types
* Add keyboard and screen reader navigation to charts via Chart2Music
* Mark charts as busy while the sonification chunk loads
* Skip chart sonification when there is nothing to navigate
* Drop the direct chart2music dependency
* Exclude legend-hidden series when judging chart sonifiability
* Push statistics chart times as numbers so sonification reads real dates
The greeting sits in the assistant's chat bubble, so render it in the pipeline's language instead of the interface language. Falls back to the interface language when no translation is available (issue #53703).
Leaflet computes the zoom level that fits a set of bounds from the current
size of the map container. When ha-map's fit runs before the browser has
laid out the container (a race that hits when the Leaflet chunks are
already cached), the container measures 0x0, the computed zoom collapses
to the minimum, and the map shows the entire world. The later
invalidateSize() from the resize observer fixes the size but keeps the
zoom, so the map stays on the world view.
Defer fitting while the container has no size and run the pending fit
once the resize observer reports a usable size.
Co-authored-by: Claude Fable 5 <[email protected]>
* Skip empty cells on the narrow data table secondary line
In narrow mode the main column renders every other visible column on a
secondary line, but the dot separator was inserted based on the column
index instead of whether the cell rendered anything. A row whose extra
columns are all empty showed a secondary line consisting only of dots,
and an empty column between two filled ones produced a double dot.
Filter empty cells out before joining, and return `nothing` instead of
`html`${nothing}`` for missing timestamps so those cells are detectably
empty too.
Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
* Extract / clarify data table column visibility
* Fix unbound method and add all-empty secondary line test
Co-authored-by: timmo001 <[email protected]>
* Fix prettier formatting in ha-data-table test
Co-authored-by: timmo001 <[email protected]>
---------
Co-authored-by: marcinbauer85 <[email protected]>
Co-authored-by: Claude Opus 5 (1M context) <[email protected]>
Co-authored-by: copilot-swe-agent[bot] <[email protected]>
* Skip hidden fields in config flow submission
* Resolve hidden fields until stable so they hold no value
* Rename ha-form conditional field from `hidden` to `visible`
* Add ask assist action to quick search and support params in dialog
* Support native android
* Group Ask Assist with quick search commands
* Hide Ask Assist when native Assist is active
* Test Ask Assist from quick search
* Fix
* Use new test structure
The preset ranges in ha-date-range-picker were computed once in
connectedCallback(). If the component connected before the translation
chunk containing the range labels had loaded, localize() returned an
empty string for every key, collapsing all presets into a single
empty-keyed entry — the preset list rendered blank and never recovered.
Compute _ranges in willUpdate() instead, recomputing whenever _i18n,
_hassConfig, or extendedPresets changes. This also fixes the presets
not updating when the locale or timezone changes while the page is open.
Co-authored-by: Claude Fable 5 <[email protected]>
* Add UTC time zone to the time zone picker
The time zone list is built from google-timezones-json, which is missing
the bare "UTC" and "Etc/UTC" zones. Both are valid IANA identifiers and a
common server default, so an instance configured to UTC showed up as an
unknown time zone in the settings.
Add the two zones to the picker options, guarded against duplicates in
case the source list starts including them.
* Accept UTC time zone in the clock card config
The clock card validated its time_zone against the raw timezone list, so
it rejected UTC even though the picker now offers it. Validate against the
shared timezone options instead, keeping a single source.
* Correct the invalid Asia/Sakhalin time zone id
google-timezones-json ships Asia/Yuzhno-Sakhalinsk, which is not a valid
IANA identifier, so selecting it failed backend validation. Map it to the
correct Asia/Sakhalin id.
The control slider flipped its value mapping whenever the document
direction was right-to-left, including for vertical sliders. RTL only
mirrors the horizontal axis, so a vertical slider ended up upside down:
the light brightness and color temperature sliders in the more info
dialog reported the opposite of what they showed (1% gave the brightest
output, 100% the dimmest).
Only mirror for right-to-left when the slider is horizontal.
* Add deterministic fixtures and characterization tests for chart data processing
* Extract statistics chart data processing into a pure function
* Extract state history line chart data processing into a pure function
* Add benchmark suite for chart data processing
* Add chart data optimization playbook
* Point agent instructions at the chart optimization playbook
A config flow field guarded by vol.In([1, 5, 6]) sends numeric option
values, but the underlying select returns the chosen value as a string, and
ha-form-select forwarded that string unchanged. On submit the backend
validated "1" against [1, 5, 6] and rejected it as an invalid selection.
Map the selected value back to its original option in ha-form-select so the
source type is retained. String options are unaffected. The mapping is
extracted into matchSelectOptionValue and covered by unit tests.
* Render echarts tooltips with Lit templates
Replace raw HTML string interpolation in echarts tooltip formatters with Lit templates so user-controlled fields (entity friendly_name, device names, node labels) are auto-escaped instead of relying on per-string filterXSS. ha-chart-base now wraps any function tooltip.formatter into a stable per-formatter container and handles Lit TemplateResult / nothing / null returns; the public HaECOption type lets charts express Lit-returning formatters without per-callsite casts.
* Simplify
* Refactor _getSeries
* Small fix
* Fix merge mistake
* Marker component and wrapper test