Compare commits

..

103 Commits

Author SHA1 Message Date
Aidan Timson
0ce17e3dea Keep number 2025-09-04 14:04:07 +01:00
Aidan Timson
ef9029829a Stop propogation of event 2025-09-04 13:54:05 +01:00
Aidan Timson
8bc53c61f2 Use type 2025-09-04 13:49:49 +01:00
Aidan Timson
711dcdbff0 Don't try to flip 2025-09-04 13:46:58 +01:00
Aidan Timson
6834e458d7 Fix 2025-09-04 13:29:03 +01:00
Aidan Timson
d597239925 Move to helper 2025-09-04 13:15:50 +01:00
Aidan Timson
004b3ce025 Simplify example 2025-09-04 12:06:11 +01:00
Aidan Timson
43e7b55e99 Focus 2025-09-04 11:11:24 +01:00
Aidan Timson
ea5fe14a64 Test panel, revert this when done 2025-09-04 11:04:24 +01:00
Aidan Timson
807fbf8bb6 Work with clamps 2025-09-04 11:04:24 +01:00
Aidan Timson
44cd425ce8 Remove duplicate event 2025-09-04 11:04:24 +01:00
Aidan Timson
af01f66329 Fix 2025-09-04 11:04:24 +01:00
Aidan Timson
d5892b372c icons, labels 2025-09-04 11:04:24 +01:00
Aidan Timson
8656df6129 Add padStart 2025-09-04 11:04:24 +01:00
Aidan Timson
8c543ee67c Setup 2025-09-04 11:04:24 +01:00
Aidan Timson
4789d8c793 Setup 2025-09-04 11:04:24 +01:00
Aidan Timson
f08bbe7c1e Setup 2025-09-04 11:04:24 +01:00
Aidan Timson
9f1ee988bc Setup 2025-09-04 11:04:24 +01:00
Aidan Timson
eba0fa35d3 Setup 2025-09-04 11:04:23 +01:00
Aidan Timson
5b8c5375b4 Setup 2025-09-04 11:04:23 +01:00
Bram Kragten
bf351d67e9 Revert "Rename "Logbook" to "Activity" in user-facing strings" (#26867)
Revert "Rename "Logbook" to "Activity" in user-facing strings (#26619)"

This reverts commit 057fad55e8.
2025-09-04 11:14:16 +02:00
Wendelin
b75fa013d2 Fix script with fields fields in tile card button feature (#26866)
Check script fields in tile card button feature
2025-09-04 11:42:41 +03:00
Paul Bottein
2601b0d89c Display area with only sensors in climate view in home dashboard (#26863)
* Display area with only sensors in climate view in home dashboard

* Update home-climate-view-strategy.ts

Co-authored-by: Simon Lamon <32477463+silamon@users.noreply.github.com>

---------

Co-authored-by: Simon Lamon <32477463+silamon@users.noreply.github.com>
2025-09-04 10:11:35 +02:00
Mike Kelly
ef8410e121 Add MCF as another volume unit (#26400) 2025-09-04 09:30:13 +03:00
karwosts
37610703c8 Pass first weekday to recorder/statistic_during_period (#26229)
* Pass first weekday to recorder/statistic_during_period

* switch order
2025-09-04 09:27:40 +03:00
Aidan Timson
4efd9bba8a Fix weather more info forecast layout jump when loading data (#26764)
* Fix weather more info forecast layout jump when loading data

* Tabs arent always populated

* Apply suggestions from code review

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Petar Petrov <MindFreeze@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-09-04 06:04:56 +00:00
Paulus Schoutsen
e1fe7976d8 Do not allow filtering by automation labels on mobile (#26861) 2025-09-04 08:47:52 +03:00
Simon Lamon
53b96107d9 Home dashboard: Climate fix (#26856)
* Climate dashboard fix

* Update home-climate-view-strategy.ts
2025-09-03 18:55:33 +02:00
Bram Kragten
dcbad9e798 Dont align with clipboard on copy/cut automation item (#26855) 2025-09-03 14:19:02 +00:00
karwosts
26b3212c7e Enable sorting step flow menu options in user language (#26845)
* Enable sorting step flow menu options in user language

* Remove menu_sort_values

* Update src/dialogs/config-flow/step-flow-menu.ts

Co-authored-by: Petar Petrov <MindFreeze@users.noreply.github.com>

* prettier

---------

Co-authored-by: Petar Petrov <MindFreeze@users.noreply.github.com>
2025-09-03 17:03:09 +03:00
Paul Bottein
f3f4bcfe45 Rename history chart to trend graph (#26854)
* Rename history chart to trend graph

* rename element and prettier

---------

Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2025-09-03 10:56:05 +00:00
Bram Kragten
7cfa9de75f Bumped version to 20250903.0 2025-09-03 12:05:19 +02:00
Paul Bottein
b66dc8894d Improve responsive support for history graph feature (#26851) 2025-09-03 12:00:49 +02:00
Wendelin
14a7813ab0 Fix automation narrow bottom sheet close animation (#26850) 2025-09-03 09:45:13 +00:00
Bram Kragten
70a2ca281f Update shortcuts dialog (#26849) 2025-09-03 10:01:10 +02:00
Wendelin
d982f042fc Update device action button variant based on warning class (#26848) 2025-09-03 07:06:18 +00:00
J. Nick Koston
e60f9e326b Show scanner-type-specific power cycle instructions in Bluetooth UI (#26847)
* Show scanner-type-specific power cycle instructions in Bluetooth UI

* preen
2025-09-03 10:03:03 +03:00
J. Nick Koston
ba39d189e7 Show scanner current state in the Bluetooth UI (#26792)
* Show scanner current state in the Bluetooth UI

The state updates live as the scanner changes mode, and provides
a warning on what to do if the scanner gets in a bad state

* Show scanner current state in the Bluetooth UI

The state updates live as the scanner changes mode, and provides
a warning on what to do if the scanner gets in a bad state

* cleanup

* switch
2025-09-02 15:20:06 -03:00
Paul Bottein
78867b2cd9 Remove non numerical sensor and binary-sensor for history chart feature (#26838)
* Use hui-graph-base for chart history feature and remove non numerical sensor support

* Fix chart opacity
2025-09-02 14:38:06 -03:00
Paul Bottein
1dff42dc00 Change home summaries color (#26839) 2025-09-02 18:14:46 +02:00
Bram Kragten
0c9b3a0765 Remove expand all/collapse all options from overflow (#26837)
* remove expand all/collapse all options from overflow

* ignore
2025-09-02 16:26:44 +02:00
Bram Kragten
5a109c0ba8 Align box shadows (#26835)
* Align box shadows

* update colors
2025-09-02 14:15:48 +00:00
Bram Kragten
f3b214c30a Add new shortcuts to shortcuts dialog (#26836) 2025-09-02 17:08:32 +03:00
Petar Petrov
c49d2a0be6 Add support for option descriptions in config flows (#26825)
* Add support for option descriptions in config flows

* use `twoline`

* remove unused classes
2025-09-02 14:03:35 +00:00
Bram Kragten
c6c3170c1b Tweak automation row (#26834)
tweak automation row
2025-09-02 13:50:05 +00:00
Paul Bottein
0abb958aea Clean graph in security and climate view in home dashboard (#26833) 2025-09-02 14:58:56 +02:00
Bram Kragten
9d55843629 Fix scrolling items in the bottom into view (#26830) 2025-09-02 14:57:11 +02:00
Bram Kragten
b70d309297 add shadow when scrollable in automation bottom sheet, min height 50vh (#26828) 2025-09-02 14:12:48 +02:00
Simon Lamon
5961b71562 Home dashboard: Ensure temperature sensor entity exists (#26831) 2025-09-02 13:03:18 +02:00
karwosts
6942626f60 Differentate service vs device in more-info link (#26823) 2025-09-02 12:44:16 +02:00
Aidan Timson
069c0acdff Fix capitalization on data table filter button (#26829) 2025-09-02 10:44:01 +00:00
Bram Kragten
1f0d83190d prevent keyboard shortcuts with more modifier keys (#26826) 2025-09-02 09:39:54 +02:00
Wendelin
7c6c92c856 Automation-keybindings (#26762)
Co-authored-by: Norbert Rittel <norbert@rittel.de>
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2025-09-01 21:41:50 +02:00
Robert Resch
eff352cde1 Warn about system performance when setting camera stream orientation (#26616) 2025-09-01 20:54:48 +02:00
Bram Kragten
62a75c188c Change drag selected styling (#26822) 2025-09-01 20:26:25 +02:00
Paul Bottein
4ffa6b6186 Force energy distribution to display the data of today (#26811) 2025-09-01 18:12:34 +02:00
Paul Bottein
25173cf605 Don't use ha-automation-row-selected to know if the item was selected (#26812) 2025-09-01 18:12:08 +02:00
Paul Bottein
3277d8e80b Add automation testing logic to sidebar (#26815) 2025-09-01 18:08:59 +02:00
Bram Kragten
55864fdc82 Update hover and hightlight states for automation rows (#26820) 2025-09-01 17:40:03 +02:00
Paul Bottein
d4d662ba46 Fix automation sidebar z index (#26810) 2025-09-01 17:21:36 +02:00
Paul Bottein
3ea5f508bb Remove box shadow for ha card in automation bottom sheet on mobile (#26817) 2025-09-01 17:19:09 +02:00
Paul Bottein
902a5dd678 Fix tag trigger when using it inside sidebar (#26819) 2025-09-01 17:18:18 +02:00
renovate[bot]
4a3ed62583 Update dependency @types/chromecast-caf-receiver to v6.0.24 (#26500)
* Update dependency @types/chromecast-caf-receiver to v6.0.24

* Use enum strings directly to make TS happy

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Petar Petrov <MindFreeze@users.noreply.github.com>
2025-09-01 14:53:10 +00:00
Paul Bottein
b4223e9e92 Use summary card in home dashboard (#26775) 2025-09-01 15:13:53 +02:00
Paul Bottein
99955d7818 Fix add dialog on dashboards on mobile (#26807) 2025-09-01 15:39:52 +03:00
Paul Bottein
f66768726c Update heading subtitle height to better fix grid (#26808) 2025-09-01 15:39:03 +03:00
Michel van de Wetering
0e4be02b2c Remove Hue bridge v1 image (#26674) 2025-09-01 15:27:50 +03:00
Bram Kragten
6daea23b3c Enable drag and drop on mobile for automations (#26805) 2025-09-01 14:09:13 +02:00
Petar Petrov
e21ddcb1e5 Handle negative values in History chart card feature (#26806) 2025-09-01 11:45:52 +00:00
Wendelin
ded85d9f27 Automation editor: fix yaml editor and editor switch (#26772) 2025-09-01 13:26:17 +02:00
Petar Petrov
eea43494da Use feature-color in History chart feature (#26802) 2025-09-01 11:34:44 +02:00
Norbert Rittel
9cf9ef927d Expand description for disabled services (#26782)
* Expand description for disabled services

* Drop "not added to Home Assistant"
2025-09-01 09:51:22 +03:00
Paulus Schoutsen
779ec4f583 Do not add graphs to every sensor tile card (#26793) 2025-08-31 15:11:41 +00:00
renovate[bot]
c541831cd2 Update dependency marked to v16.2.1 (#26785)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-31 17:07:02 +02:00
renovate[bot]
fd20c2a554 Update dependency @rspack/core to v1.5.1 (#26790)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-31 17:06:55 +02:00
uptimeZERO_
14fd29808c Bugfix: Fixed column widths in the dashboard config page (#26777)
Fixed column widths in dashboard config
2025-08-30 11:54:37 +00:00
Aidan Timson
7132ee157f Adjust states set state layout (#26765) 2025-08-30 13:11:41 +02:00
J. Nick Koston
1596b313d5 Add RSSI color gradient to Bluetooth visualization to identify connection problems (#26778) 2025-08-29 14:15:00 -05:00
karwosts
70cd68ded7 Don't use context for media selector with 'accept' (#26773) 2025-08-29 14:08:11 +00:00
renovate[bot]
cc91a6185e Update dependency @rspack/core to v1.5.0 (#26768)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-29 17:05:14 +03:00
Paul Bottein
1fd7c84583 Use fixed layout for automation sidebar to have scrollbar on the side (#26751)
Co-authored-by: Wendelin <12148533+wendevlin@users.noreply.github.com>
2025-08-29 14:19:13 +02:00
Paul Bottein
0269540ee9 Add translations for home dashboard (#26763) 2025-08-29 14:17:55 +02:00
renovate[bot]
98390b3843 Update Yarn to v4.9.4 (#26760)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-29 08:12:28 +00:00
Paul Bottein
269628929c Fix alert z-index for automation and script (#26759) 2025-08-29 08:05:05 +00:00
Norbert Rittel
21fcc84afd Improve OAuth setup explanation (#26758)
* Improve OAuth setup explanation

* Add "your"

* Include "application" in headline
2025-08-29 09:59:31 +02:00
Wendelin
b86c1db83d Automation editor: fix focus handling (#26755) 2025-08-29 08:39:06 +02:00
renovate[bot]
a376670478 Update dependency typescript-eslint to v8.41.0 (#26757)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-29 08:21:34 +02:00
renovate[bot]
72c62079aa Update dependency hls.js to v1.6.11 (#26756)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-29 08:21:28 +02:00
Surya Prakash
9baf875585 Fix: Keep buttons active in picture-glance-card regardless of state (#26718)
* Fix: Keep buttons active in picture-glance-card regardless of state


Fixes #26683

**Problem:**
Buttons in the picture-glance-card were incorrectly disabled when their state was 'unknown', making them unclickable.

**Root Cause:**
The `disabled` property was being set based on the state value, but buttons should remain clickable regardless of their state since their state only reflects the last time they were pressed.

**Solution:**
Set `disabled=${false}` to ensure buttons are always active and clickable.

**Testing:**
Verified that buttons remain active and functional even when state is 'unknown'.

* Fix: Ensure buttons get state-on class when state is unknown

Fixes #26683

The "state-on" class was not being applied when button state was
"unknown" because "unknown" was included in the STATES_OFF set.
This ensures buttons appear active regardless of their state.

* Update hui-picture-glance-card.ts

* Update hui-picture-glance-card.ts

* Update hui-picture-glance-card.ts

* Update hui-picture-glance-card.ts

* Update hui-picture-glance-card.ts

* Update hui-picture-glance-card.ts

* Update hui-picture-glance-card.ts
2025-08-29 08:20:39 +02:00
Jonathan Keslin
175915218f Hide leading zero in clock card hour when using 12-hour time format (#26669)
Remove leading zero on hour on Clock card when displayed with 12-hour time format
2025-08-29 08:42:07 +03:00
Wendelin
25f25243bd Automation editor: overflow changes and style fixes (#26744)
* Fix for width also for blueprint editor

* Fix overflow menus

* Fix option icons

* Fix iOS bottom sheet flickering and drag handle

* Fix mobile padding

* Fix padding in sidebar

* Fix overflow placement

* Add new a11y sort

* Remove overflow in rows

* Fix a11y select row

* Revert "Fix a11y select row"

This reverts commit 54260c4a37.

* Fix option padding on blueprint

---------

Co-authored-by: Paul Bottein <paul.bottein@gmail.com>
2025-08-28 16:42:45 +00:00
karwosts
cf8d36b1f3 Hide 'options' from enum more info (#26736)
* Hide 'options' from enum more info

* restrict to specific domain and class
2025-08-28 18:08:33 +02:00
Aidan Timson
e3a9d754df Change loading detailed storage to use ha-alert with spinner (#26749)
* Change spinner overlay to use `ha-alert` with messaging

* Use spinner for icon slot
2025-08-28 18:05:53 +02:00
Petar Petrov
7b303a699b Increase disk usage request timeout (#26748) 2025-08-28 16:32:52 +03:00
renovate[bot]
ee45eb00f7 Update vaadinWebComponents monorepo to v24.8.6 (#26746)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-28 15:38:03 +03:00
Norbert Rittel
24a6aa2669 Different spelling fixes of user-facing strings (#26745)
* Different spelling fixes of user-facing strings

* Fix menu "Application credentials" menu item name
2025-08-28 15:37:06 +03:00
Aidan Timson
66d011cfb9 Move automation and script ha-alerts to main flow (#26735)
Co-authored-by: Wendelin <12148533+wendevlin@users.noreply.github.com>
2025-08-28 13:53:15 +02:00
Wendelin
35895735cc Fix automation editor drag selected row in/out nested (#26740)
Fix nested sort
2025-08-28 13:30:14 +02:00
Norbert Rittel
e71df0b71a Improve section descriptions in Automation editor (#26741)
Replace "listed here" or "list of" with "added here"
2025-08-28 11:05:31 +02:00
Paulus Schoutsen
2a9846c598 Show configured area sensors on climate domain dashboard (#26737) 2025-08-28 08:34:45 +03:00
Paulus Schoutsen
b243d56bee Show binary sensors with graphs on the security dashboard (#26738) 2025-08-28 08:26:44 +03:00
J. Nick Koston
6a372a165e Improve network adapter configuration discoverability (#26734) 2025-08-27 09:59:23 -05:00
Paul Bottein
a5dad9bc22 Use entity picture for home favorite and update home dashboard icon (#26732)
* Add strategy icon

* Use entity picture for favorite
2025-08-27 16:33:48 +02:00
44 changed files with 1641 additions and 814 deletions

File diff suppressed because one or more lines are too long

View File

@@ -6,4 +6,4 @@ enableGlobalCache: false
nodeLinker: node-modules
yarnPath: .yarn/releases/yarn-4.9.3.cjs
yarnPath: .yarn/releases/yarn-4.9.4.cjs

View File

@@ -5,17 +5,17 @@ const castContext = framework.CastReceiverContext.getInstance();
const playerManager = castContext.getPlayerManager();
playerManager.setMessageInterceptor(
framework.messages.MessageType.LOAD,
"LOAD" as framework.messages.MessageType.LOAD,
(loadRequestData) => {
const media = loadRequestData.media;
// Special handling if it came from Google Assistant
if (media.entity) {
media.contentId = media.entity;
media.streamType = framework.messages.StreamType.LIVE;
media.streamType = "LIVE" as framework.messages.StreamType.LIVE;
media.contentType = "application/vnd.apple.mpegurl";
// @ts-ignore
media.hlsVideoSegmentFormat =
framework.messages.HlsVideoSegmentFormat.FMP4;
"fmp4" as framework.messages.HlsVideoSegmentFormat.FMP4;
}
return loadRequestData;
}

View File

@@ -40,7 +40,8 @@ const playDummyMedia = (viewTitle?: string) => {
loadRequestData.media.contentId =
"https://cast.home-assistant.io/images/google-nest-hub.png";
loadRequestData.media.contentType = "image/jpeg";
loadRequestData.media.streamType = framework.messages.StreamType.NONE;
loadRequestData.media.streamType =
"NONE" as framework.messages.StreamType.NONE;
const metadata = new framework.messages.GenericMediaMetadata();
metadata.title = viewTitle;
loadRequestData.media.metadata = metadata;
@@ -89,7 +90,7 @@ const showMediaPlayer = () => {
const options = new framework.CastReceiverOptions();
options.disableIdleTimeout = true;
options.customNamespaces = {
[CAST_NS]: framework.system.MessageType.JSON,
[CAST_NS]: "json" as framework.system.MessageType.JSON,
};
castContext.addCustomMessageListener(
@@ -97,9 +98,7 @@ castContext.addCustomMessageListener(
// @ts-ignore
(ev: ReceivedMessage<HassMessage>) => {
// We received a show Lovelace command, stop media from playing, hide media player and show Lovelace controller
if (
playerManager.getPlayerState() !== framework.messages.PlayerState.IDLE
) {
if (playerManager.getPlayerState() !== "IDLE") {
playerManager.stop();
} else {
showLovelaceController();
@@ -113,7 +112,7 @@ castContext.addCustomMessageListener(
const playerManager = castContext.getPlayerManager();
playerManager.setMessageInterceptor(
framework.messages.MessageType.LOAD,
"LOAD" as framework.messages.MessageType.LOAD,
(loadRequestData) => {
if (
loadRequestData.media.contentId ===
@@ -127,24 +126,23 @@ playerManager.setMessageInterceptor(
// Special handling if it came from Google Assistant
if (media.entity) {
media.contentId = media.entity;
media.streamType = framework.messages.StreamType.LIVE;
media.streamType = "LIVE" as framework.messages.StreamType.LIVE;
media.contentType = "application/vnd.apple.mpegurl";
// @ts-ignore
media.hlsVideoSegmentFormat =
framework.messages.HlsVideoSegmentFormat.FMP4;
"fmp4" as framework.messages.HlsVideoSegmentFormat.FMP4;
}
return loadRequestData;
}
);
playerManager.addEventListener(
framework.events.EventType.MEDIA_STATUS,
"MEDIA_STATUS" as framework.events.EventType.MEDIA_STATUS,
(event) => {
if (
event.mediaStatus?.playerState === framework.messages.PlayerState.IDLE &&
event.mediaStatus?.playerState === "IDLE" &&
event.mediaStatus?.idleReason &&
event.mediaStatus?.idleReason !==
framework.messages.IdleReason.INTERRUPTED
event.mediaStatus?.idleReason !== "INTERRUPTED"
) {
// media finished or stopped, return to default Lovelace
showLovelaceController();

View File

@@ -1106,7 +1106,7 @@ export default {
friendly_name: "Philips Hue",
entity_picture: null,
description:
"Press the button on the bridge to register Philips Hue with Home Assistant.\n\n![Description image](/static/images/config_philips_hue.jpg)",
"Press the button on the bridge to register Philips Hue with Home Assistant.",
submit_caption: "I have pressed the button",
},
last_changed: "2018-07-19T10:44:46.515160+00:00",

View File

@@ -89,8 +89,8 @@
"@thomasloven/round-slider": "0.6.0",
"@tsparticles/engine": "3.9.1",
"@tsparticles/preset-links": "3.2.0",
"@vaadin/combo-box": "24.8.5",
"@vaadin/vaadin-themable-mixin": "24.8.5",
"@vaadin/combo-box": "24.8.6",
"@vaadin/vaadin-themable-mixin": "24.8.6",
"@vibrant/color": "4.0.0",
"@vue/web-component-wrapper": "1.3.0",
"@webcomponents/scoped-custom-element-registry": "0.0.10",
@@ -112,7 +112,7 @@
"fuse.js": "7.1.0",
"google-timezones-json": "1.2.0",
"gulp-zopfli-green": "6.0.2",
"hls.js": "1.6.10",
"hls.js": "1.6.11",
"home-assistant-js-websocket": "9.5.0",
"idb-keyval": "6.2.2",
"intl-messageformat": "10.7.16",
@@ -123,7 +123,7 @@
"lit": "3.3.1",
"lit-html": "3.3.1",
"luxon": "3.7.1",
"marked": "16.2.0",
"marked": "16.2.1",
"memoize-one": "6.0.0",
"node-vibrant": "4.0.3",
"object-hash": "3.0.0",
@@ -159,10 +159,10 @@
"@octokit/plugin-retry": "8.0.1",
"@octokit/rest": "22.0.0",
"@rsdoctor/rspack-plugin": "1.2.3",
"@rspack/core": "1.4.11",
"@rspack/core": "1.5.1",
"@rspack/dev-server": "1.1.4",
"@types/babel__plugin-transform-runtime": "7.9.5",
"@types/chromecast-caf-receiver": "6.0.22",
"@types/chromecast-caf-receiver": "6.0.24",
"@types/chromecast-caf-sender": "1.0.11",
"@types/color-name": "2.0.0",
"@types/culori": "4.0.0",
@@ -218,7 +218,7 @@
"terser-webpack-plugin": "5.3.14",
"ts-lit-plugin": "2.0.2",
"typescript": "5.9.2",
"typescript-eslint": "8.40.0",
"typescript-eslint": "8.41.0",
"vite-tsconfig-paths": "5.1.4",
"vitest": "3.2.4",
"webpack-stats-plugin": "1.1.3",
@@ -235,7 +235,7 @@
"globals": "16.3.0",
"tslib": "2.8.1",
"@material/mwc-list@^0.27.0": "patch:@material/mwc-list@npm%3A0.27.0#~/.yarn/patches/@material-mwc-list-npm-0.27.0-5344fc9de4.patch",
"@vaadin/vaadin-themable-mixin": "24.8.5"
"@vaadin/vaadin-themable-mixin": "24.8.6"
},
"packageManager": "yarn@4.9.3"
"packageManager": "yarn@4.9.4"
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

View File

@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project]
name = "home-assistant-frontend"
version = "20250903.3"
version = "20250903.0"
license = "Apache-2.0"
license-files = ["LICENSE*"]
description = "The Home Assistant frontend"

View File

@@ -232,6 +232,7 @@ export class HaBottomSheet extends LitElement {
box-shadow: var(--wa-shadow-l);
padding: 0;
margin: 0;
top: auto;
inset-inline-end: auto;
bottom: 0;

View File

@@ -0,0 +1,121 @@
import { css, html, LitElement } from "lit";
import { customElement, property, query } from "lit/decorators";
import memoizeOne from "memoize-one";
import { mdiMinus, mdiPlus } from "@mdi/js";
import { fireEvent } from "../common/dom/fire_event";
import type { HaIconButton } from "./ha-icon-button";
import "./ha-textfield";
import "./ha-icon-button";
import { clampValue } from "../data/number";
@customElement("ha-numeric-arrow-input")
export class HaNumericArrowInput extends LitElement {
@property({ attribute: false }) public disabled = false;
@property({ attribute: false }) public required = false;
@property({ attribute: false }) public min?: number;
@property({ attribute: false }) public max?: number;
@property({ attribute: false }) public step?: number;
@property({ attribute: false }) public padStart?: number;
@property({ attribute: false }) public labelUp = "Increase";
@property({ attribute: false }) public labelDown = "Decrease";
@property({ attribute: false }) public value = 0;
@query("ha-icon-button[data-direction='up']")
private _upButton!: HaIconButton;
@query("ha-icon-button[data-direction='down']")
private _downButton!: HaIconButton;
private _paddedValue = memoizeOne((value: number, padStart?: number) =>
value.toString().padStart(padStart ?? 0, "0")
);
render() {
return html`<div
class="numeric-arrow-input-container"
@keydown=${this._keyDown}
>
<ha-icon-button
data-direction="up"
.disabled=${this.disabled}
.label=${this.labelUp}
.path=${mdiPlus}
@click=${this._up}
></ha-icon-button>
<span class="numeric-arrow-input-value"
>${this._paddedValue(this.value, this.padStart)}</span
>
<ha-icon-button
data-direction="down"
.disabled=${this.disabled}
.label=${this.labelDown}
.path=${mdiMinus}
@click=${this._down}
></ha-icon-button>
</div>`;
}
private _keyDown(ev: KeyboardEvent) {
if (ev.key === "ArrowUp") {
this._upButton.focus();
this._up();
}
if (ev.key === "ArrowDown") {
this._downButton.focus();
this._down();
}
}
private _up() {
const newValue = this.value + (this.step ?? 1);
fireEvent(
this,
"value-changed",
clampValue({ value: newValue, min: this.min, max: this.max })
);
}
private _down() {
const newValue = this.value - (this.step ?? 1);
fireEvent(
this,
"value-changed",
clampValue({ value: newValue, min: this.min, max: this.max })
);
}
static styles = css`
.numeric-arrow-input-container {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 4px;
}
.numeric-arrow-input-container ha-icon-button {
--mdc-icon-button-size: 24px;
color: var(--secondary-text-color);
}
.numeric-arrow-input-value {
color: var(--primary-text-color);
font-size: 16px;
font-weight: 500;
}
`;
}
declare global {
interface HTMLElementTagNameMap {
"ha-numeric-arrow-input": HaNumericArrowInput;
}
}

View File

@@ -0,0 +1,281 @@
import type { PropertyValues } from "lit";
import { css, html, LitElement, nothing } from "lit";
import { customElement, property, state } from "lit/decorators";
import { clampValue } from "../data/number";
import { useAmPm } from "../common/datetime/use_am_pm";
import { fireEvent } from "../common/dom/fire_event";
import type { FrontendLocaleData } from "../data/translation";
import type { HomeAssistant } from "../types";
import type { ClampedValue } from "../data/number";
import "./ha-base-time-input";
import "./ha-button";
import "./ha-numeric-arrow-input";
@customElement("ha-time-picker")
export class HaTimePicker extends LitElement {
@property({ attribute: false }) public hass!: HomeAssistant;
@property({ attribute: false }) public locale!: FrontendLocaleData;
@property({ attribute: false }) public value?: string;
@property({ attribute: false }) public disabled = false;
@property({ attribute: false }) public required = false;
@property({ attribute: false }) public enableSeconds = false;
@state() private _hours = 0;
@state() private _minutes = 0;
@state() private _seconds = 0;
@state() private _useAmPm = false;
@state() private _isPm = false;
protected firstUpdated(changedProperties: PropertyValues) {
super.firstUpdated(changedProperties);
this._useAmPm = useAmPm(this.locale);
let hours = NaN;
let minutes = NaN;
let seconds = NaN;
let isPm = false;
if (this.value) {
const parts = this.value?.split(":") || [];
minutes = parts[1] ? Number(parts[1]) : 0;
seconds = parts[2] ? Number(parts[2]) : 0;
const hour24 = parts[0] ? Number(parts[0]) : 0;
if (this._useAmPm) {
if (hour24 === 0) {
hours = 12;
isPm = false;
} else if (hour24 < 12) {
hours = hour24;
isPm = false;
} else if (hour24 === 12) {
hours = 12;
isPm = true;
} else {
hours = hour24 - 12;
isPm = true;
}
} else {
hours = hour24;
}
}
this._hours = hours;
this._minutes = minutes;
this._seconds = seconds;
this._isPm = isPm;
}
protected render() {
return html`<div class="time-picker-container">
<ha-numeric-arrow-input
.disabled=${this.disabled}
.required=${this.required}
.min=${this._useAmPm ? 1 : 0}
.max=${this._useAmPm ? 12 : 23}
.step=${1}
.padStart=${2}
.value=${this._hours}
@value-changed=${this._hoursChanged}
.labelUp=${
// TODO: Localize
"Increase hours"
}
.labelDown=${
// TODO: Localize
"Decrease hours"
}
></ha-numeric-arrow-input>
<span class="time-picker-separator">:</span>
<ha-numeric-arrow-input
.disabled=${this.disabled}
.required=${this.required}
.min=${0}
.max=${59}
.step=${1}
.padStart=${2}
.labelUp=${
// TODO: Localize
"Increase minutes"
}
.labelDown=${
// TODO: Localize
"Decrease minutes"
}
.value=${this._minutes}
@value-changed=${this._minutesChanged}
></ha-numeric-arrow-input>
${this.enableSeconds
? html`
<span class="time-picker-separator">:</span>
<ha-numeric-arrow-input
.disabled=${this.disabled}
.required=${this.required}
.min=${0}
.max=${59}
.step=${1}
.padStart=${2}
.labelUp=${
// TODO: Localize
"Increase seconds"
}
.labelDown=${
// TODO: Localize
"Decrease seconds"
}
.value=${this._seconds}
@value-changed=${this._secondsChanged}
></ha-numeric-arrow-input>
`
: nothing}
${this._useAmPm
? html`
<ha-button @click=${this._toggleAmPm}>
${this._isPm ? "PM" : "AM"}
</ha-button>
`
: nothing}
</div>`;
}
protected updated(changedProperties: PropertyValues) {
super.updated(changedProperties);
if (changedProperties.has("_hours")) {
this._timeUpdated();
}
if (changedProperties.has("_minutes")) {
this._timeUpdated();
}
if (changedProperties.has("_seconds")) {
this._timeUpdated();
}
if (changedProperties.has("_useAmPm")) {
this._timeUpdated();
}
if (changedProperties.has("_isPm")) {
this._timeUpdated();
}
}
private _hoursChanged(ev: CustomEvent<ClampedValue>) {
ev.stopPropagation?.();
this._hours = ev.detail.value;
}
private _minutesChanged(ev: CustomEvent<ClampedValue>) {
ev.stopPropagation?.();
this._minutes = ev.detail.value;
if (ev.detail.clamped) {
if (ev.detail.value === 0) {
this._hoursChanged({
detail: clampValue({
value: this._hours - 1,
min: this._useAmPm ? 1 : 0,
max: this._useAmPm ? 12 : 23,
}),
} as CustomEvent<ClampedValue>);
this._minutes = 59;
}
if (ev.detail.value === 59) {
this._hoursChanged({
detail: clampValue({
value: this._hours + 1,
min: this._useAmPm ? 1 : 0,
max: this._useAmPm ? 12 : 23,
}),
} as CustomEvent<ClampedValue>);
const hourMax = this._useAmPm ? 12 : 23;
if (this._hours < hourMax) {
this._minutes = 0;
}
}
}
}
private _secondsChanged(ev: CustomEvent<ClampedValue>) {
ev.stopPropagation?.();
this._seconds = ev.detail.value;
if (ev.detail.clamped) {
if (ev.detail.value === 0) {
this._minutesChanged({
detail: clampValue({ value: this._minutes - 1, min: 0, max: 59 }),
} as CustomEvent<ClampedValue>);
this._seconds = 59;
}
if (ev.detail.value === 59) {
this._minutesChanged({
detail: clampValue({ value: this._minutes + 1, min: 0, max: 59 }),
} as CustomEvent<ClampedValue>);
const hourMax = this._useAmPm ? 12 : 23;
if (!(this._hours === hourMax && this._minutes === 59)) {
this._seconds = 0;
}
}
}
}
private _toggleAmPm() {
this._isPm = !this._isPm;
}
private _timeUpdated() {
let hour24 = this._hours;
if (this._useAmPm) {
if (this._hours === 12) {
hour24 = this._isPm ? 12 : 0;
} else {
hour24 = this._isPm ? this._hours + 12 : this._hours;
}
}
const timeParts = [
hour24.toString().padStart(2, "0"),
this._minutes.toString().padStart(2, "0"),
this._seconds.toString().padStart(2, "0"),
];
const time = timeParts.join(":");
if (time === this.value) {
return;
}
this.value = time;
fireEvent(this, "change");
fireEvent(this, "value-changed", { value: time });
}
static styles = css`
.time-picker-container {
display: flex;
flex-direction: row;
align-items: center;
gap: 4px;
}
.time-picker-separator {
color: var(--primary-text-color);
}
`;
}
declare global {
interface HTMLElementTagNameMap {
"ha-time-picker": HaTimePicker;
}
}

View File

@@ -24,11 +24,14 @@ export interface BluetoothConnectionData extends DataTableRowData {
source: string;
}
export type HaScannerType = "usb" | "uart" | "remote" | "unknown";
export interface BluetoothScannerDetails {
source: string;
connectable: boolean;
name: string;
adapter: string;
scanner_type?: HaScannerType;
}
export type BluetoothScannersDetails = Record<string, BluetoothScannerDetails>;
@@ -55,6 +58,13 @@ export interface BluetoothAllocationsData {
allocated: string[];
}
export interface BluetoothScannerState {
source: string;
adapter: string;
current_mode: "active" | "passive" | null;
requested_mode: "active" | "passive" | null;
}
export const subscribeBluetoothScannersDetailsUpdates = (
conn: Connection,
store: Store<BluetoothScannersDetails>
@@ -170,3 +180,20 @@ export const subscribeBluetoothConnectionAllocations = (
params
);
};
export const subscribeBluetoothScannerState = (
conn: Connection,
callbackFunction: (scannerState: BluetoothScannerState) => void,
configEntryId?: string
): Promise<() => Promise<void>> => {
const params: { type: string; config_entry_id?: string } = {
type: "bluetooth/subscribe_scanner_state",
};
if (configEntryId) {
params.config_entry_id = configEntryId;
}
return conn.subscribeMessage<BluetoothScannerState>(
(scannerState) => callbackFunction(scannerState),
params
);
};

View File

@@ -97,6 +97,7 @@ export interface DataEntryFlowStepMenu {
step_id: string;
/** If array, use value to lookup translations in strings.json */
menu_options: string[] | Record<string, string>;
sort?: boolean;
description_placeholders?: Record<string, string>;
translation_domain?: string;
}

View File

@@ -12,3 +12,35 @@ export const getNumberDeviceClassConvertibleUnits = (
type: "number/device_class_convertible_units",
device_class: deviceClass,
});
export interface ClampedValue {
clamped: boolean;
value: number;
}
/**
* Clamp a value between a minimum and maximum value
* @param value - The value to clamp
* @param min - The minimum value
* @param max - The maximum value
* @returns The clamped value
*/
export const clampValue = ({
value,
min,
max,
}: {
value: number;
min?: number;
max?: number;
}): ClampedValue => {
if (max !== undefined && value > max) {
return { clamped: true, value: max };
}
if (min !== undefined && value < min) {
return { clamped: true, value: min };
}
return { clamped: false, value };
};

View File

@@ -2,6 +2,7 @@ import type { Connection } from "home-assistant-js-websocket";
import { computeStateName } from "../common/entity/compute_state_name";
import type { HaDurationData } from "../components/ha-duration-input";
import type { HomeAssistant } from "../types";
import { firstWeekday } from "../common/datetime/first_weekday";
export interface RecorderInfo {
backlog: number | null;
@@ -108,7 +109,7 @@ export interface StatisticsValidationResultMeanTypeChanged {
};
}
export const VOLUME_UNITS = ["L", "gal", "ft³", "m³", "CCF"] as const;
export const VOLUME_UNITS = ["L", "gal", "ft³", "m³", "CCF", "MCF"] as const;
export interface StatisticsUnitConfiguration {
energy?: "Wh" | "kWh" | "MWh" | "GJ";
@@ -211,7 +212,14 @@ export const fetchStatistic = (
: period.fixed_period.end,
}
: undefined,
calendar: period.calendar,
calendar: period.calendar
? {
...(period.calendar.period === "week"
? { first_weekday: firstWeekday(hass.locale).substring(0, 3) }
: {}),
...period.calendar,
}
: undefined,
rolling_window: period.rolling_window,
});

View File

@@ -256,6 +256,13 @@ export const showConfigFlowDialog = (
);
},
renderMenuOptionDescription(hass, step, option) {
return hass.localize(
`component.${step.translation_domain || step.handler}.config.step.${step.step_id}.menu_option_descriptions.${option}`,
step.description_placeholders
);
},
renderLoadingDescription(hass, reason, handler, step) {
if (reason !== "loading_flow" && reason !== "loading_step") {
return "";

View File

@@ -137,6 +137,12 @@ export interface FlowConfig {
option: string
): string;
renderMenuOptionDescription(
hass: HomeAssistant,
step: DataEntryFlowStepMenu,
option: string
): string;
renderLoadingDescription(
hass: HomeAssistant,
loadingReason: LoadingReason,

View File

@@ -225,6 +225,13 @@ export const showOptionsFlowDialog = (
);
},
renderMenuOptionDescription(hass, step, option) {
return hass.localize(
`component.${step.translation_domain || configEntry.domain}.options.step.${step.step_id}.menu_option_descriptions.${option}`,
step.description_placeholders
);
},
renderLoadingDescription(hass, reason) {
return (
hass.localize(`component.${configEntry.domain}.options.loading`) ||

View File

@@ -252,6 +252,13 @@ export const showSubConfigFlowDialog = (
);
},
renderMenuOptionDescription(hass, step, option) {
return hass.localize(
`component.${step.translation_domain || configEntry.domain}.config_subentries.${flowType}.step.${step.step_id}.menu_option_descriptions.${option}`,
step.description_placeholders
);
},
renderLoadingDescription(hass, reason, handler, step) {
if (reason !== "loading_flow" && reason !== "loading_step") {
return "";

View File

@@ -1,5 +1,5 @@
import type { TemplateResult } from "lit";
import { css, html, LitElement } from "lit";
import type { PropertyValues, TemplateResult } from "lit";
import { css, html, LitElement, nothing } from "lit";
import { customElement, property } from "lit/decorators";
import { fireEvent } from "../../common/dom/fire_event";
import "../../components/ha-icon-next";
@@ -8,6 +8,7 @@ import type { DataEntryFlowStepMenu } from "../../data/data_entry_flow";
import type { HomeAssistant } from "../../types";
import type { FlowConfig } from "./show-dialog-data-entry-flow";
import { configFlowContentStyles } from "./styles";
import { stringCompare } from "../../common/string/compare";
@customElement("step-flow-menu")
class StepFlowMenu extends LitElement {
@@ -17,9 +18,18 @@ class StepFlowMenu extends LitElement {
@property({ attribute: false }) public step!: DataEntryFlowStepMenu;
protected shouldUpdate(changedProps: PropertyValues): boolean {
return (
changedProps.size > 1 ||
!changedProps.has("hass") ||
this.hass.localize !== changedProps.get("hass")?.localize
);
}
protected render(): TemplateResult {
let options: string[];
let translations: Record<string, string>;
let optionDescriptions: Record<string, string> = {};
if (Array.isArray(this.step.menu_options)) {
options = this.step.menu_options;
@@ -30,10 +40,36 @@ class StepFlowMenu extends LitElement {
this.step,
option
);
optionDescriptions[option] =
this.flowConfig.renderMenuOptionDescription(
this.hass,
this.step,
option
);
}
} else {
options = Object.keys(this.step.menu_options);
translations = this.step.menu_options;
optionDescriptions = Object.fromEntries(
options.map((key) => [
key,
this.flowConfig.renderMenuOptionDescription(
this.hass,
this.step,
key
),
])
);
}
if (this.step.sort) {
options = options.sort((a, b) =>
stringCompare(
translations[a]!,
translations[b]!,
this.hass.locale.language
)
);
}
const description = this.flowConfig.renderMenuDescription(
@@ -46,8 +82,18 @@ class StepFlowMenu extends LitElement {
<div class="options">
${options.map(
(option) => html`
<ha-list-item hasMeta .step=${option} @click=${this._handleStep}>
<ha-list-item
hasMeta
.step=${option}
@click=${this._handleStep}
?twoline=${optionDescriptions[option]}
>
<span>${translations[option]}</span>
${optionDescriptions[option]
? html`<span slot="secondary">
${optionDescriptions[option]}
</span>`
: nothing}
<ha-icon-next slot="meta"></ha-icon-next>
</ha-list-item>
`
@@ -73,11 +119,10 @@ class StepFlowMenu extends LitElement {
css`
.options {
margin-top: 20px;
margin-bottom: 8px;
margin-bottom: 16px;
}
.content {
padding-bottom: 16px;
border-bottom: 1px solid var(--divider-color);
}
.content + .options {
margin-top: 8px;

View File

@@ -6,7 +6,9 @@ import memoizeOne from "memoize-one";
import { formatDateWeekdayShort } from "../../../common/datetime/format_date";
import { formatTime } from "../../../common/datetime/format_time";
import { formatNumber } from "../../../common/number/format_number";
import "../../../components/ha-alert";
import "../../../components/ha-relative-time";
import "../../../components/ha-spinner";
import "../../../components/ha-state-icon";
import "../../../components/ha-svg-icon";
import "../../../components/ha-tooltip";
@@ -292,15 +294,12 @@ class MoreInfoWeather extends LitElement {
</div>
`
: nothing}
${forecast
? html`
<div class="section">
${this.hass.localize("ui.card.weather.forecast")}:
</div>
${supportedForecasts.length > 1
? html`<sl-tab-group
@sl-tab-show=${this._handleForecastTypeChanged}
>
${supportedForecasts?.length > 1
? html`<sl-tab-group @sl-tab-show=${this._handleForecastTypeChanged}>
${supportedForecasts.map(
(forecastType) =>
html`<sl-tab
@@ -308,17 +307,15 @@ class MoreInfoWeather extends LitElement {
.panel=${forecastType}
.active=${this._forecastType === forecastType}
>
${this.hass!.localize(
`ui.card.weather.${forecastType}`
)}
${this.hass!.localize(`ui.card.weather.${forecastType}`)}
</sl-tab>`
)}
</sl-tab-group>`
: nothing}
<div class="forecast">
${forecast.map((item) =>
this._showValue(item.templow) ||
this._showValue(item.temperature)
${forecast?.length
? forecast.map((item) =>
this._showValue(item.templow) || this._showValue(item.temperature)
? html`
<div>
<div>
@@ -388,10 +385,10 @@ class MoreInfoWeather extends LitElement {
</div>
`
: nothing
)}
)
: html`<ha-spinner size="medium"></ha-spinner>`}
</div>
`
: nothing}
${this.stateObj.attributes.attribution
? html`
<div class="attribution">
@@ -589,6 +586,10 @@ class MoreInfoWeather extends LitElement {
.forecast-icon {
--mdc-icon-size: 40px;
}
.forecast ha-spinner {
height: 120px;
}
`,
];
}

View File

@@ -11,22 +11,20 @@ import type { HomeAssistant } from "../../types";
import { isMac } from "../../util/is_mac";
interface Text {
textTranslationKey: LocalizeKeys;
type: "text";
key: LocalizeKeys;
}
interface LocalizedShortcut {
shortcutTranslationKey: LocalizeKeys;
}
type ShortcutString = string | LocalizedShortcut;
type ShortcutString = string | { key: LocalizeKeys };
interface Shortcut {
type: "shortcut";
shortcut: ShortcutString[];
descriptionTranslationKey: LocalizeKeys;
key: LocalizeKeys;
}
interface Section {
titleTranslationKey: LocalizeKeys;
key: LocalizeKeys;
items: (Text | Shortcut)[];
}
@@ -34,115 +32,105 @@ const CTRL_CMD = "__CTRL_CMD__";
const _SHORTCUTS: Section[] = [
{
titleTranslationKey: "ui.dialogs.shortcuts.searching.title",
key: "ui.dialogs.shortcuts.searching.title",
items: [
{ type: "text", key: "ui.dialogs.shortcuts.searching.on_any_page" },
{
textTranslationKey: "ui.dialogs.shortcuts.searching.on_any_page",
},
{
type: "shortcut",
shortcut: ["C"],
descriptionTranslationKey:
"ui.dialogs.shortcuts.searching.search_command",
key: "ui.dialogs.shortcuts.searching.search_command",
},
{
type: "shortcut",
shortcut: ["E"],
descriptionTranslationKey:
"ui.dialogs.shortcuts.searching.search_entities",
key: "ui.dialogs.shortcuts.searching.search_entities",
},
{
type: "shortcut",
shortcut: ["D"],
descriptionTranslationKey:
"ui.dialogs.shortcuts.searching.search_devices",
key: "ui.dialogs.shortcuts.searching.search_devices",
},
{
textTranslationKey:
"ui.dialogs.shortcuts.searching.on_pages_with_tables",
type: "text",
key: "ui.dialogs.shortcuts.searching.on_pages_with_tables",
},
{
type: "shortcut",
shortcut: [CTRL_CMD, "F"],
descriptionTranslationKey:
"ui.dialogs.shortcuts.searching.search_in_table",
key: "ui.dialogs.shortcuts.searching.search_in_table",
},
],
},
{
titleTranslationKey: "ui.dialogs.shortcuts.assist.title",
key: "ui.dialogs.shortcuts.assist.title",
items: [
{
type: "shortcut",
shortcut: ["A"],
descriptionTranslationKey: "ui.dialogs.shortcuts.assist.open_assist",
key: "ui.dialogs.shortcuts.assist.open_assist",
},
],
},
{
titleTranslationKey: "ui.dialogs.shortcuts.automation_script.title",
key: "ui.dialogs.shortcuts.automation_script.title",
items: [
{
type: "shortcut",
shortcut: [CTRL_CMD, "C"],
descriptionTranslationKey:
"ui.dialogs.shortcuts.automation_script.copy",
key: "ui.dialogs.shortcuts.automation_script.copy",
},
{
type: "shortcut",
shortcut: [CTRL_CMD, "X"],
descriptionTranslationKey: "ui.dialogs.shortcuts.automation_script.cut",
key: "ui.dialogs.shortcuts.automation_script.cut",
},
{
shortcut: [
CTRL_CMD,
{ shortcutTranslationKey: "ui.dialogs.shortcuts.keys.del" },
],
descriptionTranslationKey:
"ui.dialogs.shortcuts.automation_script.delete",
type: "shortcut",
shortcut: [CTRL_CMD, "del"],
key: "ui.dialogs.shortcuts.automation_script.delete",
},
{
type: "shortcut",
shortcut: [CTRL_CMD, "V"],
descriptionTranslationKey:
"ui.dialogs.shortcuts.automation_script.paste",
key: "ui.dialogs.shortcuts.automation_script.paste",
},
{
type: "shortcut",
shortcut: [CTRL_CMD, "S"],
descriptionTranslationKey:
"ui.dialogs.shortcuts.automation_script.save",
key: "ui.dialogs.shortcuts.automation_script.save",
},
],
},
{
titleTranslationKey: "ui.dialogs.shortcuts.charts.title",
key: "ui.dialogs.shortcuts.charts.title",
items: [
{
type: "shortcut",
shortcut: [CTRL_CMD, { key: "ui.dialogs.shortcuts.shortcuts.drag" }],
key: "ui.dialogs.shortcuts.charts.drag_to_zoom",
},
{
type: "shortcut",
shortcut: [
CTRL_CMD,
{ shortcutTranslationKey: "ui.dialogs.shortcuts.shortcuts.drag" },
{ key: "ui.dialogs.shortcuts.shortcuts.scroll_wheel" },
],
descriptionTranslationKey: "ui.dialogs.shortcuts.charts.drag_to_zoom",
key: "ui.dialogs.shortcuts.charts.scroll_to_zoom",
},
{
shortcut: [
CTRL_CMD,
{
shortcutTranslationKey:
"ui.dialogs.shortcuts.shortcuts.scroll_wheel",
},
],
descriptionTranslationKey: "ui.dialogs.shortcuts.charts.scroll_to_zoom",
},
{
shortcut: [
{
shortcutTranslationKey:
"ui.dialogs.shortcuts.shortcuts.double_click",
},
],
descriptionTranslationKey: "ui.dialogs.shortcuts.charts.double_click",
type: "shortcut",
shortcut: [{ key: "ui.dialogs.shortcuts.shortcuts.double_click" }],
key: "ui.dialogs.shortcuts.charts.double_click",
},
],
},
{
titleTranslationKey: "ui.dialogs.shortcuts.other.title",
key: "ui.dialogs.shortcuts.other.title",
items: [
{
type: "shortcut",
shortcut: ["M"],
descriptionTranslationKey: "ui.dialogs.shortcuts.other.my_link",
key: "ui.dialogs.shortcuts.other.my_link",
},
],
},
@@ -164,28 +152,28 @@ class DialogShortcuts extends LitElement {
}
private _renderShortcut(
shortcutKeys: ShortcutString[],
descriptionKey: LocalizeKeys
shortcuts: ShortcutString[],
translationKey: LocalizeKeys
) {
const keys = shortcuts.map((shortcut) =>
typeof shortcut === "string" ? shortcut : this.hass.localize(shortcut.key)
);
return html`
<div class="shortcut">
${shortcutKeys.map(
(shortcutKey) =>
${keys.map(
(key) =>
html`<span
>${shortcutKey === CTRL_CMD
>${key === CTRL_CMD
? isMac
? html`<ha-svg-icon
.path=${mdiAppleKeyboardCommand}
></ha-svg-icon>`
: this.hass.localize("ui.panel.config.automation.editor.ctrl")
: typeof shortcutKey === "string"
? shortcutKey
: this.hass.localize(
shortcutKey.shortcutTranslationKey
)}</span
: key}</span
>`
)}
${this.hass.localize(descriptionKey)}
${this.hass.localize(translationKey)}
</div>
`;
}
@@ -209,18 +197,16 @@ class DialogShortcuts extends LitElement {
<div class="content">
${_SHORTCUTS.map(
(section) => html`
<h3>${this.hass.localize(section.titleTranslationKey)}</h3>
<h3>${this.hass.localize(section.key)}</h3>
<div class="items">
${section.items.map((item) => {
if ("shortcut" in item) {
return this._renderShortcut(
(item as Shortcut).shortcut,
(item as Shortcut).descriptionTranslationKey
);
if (item.type === "text") {
return html`<p>${this.hass.localize(item.key)}</p>`;
}
return html`<p>
${this.hass.localize((item as Text).textTranslationKey)}
</p>`;
if (item.type === "shortcut") {
return this._renderShortcut(item.shortcut, item.key);
}
return nothing;
})}
</div>
`

View File

@@ -79,6 +79,13 @@ export const demoPanels: Panels = {
config: null,
url_path: "energy",
},
"time-picker": {
component_name: "time-picker",
icon: "hass:clock-outline",
title: "time_picker",
config: null,
url_path: "time-picker",
},
// config: {
// component_name: "config",
// icon: "hass:cog",

View File

@@ -30,6 +30,7 @@ const COMPONENTS = {
my: () => import("../panels/my/ha-panel-my"),
profile: () => import("../panels/profile/ha-panel-profile"),
todo: () => import("../panels/todo/ha-panel-todo"),
"time-picker": () => import("../panels/time-picker/ha-panel-time-picker"),
"media-browser": () =>
import("../panels/media-browser/ha-panel-media-browser"),
};

View File

@@ -292,7 +292,7 @@ class HaAutomationPicker extends SubscribeMixin(LitElement) {
extraTemplate: (automation) =>
automation.labels.length
? html`<ha-data-table-labels
@label-clicked=${this._labelClicked}
@label-clicked=${narrow ? undefined : this._labelClicked}
.labels=${automation.labels}
></ha-data-table-labels>`
: nothing,

View File

@@ -171,6 +171,7 @@ export default class HaAutomationSidebarCard extends LitElement {
transition: box-shadow 180ms ease-in-out;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
z-index: 6;
position: relative;
background-color: var(
--ha-dialog-surface-background,
@@ -200,7 +201,6 @@ export default class HaAutomationSidebarCard extends LitElement {
.card-content {
max-height: calc(100% - 80px);
overflow: auto;
margin-top: 0;
}
@media (min-width: 450px) and (min-height: 500px) {

View File

@@ -65,10 +65,6 @@ export default class HaAutomationSidebarCondition extends LitElement {
}
}
}
// Reset testing state when condition changes
if (changedProperties.has("sidebarKey")) {
this._testing = false;
}
}
protected render() {
@@ -287,13 +283,11 @@ export default class HaAutomationSidebarCondition extends LitElement {
sidebar
></ha-automation-condition-editor>`
)}
<div class="testing-wrapper">
<div
class="testing ${classMap({
active: this._testing,
pass: this._testingResult === true,
error: this._testingResult === false,
narrow: this.narrow,
})}"
>
${this._testingResult
@@ -304,7 +298,6 @@ export default class HaAutomationSidebarCondition extends LitElement {
"ui.panel.config.automation.editor.conditions.testing_error"
)}
</div>
</div>
</ha-automation-sidebar-card>`;
}
@@ -403,13 +396,21 @@ export default class HaAutomationSidebarCondition extends LitElement {
ha-automation-sidebar-card {
position: relative;
}
.testing-wrapper {
.testing {
position: absolute;
z-index: 6;
top: 0px;
right: 0px;
left: 0px;
margin: -1px;
text-transform: uppercase;
font-size: var(--ha-font-size-m);
font-weight: var(--ha-font-weight-bold);
background-color: var(--divider-color, #e0e0e0);
color: var(--text-primary-color);
max-height: 0px;
overflow: hidden;
transition: max-height 0.3s;
text-align: center;
border-top-right-radius: var(
--ha-card-border-radius,
var(--ha-border-radius-lg)
@@ -418,33 +419,15 @@ export default class HaAutomationSidebarCondition extends LitElement {
--ha-card-border-radius,
var(--ha-border-radius-lg)
);
pointer-events: none;
height: 100px;
}
.testing {
--testing-color: var(--divider-color, #e0e0e0);
text-transform: uppercase;
font-size: var(--ha-font-size-m);
font-weight: var(--ha-font-weight-bold);
background-color: var(--testing-color);
color: var(--text-primary-color);
max-height: 0px;
transition:
max-height 0.3s ease-in-out,
padding-top 0.3s ease-in-out;
text-align: center;
}
.testing.active.narrow {
padding-top: 16px;
}
.testing.active {
max-height: 100%;
max-height: 100px;
}
.testing.error {
--testing-color: var(--accent-color);
background-color: var(--accent-color);
}
.testing.pass {
--testing-color: var(--success-color);
background-color: var(--success-color);
}
`,
];

View File

@@ -217,7 +217,7 @@ export const automationRowsStyles = css`
export const sidebarEditorStyles = css`
.sidebar-editor {
display: block;
padding-top: 8px;
padding-top: 16px;
}
.description {
padding-top: 16px;

View File

@@ -1,5 +1,5 @@
import type { CSSResultGroup, TemplateResult } from "lit";
import { css, html, LitElement } from "lit";
import { css, html, LitElement, nothing } from "lit";
import { customElement, property, state } from "lit/decorators";
import "../../../../../components/ha-card";
import "../../../../../components/ha-code-editor";
@@ -11,13 +11,22 @@ import { showOptionsFlowDialog } from "../../../../../dialogs/config-flow/show-d
import "../../../../../layouts/hass-subpage";
import { haStyle } from "../../../../../resources/styles";
import type { HomeAssistant } from "../../../../../types";
import { subscribeBluetoothConnectionAllocations } from "../../../../../data/bluetooth";
import {
subscribeBluetoothConnectionAllocations,
subscribeBluetoothScannerState,
subscribeBluetoothScannersDetails,
} from "../../../../../data/bluetooth";
import type {
BluetoothAllocationsData,
BluetoothScannerState,
BluetoothScannersDetails,
HaScannerType,
} from "../../../../../data/bluetooth";
import {
getValueInPercentage,
roundWithOneDecimal,
} from "../../../../../util/calculate";
import "../../../../../components/ha-metric";
import type { BluetoothAllocationsData } from "../../../../../data/bluetooth";
@customElement("bluetooth-config-dashboard")
export class BluetoothConfigDashboard extends LitElement {
@@ -29,16 +38,26 @@ export class BluetoothConfigDashboard extends LitElement {
@state() private _connectionAllocationsError?: string;
@state() private _scannerState?: BluetoothScannerState;
@state() private _scannerDetails?: BluetoothScannersDetails;
private _configEntry = new URLSearchParams(window.location.search).get(
"config_entry"
);
private _unsubConnectionAllocations?: (() => Promise<void>) | undefined;
private _unsubScannerState?: (() => Promise<void>) | undefined;
private _unsubScannerDetails?: (() => void) | undefined;
public connectedCallback(): void {
super.connectedCallback();
if (this.hass) {
this._subscribeBluetoothConnectionAllocations();
this._subscribeBluetoothScannerState();
this._subscribeScannerDetails();
}
}
@@ -61,12 +80,45 @@ export class BluetoothConfigDashboard extends LitElement {
}
}
private async _subscribeBluetoothScannerState(): Promise<void> {
if (this._unsubScannerState || !this._configEntry) {
return;
}
this._unsubScannerState = await subscribeBluetoothScannerState(
this.hass.connection,
(scannerState) => {
this._scannerState = scannerState;
},
this._configEntry
);
}
private _subscribeScannerDetails(): void {
if (this._unsubScannerDetails) {
return;
}
this._unsubScannerDetails = subscribeBluetoothScannersDetails(
this.hass.connection,
(details) => {
this._scannerDetails = details;
}
);
}
public disconnectedCallback() {
super.disconnectedCallback();
if (this._unsubConnectionAllocations) {
this._unsubConnectionAllocations();
this._unsubConnectionAllocations = undefined;
}
if (this._unsubScannerState) {
this._unsubScannerState();
this._unsubScannerState = undefined;
}
if (this._unsubScannerDetails) {
this._unsubScannerDetails();
this._unsubScannerDetails = undefined;
}
}
protected render(): TemplateResult {
@@ -78,6 +130,7 @@ export class BluetoothConfigDashboard extends LitElement {
"ui.panel.config.bluetooth.settings_title"
)}
>
<div class="card-content">${this._renderScannerState()}</div>
<div class="card-actions">
<ha-button @click=${this._openOptionFlow}
>${this.hass.localize(
@@ -142,6 +195,118 @@ export class BluetoothConfigDashboard extends LitElement {
private _getUsedAllocations = (used: number, total: number) =>
roundWithOneDecimal(getValueInPercentage(used, 0, total));
private _renderScannerMismatchWarning(
scannerState: BluetoothScannerState,
scannerType: HaScannerType,
formatMode: (mode: string | null) => string
) {
const instructions: string[] = [];
if (scannerType === "remote" || scannerType === "unknown") {
instructions.push(
this.hass.localize(
"ui.panel.config.bluetooth.scanner_mode_mismatch_remote"
)
);
}
if (scannerType === "usb" || scannerType === "unknown") {
instructions.push(
this.hass.localize(
"ui.panel.config.bluetooth.scanner_mode_mismatch_usb"
)
);
}
if (scannerType === "uart" || scannerType === "unknown") {
instructions.push(
this.hass.localize(
"ui.panel.config.bluetooth.scanner_mode_mismatch_uart"
)
);
}
return html`<ha-alert alert-type="warning">
<div>
${this.hass.localize(
"ui.panel.config.bluetooth.scanner_mode_mismatch",
{
requested: formatMode(scannerState.requested_mode),
current: formatMode(scannerState.current_mode),
}
)}
</div>
<ul>
${instructions.map((instruction) => html`<li>${instruction}</li>`)}
</ul>
</ha-alert>`;
}
private _renderScannerState() {
if (!this._configEntry || !this._scannerState) {
return html`<div>
${this.hass.localize(
"ui.panel.config.bluetooth.no_scanner_state_available"
)}
</div>`;
}
const scannerState = this._scannerState;
// Find the scanner details for this source
const scannerDetails = this._scannerDetails?.[scannerState.source];
const scannerType: HaScannerType =
scannerDetails?.scanner_type ?? "unknown";
const formatMode = (mode: string | null) => {
switch (mode) {
case null:
return this.hass.localize(
"ui.panel.config.bluetooth.scanning_mode_none"
);
case "active":
return this.hass.localize(
"ui.panel.config.bluetooth.scanning_mode_active"
);
case "passive":
return this.hass.localize(
"ui.panel.config.bluetooth.scanning_mode_passive"
);
default:
return mode; // Fallback for unknown modes
}
};
return html`
<div class="scanner-state">
<div class="state-row">
<span
>${this.hass.localize(
"ui.panel.config.bluetooth.current_scanning_mode"
)}:</span
>
<span class="state-value"
>${formatMode(scannerState.current_mode)}</span
>
</div>
<div class="state-row">
<span
>${this.hass.localize(
"ui.panel.config.bluetooth.requested_scanning_mode"
)}:</span
>
<span class="state-value"
>${formatMode(scannerState.requested_mode)}</span
>
</div>
${scannerState.current_mode !== scannerState.requested_mode
? this._renderScannerMismatchWarning(
scannerState,
scannerType,
formatMode
)
: nothing}
</div>
`;
}
private _renderConnectionAllocations() {
if (this._connectionAllocationsError) {
return html`<ha-alert alert-type="error"
@@ -220,6 +385,18 @@ export class BluetoothConfigDashboard extends LitElement {
display: flex;
justify-content: flex-end;
}
.scanner-state {
margin-bottom: 16px;
}
.state-row {
display: flex;
justify-content: space-between;
align-items: center;
padding: 4px 0;
}
.state-value {
font-weight: 500;
}
`,
];
}

View File

@@ -34,6 +34,16 @@ const UPDATE_THROTTLE_TIME = 10000;
const CORE_SOURCE_ID = "ha";
const CORE_SOURCE_LABEL = "Home Assistant";
const RSSI_COLOR_THRESHOLDS: [number, string][] = [
[-70, "--green-color"], // Excellent: > -70 dBm
[-75, "--lime-color"], // Good: -70 to -75 dBm
[-80, "--yellow-color"], // Okay: -75 to -80 dBm
[-85, "--amber-color"], // Marginal: -80 to -85 dBm
[-90, "--orange-color"], // Weak: -85 to -90 dBm
[-95, "--deep-orange-color"], // Poor: -90 to -95 dBm
[-Infinity, "--red-color"], // Very poor: < -95 dBm
];
@customElement("bluetooth-network-visualization")
export class BluetoothNetworkVisualization extends LitElement {
@property({ attribute: false }) public hass!: HomeAssistant;
@@ -125,6 +135,16 @@ export class BluetoothNetworkVisualization extends LitElement {
`;
}
private _getRssiColorVar = memoizeOne((rssi: number): string => {
for (const [threshold, colorVar] of RSSI_COLOR_THRESHOLDS) {
if (rssi > threshold) {
return colorVar;
}
}
// Fallback (should never reach here)
return "--red-color";
});
private _formatNetworkData = memoizeOne(
(
data: BluetoothDeviceData[],
@@ -206,7 +226,7 @@ export class BluetoothNetworkVisualization extends LitElement {
symbol: "none",
lineStyle: {
width: this._getLineWidth(node.rssi),
color: style.getPropertyValue("--primary-color"),
color: style.getPropertyValue(this._getRssiColorVar(node.rssi)),
},
});
return;
@@ -227,7 +247,7 @@ export class BluetoothNetworkVisualization extends LitElement {
lineStyle: {
width: this._getLineWidth(node.rssi),
color: device
? style.getPropertyValue("--primary-color")
? style.getPropertyValue(this._getRssiColorVar(node.rssi))
: style.getPropertyValue("--disabled-color"),
},
});

View File

@@ -199,8 +199,10 @@ export class HaConfigLovelaceDashboards extends LitElement {
"ui.panel.config.lovelace.dashboards.picker.headers.require_admin"
),
sortable: true,
type: "icon",
hidden: narrow,
type: "icon",
minWidth: "120px",
maxWidth: "120px",
template: (dashboard) =>
dashboard.require_admin
? html`<ha-svg-icon .path=${mdiCheck}></ha-svg-icon>`
@@ -210,8 +212,10 @@ export class HaConfigLovelaceDashboards extends LitElement {
title: localize(
"ui.panel.config.lovelace.dashboards.picker.headers.sidebar"
),
type: "icon",
hidden: narrow,
type: "icon",
minWidth: "120px",
maxWidth: "120px",
template: (dashboard) =>
dashboard.show_in_sidebar
? html`<ha-svg-icon .path=${mdiCheck}></ha-svg-icon>`

View File

@@ -289,6 +289,15 @@ export const showRepairsFlowDialog = (
);
},
renderMenuOptionDescription(hass, step, option) {
return hass.localize(
`component.${issue.domain}.issues.${
issue.translation_key || issue.issue_id
}.fix_flow.step.${step.step_id}.menu_option_descriptions.${option}`,
mergePlaceholders(issue, step)
);
},
renderLoadingDescription(hass, reason) {
return (
hass.localize(

View File

@@ -54,6 +54,10 @@ class DeveloperToolsRouter extends HassRouterPage {
tag: "developer-tools-debug",
load: () => import("./debug/developer-tools-debug"),
},
"time-picker": {
tag: "developer-tools-time-picker",
load: () => import("../time-picker/ha-panel-time-picker"),
},
},
};

View File

@@ -80,6 +80,13 @@ class PanelDeveloperTools extends LitElement {
<sl-tab slot="nav" panel="assist" .active=${page === "assist"}
>Assist</sl-tab
>
<sl-tab
slot="nav"
panel="time-picker"
.active=${page === "time-picker"}
>
Time Picker
</sl-tab>
</sl-tab-group>
</div>
<developer-tools-router

View File

@@ -568,6 +568,10 @@ class HaPanelDevState extends LitElement {
margin: 0 8px 16px;
}
ha-expansion-panel p {
padding: 0 8px;
}
.inputs {
width: 100%;
max-width: 800px;
@@ -579,8 +583,9 @@ class HaPanelDevState extends LitElement {
.button-row {
display: flex;
margin-top: 8px;
margin: 8px 0;
align-items: center;
gap: 8px;
}
:host([narrow]) .state-wrapper {

View File

@@ -9,7 +9,7 @@ import { SubscribeMixin } from "../../../mixins/subscribe-mixin";
import type { HomeAssistant } from "../../../types";
import { coordinatesMinimalResponseCompressedState } from "../common/graph/coordinates";
import "../components/hui-graph-base";
import type { LovelaceCardFeature, LovelaceCardFeatureEditor } from "../types";
import type { LovelaceCardFeature } from "../types";
import type {
TrendGraphCardFeatureConfig,
LovelaceCardFeatureContext,
@@ -27,7 +27,7 @@ export const supportsTrendGraphCardFeature = (
return domain === "sensor" && isNumericFromAttributes(stateObj.attributes);
};
export const DEFAULT_HOURS_TO_SHOW = 24;
const DEFAULT_HOURS_TO_SHOW = 24;
@customElement("hui-trend-graph-card-feature")
class HuiHistoryChartCardFeature
@@ -51,13 +51,6 @@ class HuiHistoryChartCardFeature
};
}
public static async getConfigElement(): Promise<LovelaceCardFeatureEditor> {
await import(
"../editor/config-elements/hui-trend-graph-card-feature-editor"
);
return document.createElement("hui-trend-graph-card-feature-editor");
}
public setConfig(config: TrendGraphCardFeatureConfig): void {
if (!config) {
throw new Error("Invalid configuration");

View File

@@ -36,11 +36,12 @@ export class HuiClockCardDigital extends LitElement {
locale = { ...locale, time_format: this.config.time_format };
}
const h12 = useAmPm(locale);
this._dateTimeFormat = new Intl.DateTimeFormat(this.hass.locale.language, {
hour: "2-digit",
hour: h12 ? "numeric" : "2-digit",
minute: "2-digit",
second: "2-digit",
hourCycle: useAmPm(locale) ? "h12" : "h23",
hourCycle: h12 ? "h12" : "h23",
timeZone:
this.config?.time_zone ||
resolveTimeZone(locale.time_zone, this.hass.config?.time_zone),

View File

@@ -109,7 +109,7 @@ class HuiEnergySankeyCard
"ui.panel.lovelace.cards.energy.energy_distribution.home"
),
value: Math.max(0, consumption.total.used_total),
color: computedStyle.getPropertyValue("--primary-color").trim(),
color: computedStyle.getPropertyValue("--primary-color"),
index: 1,
};
nodes.push(homeNode);
@@ -125,9 +125,7 @@ class HuiEnergySankeyCard
"ui.panel.lovelace.cards.energy.energy_distribution.battery"
),
value: totalBatteryOut,
color: computedStyle
.getPropertyValue("--energy-battery-out-color")
.trim(),
color: computedStyle.getPropertyValue("--energy-battery-out-color"),
index: 0,
});
links.push({
@@ -143,9 +141,7 @@ class HuiEnergySankeyCard
"ui.panel.lovelace.cards.energy.energy_distribution.battery"
),
value: totalBatteryIn,
color: computedStyle
.getPropertyValue("--energy-battery-in-color")
.trim(),
color: computedStyle.getPropertyValue("--energy-battery-in-color"),
index: 1,
});
if (consumption.total.grid_to_battery > 0) {
@@ -173,9 +169,9 @@ class HuiEnergySankeyCard
"ui.panel.lovelace.cards.energy.energy_distribution.grid"
),
value: totalFromGrid,
color: computedStyle
.getPropertyValue("--energy-grid-consumption-color")
.trim(),
color: computedStyle.getPropertyValue(
"--energy-grid-consumption-color"
),
index: 0,
});
@@ -196,7 +192,7 @@ class HuiEnergySankeyCard
"ui.panel.lovelace.cards.energy.energy_distribution.solar"
),
value: totalSolarProduction,
color: computedStyle.getPropertyValue("--energy-solar-color").trim(),
color: computedStyle.getPropertyValue("--energy-solar-color"),
index: 0,
});
@@ -217,9 +213,7 @@ class HuiEnergySankeyCard
"ui.panel.lovelace.cards.energy.energy_distribution.grid"
),
value: totalToGrid,
color: computedStyle
.getPropertyValue("--energy-grid-return-color")
.trim(),
color: computedStyle.getPropertyValue("--energy-grid-return-color"),
index: 1,
});
if (consumption.total.battery_to_grid > 0) {
@@ -301,7 +295,7 @@ class HuiEnergySankeyCard
label: this.hass.floors[floorId].name,
value: floors[floorId].value,
index: 2,
color: computedStyle.getPropertyValue("--primary-color").trim(),
color: computedStyle.getPropertyValue("--primary-color"),
});
links.push({
source: "home",
@@ -322,7 +316,7 @@ class HuiEnergySankeyCard
label: this.hass.areas[areaId]!.name,
value: areas[areaId].value,
index: 3,
color: computedStyle.getPropertyValue("--primary-color").trim(),
color: computedStyle.getPropertyValue("--primary-color"),
});
links.push({
source: floorNodeId,
@@ -366,9 +360,7 @@ class HuiEnergySankeyCard
"ui.panel.lovelace.cards.energy.energy_devices_detail_graph.untracked_consumption"
),
value: untrackedConsumption,
color: computedStyle
.getPropertyValue("--state-unavailable-color")
.trim(),
color: computedStyle.getPropertyValue("--state-unavailable-color"),
index: 3 + deviceSections.length,
});
links.push({

View File

@@ -7,6 +7,7 @@ import { DOMAINS_TOGGLE } from "../../../common/const";
import { applyThemesOnElement } from "../../../common/dom/apply_themes_on_element";
import { computeDomain } from "../../../common/entity/compute_domain";
import { computeStateName } from "../../../common/entity/compute_state_name";
import { stateActive } from "../../../common/entity/state_active";
import "../../../components/ha-card";
import "../../../components/ha-icon-button";
import "../../../components/ha-state-icon";
@@ -30,15 +31,6 @@ import type {
} from "./types";
import type { PersonEntity } from "../../../data/person";
const STATES_OFF = new Set([
"closed",
"locked",
"not_home",
"off",
"unavailable",
"unknown",
]);
@customElement("hui-picture-glance-card")
class HuiPictureGlanceCard extends LitElement implements LovelaceCard {
public static async getConfigElement(): Promise<LovelaceCardEditor> {
@@ -303,7 +295,7 @@ class HuiPictureGlanceCard extends LitElement implements LovelaceCard {
.disabled=${!hasAction(entityConf.tap_action)}
.config=${entityConf}
class=${classMap({
"state-on": !STATES_OFF.has(stateObj.state),
"state-on": stateActive(stateObj),
})}
title=${`${computeStateName(
stateObj

View File

@@ -128,7 +128,6 @@ const EDITABLES_FEATURE_TYPES = new Set<UiFeatureTypes>([
"lawn-mower-commands",
"numeric-input",
"select-options",
"trend-graph",
"update-actions",
"vacuum-commands",
"water-heater-operation-modes",

View File

@@ -1,82 +0,0 @@
import { html, LitElement, nothing } from "lit";
import { customElement, property, state } from "lit/decorators";
import { fireEvent } from "../../../../common/dom/fire_event";
import "../../../../components/ha-form/ha-form";
import type {
HaFormSchema,
SchemaUnion,
} from "../../../../components/ha-form/types";
import type { HomeAssistant } from "../../../../types";
import { DEFAULT_HOURS_TO_SHOW } from "../../card-features/hui-trend-graph-card-feature";
import type {
LovelaceCardFeatureContext,
TrendGraphCardFeatureConfig,
} from "../../card-features/types";
import type { LovelaceCardFeatureEditor } from "../../types";
const SCHEMA = [
{
name: "hours_to_show",
default: DEFAULT_HOURS_TO_SHOW,
selector: { number: { min: 1, mode: "box" } },
},
] as const satisfies HaFormSchema[];
@customElement("hui-trend-graph-card-feature-editor")
export class HuiTrendGraphCardFeatureEditor
extends LitElement
implements LovelaceCardFeatureEditor
{
@property({ attribute: false }) public hass?: HomeAssistant;
@property({ attribute: false }) public context?: LovelaceCardFeatureContext;
@state() private _config?: TrendGraphCardFeatureConfig;
public setConfig(config: TrendGraphCardFeatureConfig): void {
this._config = config;
}
protected render() {
if (!this.hass || !this._config) {
return nothing;
}
const data = { ...this._config };
if (!this._config.hours_to_show) {
data.hours_to_show = DEFAULT_HOURS_TO_SHOW;
}
return html`
<ha-form
.hass=${this.hass}
.data=${data}
.schema=${SCHEMA}
.computeLabel=${this._computeLabelCallback}
@value-changed=${this._valueChanged}
></ha-form>
`;
}
private _valueChanged(ev: CustomEvent): void {
fireEvent(this, "config-changed", { config: ev.detail.value });
}
private _computeLabelCallback = (schema: SchemaUnion<typeof SCHEMA>) => {
switch (schema.name) {
case "hours_to_show":
return this.hass!.localize(
`ui.panel.lovelace.editor.card.generic.${schema.name}`
);
default:
return "";
}
};
}
declare global {
interface HTMLElementTagNameMap {
"hui-trend-graph-card-feature-editor": HuiTrendGraphCardFeatureEditor;
}
}

View File

@@ -0,0 +1,180 @@
import { html, LitElement, css } from "lit";
import { customElement, property, state } from "lit/decorators";
import type { HomeAssistant } from "../../types";
import "../../components/ha-time-picker";
import "../../components/ha-card";
import "../../components/ha-button";
import "../../components/ha-alert";
import "../../components/ha-selector/ha-selector";
@customElement("developer-tools-time-picker")
export class DeveloperToolsTimePicker extends LitElement {
@property({ attribute: false })
public hass!: HomeAssistant;
@property({ type: Boolean, reflect: true })
public narrow = false;
@state()
private _timeValue = "14:15:00";
@state()
private _timeValue2 = "09:05:05";
static get styles() {
return css`
:host {
display: block;
padding: 16px;
max-width: 800px;
margin: 0 auto;
}
.header {
margin-bottom: 24px;
}
.header h1 {
margin: 0 0 8px 0;
color: var(--primary-text-color);
font-size: 28px;
font-weight: 400;
}
.header p {
margin: 0;
color: var(--secondary-text-color);
font-size: 16px;
line-height: 1.5;
}
.section {
margin-bottom: 32px;
}
.section h2 {
margin: 0 0 16px 0;
color: var(--primary-text-color);
font-size: 20px;
font-weight: 500;
}
.example {
background: var(--card-background-color);
border-radius: 12px;
padding: 24px;
margin-bottom: 16px;
border: 1px solid var(--divider-color);
}
.example h3 {
margin: 0 0 16px 0;
color: var(--primary-text-color);
font-size: 16px;
font-weight: 500;
}
.time-picker-container {
display: flex;
align-items: center;
gap: 16px;
margin-bottom: 16px;
}
.value-display {
background: var(--secondary-background-color);
padding: 8px 12px;
border-radius: 6px;
font-family: monospace;
font-size: 14px;
color: var(--primary-text-color);
min-width: 100px;
text-align: center;
}
.controls {
display: flex;
gap: 12px;
align-items: center;
flex-wrap: wrap;
}
.form-toggle {
margin-top: 16px;
}
@media (max-width: 600px) {
:host {
padding: 12px;
}
.time-picker-container {
flex-direction: column;
align-items: stretch;
}
.controls {
flex-direction: column;
align-items: stretch;
}
}
`;
}
protected render() {
return html`
<div class="header">
<h1>Time picker demo</h1>
<p>
This page demonstrates the ha-time-picker component with various
configurations and use cases.
</p>
</div>
<div class="section">
<h2>Time picker</h2>
<div class="example">
<div class="time-picker-container">
<ha-time-picker
.locale=${this.hass.locale}
.value=${this._timeValue}
@value-changed=${this._onTimeChanged}
></ha-time-picker>
<div class="value-display">${this._timeValue}</div>
</div>
<p>Current value: ${this._timeValue}</p>
</div>
</div>
<div class="section">
<h2>Time picker with seconds</h2>
<div class="example">
<div class="time-picker-container">
<ha-time-picker
.locale=${this.hass.locale}
.value=${this._timeValue2}
.enableSeconds=${true}
@value-changed=${this._onTime2Changed}
></ha-time-picker>
<div class="value-display">${this._timeValue2}</div>
</div>
<p>Current value: ${this._timeValue2}</p>
</div>
</div>
`;
}
private _onTimeChanged(ev: CustomEvent) {
this._timeValue = ev.detail.value;
}
private _onTime2Changed(ev: CustomEvent) {
this._timeValue2 = ev.detail.value;
}
}
declare global {
interface HTMLElementTagNameMap {
"developer-tools-time-picker": DeveloperToolsTimePicker;
}
}

View File

@@ -1619,7 +1619,7 @@
"preload_stream": "Preload camera stream",
"preload_stream_description": "This keeps the camera stream open in the background so it shows quicker. Warning! This is device intensive.",
"stream_orientation": "Camera stream orientation",
"stream_orientation_description": "The orientation transformation to use for the camera stream.",
"stream_orientation_description": "The orientation transformation to use for the camera stream.\nWarning: Stream orientation processing occurs on the Home Assistant device and may impact system performance. When possible, configure this setting directly on your camera instead.",
"stream_orientation_1": "No orientation transform",
"stream_orientation_2": "Mirror",
"stream_orientation_3": "Rotate 180",
@@ -2040,9 +2040,6 @@
"title": "Shortcuts",
"enable_shortcuts_hint": "For keyboard shortcuts to work, make sure you have them enabled in your {user_profile}.",
"enable_shortcuts_hint_user_profile": "user profile",
"keys": {
"del": "Del"
},
"shortcuts": {
"double_click": "Double-click",
"scroll_wheel": "Scroll",
@@ -5146,7 +5143,7 @@
"integration": "Integration",
"config_entry": "Config entry"
},
"enabled_description": "Disabled devices will not be shown and entities belonging to the device will be disabled and not added to Home Assistant.",
"enabled_description": "Disabled devices and services will not be shown and entities belonging to them will be disabled, too.",
"open_configuration_url": "Visit",
"set_up_voice_assistant": "Set up voice assistant",
"download_diagnostics": "Download diagnostics",
@@ -5743,6 +5740,16 @@
"no_advertisements_found": "No matching Bluetooth advertisements found",
"no_connection_slot_allocations": "No connection slot allocations information available",
"no_active_connection_support": "This adapter does not support making active (GATT) connections.",
"no_scanner_state_available": "No scanner state available",
"current_scanning_mode": "Current scanning mode",
"requested_scanning_mode": "Requested scanning mode",
"scanning_mode_none": "none",
"scanning_mode_active": "active",
"scanning_mode_passive": "passive",
"scanner_mode_mismatch": "Scanner requested {requested} mode but is operating in {current} mode. The scanner is in a bad state and needs to be power cycled.",
"scanner_mode_mismatch_remote": "For proxies: reboot the device",
"scanner_mode_mismatch_usb": "For USB adapters: unplug and plug back in",
"scanner_mode_mismatch_uart": "For UART/onboard adapters: power down the system completely and power it back up",
"address": "Address",
"name": "Name",
"source": "Source",

514
yarn.lock
View File

@@ -3281,58 +3281,58 @@ __metadata:
languageName: node
linkType: hard
"@module-federation/error-codes@npm:0.17.1":
version: 0.17.1
resolution: "@module-federation/error-codes@npm:0.17.1"
checksum: 10/5f5f02a90a423479c84e4ff4398a3a9e31b66bd545e7c978ecb8a417f33162b86e749356baab14c006e741c9cebae549335a4c99e94ce7ef54210269fdf74f7f
"@module-federation/error-codes@npm:0.18.0":
version: 0.18.0
resolution: "@module-federation/error-codes@npm:0.18.0"
checksum: 10/ccd00f6b2504ec2e685bda6d175ed86df27e21994b36869140a18059595716e9ea7db5d0b516a095891ec9e6c90e702f42a366743df3652bf91ff3bb4f895991
languageName: node
linkType: hard
"@module-federation/runtime-core@npm:0.17.1":
version: 0.17.1
resolution: "@module-federation/runtime-core@npm:0.17.1"
"@module-federation/runtime-core@npm:0.18.0":
version: 0.18.0
resolution: "@module-federation/runtime-core@npm:0.18.0"
dependencies:
"@module-federation/error-codes": "npm:0.17.1"
"@module-federation/sdk": "npm:0.17.1"
checksum: 10/b0c945379bde13af84ceb833e3bfe3c8cf11fd265af0ad7640a1506017529458f408a4a3f1bd0f4b5983da71438913d5c25ed25e20908eb1f789bd1483616650
"@module-federation/error-codes": "npm:0.18.0"
"@module-federation/sdk": "npm:0.18.0"
checksum: 10/82af795408f2e92bea9c801a2057f1a6ed85eaf131195d5deaa4ef9a6a88db9e2cb851b4416e6e43a841459986b5ebb84e98b4625fb9bbd98cee11929f1ede6b
languageName: node
linkType: hard
"@module-federation/runtime-tools@npm:0.17.1":
version: 0.17.1
resolution: "@module-federation/runtime-tools@npm:0.17.1"
"@module-federation/runtime-tools@npm:0.18.0":
version: 0.18.0
resolution: "@module-federation/runtime-tools@npm:0.18.0"
dependencies:
"@module-federation/runtime": "npm:0.17.1"
"@module-federation/webpack-bundler-runtime": "npm:0.17.1"
checksum: 10/2e183e357b644dbe015d0e51df3fe601852ca79ffe3a30c582eee7a2050d7600eb3253f5de15e476c60741d0a1dd70add1ade7b5a3537cd2ee12bfee286284ea
"@module-federation/runtime": "npm:0.18.0"
"@module-federation/webpack-bundler-runtime": "npm:0.18.0"
checksum: 10/c6b1483899865e4c73be0ae77e6e1a5f517798f7ab3b8c6df2bb7ed22463e7a471f68d5f9528b2aff5b45e2db67596805028206f3956aafec5a36dcefb94afd2
languageName: node
linkType: hard
"@module-federation/runtime@npm:0.17.1":
version: 0.17.1
resolution: "@module-federation/runtime@npm:0.17.1"
"@module-federation/runtime@npm:0.18.0":
version: 0.18.0
resolution: "@module-federation/runtime@npm:0.18.0"
dependencies:
"@module-federation/error-codes": "npm:0.17.1"
"@module-federation/runtime-core": "npm:0.17.1"
"@module-federation/sdk": "npm:0.17.1"
checksum: 10/f5405968dff4fa2cf510127701ec1722105f44298fd09eafeecead450b7bb95a05450749157fe2fc39caf6241bec9e45caa9a55375b48e7f195db84799a8df0c
"@module-federation/error-codes": "npm:0.18.0"
"@module-federation/runtime-core": "npm:0.18.0"
"@module-federation/sdk": "npm:0.18.0"
checksum: 10/6164597782b21840e3b8f159000338d8e20a817a60909015c11402e9e6442d60d9c3b4b6f25d92d7261011ef1fc0e8caafbb91f25c29b372f28764cbea8ef9eb
languageName: node
linkType: hard
"@module-federation/sdk@npm:0.17.1":
version: 0.17.1
resolution: "@module-federation/sdk@npm:0.17.1"
checksum: 10/daaaa49ed900c00a69641130cf673ad5d5b8623d82fb4bd03a67c839a6da760a0a5ae29b836ba66eeb95ee5392e558588ffd987a2c00b05c2b0a7c5039ed042d
"@module-federation/sdk@npm:0.18.0":
version: 0.18.0
resolution: "@module-federation/sdk@npm:0.18.0"
checksum: 10/f397dc53c705ad1f1e19530a8ff79116bb5aeeef92a79b3acaaa6140ae4e5784b42e81d1445eabf536c007c9383857f6764506ed725a6352464fe1ce581af89a
languageName: node
linkType: hard
"@module-federation/webpack-bundler-runtime@npm:0.17.1":
version: 0.17.1
resolution: "@module-federation/webpack-bundler-runtime@npm:0.17.1"
"@module-federation/webpack-bundler-runtime@npm:0.18.0":
version: 0.18.0
resolution: "@module-federation/webpack-bundler-runtime@npm:0.18.0"
dependencies:
"@module-federation/runtime": "npm:0.17.1"
"@module-federation/sdk": "npm:0.17.1"
checksum: 10/72e5030529dbc53df6271fa78bdb63976d0601fe9fde5105f8a7325e0fa296bc35277b9b084e52995cd314b89e12d33f8b869c1d63a13231c2948d4c741e72fd
"@module-federation/runtime": "npm:0.18.0"
"@module-federation/sdk": "npm:0.18.0"
checksum: 10/c80f26e02d497948a0864283bedf13118d5c188ac8165e71edce5da72776091db6da2dc5da5d47a53fbb6914bfbff1ddfce16a6b9c18485a9a41a04bc4060e34
languageName: node
linkType: hard
@@ -3990,92 +3990,92 @@ __metadata:
languageName: node
linkType: hard
"@rspack/binding-darwin-arm64@npm:1.4.11":
version: 1.4.11
resolution: "@rspack/binding-darwin-arm64@npm:1.4.11"
"@rspack/binding-darwin-arm64@npm:1.5.1":
version: 1.5.1
resolution: "@rspack/binding-darwin-arm64@npm:1.5.1"
conditions: os=darwin & cpu=arm64
languageName: node
linkType: hard
"@rspack/binding-darwin-x64@npm:1.4.11":
version: 1.4.11
resolution: "@rspack/binding-darwin-x64@npm:1.4.11"
"@rspack/binding-darwin-x64@npm:1.5.1":
version: 1.5.1
resolution: "@rspack/binding-darwin-x64@npm:1.5.1"
conditions: os=darwin & cpu=x64
languageName: node
linkType: hard
"@rspack/binding-linux-arm64-gnu@npm:1.4.11":
version: 1.4.11
resolution: "@rspack/binding-linux-arm64-gnu@npm:1.4.11"
"@rspack/binding-linux-arm64-gnu@npm:1.5.1":
version: 1.5.1
resolution: "@rspack/binding-linux-arm64-gnu@npm:1.5.1"
conditions: os=linux & cpu=arm64 & libc=glibc
languageName: node
linkType: hard
"@rspack/binding-linux-arm64-musl@npm:1.4.11":
version: 1.4.11
resolution: "@rspack/binding-linux-arm64-musl@npm:1.4.11"
"@rspack/binding-linux-arm64-musl@npm:1.5.1":
version: 1.5.1
resolution: "@rspack/binding-linux-arm64-musl@npm:1.5.1"
conditions: os=linux & cpu=arm64 & libc=musl
languageName: node
linkType: hard
"@rspack/binding-linux-x64-gnu@npm:1.4.11":
version: 1.4.11
resolution: "@rspack/binding-linux-x64-gnu@npm:1.4.11"
"@rspack/binding-linux-x64-gnu@npm:1.5.1":
version: 1.5.1
resolution: "@rspack/binding-linux-x64-gnu@npm:1.5.1"
conditions: os=linux & cpu=x64 & libc=glibc
languageName: node
linkType: hard
"@rspack/binding-linux-x64-musl@npm:1.4.11":
version: 1.4.11
resolution: "@rspack/binding-linux-x64-musl@npm:1.4.11"
"@rspack/binding-linux-x64-musl@npm:1.5.1":
version: 1.5.1
resolution: "@rspack/binding-linux-x64-musl@npm:1.5.1"
conditions: os=linux & cpu=x64 & libc=musl
languageName: node
linkType: hard
"@rspack/binding-wasm32-wasi@npm:1.4.11":
version: 1.4.11
resolution: "@rspack/binding-wasm32-wasi@npm:1.4.11"
"@rspack/binding-wasm32-wasi@npm:1.5.1":
version: 1.5.1
resolution: "@rspack/binding-wasm32-wasi@npm:1.5.1"
dependencies:
"@napi-rs/wasm-runtime": "npm:^1.0.1"
conditions: cpu=wasm32
languageName: node
linkType: hard
"@rspack/binding-win32-arm64-msvc@npm:1.4.11":
version: 1.4.11
resolution: "@rspack/binding-win32-arm64-msvc@npm:1.4.11"
"@rspack/binding-win32-arm64-msvc@npm:1.5.1":
version: 1.5.1
resolution: "@rspack/binding-win32-arm64-msvc@npm:1.5.1"
conditions: os=win32 & cpu=arm64
languageName: node
linkType: hard
"@rspack/binding-win32-ia32-msvc@npm:1.4.11":
version: 1.4.11
resolution: "@rspack/binding-win32-ia32-msvc@npm:1.4.11"
"@rspack/binding-win32-ia32-msvc@npm:1.5.1":
version: 1.5.1
resolution: "@rspack/binding-win32-ia32-msvc@npm:1.5.1"
conditions: os=win32 & cpu=ia32
languageName: node
linkType: hard
"@rspack/binding-win32-x64-msvc@npm:1.4.11":
version: 1.4.11
resolution: "@rspack/binding-win32-x64-msvc@npm:1.4.11"
"@rspack/binding-win32-x64-msvc@npm:1.5.1":
version: 1.5.1
resolution: "@rspack/binding-win32-x64-msvc@npm:1.5.1"
conditions: os=win32 & cpu=x64
languageName: node
linkType: hard
"@rspack/binding@npm:1.4.11":
version: 1.4.11
resolution: "@rspack/binding@npm:1.4.11"
"@rspack/binding@npm:1.5.1":
version: 1.5.1
resolution: "@rspack/binding@npm:1.5.1"
dependencies:
"@rspack/binding-darwin-arm64": "npm:1.4.11"
"@rspack/binding-darwin-x64": "npm:1.4.11"
"@rspack/binding-linux-arm64-gnu": "npm:1.4.11"
"@rspack/binding-linux-arm64-musl": "npm:1.4.11"
"@rspack/binding-linux-x64-gnu": "npm:1.4.11"
"@rspack/binding-linux-x64-musl": "npm:1.4.11"
"@rspack/binding-wasm32-wasi": "npm:1.4.11"
"@rspack/binding-win32-arm64-msvc": "npm:1.4.11"
"@rspack/binding-win32-ia32-msvc": "npm:1.4.11"
"@rspack/binding-win32-x64-msvc": "npm:1.4.11"
"@rspack/binding-darwin-arm64": "npm:1.5.1"
"@rspack/binding-darwin-x64": "npm:1.5.1"
"@rspack/binding-linux-arm64-gnu": "npm:1.5.1"
"@rspack/binding-linux-arm64-musl": "npm:1.5.1"
"@rspack/binding-linux-x64-gnu": "npm:1.5.1"
"@rspack/binding-linux-x64-musl": "npm:1.5.1"
"@rspack/binding-wasm32-wasi": "npm:1.5.1"
"@rspack/binding-win32-arm64-msvc": "npm:1.5.1"
"@rspack/binding-win32-ia32-msvc": "npm:1.5.1"
"@rspack/binding-win32-x64-msvc": "npm:1.5.1"
dependenciesMeta:
"@rspack/binding-darwin-arm64":
optional: true
@@ -4097,23 +4097,23 @@ __metadata:
optional: true
"@rspack/binding-win32-x64-msvc":
optional: true
checksum: 10/8bb94774204f41888ff442afec06f019d008abba79964b74d566acf64f7216a148a1842f90c44b3bf680e69b697d8e5cd0f1cca6fd0b8a94df5f97c2a3f05510
checksum: 10/a6756a35bda55fd9e21b1ce142ca18e228d92832dc213027a19314981f8f12e6510dd862a9724ee96dee61755b3dd30ce73b2bb117d150e9f5ce73ba8fe4b57a
languageName: node
linkType: hard
"@rspack/core@npm:1.4.11":
version: 1.4.11
resolution: "@rspack/core@npm:1.4.11"
"@rspack/core@npm:1.5.1":
version: 1.5.1
resolution: "@rspack/core@npm:1.5.1"
dependencies:
"@module-federation/runtime-tools": "npm:0.17.1"
"@rspack/binding": "npm:1.4.11"
"@module-federation/runtime-tools": "npm:0.18.0"
"@rspack/binding": "npm:1.5.1"
"@rspack/lite-tapable": "npm:1.0.1"
peerDependencies:
"@swc/helpers": ">=0.5.1"
peerDependenciesMeta:
"@swc/helpers":
optional: true
checksum: 10/77d463bd90feb2d24f7bc56df198f0b7ad310a9eb676070eac8d78014d151e783943c5b44c64700a51a36708c626a341eeaa9b3287e358616d09dfe25ab04e77
checksum: 10/b7a6269d5bdbcad140d172ebe951f4693711573d4f38e4c676c250a9cc6c1bdf602ad5187eeacc07ff12b74d510b746c92e3f112c8ab4dca46846c595d2876b0
languageName: node
linkType: hard
@@ -4445,10 +4445,10 @@ __metadata:
languageName: node
linkType: hard
"@types/chromecast-caf-receiver@npm:6.0.22":
version: 6.0.22
resolution: "@types/chromecast-caf-receiver@npm:6.0.22"
checksum: 10/6c51cb52527776ddfa187a261b88184c98bdd61c129dd8719cba213894d565cf69073734d6473696ffd60a768f6fb5a3fe9932693f43174fbc5e7af201db8a90
"@types/chromecast-caf-receiver@npm:6.0.24":
version: 6.0.24
resolution: "@types/chromecast-caf-receiver@npm:6.0.24"
checksum: 10/1f2b95e8a15dbb36d5328895229d4a5cb255b33e62d46335bd6ed75e16aa9ea6a7d765a64ae120d19b3134fb3e51e9547d2544c7277f7bffe0bf0b3999f026da
languageName: node
linkType: hard
@@ -4964,106 +4964,106 @@ __metadata:
languageName: node
linkType: hard
"@typescript-eslint/eslint-plugin@npm:8.40.0":
version: 8.40.0
resolution: "@typescript-eslint/eslint-plugin@npm:8.40.0"
"@typescript-eslint/eslint-plugin@npm:8.41.0":
version: 8.41.0
resolution: "@typescript-eslint/eslint-plugin@npm:8.41.0"
dependencies:
"@eslint-community/regexpp": "npm:^4.10.0"
"@typescript-eslint/scope-manager": "npm:8.40.0"
"@typescript-eslint/type-utils": "npm:8.40.0"
"@typescript-eslint/utils": "npm:8.40.0"
"@typescript-eslint/visitor-keys": "npm:8.40.0"
"@typescript-eslint/scope-manager": "npm:8.41.0"
"@typescript-eslint/type-utils": "npm:8.41.0"
"@typescript-eslint/utils": "npm:8.41.0"
"@typescript-eslint/visitor-keys": "npm:8.41.0"
graphemer: "npm:^1.4.0"
ignore: "npm:^7.0.0"
natural-compare: "npm:^1.4.0"
ts-api-utils: "npm:^2.1.0"
peerDependencies:
"@typescript-eslint/parser": ^8.40.0
"@typescript-eslint/parser": ^8.41.0
eslint: ^8.57.0 || ^9.0.0
typescript: ">=4.8.4 <6.0.0"
checksum: 10/9df4d4ac58734a34964b791622dcb94ffc6c49c1d0f4fd0480b3fc0e026527df7167ff78a4f8bbd29089d605756c28c1a90b2f0653df34b40ac8b969bc6c92e9
checksum: 10/b96e3fd9e8ae2c289aa7f1c0d2fbf89c608d37f54162a893bac5895318b05d21d3fd456cf7a6adf165915a8212f773f1bae9b4d83f732441864f6d92d083ed99
languageName: node
linkType: hard
"@typescript-eslint/parser@npm:8.40.0":
version: 8.40.0
resolution: "@typescript-eslint/parser@npm:8.40.0"
"@typescript-eslint/parser@npm:8.41.0":
version: 8.41.0
resolution: "@typescript-eslint/parser@npm:8.41.0"
dependencies:
"@typescript-eslint/scope-manager": "npm:8.40.0"
"@typescript-eslint/types": "npm:8.40.0"
"@typescript-eslint/typescript-estree": "npm:8.40.0"
"@typescript-eslint/visitor-keys": "npm:8.40.0"
"@typescript-eslint/scope-manager": "npm:8.41.0"
"@typescript-eslint/types": "npm:8.41.0"
"@typescript-eslint/typescript-estree": "npm:8.41.0"
"@typescript-eslint/visitor-keys": "npm:8.41.0"
debug: "npm:^4.3.4"
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
typescript: ">=4.8.4 <6.0.0"
checksum: 10/1e60f70e9d02f930553db7f4684c27c376fadf345db155414a22d1a32cd21def7d36496bd63c1acbf3afbec9fb8794947e880f88c1143b83e1d3c45146cec41a
checksum: 10/d4ba418aa62e08d49a5b953c9debd52674c30b9b2bb7bf2efc173a22ad3942df72cd83072beac06d98dad82741baf502a55fc648925ca407b01abdc908675f67
languageName: node
linkType: hard
"@typescript-eslint/project-service@npm:8.40.0":
version: 8.40.0
resolution: "@typescript-eslint/project-service@npm:8.40.0"
"@typescript-eslint/project-service@npm:8.41.0":
version: 8.41.0
resolution: "@typescript-eslint/project-service@npm:8.41.0"
dependencies:
"@typescript-eslint/tsconfig-utils": "npm:^8.40.0"
"@typescript-eslint/types": "npm:^8.40.0"
"@typescript-eslint/tsconfig-utils": "npm:^8.41.0"
"@typescript-eslint/types": "npm:^8.41.0"
debug: "npm:^4.3.4"
peerDependencies:
typescript: ">=4.8.4 <6.0.0"
checksum: 10/86491aa65c1dd78c9784dddd8467601aef8be652c5fb3a901e8b1995cf07c1dbe11d0ab4610d770e3f4063c0c254a6c6aa5fb7cf724bf12fa4ee56f47f3a2955
checksum: 10/ff8315de005ea7072ecd208b50b35fa01db034f110f30f415faa9c9441648494e5322723a0a4267beb28524babd6b04b349c32f2a2821f4ae0e9c4d503e1e8f0
languageName: node
linkType: hard
"@typescript-eslint/scope-manager@npm:8.40.0":
version: 8.40.0
resolution: "@typescript-eslint/scope-manager@npm:8.40.0"
"@typescript-eslint/scope-manager@npm:8.41.0":
version: 8.41.0
resolution: "@typescript-eslint/scope-manager@npm:8.41.0"
dependencies:
"@typescript-eslint/types": "npm:8.40.0"
"@typescript-eslint/visitor-keys": "npm:8.40.0"
checksum: 10/0c5aa10208bfbb506bf3925a420c3de667298064bde400f03ee52c19cd0785dd05c2c820e05724d005737e2920d925aff0318ec3308156f9b81c84736a1fe46b
"@typescript-eslint/types": "npm:8.41.0"
"@typescript-eslint/visitor-keys": "npm:8.41.0"
checksum: 10/4fc1dd6b3390d3a770c228dac227f35ff1126034fce484ab5e5a4fdbe2dab5dca1c8de3c528708320fee021adec1a1260ee45ed2aef9f7e3fdfbb1faf2191f9f
languageName: node
linkType: hard
"@typescript-eslint/tsconfig-utils@npm:8.40.0, @typescript-eslint/tsconfig-utils@npm:^8.40.0":
version: 8.40.0
resolution: "@typescript-eslint/tsconfig-utils@npm:8.40.0"
"@typescript-eslint/tsconfig-utils@npm:8.41.0, @typescript-eslint/tsconfig-utils@npm:^8.41.0":
version: 8.41.0
resolution: "@typescript-eslint/tsconfig-utils@npm:8.41.0"
peerDependencies:
typescript: ">=4.8.4 <6.0.0"
checksum: 10/c5a557cc83d194902140af0ddfa10b2776db3625e2c9bb609d0d720aa78a0735ff71df8bffd5c2a1b90cdada8242543c5421ad4dcd58cf2ff12717b733bcfca9
checksum: 10/522d54252f9647d22e46f963df6bafe98aa0572b021e6acf7474c40f1a68afa6753f23a0a125abb1d792a89a1b1cc654d918553a03d08f769139f2f40b0d026c
languageName: node
linkType: hard
"@typescript-eslint/type-utils@npm:8.40.0":
version: 8.40.0
resolution: "@typescript-eslint/type-utils@npm:8.40.0"
"@typescript-eslint/type-utils@npm:8.41.0":
version: 8.41.0
resolution: "@typescript-eslint/type-utils@npm:8.41.0"
dependencies:
"@typescript-eslint/types": "npm:8.40.0"
"@typescript-eslint/typescript-estree": "npm:8.40.0"
"@typescript-eslint/utils": "npm:8.40.0"
"@typescript-eslint/types": "npm:8.41.0"
"@typescript-eslint/typescript-estree": "npm:8.41.0"
"@typescript-eslint/utils": "npm:8.41.0"
debug: "npm:^4.3.4"
ts-api-utils: "npm:^2.1.0"
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
typescript: ">=4.8.4 <6.0.0"
checksum: 10/296c718330b2ac4408840258c30c01072de01ffe1c009be00c5049be1b19a71cbb2e258363ae349150760bcd2d34799df305b4cfc4d7f3b2fa9760ac8ffb3f75
checksum: 10/6c4c693c1ee3d1a1a3635898d59f1a3bcdf224be84284ea95a21fa68a3206bae32ce04d371df366fcad250a3eca3af723ed6ca1b4aefba238d4e553797c2dc9d
languageName: node
linkType: hard
"@typescript-eslint/types@npm:8.40.0, @typescript-eslint/types@npm:^8.40.0":
version: 8.40.0
resolution: "@typescript-eslint/types@npm:8.40.0"
checksum: 10/f3931d0920a42b3bc69e9cdeb67a0c710597271cdd9d7c736302bdc52d21df1c962082df7cd712eeabd2c47658415d0a4b7d72f819cb38f82f4e234b48dbaa57
"@typescript-eslint/types@npm:8.41.0, @typescript-eslint/types@npm:^8.41.0":
version: 8.41.0
resolution: "@typescript-eslint/types@npm:8.41.0"
checksum: 10/e2fe5d9125264a1b1310fff7ac65e827da9885219d7f910dba090dcf7d4242830cb96695c7257634b22e1947943a2e890f9740536d95612452e5752385ab6a5b
languageName: node
linkType: hard
"@typescript-eslint/typescript-estree@npm:8.40.0":
version: 8.40.0
resolution: "@typescript-eslint/typescript-estree@npm:8.40.0"
"@typescript-eslint/typescript-estree@npm:8.41.0":
version: 8.41.0
resolution: "@typescript-eslint/typescript-estree@npm:8.41.0"
dependencies:
"@typescript-eslint/project-service": "npm:8.40.0"
"@typescript-eslint/tsconfig-utils": "npm:8.40.0"
"@typescript-eslint/types": "npm:8.40.0"
"@typescript-eslint/visitor-keys": "npm:8.40.0"
"@typescript-eslint/project-service": "npm:8.41.0"
"@typescript-eslint/tsconfig-utils": "npm:8.41.0"
"@typescript-eslint/types": "npm:8.41.0"
"@typescript-eslint/visitor-keys": "npm:8.41.0"
debug: "npm:^4.3.4"
fast-glob: "npm:^3.3.2"
is-glob: "npm:^4.0.3"
@@ -5072,160 +5072,160 @@ __metadata:
ts-api-utils: "npm:^2.1.0"
peerDependencies:
typescript: ">=4.8.4 <6.0.0"
checksum: 10/2e61ecfecb933f644799a7c11e4c7a730df57290c8d0482082cff7739b2401b0cf3b1ebef7b08a54a90285978957a49850d1a53061e8770164da651172ebee32
checksum: 10/e039815d2ee03727fadb32c460e0c7df71a35b6c93a87e019c63836c53e51ce41f1975b32c9e5bcc840f4cd49c7bf7715c95df149f915379ec4c559d02436623
languageName: node
linkType: hard
"@typescript-eslint/utils@npm:8.40.0":
version: 8.40.0
resolution: "@typescript-eslint/utils@npm:8.40.0"
"@typescript-eslint/utils@npm:8.41.0":
version: 8.41.0
resolution: "@typescript-eslint/utils@npm:8.41.0"
dependencies:
"@eslint-community/eslint-utils": "npm:^4.7.0"
"@typescript-eslint/scope-manager": "npm:8.40.0"
"@typescript-eslint/types": "npm:8.40.0"
"@typescript-eslint/typescript-estree": "npm:8.40.0"
"@typescript-eslint/scope-manager": "npm:8.41.0"
"@typescript-eslint/types": "npm:8.41.0"
"@typescript-eslint/typescript-estree": "npm:8.41.0"
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
typescript: ">=4.8.4 <6.0.0"
checksum: 10/b4cd1e6a4f55cc6475189de12e6bd418080a227e794745a2af304ab21655b031c28dae6387d4e9b54dd2f420696cec4f77cca9c66db405ed2281e0e09c95ba1c
checksum: 10/863565c0891d89ee27497571092783a7fa90e281a7643f1bda5d9e8b94aea2acbc851e81141ce7a53ddea3638a0527ea165801dd9611f5532940e4d413c955a8
languageName: node
linkType: hard
"@typescript-eslint/visitor-keys@npm:8.40.0":
version: 8.40.0
resolution: "@typescript-eslint/visitor-keys@npm:8.40.0"
"@typescript-eslint/visitor-keys@npm:8.41.0":
version: 8.41.0
resolution: "@typescript-eslint/visitor-keys@npm:8.41.0"
dependencies:
"@typescript-eslint/types": "npm:8.40.0"
"@typescript-eslint/types": "npm:8.41.0"
eslint-visitor-keys: "npm:^4.2.1"
checksum: 10/191f47998001a5e9cdde7491b0215d9c6c45c637aedd7d32cafd35ce2a4a0f4b8582edab015e09238f48e025a788b99efd8e70e4e3200e32143f91c95112abcd
checksum: 10/3c764be2f0d3b212c2cb7d0cc8a7b0ed378feb58883654471fd8ee943f1e124c0b78df92fe14368ceb46016b0e3ae1c47e2630ec3599aa7b4bd54f7793747657
languageName: node
linkType: hard
"@vaadin/a11y-base@npm:~24.8.5":
version: 24.8.5
resolution: "@vaadin/a11y-base@npm:24.8.5"
"@vaadin/a11y-base@npm:~24.8.6":
version: 24.8.6
resolution: "@vaadin/a11y-base@npm:24.8.6"
dependencies:
"@open-wc/dedupe-mixin": "npm:^1.3.0"
"@polymer/polymer": "npm:^3.0.0"
"@vaadin/component-base": "npm:~24.8.5"
"@vaadin/component-base": "npm:~24.8.6"
lit: "npm:^3.0.0"
checksum: 10/64c0447b1715f842aa5953a0ffeb78e3ae677aa9dc61fa2389dead20947519d897070fd42a164b09dda9465d7cf48fa413f62a3c9afed8aac43590d920616f24
checksum: 10/1127282ee3d2814de85ac7df2e3661db955bec78472ab4991229440ef532c6de6955c48c6353f913a4d911c938ed0205f6cff73928c52866f324237be110a222
languageName: node
linkType: hard
"@vaadin/combo-box@npm:24.8.5":
version: 24.8.5
resolution: "@vaadin/combo-box@npm:24.8.5"
"@vaadin/combo-box@npm:24.8.6":
version: 24.8.6
resolution: "@vaadin/combo-box@npm:24.8.6"
dependencies:
"@open-wc/dedupe-mixin": "npm:^1.3.0"
"@polymer/polymer": "npm:^3.0.0"
"@vaadin/a11y-base": "npm:~24.8.5"
"@vaadin/component-base": "npm:~24.8.5"
"@vaadin/field-base": "npm:~24.8.5"
"@vaadin/input-container": "npm:~24.8.5"
"@vaadin/item": "npm:~24.8.5"
"@vaadin/lit-renderer": "npm:~24.8.5"
"@vaadin/overlay": "npm:~24.8.5"
"@vaadin/vaadin-lumo-styles": "npm:~24.8.5"
"@vaadin/vaadin-material-styles": "npm:~24.8.5"
"@vaadin/vaadin-themable-mixin": "npm:~24.8.5"
"@vaadin/a11y-base": "npm:~24.8.6"
"@vaadin/component-base": "npm:~24.8.6"
"@vaadin/field-base": "npm:~24.8.6"
"@vaadin/input-container": "npm:~24.8.6"
"@vaadin/item": "npm:~24.8.6"
"@vaadin/lit-renderer": "npm:~24.8.6"
"@vaadin/overlay": "npm:~24.8.6"
"@vaadin/vaadin-lumo-styles": "npm:~24.8.6"
"@vaadin/vaadin-material-styles": "npm:~24.8.6"
"@vaadin/vaadin-themable-mixin": "npm:~24.8.6"
lit: "npm:^3.0.0"
checksum: 10/430e04ce3c7f977bfde771bf5aafb4dd2e862ecffd93a3296df596b24626c7a93dbe16f4e39b8e88089ce60a5f5d5a95db17fe305df6f30593f39dc1f79ec8af
checksum: 10/95031f4fd2adfe584a235d83da30b8bd5a3bcdcc6e342c9b1d4305c9ccf7ef7c2041b5930e7206408b2d01c81fc6555d1f556e31321433cc069905afe5aa1507
languageName: node
linkType: hard
"@vaadin/component-base@npm:~24.8.5":
version: 24.8.5
resolution: "@vaadin/component-base@npm:24.8.5"
"@vaadin/component-base@npm:~24.8.6":
version: 24.8.6
resolution: "@vaadin/component-base@npm:24.8.6"
dependencies:
"@open-wc/dedupe-mixin": "npm:^1.3.0"
"@polymer/polymer": "npm:^3.0.0"
"@vaadin/vaadin-development-mode-detector": "npm:^2.0.0"
"@vaadin/vaadin-usage-statistics": "npm:^2.1.0"
lit: "npm:^3.0.0"
checksum: 10/7f9ec08ca2dcedb15990cff87282523505e1df668ecbdbe624e91b75aae8b08062924e9dee7886e97a971054dda025277b368f32f8c57ee4e7ca022d7c23b862
checksum: 10/d4bff00004f659d93ec3ae4c6c5f5f645672f093cccf20bb6b0957939b31d9ecd29ecf32d7863c1a212784f0baf84f32ffee7c9158451de7c91bc009d8e42d24
languageName: node
linkType: hard
"@vaadin/field-base@npm:~24.8.5":
version: 24.8.5
resolution: "@vaadin/field-base@npm:24.8.5"
"@vaadin/field-base@npm:~24.8.6":
version: 24.8.6
resolution: "@vaadin/field-base@npm:24.8.6"
dependencies:
"@open-wc/dedupe-mixin": "npm:^1.3.0"
"@polymer/polymer": "npm:^3.0.0"
"@vaadin/a11y-base": "npm:~24.8.5"
"@vaadin/component-base": "npm:~24.8.5"
"@vaadin/a11y-base": "npm:~24.8.6"
"@vaadin/component-base": "npm:~24.8.6"
lit: "npm:^3.0.0"
checksum: 10/6851c05949c389bd76f201dd876ae0f0725e53146b0026bdfc8ec8a9b3712a2f52b18f23bd73971c8d76f5026c6186a0b54073850fa2a31890c7594dc2d61cb2
checksum: 10/a1b1121e5ed690645f2e7b0400e5f1880aac0fdff81fd57fc85c325187587005162f835d322868fc5788f74ebb69ce99f1cea3cde49b23aab67310aac67df996
languageName: node
linkType: hard
"@vaadin/icon@npm:~24.8.5":
version: 24.8.5
resolution: "@vaadin/icon@npm:24.8.5"
"@vaadin/icon@npm:~24.8.6":
version: 24.8.6
resolution: "@vaadin/icon@npm:24.8.6"
dependencies:
"@open-wc/dedupe-mixin": "npm:^1.3.0"
"@polymer/polymer": "npm:^3.0.0"
"@vaadin/component-base": "npm:~24.8.5"
"@vaadin/vaadin-lumo-styles": "npm:~24.8.5"
"@vaadin/vaadin-themable-mixin": "npm:~24.8.5"
"@vaadin/component-base": "npm:~24.8.6"
"@vaadin/vaadin-lumo-styles": "npm:~24.8.6"
"@vaadin/vaadin-themable-mixin": "npm:~24.8.6"
lit: "npm:^3.0.0"
checksum: 10/0ba15d8ea903e6a64bf5bdd3f5e91c74ebbb75bcacdb273faae0b71dec8e83a7c6daccbcbd8700c45e48bf6c5fec4552236b7ee464ebf06b1aba6e74a6eb3565
checksum: 10/569e5241bb421f8a30fe34c360f97b6e521f3dcde65dcf2fbeb60d699e230406605b48d301ca4e1cfa2cf64b56ca2b95e9a013a5e6e51f910e60b683aaeca64b
languageName: node
linkType: hard
"@vaadin/input-container@npm:~24.8.5":
version: 24.8.5
resolution: "@vaadin/input-container@npm:24.8.5"
"@vaadin/input-container@npm:~24.8.6":
version: 24.8.6
resolution: "@vaadin/input-container@npm:24.8.6"
dependencies:
"@polymer/polymer": "npm:^3.0.0"
"@vaadin/component-base": "npm:~24.8.5"
"@vaadin/vaadin-lumo-styles": "npm:~24.8.5"
"@vaadin/vaadin-material-styles": "npm:~24.8.5"
"@vaadin/vaadin-themable-mixin": "npm:~24.8.5"
"@vaadin/component-base": "npm:~24.8.6"
"@vaadin/vaadin-lumo-styles": "npm:~24.8.6"
"@vaadin/vaadin-material-styles": "npm:~24.8.6"
"@vaadin/vaadin-themable-mixin": "npm:~24.8.6"
lit: "npm:^3.0.0"
checksum: 10/04ca1f54f101858557a9dba55ef46706091f54a2344fb5322c89fb84abe717d97db60b43010496e9948e5a3d6779ba700e6d6eb986c8e37df96bc9bc9efe676e
checksum: 10/b18631fd45f59cc9d728a58da911feb119398c0e76962fa7cdcf62cf8582f722cdfc4bdcf52be5f678a390bf9006339351fcaf08b1cbcfe5905638d13c74f100
languageName: node
linkType: hard
"@vaadin/item@npm:~24.8.5":
version: 24.8.5
resolution: "@vaadin/item@npm:24.8.5"
"@vaadin/item@npm:~24.8.6":
version: 24.8.6
resolution: "@vaadin/item@npm:24.8.6"
dependencies:
"@open-wc/dedupe-mixin": "npm:^1.3.0"
"@polymer/polymer": "npm:^3.0.0"
"@vaadin/a11y-base": "npm:~24.8.5"
"@vaadin/component-base": "npm:~24.8.5"
"@vaadin/vaadin-lumo-styles": "npm:~24.8.5"
"@vaadin/vaadin-material-styles": "npm:~24.8.5"
"@vaadin/vaadin-themable-mixin": "npm:~24.8.5"
"@vaadin/a11y-base": "npm:~24.8.6"
"@vaadin/component-base": "npm:~24.8.6"
"@vaadin/vaadin-lumo-styles": "npm:~24.8.6"
"@vaadin/vaadin-material-styles": "npm:~24.8.6"
"@vaadin/vaadin-themable-mixin": "npm:~24.8.6"
lit: "npm:^3.0.0"
checksum: 10/da0d69cfde4655a8209cfa67c342bb48c7fe1f5ec48f15065582e6a8d3e48926b8e28e5fb68dcb526421d3f7faeea7292afd8957258cf7658e46ad40bd1328e8
checksum: 10/59f9bd95794b30a2f65cba1482a1f496370f92f834bf532255622a76a43066c53ee0c6fc5eb3ca5d777835532f3efaa2415edce91823f91f2462ecb1342a3bce
languageName: node
linkType: hard
"@vaadin/lit-renderer@npm:~24.8.5":
version: 24.8.5
resolution: "@vaadin/lit-renderer@npm:24.8.5"
"@vaadin/lit-renderer@npm:~24.8.6":
version: 24.8.6
resolution: "@vaadin/lit-renderer@npm:24.8.6"
dependencies:
lit: "npm:^3.0.0"
checksum: 10/a5cdfbd7ff3e7cf979fa826b4151879c0ad8b9068b254c690e8a82d859ffd553ca935bcee5115d1a3b914ff018a393dcb2460a75d8f5caab975654624060172b
checksum: 10/eb721a0e09156e67d857ea95ed2285b63f041e82fff60c40822de6050a4ee21e18330b208b14850a72a4ea2e0f7ee43b3d9518d228dc22672e7b69e25da43662
languageName: node
linkType: hard
"@vaadin/overlay@npm:~24.8.5":
version: 24.8.5
resolution: "@vaadin/overlay@npm:24.8.5"
"@vaadin/overlay@npm:~24.8.6":
version: 24.8.6
resolution: "@vaadin/overlay@npm:24.8.6"
dependencies:
"@open-wc/dedupe-mixin": "npm:^1.3.0"
"@polymer/polymer": "npm:^3.0.0"
"@vaadin/a11y-base": "npm:~24.8.5"
"@vaadin/component-base": "npm:~24.8.5"
"@vaadin/vaadin-lumo-styles": "npm:~24.8.5"
"@vaadin/vaadin-material-styles": "npm:~24.8.5"
"@vaadin/vaadin-themable-mixin": "npm:~24.8.5"
"@vaadin/a11y-base": "npm:~24.8.6"
"@vaadin/component-base": "npm:~24.8.6"
"@vaadin/vaadin-lumo-styles": "npm:~24.8.6"
"@vaadin/vaadin-material-styles": "npm:~24.8.6"
"@vaadin/vaadin-themable-mixin": "npm:~24.8.6"
lit: "npm:^3.0.0"
checksum: 10/e9b414ebc3dc885020edea0ec399556dfdc7ab3256f544dad6410a30683862f91566bae8b691e0dd5f228ffd470c84efb33ee52fef4c85bec509919d3c226720
checksum: 10/2a1047f4a8fc11bf51a5095cd66bd6cd9122c5edadb57ab84a559f86d90301bf16d95fd877b9fc2e7cdbcd3bd1856ab73649ec7301251b58feb5a03f42e1ccea
languageName: node
linkType: hard
@@ -5236,37 +5236,37 @@ __metadata:
languageName: node
linkType: hard
"@vaadin/vaadin-lumo-styles@npm:~24.8.5":
version: 24.8.5
resolution: "@vaadin/vaadin-lumo-styles@npm:24.8.5"
"@vaadin/vaadin-lumo-styles@npm:~24.8.6":
version: 24.8.6
resolution: "@vaadin/vaadin-lumo-styles@npm:24.8.6"
dependencies:
"@polymer/polymer": "npm:^3.0.0"
"@vaadin/component-base": "npm:~24.8.5"
"@vaadin/icon": "npm:~24.8.5"
"@vaadin/vaadin-themable-mixin": "npm:~24.8.5"
checksum: 10/95279f74f09d7608c312879ce8d375ffe9039f79a8326ad3c994e59704a1ba34e632cac4c9c2b838f590f52de856ff98e3357955054c73e2941bcb873ecb57ce
"@vaadin/component-base": "npm:~24.8.6"
"@vaadin/icon": "npm:~24.8.6"
"@vaadin/vaadin-themable-mixin": "npm:~24.8.6"
checksum: 10/fe01c0a93caa669a3b63573d2294834805d1e393bc5a0d7bcdee030d9f7ef2d73e2fc1a40543f82a4516b8fa155eaf13f6bb84653e26686c6ecb2ee22dfa9500
languageName: node
linkType: hard
"@vaadin/vaadin-material-styles@npm:~24.8.5":
version: 24.8.5
resolution: "@vaadin/vaadin-material-styles@npm:24.8.5"
"@vaadin/vaadin-material-styles@npm:~24.8.6":
version: 24.8.6
resolution: "@vaadin/vaadin-material-styles@npm:24.8.6"
dependencies:
"@polymer/polymer": "npm:^3.0.0"
"@vaadin/component-base": "npm:~24.8.5"
"@vaadin/vaadin-themable-mixin": "npm:~24.8.5"
checksum: 10/e1f531deda484f1e7e8485a1d5f2e5eed5a74b7c30554ede3d7a45643fc9f54e2eb364c1cc32543097f04eda3fcab466508c527be5166df2930695268fc737c8
"@vaadin/component-base": "npm:~24.8.6"
"@vaadin/vaadin-themable-mixin": "npm:~24.8.6"
checksum: 10/a19f479b567e929b6c375e3a0518b651f99d4ca329ba4323cf4582c13d3b01e73392bb082a3216a3f8d84a7b004df42042ac71e64b66d9f20ae2740f3a57459f
languageName: node
linkType: hard
"@vaadin/vaadin-themable-mixin@npm:24.8.5":
version: 24.8.5
resolution: "@vaadin/vaadin-themable-mixin@npm:24.8.5"
"@vaadin/vaadin-themable-mixin@npm:24.8.6":
version: 24.8.6
resolution: "@vaadin/vaadin-themable-mixin@npm:24.8.6"
dependencies:
"@open-wc/dedupe-mixin": "npm:^1.3.0"
lit: "npm:^3.0.0"
style-observer: "npm:^0.0.8"
checksum: 10/90b883ea34f39b381d3777ac8ea15797d12b899883bdb64ac14e9d170ae113f3f5b29f3492a10d2aeec05cb05ce0b6708d0963110f9ca9858af247210c1e89ce
checksum: 10/eb0b356f86d0f19914284219243812dde31d5b54b6f192a3bcb569d0403d100c820080d60878be90b859fd7e2a4342a5e054291a0f3c12888c173ca4122290af
languageName: node
linkType: hard
@@ -9298,10 +9298,10 @@ __metadata:
languageName: node
linkType: hard
"hls.js@npm:1.6.10":
version: 1.6.10
resolution: "hls.js@npm:1.6.10"
checksum: 10/28ba90e7915dd178b59907f99320f02bdf81023cd570e40e4aace32c4d744bb8a4404f1d6f040cd00a152334a76d97fee702a88596dd9ecaebe93aa5ac48506f
"hls.js@npm:1.6.11":
version: 1.6.11
resolution: "hls.js@npm:1.6.11"
checksum: 10/a7fb6407bd9729186fcdff14fb37d98d24ddfdce69e30165179a1af4c66fc83252bd85ee9199df91220ca5573fed7529b861d40fe86d93b4c06dc89ccc33382a
languageName: node
linkType: hard
@@ -9377,7 +9377,7 @@ __metadata:
"@octokit/rest": "npm:22.0.0"
"@replit/codemirror-indentation-markers": "npm:6.5.3"
"@rsdoctor/rspack-plugin": "npm:1.2.3"
"@rspack/core": "npm:1.4.11"
"@rspack/core": "npm:1.5.1"
"@rspack/dev-server": "npm:1.1.4"
"@shoelace-style/shoelace": "npm:2.20.1"
"@swc/helpers": "npm:0.5.17"
@@ -9385,7 +9385,7 @@ __metadata:
"@tsparticles/engine": "npm:3.9.1"
"@tsparticles/preset-links": "npm:3.2.0"
"@types/babel__plugin-transform-runtime": "npm:7.9.5"
"@types/chromecast-caf-receiver": "npm:6.0.22"
"@types/chromecast-caf-receiver": "npm:6.0.24"
"@types/chromecast-caf-sender": "npm:1.0.11"
"@types/color-name": "npm:2.0.0"
"@types/culori": "npm:4.0.0"
@@ -9402,8 +9402,8 @@ __metadata:
"@types/tar": "npm:6.1.13"
"@types/ua-parser-js": "npm:0.7.39"
"@types/webspeechapi": "npm:0.0.29"
"@vaadin/combo-box": "npm:24.8.5"
"@vaadin/vaadin-themable-mixin": "npm:24.8.5"
"@vaadin/combo-box": "npm:24.8.6"
"@vaadin/vaadin-themable-mixin": "npm:24.8.6"
"@vibrant/color": "npm:4.0.0"
"@vitest/coverage-v8": "npm:3.2.4"
"@vue/web-component-wrapper": "npm:1.3.0"
@@ -9446,7 +9446,7 @@ __metadata:
gulp-json-transform: "npm:0.5.0"
gulp-rename: "npm:2.1.0"
gulp-zopfli-green: "npm:6.0.2"
hls.js: "npm:1.6.10"
hls.js: "npm:1.6.11"
home-assistant-js-websocket: "npm:9.5.0"
html-minifier-terser: "npm:7.2.0"
husky: "npm:9.1.7"
@@ -9466,7 +9466,7 @@ __metadata:
lodash.template: "npm:4.5.0"
luxon: "npm:3.7.1"
map-stream: "npm:0.0.7"
marked: "npm:16.2.0"
marked: "npm:16.2.1"
memoize-one: "npm:6.0.0"
node-vibrant: "npm:4.0.3"
object-hash: "npm:3.0.0"
@@ -9488,7 +9488,7 @@ __metadata:
tinykeys: "npm:3.0.0"
ts-lit-plugin: "npm:2.0.2"
typescript: "npm:5.9.2"
typescript-eslint: "npm:8.40.0"
typescript-eslint: "npm:8.41.0"
ua-parser-js: "npm:2.0.4"
vite-tsconfig-paths: "npm:5.1.4"
vitest: "npm:3.2.4"
@@ -11137,12 +11137,12 @@ __metadata:
languageName: node
linkType: hard
"marked@npm:16.2.0":
version: 16.2.0
resolution: "marked@npm:16.2.0"
"marked@npm:16.2.1":
version: 16.2.1
resolution: "marked@npm:16.2.1"
bin:
marked: bin/marked.js
checksum: 10/0a73dcfbe500514d2f1106da99708beed8a31de586e2826e1aa47ca0e0a4850b1e9598569b09d5366d4f4dee2d279a13f32616ed1ee75c832068eb7dd660f66f
checksum: 10/67e911a7dd416869649dee18dc4a9683c0ccd8e72ba0fee3b3f578f857416e69780013e9d63762c600e6f9cf997c5af9fa0507a2053f8e65d39c5459c245c0cd
languageName: node
linkType: hard
@@ -14527,18 +14527,18 @@ __metadata:
languageName: node
linkType: hard
"typescript-eslint@npm:8.40.0":
version: 8.40.0
resolution: "typescript-eslint@npm:8.40.0"
"typescript-eslint@npm:8.41.0":
version: 8.41.0
resolution: "typescript-eslint@npm:8.41.0"
dependencies:
"@typescript-eslint/eslint-plugin": "npm:8.40.0"
"@typescript-eslint/parser": "npm:8.40.0"
"@typescript-eslint/typescript-estree": "npm:8.40.0"
"@typescript-eslint/utils": "npm:8.40.0"
"@typescript-eslint/eslint-plugin": "npm:8.41.0"
"@typescript-eslint/parser": "npm:8.41.0"
"@typescript-eslint/typescript-estree": "npm:8.41.0"
"@typescript-eslint/utils": "npm:8.41.0"
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
typescript: ">=4.8.4 <6.0.0"
checksum: 10/b96dc4e70bd551e5399b928e946957cce622cba89f0ff87521f9e93f223acbe406930a1ebee845b158f586959cb7d85f15ea2250b97341aa87f50a3c987d068a
checksum: 10/a398a367b3a674bcdb74f060e0b06aacb9e8bd0637079c5079ff66a43a35286098b97d71fca1b81b738c0df840fda4b53aeee03ed0aacef03f9644c61a68960e
languageName: node
linkType: hard