* Move pickers onto the new list components
Pickers, the quick bar, the automation element search and the card
picker entity tree now use ha-list-base and its item family instead of
Material Web list items.
- Add a virtual-focus mode to ha-list-base and ha-list-virtualized:
focus stays in a search field and the list marks the active row.
- Render picker rows as ha-list-item-option, with the current value as
the selected option.
- Make ha-combo-box-item a presentational row layout on ha-row-item.
- Render ha-picker-field as a native button with the clear button next
to it.
- Let held arrow keys repeat in pickers and the automation search.
- Fix list items not unregistering after they leave the DOM, and an
unhandled rejection when a virtualized list is removed mid-layout.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Fix section titles
* fix e2e
* mage entity tree search like picker and automation
* remove comments
* fix picker field aria label
* fix disabled field style selector
* Update src/components/ha-picker-combo-box.ts
Co-authored-by: Petar Petrov <MindFreeze@users.noreply.github.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Petar Petrov <MindFreeze@users.noreply.github.com>
* Migrate from Yarn to pnpm
Switch the package manager to pnpm 11, keeping every resolved
dependency version from yarn.lock.
- Move resolutions to pnpm overrides and Yarn patches to patches/
- Enable supply-chain protection: 3 day minimum release age,
trust policy that blocks provenance downgrades, and dependency
build scripts denied by default
- Declare dependencies that were imported but only available through
Yarn's hoisting: zrender, @lezer/common, zxing-wasm,
@babel/helper-compilation-targets, core-js-compat, @types/geojson
- Look up pinned license overrides in pnpm's node_modules layout
- Update CI, scripts, git hooks, Renovate, and documentation
* Cache the pnpm store with node_modules in CI
Jobs that restore the shared node_modules cache skip the install, so
the pnpm store is empty there. The license file generation runs
`pnpm licenses list`, which reads package metadata from the store and
fails without it.
* Point the demo e2e comment at the real test:e2e:demo script
---------
Co-authored-by: Claude <noreply@anthropic.com>
* Correct Assist pipeline and speech API types in the frontend
Compare the pipeline, conversation, speech and Wyoming data modules
with the handlers that produce them, and fix the mismatches.
The pipeline run events were the furthest adrift. Correct the wake
word, speech-to-text, intent and text-to-speech payloads, add the
stt-vad-start and stt-vad-end events, and drop keys the backend never
sends.
Two of these were live bugs. The chat log subscription nests its
payload under chat_log, so the log was read one level too high. The
debug view read the wake word result as ww_id, which is wake_word_id,
so that field always rendered undefined.
Rewrite the Wyoming info types against the wyoming library, which the
previous types modelled as empty tuples.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YDqKNfAAvMV7zJJNodsHfK
* Leave the chat log tool result to its own change
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YDqKNfAAvMV7zJJNodsHfK
---------
Co-authored-by: Claude <noreply@anthropic.com>
* Share GitHub issue URLs and type integration queries
* Share the documentation base URL
* Add a bug report link to log details
* Add horizontal divider
* Name the destination in the log report link text
* Move log reporting into the alert below the header
* Clarify log reporting guidance and alert spacing
* Update src/translations/en.json
Co-authored-by: Norbert Rittel <norbert@rittel.de>
* Prefill installation type in log reports
* Add serial comma to log reporting guidance
* Fix log report loading and large log handling
* Clarify custom Frontend modules in log reporting guidance
* Use version-aware documentation links in log reports
* Use contexts and limit health requests in log details
---------
Co-authored-by: Norbert Rittel <norbert@rittel.de>
* Add Matter to the demo
Load the matter integration and mock its network topology, so the Matter
panel and its network map render in the demo, with a Thread and Wi-Fi
topology that includes a border router and an offline node.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C6PpwxkMaHCWkEFA27YnLE
* Key Matter node diagnostics by device
The diagnostics and ping mocks ignored the requested device, so every
Matter device reported node 1 on Thread and available. The device page
gates its actions on that: the offline garden sensor offered actions that
need a live node, and the Wi-Fi plug offered a Thread network link.
Both are now derived from the topology the map already renders, so a
device's node ID, transport, node type and availability match it, and an
unknown device is rejected as the backend would.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C6PpwxkMaHCWkEFA27YnLE
* Give Matter fixtures unique entity IDs and mock its device actions
lock.front_door and sensor.garden_temperature already exist in the home
demo config, whose entities are added last and overwrote the display
registry entries, detaching them from their Matter devices. The panel
counted 3 entities instead of 5 on that demo. Renamed to a side door lock
and a patio sensor, which no demo config uses.
The device page offers commissioning, fabric and credential actions for an
available node, none of which were mocked, so each failed with
command_not_mocked.
Adds a demo E2E test for the panel and its map. Emptying the topology
subscription fails it.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C6PpwxkMaHCWkEFA27YnLE
* Mock the Matter lock services and fix the commissioning codes
The lock device exposes "Manage lock", whose dialog reads back the response
of matter.get_lock_info and matter.get_lock_users; neither was mocked, so
it always showed its load-failed alert.
setup_pin_code carried the manual pairing code. The three commissioning
codes now agree on the Matter test payload for passcode 20202021.
Pinging an unknown device rejects like the diagnostics command, matching
the backend, which resolves the device before acting either way.
The E2E test now reads the diagnostics of a Thread, a Wi-Fi and an offline
device, so a regression back to one shared response fails it.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C6PpwxkMaHCWkEFA27YnLE
* Return a credential result and gate the Matter Thread action
`setMatterLockCredential` reads `user_index` off the per-entity response, so
the demo's empty object made saving a code throw. Return the indices the
dialog reads back, and drop the mock for a `clear_lock_credential` service
the frontend never calls.
The device action linking to the Thread panel did not check that the
integration is loaded, unlike the same link on the Matter dashboard, so it
could navigate to a panel that is not there.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C6PpwxkMaHCWkEFA27YnLE
* Keep the mocked Matter lock users across changes
The manage dialog reloads the list after every add, edit and delete, so the
static response made each change look like it was reverted. Keep the users
per lock entity and mutate them, and hand back a copy so the dialog's
reactive state sees a new list.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C6PpwxkMaHCWkEFA27YnLE
---------
Co-authored-by: Claude <noreply@anthropic.com>
* Wait for connectivity settings readiness
* Wait for serial settings readiness
* Wait for storage settings readiness
* Simplify delayed serial scenario
* Test delayed connectivity readiness
* Group the connectivity panels behind a Connectivity settings page
Move the connectivity panels (Matter, Zigbee, Z-Wave, KNX, MQTT, Thread,
Bluetooth, serial, infrared, radio frequency, Insteon, and tags) behind a new
Connectivity page. It sits with Voice assistants in the second settings group,
where those panels used to be listed individually.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y7Yy1BcbkMjCZEtkTEqyKm
* Update config panel e2e coverage for the Connectivity page
The connectivity panels moved off the settings root, so split the link smoke
cases and assert them on the Connectivity page instead. Add a route smoke case
for /config/connectivity.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y7Yy1BcbkMjCZEtkTEqyKm
---------
Co-authored-by: Claude <noreply@anthropic.com>
* refactor(profile): split general section into subpages with dashboard navigation
Replace the two-tab profile layout (general/security) with a dashboard-first
navigation structure. The general section is split into three focused subpages
(preferences, localization, browser), each wrapping the original row components
unchanged. A new dashboard page provides a user card (name, owner badge, logout)
and a navigation list linking to all four subpages.
Add ha-navigation-list as a reusable component for page navigation lists.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* refactor: remove orphan translation keys after general section split
Drop tabs.general and current_user, which were only used in the now-deleted
ha-profile-section-general.ts and the old profileSections tab config.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* refactor(profile): align dashboard layout with Bluetooth panel pattern
Replace .content with .container (padding on wrapper, max-width/margin on
cards) to match the layout convention used in protocol panels like Bluetooth.
Always show the chevron in ha-navigation-list, removing the narrow condition.
Drop the unused narrow prop from ha-navigation-list.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* refactor: move ha-config-navigation-list to src/components
Makes the component available outside the config panel. Update import
paths in the two existing config consumers and use it in the profile
dashboard. Remove the now-unused ha-navigation-list (which relied on
ha-md-list/ha-md-list-item).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: security subpage width and card spacing
Use .container > * instead of ha-card to apply max-width and margin,
since the security cards are custom elements whose inner ha-card lives
in their own shadow DOM and is unreachable from the parent stylesheet.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* refactor(profile): move language setting to localization subpage
Language is a regional/cultural preference, consistent with the other
settings in localization (time zone, date and time formats).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* refactor(profile): rename profile subpage labels
- "User preferences" -> "Appearance"
- "Browser settings" -> "This browser"
- "Mobile app settings" -> "This mobile app"
* feat(profile): surface theme picker on dashboard page
Move ha-pick-theme-row from the Appearance subpage to the profile
dashboard, between the user card and the navigation list. Theme and
dark mode are now accessible directly without navigating to a subpage.
Update Appearance description to reflect its new scope.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* refactor(profile): restructure theme row layout and labels
Split dark mode and color pickers into separate ha-settings-row elements
with headings. Move reset button outside the color-row to keep the label
vertically stable when the button appears. Add padding to reset row.
Rename "Reset" to "Reset colors" for clarity.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* add title to theme settings card
* refactor(profile): apply theme row layout improvements to ha-theme-settings
Migrate the dark mode and color pickers layout from ha-pick-theme-row into
ha-theme-settings: use separate ha-settings-row elements with headings for
dark mode and custom colors, move reset button outside as a sibling element.
Add colors label to ThemeSettingsLabels interface.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* refactor(profile): migrate theme settings to ha-list-item-base layout
Replace ha-settings-row elements in ha-theme-settings with ha-list-item-base
inside ha-list-base for a more compact appearance. Split color pickers into
individual rows (one per color). Reduce vertical padding to --ha-space-2.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* refactor(profile): combine color pickers into single row with label
Merge primary and accent color pickers into one ha-list-item-base row
under a "Custom colors" headline. Restore labels on individual pickers
and increase their min-width to 150px.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix(profile): stack theme settings rows vertically in narrow mode
Reflect narrow prop on host and use ::part(base/end) to stack all
ha-list-item-base rows in column layout on narrow screens, preventing
headline truncation from oversized end slot controls.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* Fix test:e2e:demo
* fix broken links
* Add my links
* Use s instead of smal for ha-button size
Co-authored-by: Maarten Lakerveld <git@maartenlakerveld.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Maarten Lakerveld <git@maartenlakerveld.com>
* Wrap dashboard loading spinner in a delayed fade in component
* Expose initial view render completion
* Wait for dashboard initial readiness
* Signal initial Lovelace view readiness
* Aggregate dashboard view readiness
* Wait for generated panel readiness
* Test dashboard initial readiness
* Add fade in delay to correct dashboard loading
* Delay generated panel readiness until content
* Test generated dashboard initial readiness
* Guard component spread against undefined for unknown panels
Co-authored-by: timmo001 <28114703+timmo001@users.noreply.github.com>
* Wait for calendar and media browser readiness
* Test calendar and media browser readiness
* Wait for media panel host readiness
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Simon Lamon <32477463+silamon@users.noreply.github.com>
Fix race in demo e2e sidebar helper on narrow viewports
openDemoSidebar decided whether the sidebar was behind a modal drawer by
sampling ha-menu-button visibility. That element renders nothing until its
Lit contexts resolve, so right after load it reads as hidden on the narrow
layout too. The helper then took the wide-layout branch, never opened the
drawer, and the following panel assertion waited out its timeout on an
attached-but-hidden #sidebar-panel-map.
Read the layout from ha-drawer's type instead, which home-assistant-main
sets while committing its first render, and wait for the drawer to report
open after clicking the menu button.
* 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
* Dont open demo
* Scripts to run script/develop*
* Scripts for dev demo and gallery
* Background wrapper for agents with `--background`
* Background `yarn dev` and `dev:serve` for agents
* Dedupe lifecycle functions
* Apply suggestions from code review
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>