Compare commits

...

13 Commits

Author SHA1 Message Date
copilot-swe-agent[bot] 527e16668d Address event handler review feedback
Co-authored-by: timmo001 <28114703+timmo001@users.noreply.github.com>
2026-08-03 12:57:14 +00:00
Aidan Timson f59ceeff8f Type feature event handlers 2026-08-03 12:37:10 +01:00
Aidan Timson cee1c91ed8 Home Assistant event handler types skill (#53452)
* Document Home Assistant event handler types

* Expand event handling guidance

* Prefer bottom event declarations

* Split event guidance into dedicated skill
2026-08-03 13:51:24 +03:00
renovate[bot] 954662f454 Update formatjs (#53451)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-03 08:35:14 +03:00
renovate[bot] c07fb2b7ec Update dependency intl-messageformat to v11.2.13 (#53450)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-03 05:33:41 +00:00
Sören Beye 041219a40c Fix js float weirdness in hui-energy-grid-balance-card (#53442) 2026-08-03 08:26:57 +03:00
karwosts f28a1c5370 Allow to favorite the manual card (#53445) 2026-08-03 08:23:17 +03:00
renovate[bot] 4099de96c3 Update Playwright (#53446)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-02 21:36:40 +02:00
dependabot[bot] 673ca45cde Bump home-assistant/actions/helpers/verify-version from e3fb68ebda13d88a0d695082f471ba2c83d025fb to ab22029681aa532bfe7de5774a9972d67bfbd2c0 (#53440)
Bump home-assistant/actions/helpers/verify-version

Bumps [home-assistant/actions/helpers/verify-version](https://github.com/home-assistant/actions) from e3fb68ebda13d88a0d695082f471ba2c83d025fb to ab22029681aa532bfe7de5774a9972d67bfbd2c0.
- [Release notes](https://github.com/home-assistant/actions/releases)
- [Commits](https://github.com/home-assistant/actions/compare/e3fb68ebda13d88a0d695082f471ba2c83d025fb...ab22029681aa532bfe7de5774a9972d67bfbd2c0)

---
updated-dependencies:
- dependency-name: home-assistant/actions/helpers/verify-version
  dependency-version: ab22029681aa532bfe7de5774a9972d67bfbd2c0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-02 09:45:26 +02:00
renovate[bot] 4dfc626363 Update Yarn to v4.18.0 (#53432)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-02 09:45:09 +02:00
dependabot[bot] 1206f0ae5d Bump the codeql-action group across 1 directory with 2 updates (#53439)
Bumps the codeql-action group with 2 updates in the / directory: [github/codeql-action/init](https://github.com/github/codeql-action) and [github/codeql-action/analyze](https://github.com/github/codeql-action).


Updates `github/codeql-action/init` from 4.37.1 to 4.37.3
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/7188fc363630916deb702c7fdcf4e481b751f97a...e4fba868fa4b1b91e1fdab776edc8cfbe6e9fb81)

Updates `github/codeql-action/analyze` from 4.37.1 to 4.37.3
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/7188fc363630916deb702c7fdcf4e481b751f97a...e4fba868fa4b1b91e1fdab776edc8cfbe6e9fb81)

---
updated-dependencies:
- dependency-name: github/codeql-action/init
  dependency-version: 4.37.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: codeql-action
- dependency-name: github/codeql-action/analyze
  dependency-version: 4.37.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: codeql-action
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-02 09:44:33 +02:00
renovate[bot] f71a938d02 Update dependency jsdom to v30.0.1 (#53431)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-01 13:09:13 +02:00
renovate[bot] e2cade842e Update dependency @rspack/core to v2.1.7 (#53430)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-01 13:09:11 +02:00
30 changed files with 1360 additions and 1148 deletions
@@ -7,6 +7,8 @@ description: Home Assistant frontend component patterns. Use when implementing o
Use this skill when creating or reviewing Home Assistant UI components and common interaction patterns.
Cross-load `ha-frontend-events` when component work includes event listener typing, custom event dispatch, or event-map declarations.
## Dialogs
Open dialogs through the fire-event pattern:
+105
View File
@@ -0,0 +1,105 @@
---
name: ha-frontend-events
description: Home Assistant frontend event patterns. Use when typing event handlers, using HASSDomEvent types, dispatching with fireEvent, or declaring HASSDomEvents and event maps.
---
# HA Frontend Events
Use this skill when implementing or reviewing event listeners and custom event contracts. Cross-load `ha-frontend-components` when the work also involves dialogs, forms, alerts, shortcuts, tooltips, panels, Lovelace cards, or buttons.
## Event Handling
Use the event types from `src/common/dom/fire_event.ts` instead of plain `Event`, generic `CustomEvent`, or element casts when they express the handler contract:
- Use `HASSDomCurrentTargetEvent<T>` to read the element on which the listener was registered through `ev.currentTarget`.
- Use `HASSDomTargetEvent<T>` only to read the element that originated the event through `ev.target`.
- Use `HASSDomEvent<T>` to read a custom event payload through `ev.detail`.
- Use `ValueChangedEvent<T>` from `src/types.ts` for the standard `value-changed` event.
- Prefer an event type exported by the component being listened to, such as `HaSelectSelectEvent<T, Clearable>` or `HaDropdownSelectEvent<TValue, TData>`, over reconstructing its detail type.
- Use `ActionHandlerEvent` from `src/data/lovelace/action_handler.ts` for Lovelace tap, hold, and double-tap handlers.
Import event and element types with `import type`:
```ts
import type {
HASSDomCurrentTargetEvent,
HASSDomEvent,
HASSDomTargetEvent,
} from "../common/dom/fire_event";
import type { HaCheckbox } from "../components/ha-checkbox";
import type { HaEntityPicker } from "../components/entity/ha-entity-picker";
import type { HaRadioGroup } from "../components/radio/ha-radio-group";
import type { ValueChangedEvent } from "../types";
```
Type the handler so the selected property can be read directly. Do not cast `ev.currentTarget` or assign it to a single-use variable:
```ts
private _scopeChanged(ev: HASSDomCurrentTargetEvent<HaRadioGroup>): void {
this._scope = ev.currentTarget.value;
}
private _checkedChanged(ev: HASSDomTargetEvent<HaCheckbox>): void {
this._checked = ev.target.checked;
}
private _valueChanged(ev: ValueChangedEvent<string>): void {
this._value = ev.detail.value;
}
private _itemSelected(ev: HASSDomEvent<{ id: string }>): void {
this._selectedId = ev.detail.id;
}
```
Use intersections when a handler needs more than one facet of an event. Keep the native event type when the handler reads native fields such as `key`, modifier keys, `dataTransfer`, or focus relationships:
```ts
private _entityChanged(
ev: ValueChangedEvent<string> & HASSDomCurrentTargetEvent<HaEntityPicker>
): void {
ev.currentTarget.value = ev.detail.value;
}
private _keyDown(
ev: KeyboardEvent & HASSDomCurrentTargetEvent<HTMLInputElement>
): void {
if (ev.key === "Enter") {
this._submit(ev.currentTarget.value);
}
}
```
Dispatch Home Assistant component events with `fireEvent()` instead of constructing `Event` or `CustomEvent` directly. Register the event name and detail type by augmenting `HASSDomEvents`; use `undefined` when an event has no detail. `fireEvent()` constrains event names and supplied detail, and events bubble and cross shadow boundaries by default:
```ts
fireEvent(this, "item-selected", { id: item.id });
fireEvent(this, "refresh-requested");
```
When an event is already registered, derive handler and listener types from its registration rather than repeating the payload shape:
```ts
private _itemSelected(
ev: HASSDomEvent<HASSDomEvents["item-selected"]>
): void {
this._selectedId = ev.detail.id;
}
```
`HASSDomEvents` types `fireEvent()` calls. Augment `HTMLElementEventMap` for typed listeners on HTML elements, or `GlobalEventHandlersEventMap` when the event is handled on global event targets.
In component files, prefer placing global event declarations after the class at the bottom of the file. Preserve the existing placement when editing established files; foundational type, helper, and mixin files commonly keep declarations near the top before their consumers.
```ts
declare global {
interface HASSDomEvents {
"item-selected": { id: string };
"refresh-requested": undefined;
}
interface HTMLElementEventMap {
"item-selected": HASSDomEvent<HASSDomEvents["item-selected"]>;
}
}
```
+1 -1
View File
@@ -70,4 +70,4 @@ Configuration and props:
- Identify behavioral regressions, bugs, accessibility issues, and missing tests first.
- Keep style-only comments secondary unless they affect maintainability or user experience.
- Prefer small, direct fixes over large refactors during review follow-up.
- Cross-load `ha-frontend-contexts`, `ha-frontend-components`, `ha-frontend-styling`, `ha-frontend-testing`, or `ha-frontend-user-facing-text` when a finding falls in that area.
- Cross-load `ha-frontend-contexts`, `ha-frontend-components`, `ha-frontend-events`, `ha-frontend-styling`, `ha-frontend-testing`, or `ha-frontend-user-facing-text` when a finding falls in that area.
+2 -2
View File
@@ -32,12 +32,12 @@ jobs:
persist-credentials: false
- name: Initialize CodeQL
uses: github/codeql-action/init@7188fc363630916deb702c7fdcf4e481b751f97a # v4.37.1
uses: github/codeql-action/init@e4fba868fa4b1b91e1fdab776edc8cfbe6e9fb81 # v4.37.3
with:
languages: javascript-typescript
build-mode: none
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@7188fc363630916deb702c7fdcf4e481b751f97a # v4.37.1
uses: github/codeql-action/analyze@e4fba868fa4b1b91e1fdab776edc8cfbe6e9fb81 # v4.37.3
with:
category: "/language:javascript-typescript"
+4 -4
View File
@@ -38,7 +38,7 @@ jobs:
name: Prepare container dependencies
runs-on: ubuntu-latest
container:
image: mcr.microsoft.com/playwright:v1.62.0-noble
image: mcr.microsoft.com/playwright:v1.62.1-noble
options: --user 1001
defaults:
run:
@@ -154,7 +154,7 @@ jobs:
- prepare-container-dependencies
runs-on: ubuntu-latest
container:
image: mcr.microsoft.com/playwright:v1.62.0-noble
image: mcr.microsoft.com/playwright:v1.62.1-noble
options: --user 1001 --ipc=host
defaults:
run:
@@ -206,7 +206,7 @@ jobs:
- prepare-container-dependencies
runs-on: ubuntu-latest
container:
image: mcr.microsoft.com/playwright:v1.62.0-noble
image: mcr.microsoft.com/playwright:v1.62.1-noble
options: --user 1001 --ipc=host
defaults:
run:
@@ -260,7 +260,7 @@ jobs:
- prepare-container-dependencies
runs-on: ubuntu-latest
container:
image: mcr.microsoft.com/playwright:v1.62.0-noble
image: mcr.microsoft.com/playwright:v1.62.1-noble
options: --user 1001 --ipc=host
defaults:
run:
+1 -1
View File
@@ -36,7 +36,7 @@ jobs:
python-version: ${{ env.PYTHON_VERSION }}
- name: Verify version
uses: home-assistant/actions/helpers/verify-version@e3fb68ebda13d88a0d695082f471ba2c83d025fb # master
uses: home-assistant/actions/helpers/verify-version@ab22029681aa532bfe7de5774a9972d67bfbd2c0 # master
- name: Setup Node and install
uses: ./.github/actions/setup
-944
View File
File diff suppressed because one or more lines are too long
+1000
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -13,4 +13,4 @@ nodeLinker: node-modules
npmMinimalAgeGate: 3d
yarnPath: .yarn/releases/yarn-4.17.1.cjs
yarnPath: .yarn/releases/yarn-4.18.0.cjs
+1
View File
@@ -40,6 +40,7 @@ Detailed guidance lives in project skills under `.agents/skills/`. Load the matc
- `ha-frontend-contexts`: Lit contexts, `hass` migration, and rerender-sensitive state access.
- `ha-frontend-components`: dialogs, forms, alerts, shortcuts, tooltips, panels, and Lovelace cards.
- `ha-frontend-events`: event handler typing, custom event dispatch, and event-map declarations.
- `ha-frontend-styling`: theme variables, spacing tokens, responsive layout, RTL, and view transitions.
- `ha-frontend-testing`: lint, typecheck, Vitest, Playwright e2e dev servers, and benchmarks.
- `ha-frontend-user-facing-text`: localization, terminology, sentence case, and Home Assistant text style.
+7 -7
View File
@@ -52,13 +52,13 @@
"@codemirror/view": "6.43.7",
"@date-fns/tz": "1.5.0",
"@egjs/hammerjs": "2.0.17",
"@formatjs/intl-datetimeformat": "7.5.2",
"@formatjs/intl-datetimeformat": "7.6.0",
"@formatjs/intl-displaynames": "7.3.13",
"@formatjs/intl-durationformat": "0.10.18",
"@formatjs/intl-getcanonicallocales": "3.2.11",
"@formatjs/intl-listformat": "8.3.13",
"@formatjs/intl-locale": "5.3.10",
"@formatjs/intl-numberformat": "9.3.14",
"@formatjs/intl-numberformat": "9.4.0",
"@formatjs/intl-pluralrules": "6.3.13",
"@formatjs/intl-relativetimeformat": "12.3.13",
"@fullcalendar/core": "6.1.21",
@@ -107,7 +107,7 @@
"hls.js": "1.6.16",
"home-assistant-js-websocket": "9.6.0",
"idb-keyval": "6.3.0",
"intl-messageformat": "11.2.12",
"intl-messageformat": "11.2.13",
"js-yaml": "5.2.2",
"leaflet": "1.9.4",
"leaflet-draw": "patch:leaflet-draw@npm%3A1.0.4#./.yarn/patches/leaflet-draw-npm-1.0.4-0ca0ebcf65.patch",
@@ -150,9 +150,9 @@
"@octokit/auth-oauth-device": "8.0.3",
"@octokit/plugin-retry": "8.1.0",
"@octokit/rest": "22.0.1",
"@playwright/test": "1.62.0",
"@playwright/test": "1.62.1",
"@rsdoctor/rspack-plugin": "1.6.1",
"@rspack/core": "2.1.6",
"@rspack/core": "2.1.7",
"@rspack/dev-server": "2.1.0",
"@types/babel__plugin-transform-runtime": "7.9.5",
"@types/chromecast-caf-receiver": "6.0.26",
@@ -193,7 +193,7 @@
"gulp-rename": "2.1.0",
"html-minifier-terser": "7.2.0",
"husky": "9.1.7",
"jsdom": "30.0.0",
"jsdom": "30.0.1",
"jszip": "3.10.1",
"license-checker-rseidelsohn": "5.0.1",
"lint-staged": "17.2.0",
@@ -228,7 +228,7 @@
"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"
},
"packageManager": "yarn@4.17.1",
"packageManager": "yarn@4.18.0",
"volta": {
"node": "24.18.1"
}
@@ -6,14 +6,20 @@ import type { ByWeekday, Options, WeekdayStr } from "rrule";
import { RRule, Weekday } from "rrule";
import { formatDate, formatTime } from "../../common/datetime/calc_date";
import { firstWeekdayIndex } from "../../common/datetime/first_weekday";
import type {
HASSDomCurrentTargetEvent,
HASSDomTargetEvent,
} from "../../common/dom/fire_event";
import type { LocalizeKeys } from "../../common/translations/localize";
import "../../components/chips/ha-chip-set";
import "../../components/chips/ha-filter-chip";
import type { HaFilterChip } from "../../components/chips/ha-filter-chip";
import "../../components/ha-date-input";
import "../../components/ha-select";
import type { HaSelectSelectEvent } from "../../components/ha-select";
import "../../components/input/ha-input";
import type { HomeAssistant } from "../../types";
import type { HaInput } from "../../components/input/ha-input";
import type { HomeAssistant, ValueChangedEvent } from "../../types";
import type {
MonthlyRepeatItem,
RepeatEnd,
@@ -321,8 +327,8 @@ export class RecurrenceRuleEditor extends LitElement {
`;
}
private _onIntervalChange(e: Event) {
this._interval = (e.target! as any).value;
private _onIntervalChange(e: HASSDomTargetEvent<HaInput>) {
this._interval = Number(e.target.value);
}
private _onRepeatSelected(e: HaSelectSelectEvent<RepeatFrequency>) {
@@ -351,9 +357,12 @@ export class RecurrenceRuleEditor extends LitElement {
this._monthday = selectedItem.bymonthday;
}
private _onWeekdayToggle(e: MouseEvent) {
const target = e.currentTarget as any;
const value = target.value as WeekdayStr;
private _onWeekdayToggle(
e: MouseEvent &
HASSDomCurrentTargetEvent<HaFilterChip & { value: WeekdayStr }>
) {
const target = e.currentTarget;
const value = target.value;
if (this._weekday.has(value)) {
this._weekday.delete(value);
} else {
@@ -385,11 +394,11 @@ export class RecurrenceRuleEditor extends LitElement {
e.stopPropagation();
}
private _onCountChange(e: Event) {
this._count = (e.target! as any).value;
private _onCountChange(e: HASSDomTargetEvent<HaInput>) {
this._count = Number(e.target.value);
}
private _onUntilChange(e: CustomEvent) {
private _onUntilChange(e: ValueChangedEvent<string>) {
e.stopPropagation();
this._untilDay = new Date(
new TZDate(e.detail.value + "T00:00:00", this.timezone).getTime()
@@ -436,7 +445,7 @@ export class RecurrenceRuleEditor extends LitElement {
);
// rrule.js can't compute some UNTIL variations so we compute that ourself. Must be
// in the same format as dtstart.
let newUntilValue;
let newUntilValue: string;
if (this.allDay) {
// For all-day events, only use the date part
newUntilValue = until.toISOString().split("T")[0].replace(/-/g, "");
@@ -4,6 +4,7 @@ import type { PropertyValues } from "lit";
import { css, html, LitElement, nothing } from "lit";
import { customElement, property, state } from "lit/decorators";
import { formatNumber } from "../../../../common/number/format_number";
import { round } from "../../../../common/number/round";
import "../../../../components/ha-card";
import "../../../../components/ha-svg-icon";
import "../../../../components/ha-tooltip";
@@ -91,8 +92,8 @@ class HuiEnergyGridBalanceCard
const { summedData } = getSummedData(this._data);
const imported = summedData.total.from_grid ?? 0;
const exported = summedData.total.to_grid ?? 0;
const imported = round(summedData.total.from_grid ?? 0, 3);
const exported = round(summedData.total.to_grid ?? 0, 3);
const net = imported - exported;
const fmt = (value: number) =>
+1 -1
View File
@@ -147,7 +147,7 @@ export class HuiTileCard extends LitElement implements LovelaceCard {
handleAction(this, this.hass!, this._config!, ev.detail.action!);
}
private _handleIconAction(ev: CustomEvent) {
private _handleIconAction(ev: ActionHandlerEvent) {
ev.stopPropagation();
const config = {
entity: this._config!.entity,
+12 -4
View File
@@ -4,6 +4,10 @@ import { customElement, property, state } from "lit/decorators";
import { classMap } from "lit/directives/class-map";
import { styleMap } from "lit/directives/style-map";
import { STATES_OFF } from "../../../common/const";
import type {
HASSDomCurrentTargetEvent,
HASSDomTargetEvent,
} from "../../../common/dom/fire_event";
import { computeDomain } from "../../../common/entity/compute_domain";
import parseAspectRatio from "../../../common/util/parse-aspect-ratio";
import "../../../components/ha-camera-stream";
@@ -378,9 +382,11 @@ export class HuiImage extends LitElement {
this._loadState = LoadState.Error;
}
private async _onImageLoad(ev: Event): Promise<void> {
private async _onImageLoad(
ev: HASSDomTargetEvent<HTMLImageElement>
): Promise<void> {
this._loadState = LoadState.Loaded;
const imgEl = ev.target as HTMLImageElement;
const imgEl = ev.target;
if (this._ratio && this._ratio.w > 0 && this._ratio.h > 0) {
this._loadedImageSrc = imgEl.src;
}
@@ -388,9 +394,11 @@ export class HuiImage extends LitElement {
this._lastImageHeight = imgEl.offsetHeight;
}
private async _onVideoLoad(ev: Event): Promise<void> {
private async _onVideoLoad(
ev: HASSDomCurrentTargetEvent<HaCameraStream>
): Promise<void> {
this._loadState = LoadState.Loaded;
const videoEl = ev.currentTarget as HaCameraStream;
const videoEl = ev.currentTarget;
await this.updateComplete;
this._lastImageHeight = videoEl.offsetHeight;
}
@@ -123,8 +123,9 @@ export class HuiCardPicker extends LitElement {
};
const fuse = new Fuse(cards, options);
cards = fuse.search(filter).map((result) => result.item);
return cardElements.filter((cardElement: CardElement) =>
cards.includes(cardElement.card)
return cardElements.filter(
(cardElement: CardElement) =>
cards.includes(cardElement.card) && cardElement.card.type !== "manual"
);
}
);
@@ -140,7 +141,9 @@ export class HuiCardPicker extends LitElement {
(cardElements: CardElement[]): CardElement[] =>
cardElements.filter(
(cardElement: CardElement) =>
!cardElement.card.isCustom && !cardElement.card.isEnergy
!cardElement.card.isCustom &&
!cardElement.card.isEnergy &&
!(cardElement.card.type === "manual")
)
);
@@ -151,6 +154,12 @@ export class HuiCardPicker extends LitElement {
)
);
private _manualCard = memoizeOne((cardElements: CardElement[]): CardElement =>
cardElements.find(
(cardElement: CardElement) => cardElement.card.type === "manual"
)!
);
private _favoriteCards(): CardElement[] {
return this._favorites
.map((key) => this._favoriteElement(key))
@@ -160,9 +169,10 @@ export class HuiCardPicker extends LitElement {
// A preview is a live DOM node, so every section a card shows up in needs
// its own element.
private _toCardElement(card: Card): CardElement {
const config = card.type === "manual" ? { type: "" } : undefined;
return {
card,
element: html`${until(this._renderCardElement(card), SPINNER)}`,
element: html`${until(this._renderCardElement(card, config), SPINNER)}`,
};
}
@@ -194,6 +204,7 @@ export class HuiCardPicker extends LitElement {
const othersCards = this._otherCards(this._cards);
const energyCardsItems = this._energyCards(this._cards);
const customCardsItems = this._customCards(this._cards);
const manualCard = this._manualCard(this._cards);
return html`
<ha-input-search
@@ -334,25 +345,7 @@ export class HuiCardPicker extends LitElement {
}
`
}
<div class="cards-container">
<div
class="card manual"
@click=${this._cardPicked}
.config=${{ type: "" }}
>
<div class="card-header">
${this.hass!.localize(
`ui.panel.lovelace.editor.card.generic.manual`
)}
</div>
<div class="preview description">
${this.hass!.localize(
`ui.panel.lovelace.editor.card.generic.manual_description`
)}
</div>
<ha-ripple></ha-ripple>
</div>
</div>
<div class="cards-container">${this._renderCard(manualCard, true)}</div>
</div>
`;
}
@@ -443,6 +436,13 @@ export class HuiCardPicker extends LitElement {
)
);
}
cards = cards.concat({
type: "manual",
name: this.hass!.localize("ui.panel.lovelace.editor.card.generic.manual"),
description: this.hass!.localize(
"ui.panel.lovelace.editor.card.generic.manual_description"
),
});
this._cards = cards.map((card: Card) => this._toCardElement(card));
this._suggestedCards = cards
.filter((card: Card) => card.isSuggested)
@@ -481,12 +481,12 @@ export class HuiCardPicker extends LitElement {
}
);
private _renderCard(cardElement: CardElement): TemplateResult {
private _renderCard(cardElement: CardElement, wide = false): TemplateResult {
const key = cardKey(cardElement.card);
const favorite = this._favorites.includes(key);
return html`
<div class="card" tabindex="0">
<div class="card ${classMap({ "full-width": wide })}" tabindex="0">
${cardElement.element}
<ha-icon-button
class="favorite ${classMap({ selected: favorite })}"
@@ -832,7 +832,7 @@ export class HuiCardPicker extends LitElement {
);
}
.manual {
.full-width {
max-width: none;
grid-column: 1 / -1;
}
@@ -15,7 +15,7 @@ import type { LocalizeFunc } from "../../../../../common/translations/localize";
import { fireEvent } from "../../../../../common/dom/fire_event";
import "../../../../../components/ha-form/ha-form";
import type { SchemaUnion } from "../../../../../components/ha-form/types";
import type { HomeAssistant } from "../../../../../types";
import type { HomeAssistant, ValueChangedEvent } from "../../../../../types";
import type { ImageElementConfig } from "../../../elements/types";
import type { LovelacePictureElementEditor } from "../../../types";
import { ACTION_RELATED_CONTEXT } from "../../../components/hui-action-editor";
@@ -159,7 +159,7 @@ export class HuiImageElementEditor
: {}),
}));
private _valueChanged(ev: CustomEvent): void {
private _valueChanged(ev: ValueChangedEvent<ImageElementConfig>): void {
fireEvent(this, "config-changed", { config: ev.detail.value });
}
@@ -20,7 +20,7 @@ import "../../../../components/ha-card";
import "../../../../components/ha-form/ha-form";
import "../../../../components/ha-icon";
import "../../../../components/ha-switch";
import type { HomeAssistant } from "../../../../types";
import type { HomeAssistant, ValueChangedEvent } from "../../../../types";
import {
PREVIEW_CLICK_CALLBACK,
type PictureElementsCardConfig,
@@ -29,6 +29,7 @@ import type { LovelaceCardEditor } from "../../types";
import "../hui-sub-element-editor";
import { baseLovelaceCardConfig } from "../structs/base-card-struct";
import type { EditDetailElementEvent, SubElementEditorConfig } from "../types";
import type { UIConfigChangedEvent } from "../hui-element-editor";
import { configElementStyle } from "./config-elements-style";
import "../hui-picture-elements-card-row-editor";
import type { LovelaceElementConfig } from "../../elements/types";
@@ -228,7 +229,7 @@ export class HuiPictureElementsCardEditor
: {}),
}));
private _formChanged(ev: CustomEvent): void {
private _formChanged(ev: ValueChangedEvent<PictureElementsCardConfig>): void {
ev.stopPropagation();
if (!this._config || !this.hass) {
return;
@@ -261,7 +262,9 @@ export class HuiPictureElementsCardEditor
}
}
private _handleSubElementChanged(ev: CustomEvent): void {
private _handleSubElementChanged(
ev: UIConfigChangedEvent<LovelaceElementConfig>
): void {
ev.stopPropagation();
if (!this._config || !this.hass) {
return;
@@ -12,7 +12,12 @@ import { LitElement, css, html, nothing } from "lit";
import { customElement, property, query, state } from "lit/decorators";
import { classMap } from "lit/directives/class-map";
import { until } from "lit/directives/until";
import { fireEvent, type HASSDomEvent } from "../../common/dom/fire_event";
import { fireEvent } from "../../common/dom/fire_event";
import type {
HASSDomCurrentTargetEvent,
HASSDomEvent,
HASSDomTargetEvent,
} from "../../common/dom/fire_event";
import { computeDomain } from "../../common/entity/compute_domain";
import { computeEntityPickerDisplay } from "../../common/entity/compute_entity_name_display";
import { supportsFeature } from "../../common/entity/supports-feature";
@@ -582,14 +587,15 @@ export class BarMediaPlayer extends SubscribeMixin(LitElement) {
this._volumeSlider.value = this._volumeValue;
}
private _handleControlClick(e: MouseEvent): void {
const action = (e.currentTarget! as HTMLElement).getAttribute("action")!;
private _handleControlClick(
e: MouseEvent & HASSDomCurrentTargetEvent<HTMLElement>
): void {
const action = e.currentTarget.getAttribute("action")!;
if (!this._browserPlayer) {
handleMediaControlClick(
this.hass!,
this._stateObj!,
(e.currentTarget as HTMLElement).getAttribute("action")!
e.currentTarget.getAttribute("action")!
);
return;
}
@@ -600,12 +606,12 @@ export class BarMediaPlayer extends SubscribeMixin(LitElement) {
}
}
private _handleMediaSeekChanged(e: Event): void {
private _handleMediaSeekChanged(e: HASSDomTargetEvent<HaSlider>): void {
if (this.entityId === BROWSER_PLAYER || !this._stateObj) {
return;
}
const newValue = (e.target as HaSlider).value;
const newValue = e.target.value;
this.hass.callService("media_player", "media_seek", {
entity_id: this._stateObj.entity_id,
seek_position: newValue,
@@ -16,7 +16,7 @@ import type {
} from "../../data/data_entry_flow";
import { DirtyStateProviderMixin } from "../../mixins/dirty-state-provider-mixin";
import { haStyleDialog } from "../../resources/styles";
import type { HomeAssistant } from "../../types";
import type { HomeAssistant, ValueChangedEvent } from "../../types";
let instance = 0;
@@ -229,7 +229,7 @@ class HaMfaModuleSetupFlow extends DirtyStateProviderMixin<
});
}
private _stepDataChanged(ev: CustomEvent) {
private _stepDataChanged(ev: ValueChangedEvent<Record<string, unknown>>) {
this._stepData = ev.detail.value;
this._updateDirtyState(this._stepData);
}
@@ -2,6 +2,7 @@ import type { TemplateResult } from "lit";
import { html, LitElement } from "lit";
import { customElement, property } from "lit/decorators";
import { fireEvent } from "../../common/dom/fire_event";
import type { HASSDomTargetEvent } from "../../common/dom/fire_event";
import "../../components/ha-switch";
import type { HaSwitch } from "../../components/ha-switch";
import "../../components/item/ha-row-item";
@@ -33,8 +34,8 @@ class HaEnableShortcutsRow extends LitElement {
`;
}
private async _checkedChanged(ev: Event) {
const enabled = (ev.target as HaSwitch).checked;
private async _checkedChanged(ev: HASSDomTargetEvent<HaSwitch>) {
const enabled = ev.target.checked;
if (enabled === this.hass.enableShortcuts) {
return;
}
+3 -2
View File
@@ -2,6 +2,7 @@ import type { TemplateResult } from "lit";
import { html, LitElement } from "lit";
import { customElement, property } from "lit/decorators";
import { fireEvent } from "../../common/dom/fire_event";
import type { HASSDomTargetEvent } from "../../common/dom/fire_event";
import "../../components/ha-switch";
import type { HaSwitch } from "../../components/ha-switch";
import "../../components/item/ha-row-item";
@@ -31,8 +32,8 @@ class HaForcedNarrowRow extends LitElement {
`;
}
private async _checkedChanged(ev: Event) {
const newValue = (ev.target as HaSwitch).checked;
private async _checkedChanged(ev: HASSDomTargetEvent<HaSwitch>) {
const newValue = ev.target.checked;
if (newValue === (this.hass.dockedSidebar === "always_hidden")) {
return;
}
@@ -3,6 +3,7 @@ import type { CSSResultGroup, TemplateResult } from "lit";
import { css, html, LitElement, nothing } from "lit";
import { customElement, property, state } from "lit/decorators";
import { fireEvent } from "../../common/dom/fire_event";
import type { HASSDomCurrentTargetEvent } from "../../common/dom/fire_event";
import { copyToClipboard } from "../../common/util/copy-clipboard";
import { withViewTransition } from "../../common/util/view-transition";
import "../../components/ha-alert";
@@ -11,6 +12,7 @@ import "../../components/ha-dialog";
import "../../components/ha-dialog-footer";
import "../../components/ha-svg-icon";
import "../../components/input/ha-input";
import type { HaInput } from "../../components/input/ha-input";
import { DirtyStateProviderMixin } from "../../mixins/dirty-state-provider-mixin";
import type { HomeAssistant } from "../../types";
import { showToast } from "../../util/toast";
@@ -190,8 +192,10 @@ export class HaLongLivedAccessTokenDialog extends DirtyStateProviderMixin<string
`;
}
private _nameChanged(ev: Event) {
this._name = (ev.currentTarget as HTMLInputElement).value;
private _nameChanged(
ev: HASSDomCurrentTargetEvent<Omit<HaInput, "value"> & { value: string }>
) {
this._name = ev.currentTarget.value;
this._errorMessage = undefined;
this._updateDirtyState(this._name);
}
@@ -5,9 +5,11 @@ import { customElement, property } from "lit/decorators";
import memoizeOne from "memoize-one";
import { relativeTime } from "../../common/datetime/relative_time";
import { fireEvent } from "../../common/dom/fire_event";
import type { HASSDomCurrentTargetEvent } from "../../common/dom/fire_event";
import "../../components/ha-button";
import "../../components/ha-card";
import "../../components/ha-icon-button";
import type { HaIconButton } from "../../components/ha-icon-button";
import "../../components/ha-settings-row";
import type { RefreshToken } from "../../data/refresh_token";
import {
@@ -110,8 +112,10 @@ class HaLongLivedTokens extends LitElement {
});
}
private async _deleteToken(ev: Event): Promise<void> {
const token = (ev.currentTarget as any).token;
private async _deleteToken(
ev: HASSDomCurrentTargetEvent<HaIconButton & { token: RefreshToken }>
): Promise<void> {
const token = ev.currentTarget.token;
if (
!(await showConfirmationDialog(this, {
title: this.hass.localize(
+4 -1
View File
@@ -16,6 +16,7 @@ import { fireEvent } from "../../common/dom/fire_event";
import "../../components/ha-button";
import "../../components/ha-card";
import "../../components/ha-dropdown";
import type { HaDropdownSelectEvent } from "../../components/ha-dropdown";
import "../../components/ha-dropdown-item";
import "../../components/ha-icon-button";
import "../../components/item/ha-list-item-base";
@@ -221,7 +222,9 @@ class HaRefreshTokens extends LitElement {
}
private _handleDropdownSelect(
ev: CustomEvent<{ item: { action: string; token: RefreshToken } }>
ev: HaDropdownSelectEvent<string> & {
detail: { item: { action: string; token: RefreshToken } };
}
) {
if (ev.detail.item.action === "toggle_expiration") {
this._toggleTokenExpiration(ev.detail.item.token);
+9 -6
View File
@@ -1,7 +1,10 @@
import type { TemplateResult } from "lit";
import { html, LitElement } from "lit";
import { customElement, property } from "lit/decorators";
import type { HASSDomEvent } from "../../common/dom/fire_event";
import type {
HASSDomEvent,
HASSDomTargetEvent,
} from "../../common/dom/fire_event";
import { fireEvent } from "../../common/dom/fire_event";
import "../../components/ha-switch";
import type { HaSwitch } from "../../components/ha-switch";
@@ -15,9 +18,9 @@ declare global {
}
// for add event listener
interface HTMLElementEventMap {
"hass-suspend-when-hidden": HASSDomEvent<{
suspend: HomeAssistant["suspendWhenHidden"];
}>;
"hass-suspend-when-hidden": HASSDomEvent<
HASSDomEvents["hass-suspend-when-hidden"]
>;
}
}
@@ -43,8 +46,8 @@ class HaSetSuspendRow extends LitElement {
`;
}
private async _checkedChanged(ev: Event) {
const suspend = (ev.target as HaSwitch).checked;
private async _checkedChanged(ev: HASSDomTargetEvent<HaSwitch>) {
const suspend = ev.target.checked;
if (suspend === this.hass.suspendWhenHidden) {
return;
}
+3 -2
View File
@@ -2,6 +2,7 @@ import type { TemplateResult } from "lit";
import { html, LitElement } from "lit";
import { customElement, property } from "lit/decorators";
import { fireEvent } from "../../common/dom/fire_event";
import type { HASSDomTargetEvent } from "../../common/dom/fire_event";
import "../../components/ha-switch";
import type { HaSwitch } from "../../components/ha-switch";
import "../../components/item/ha-row-item";
@@ -30,8 +31,8 @@ class HaSetVibrateRow extends LitElement {
`;
}
private async _checkedChanged(ev: Event) {
const vibrate = (ev.target as HaSwitch).checked;
private async _checkedChanged(ev: HASSDomTargetEvent<HaSwitch>) {
const vibrate = ev.target.checked;
if (vibrate === this.hass.vibrate) {
return;
}
+11 -8
View File
@@ -6,16 +6,19 @@ import memoizeOne from "memoize-one";
import { formatShortDateTimeWithConditionalYear } from "../../common/datetime/format_date_time";
import { resolveTimeZone } from "../../common/datetime/resolve-time-zone";
import { fireEvent } from "../../common/dom/fire_event";
import type { HASSDomTargetEvent } from "../../common/dom/fire_event";
import { computeStateName } from "../../common/entity/compute_state_name";
import { supportsFeature } from "../../common/entity/supports-feature";
import { supportsMarkdownHelper } from "../../common/translations/markdown_support";
import "../../components/ha-alert";
import "../../components/ha-button";
import "../../components/ha-checkbox";
import type { HaCheckbox } from "../../components/ha-checkbox";
import "../../components/ha-date-input";
import "../../components/ha-dialog";
import "../../components/ha-dialog-footer";
import "../../components/ha-textarea";
import type { HaTextArea } from "../../components/ha-textarea";
import "../../components/ha-time-input";
import "../../components/input/ha-input";
import type { HaInput } from "../../components/input/ha-input";
@@ -30,7 +33,7 @@ import {
import { showConfirmationDialog } from "../../dialogs/generic/show-dialog-box";
import { DirtyStateProviderMixin } from "../../mixins/dirty-state-provider-mixin";
import { haStyleDialog } from "../../resources/styles";
import type { HomeAssistant } from "../../types";
import type { HomeAssistant, ValueChangedEvent } from "../../types";
import type { TodoItemEditDialogParams } from "./show-dialog-todo-item-editor";
interface TodoItemFormState {
@@ -166,7 +169,7 @@ class DialogTodoItemEditor extends DirtyStateProviderMixin<TodoItemFormState>()(
<div class="flex">
<ha-checkbox
.checked=${this._checked}
@change=${this._checkedCanged}
@change=${this._checkedChanged}
.disabled=${isCreate || !canUpdate}
></ha-checkbox>
<ha-input
@@ -338,22 +341,22 @@ class DialogTodoItemEditor extends DirtyStateProviderMixin<TodoItemFormState>()(
return new Date(tzDate.getTime());
}
private _checkedCanged(ev) {
private _checkedChanged(ev: HASSDomTargetEvent<HaCheckbox>) {
this._checked = ev.target.checked;
this._updateDirtyState(this._currentState());
}
private _handleSummaryChanged(ev: InputEvent) {
this._summary = (ev.target as HaInput).value ?? "";
private _handleSummaryChanged(ev: InputEvent & HASSDomTargetEvent<HaInput>) {
this._summary = ev.target.value ?? "";
this._updateDirtyState(this._currentState());
}
private _handleDescriptionChanged(ev) {
private _handleDescriptionChanged(ev: HASSDomTargetEvent<HaTextArea>) {
this._description = ev.target.value;
this._updateDirtyState(this._currentState());
}
private _dueDateChanged(ev: CustomEvent) {
private _dueDateChanged(ev: ValueChangedEvent<string | undefined>) {
if (!ev.detail.value) {
this._due = undefined;
this._updateDirtyState(this._currentState());
@@ -364,7 +367,7 @@ class DialogTodoItemEditor extends DirtyStateProviderMixin<TodoItemFormState>()(
this._updateDirtyState(this._currentState());
}
private _dueTimeChanged(ev: CustomEvent) {
private _dueTimeChanged(ev: ValueChangedEvent<string>) {
this._hasTime = true;
this._due = this._parseDate(
`${this._formatDate(this._due || new Date())}T${ev.detail.value}`
+3 -2
View File
@@ -15,6 +15,7 @@ import memoizeOne from "memoize-one";
import { isComponentLoaded } from "../../common/config/is_component_loaded";
import { storage } from "../../common/decorators/storage";
import { fireEvent } from "../../common/dom/fire_event";
import type { HASSDomCurrentTargetEvent } from "../../common/dom/fire_event";
import { computeStateName } from "../../common/entity/compute_state_name";
import { supportsFeature } from "../../common/entity/supports-feature";
import { navigate } from "../../common/navigate";
@@ -396,8 +397,8 @@ class PanelTodo extends LitElement {
}
}
private _setEntityId(ev: Event) {
const item = ev.currentTarget as HaDropdownItem;
private _setEntityId(ev: HASSDomCurrentTargetEvent<HaDropdownItem>) {
const item = ev.currentTarget;
this._entityId = item.value;
}
+104 -104
View File
@@ -40,7 +40,7 @@ __metadata:
languageName: node
linkType: hard
"@asamuzakjp/dom-selector@npm:^8.2.5":
"@asamuzakjp/dom-selector@npm:^8.3.0":
version: 8.3.0
resolution: "@asamuzakjp/dom-selector@npm:8.3.0"
dependencies:
@@ -2499,7 +2499,7 @@ __metadata:
languageName: node
linkType: hard
"@csstools/css-syntax-patches-for-csstree@npm:^1.1.6":
"@csstools/css-syntax-patches-for-csstree@npm:^1.1.7":
version: 1.1.7
resolution: "@csstools/css-syntax-patches-for-csstree@npm:1.1.7"
peerDependencies:
@@ -2763,12 +2763,12 @@ __metadata:
languageName: node
linkType: hard
"@formatjs/icu-messageformat-parser@npm:3.5.15":
version: 3.5.15
resolution: "@formatjs/icu-messageformat-parser@npm:3.5.15"
"@formatjs/icu-messageformat-parser@npm:3.5.16":
version: 3.5.16
resolution: "@formatjs/icu-messageformat-parser@npm:3.5.16"
dependencies:
"@formatjs/icu-skeleton-parser": "npm:2.1.11"
checksum: 10/4337a0bc8df86c498509a3a4b51fc2b4bb6e36c444447d64b5d5ca7b60b3dac676e67863e160b5269f7d35a42f3ab17d2eeeb056123120181db31c7a50f831e9
checksum: 10/406cf08cf01a68e244c7077b726b199dde6ba4c95ecb2d807bff9ec62a9acc77b7f47fad196f02dfbd7a7b8110cccf5d5392e9693069e2484cf96f00899a728f
languageName: node
linkType: hard
@@ -2779,13 +2779,13 @@ __metadata:
languageName: node
linkType: hard
"@formatjs/intl-datetimeformat@npm:7.5.2":
version: 7.5.2
resolution: "@formatjs/intl-datetimeformat@npm:7.5.2"
"@formatjs/intl-datetimeformat@npm:7.6.0":
version: 7.6.0
resolution: "@formatjs/intl-datetimeformat@npm:7.6.0"
dependencies:
"@formatjs/bigdecimal": "npm:0.2.7"
"@formatjs/intl-localematcher": "npm:0.8.13"
checksum: 10/a9b18f890bd1fd747b6a4639a7fcc30456dfed2e78aebeca1dac245f1f2a5a20d295a9a125fc7037a7603ec257e0fadd7989ea180c68dd5a30c8ae2c429d689d
checksum: 10/8d172390d12c0d771721e5737d4af37ed3dd3bdbb59dfbc7ac2280ee17ff0ed56a737d0b8a3ca507e40c556140b4297a28d72b33b5b3b3e9becca55d8ef26549
languageName: node
linkType: hard
@@ -2843,13 +2843,13 @@ __metadata:
languageName: node
linkType: hard
"@formatjs/intl-numberformat@npm:9.3.14":
version: 9.3.14
resolution: "@formatjs/intl-numberformat@npm:9.3.14"
"@formatjs/intl-numberformat@npm:9.4.0":
version: 9.4.0
resolution: "@formatjs/intl-numberformat@npm:9.4.0"
dependencies:
"@formatjs/bigdecimal": "npm:0.2.7"
"@formatjs/intl-localematcher": "npm:0.8.13"
checksum: 10/7ba06936b41674cdcfa2aabc05a1dac5defbbb57a790bf8e3eb97d930750b0ec5ba715124cb3661d54015072f6877cbece5d92fa5e2ab98ba32d096c99432140
checksum: 10/63476552f2cb9dd8530c8965bf891e9ead573813e5a42c1fc2dc7e254ff3fec15aba90ac44a4df1a875a2c2e04431e7eea643098651afaebf2f439d4a7cacea0
languageName: node
linkType: hard
@@ -4208,14 +4208,14 @@ __metadata:
languageName: node
linkType: hard
"@playwright/test@npm:1.62.0":
version: 1.62.0
resolution: "@playwright/test@npm:1.62.0"
"@playwright/test@npm:1.62.1":
version: 1.62.1
resolution: "@playwright/test@npm:1.62.1"
dependencies:
playwright: "npm:1.62.0"
playwright: "npm:1.62.1"
bin:
playwright: cli.js
checksum: 10/90b504f3933b97687580d7e6ba42ce9e73a9cdd41da5ae59441104b3dfa1508142ed17e5742acc70fdc2aef79078365859c6a463cebf46a8f7db9506a3ece1d6
checksum: 10/a84fdc2b0c0f01131fa4c0f0aaebf2698a618ca4a459e3b71ebec4b0b8a5be5b7b1a3cfc063e316d4d75f403a04078d214baf69c4bcbc9606ba12be696d4ff14
languageName: node
linkType: hard
@@ -4740,65 +4740,65 @@ __metadata:
languageName: node
linkType: hard
"@rspack/binding-darwin-arm64@npm:2.1.6":
version: 2.1.6
resolution: "@rspack/binding-darwin-arm64@npm:2.1.6"
"@rspack/binding-darwin-arm64@npm:2.1.7":
version: 2.1.7
resolution: "@rspack/binding-darwin-arm64@npm:2.1.7"
conditions: os=darwin & cpu=arm64
languageName: node
linkType: hard
"@rspack/binding-darwin-x64@npm:2.1.6":
version: 2.1.6
resolution: "@rspack/binding-darwin-x64@npm:2.1.6"
"@rspack/binding-darwin-x64@npm:2.1.7":
version: 2.1.7
resolution: "@rspack/binding-darwin-x64@npm:2.1.7"
conditions: os=darwin & cpu=x64
languageName: node
linkType: hard
"@rspack/binding-linux-arm64-gnu@npm:2.1.6":
version: 2.1.6
resolution: "@rspack/binding-linux-arm64-gnu@npm:2.1.6"
"@rspack/binding-linux-arm64-gnu@npm:2.1.7":
version: 2.1.7
resolution: "@rspack/binding-linux-arm64-gnu@npm:2.1.7"
conditions: os=linux & cpu=arm64 & libc=glibc
languageName: node
linkType: hard
"@rspack/binding-linux-arm64-musl@npm:2.1.6":
version: 2.1.6
resolution: "@rspack/binding-linux-arm64-musl@npm:2.1.6"
"@rspack/binding-linux-arm64-musl@npm:2.1.7":
version: 2.1.7
resolution: "@rspack/binding-linux-arm64-musl@npm:2.1.7"
conditions: os=linux & cpu=arm64 & libc=musl
languageName: node
linkType: hard
"@rspack/binding-linux-riscv64-gnu@npm:2.1.6":
version: 2.1.6
resolution: "@rspack/binding-linux-riscv64-gnu@npm:2.1.6"
"@rspack/binding-linux-riscv64-gnu@npm:2.1.7":
version: 2.1.7
resolution: "@rspack/binding-linux-riscv64-gnu@npm:2.1.7"
conditions: os=linux & cpu=riscv64 & libc=glibc
languageName: node
linkType: hard
"@rspack/binding-linux-riscv64-musl@npm:2.1.6":
version: 2.1.6
resolution: "@rspack/binding-linux-riscv64-musl@npm:2.1.6"
"@rspack/binding-linux-riscv64-musl@npm:2.1.7":
version: 2.1.7
resolution: "@rspack/binding-linux-riscv64-musl@npm:2.1.7"
conditions: os=linux & cpu=riscv64 & libc=musl
languageName: node
linkType: hard
"@rspack/binding-linux-x64-gnu@npm:2.1.6":
version: 2.1.6
resolution: "@rspack/binding-linux-x64-gnu@npm:2.1.6"
"@rspack/binding-linux-x64-gnu@npm:2.1.7":
version: 2.1.7
resolution: "@rspack/binding-linux-x64-gnu@npm:2.1.7"
conditions: os=linux & cpu=x64 & libc=glibc
languageName: node
linkType: hard
"@rspack/binding-linux-x64-musl@npm:2.1.6":
version: 2.1.6
resolution: "@rspack/binding-linux-x64-musl@npm:2.1.6"
"@rspack/binding-linux-x64-musl@npm:2.1.7":
version: 2.1.7
resolution: "@rspack/binding-linux-x64-musl@npm:2.1.7"
conditions: os=linux & cpu=x64 & libc=musl
languageName: node
linkType: hard
"@rspack/binding-wasm32-wasi@npm:2.1.6":
version: 2.1.6
resolution: "@rspack/binding-wasm32-wasi@npm:2.1.6"
"@rspack/binding-wasm32-wasi@npm:2.1.7":
version: 2.1.7
resolution: "@rspack/binding-wasm32-wasi@npm:2.1.7"
dependencies:
"@emnapi/core": "npm:1.11.2"
"@emnapi/runtime": "npm:1.11.2"
@@ -4807,43 +4807,43 @@ __metadata:
languageName: node
linkType: hard
"@rspack/binding-win32-arm64-msvc@npm:2.1.6":
version: 2.1.6
resolution: "@rspack/binding-win32-arm64-msvc@npm:2.1.6"
"@rspack/binding-win32-arm64-msvc@npm:2.1.7":
version: 2.1.7
resolution: "@rspack/binding-win32-arm64-msvc@npm:2.1.7"
conditions: os=win32 & cpu=arm64
languageName: node
linkType: hard
"@rspack/binding-win32-ia32-msvc@npm:2.1.6":
version: 2.1.6
resolution: "@rspack/binding-win32-ia32-msvc@npm:2.1.6"
"@rspack/binding-win32-ia32-msvc@npm:2.1.7":
version: 2.1.7
resolution: "@rspack/binding-win32-ia32-msvc@npm:2.1.7"
conditions: os=win32 & cpu=ia32
languageName: node
linkType: hard
"@rspack/binding-win32-x64-msvc@npm:2.1.6":
version: 2.1.6
resolution: "@rspack/binding-win32-x64-msvc@npm:2.1.6"
"@rspack/binding-win32-x64-msvc@npm:2.1.7":
version: 2.1.7
resolution: "@rspack/binding-win32-x64-msvc@npm:2.1.7"
conditions: os=win32 & cpu=x64
languageName: node
linkType: hard
"@rspack/binding@npm:2.1.6":
version: 2.1.6
resolution: "@rspack/binding@npm:2.1.6"
"@rspack/binding@npm:2.1.7":
version: 2.1.7
resolution: "@rspack/binding@npm:2.1.7"
dependencies:
"@rspack/binding-darwin-arm64": "npm:2.1.6"
"@rspack/binding-darwin-x64": "npm:2.1.6"
"@rspack/binding-linux-arm64-gnu": "npm:2.1.6"
"@rspack/binding-linux-arm64-musl": "npm:2.1.6"
"@rspack/binding-linux-riscv64-gnu": "npm:2.1.6"
"@rspack/binding-linux-riscv64-musl": "npm:2.1.6"
"@rspack/binding-linux-x64-gnu": "npm:2.1.6"
"@rspack/binding-linux-x64-musl": "npm:2.1.6"
"@rspack/binding-wasm32-wasi": "npm:2.1.6"
"@rspack/binding-win32-arm64-msvc": "npm:2.1.6"
"@rspack/binding-win32-ia32-msvc": "npm:2.1.6"
"@rspack/binding-win32-x64-msvc": "npm:2.1.6"
"@rspack/binding-darwin-arm64": "npm:2.1.7"
"@rspack/binding-darwin-x64": "npm:2.1.7"
"@rspack/binding-linux-arm64-gnu": "npm:2.1.7"
"@rspack/binding-linux-arm64-musl": "npm:2.1.7"
"@rspack/binding-linux-riscv64-gnu": "npm:2.1.7"
"@rspack/binding-linux-riscv64-musl": "npm:2.1.7"
"@rspack/binding-linux-x64-gnu": "npm:2.1.7"
"@rspack/binding-linux-x64-musl": "npm:2.1.7"
"@rspack/binding-wasm32-wasi": "npm:2.1.7"
"@rspack/binding-win32-arm64-msvc": "npm:2.1.7"
"@rspack/binding-win32-ia32-msvc": "npm:2.1.7"
"@rspack/binding-win32-x64-msvc": "npm:2.1.7"
dependenciesMeta:
"@rspack/binding-darwin-arm64":
optional: true
@@ -4869,15 +4869,15 @@ __metadata:
optional: true
"@rspack/binding-win32-x64-msvc":
optional: true
checksum: 10/0d164b7425f448ed6b8b81e687f4a82377289476cee41553ced9532e211d216fa13429b9125f3e3f025e391709bf752983c16eb4549341a21cbd0c61510afbeb
checksum: 10/1400d8553d2122850fc43a45b69828bcdcbccf7715381a627802e160da6f93e90ca41d0280a69d175894bc29a428a374c80157b874883363b998090dc0aff33c
languageName: node
linkType: hard
"@rspack/core@npm:2.1.6":
version: 2.1.6
resolution: "@rspack/core@npm:2.1.6"
"@rspack/core@npm:2.1.7":
version: 2.1.7
resolution: "@rspack/core@npm:2.1.7"
dependencies:
"@rspack/binding": "npm:2.1.6"
"@rspack/binding": "npm:2.1.7"
peerDependencies:
"@module-federation/runtime-tools": ^0.24.1 || ^2.0.0
"@swc/helpers": ^0.5.23
@@ -4886,7 +4886,7 @@ __metadata:
optional: true
"@swc/helpers":
optional: true
checksum: 10/334f8e13aa3540b7320d3186250fc4e2f128711f765d2073274188f23c692d4262e7cbb88c10571626b55e480186c474bdbcb564e7fa97df803479554de855b4
checksum: 10/84526df889fa2813cfa7dfbed71b713c47c2010b1f55da26db698a87ea11f3f433a931ec29616ff300cb63d0ea27cbe7d2b40df64abf45f9b1a484b59c94ca1a
languageName: node
linkType: hard
@@ -9904,13 +9904,13 @@ __metadata:
"@date-fns/tz": "npm:1.5.0"
"@egjs/hammerjs": "npm:2.0.17"
"@eslint/js": "npm:10.0.1"
"@formatjs/intl-datetimeformat": "npm:7.5.2"
"@formatjs/intl-datetimeformat": "npm:7.6.0"
"@formatjs/intl-displaynames": "npm:7.3.13"
"@formatjs/intl-durationformat": "npm:0.10.18"
"@formatjs/intl-getcanonicallocales": "npm:3.2.11"
"@formatjs/intl-listformat": "npm:8.3.13"
"@formatjs/intl-locale": "npm:5.3.10"
"@formatjs/intl-numberformat": "npm:9.3.14"
"@formatjs/intl-numberformat": "npm:9.4.0"
"@formatjs/intl-pluralrules": "npm:6.3.13"
"@formatjs/intl-relativetimeformat": "npm:12.3.13"
"@fullcalendar/core": "npm:6.1.21"
@@ -9937,10 +9937,10 @@ __metadata:
"@octokit/auth-oauth-device": "npm:8.0.3"
"@octokit/plugin-retry": "npm:8.1.0"
"@octokit/rest": "npm:22.0.1"
"@playwright/test": "npm:1.62.0"
"@playwright/test": "npm:1.62.1"
"@replit/codemirror-indentation-markers": "npm:6.5.3"
"@rsdoctor/rspack-plugin": "npm:1.6.1"
"@rspack/core": "npm:2.1.6"
"@rspack/core": "npm:2.1.7"
"@rspack/dev-server": "npm:2.1.0"
"@swc/helpers": "npm:0.5.23"
"@thomasloven/round-slider": "npm:0.6.0"
@@ -10007,9 +10007,9 @@ __metadata:
html-minifier-terser: "npm:7.2.0"
husky: "npm:9.1.7"
idb-keyval: "npm:6.3.0"
intl-messageformat: "npm:11.2.12"
intl-messageformat: "npm:11.2.13"
js-yaml: "npm:5.2.2"
jsdom: "npm:30.0.0"
jsdom: "npm:30.0.1"
jszip: "npm:3.10.1"
leaflet: "npm:1.9.4"
leaflet-draw: "patch:leaflet-draw@npm%3A1.0.4#./.yarn/patches/leaflet-draw-npm-1.0.4-0ca0ebcf65.patch"
@@ -10355,13 +10355,13 @@ __metadata:
languageName: node
linkType: hard
"intl-messageformat@npm:11.2.12":
version: 11.2.12
resolution: "intl-messageformat@npm:11.2.12"
"intl-messageformat@npm:11.2.13":
version: 11.2.13
resolution: "intl-messageformat@npm:11.2.13"
dependencies:
"@formatjs/fast-memoize": "npm:3.1.7"
"@formatjs/icu-messageformat-parser": "npm:3.5.15"
checksum: 10/e9fb7dfe11f3fc34cb01e24f550f060c8c3e56a07d634b9e10a525a57df49300cf0721fc3a8b3771fb54e8a3171571815f36dd2ab9f78024bbc11b4a58f947a2
"@formatjs/icu-messageformat-parser": "npm:3.5.16"
checksum: 10/7da1b2e01258ae310cd3aeabd6302497a70755ef860cc666405e89ede2927f5d5995d8a6f9be556d7dfc4f7b1eb0a13b26c9633234fdb4afea762013bb25af65
languageName: node
linkType: hard
@@ -10964,14 +10964,14 @@ __metadata:
languageName: node
linkType: hard
"jsdom@npm:30.0.0":
version: 30.0.0
resolution: "jsdom@npm:30.0.0"
"jsdom@npm:30.0.1":
version: 30.0.1
resolution: "jsdom@npm:30.0.1"
dependencies:
"@asamuzakjp/css-color": "npm:^6.0.5"
"@asamuzakjp/dom-selector": "npm:^8.2.5"
"@asamuzakjp/dom-selector": "npm:^8.3.0"
"@bramus/specificity": "npm:^2.4.2"
"@csstools/css-syntax-patches-for-csstree": "npm:^1.1.6"
"@csstools/css-syntax-patches-for-csstree": "npm:^1.1.7"
"@exodus/bytes": "npm:^1.15.1"
css-tree: "npm:^3.2.1"
data-urls: "npm:^7.0.0"
@@ -10983,7 +10983,7 @@ __metadata:
saxes: "npm:^6.0.0"
symbol-tree: "npm:^3.2.4"
tough-cookie: "npm:^6.0.2"
undici: "npm:^8.7.0"
undici: "npm:^8.9.0"
w3c-xmlserializer: "npm:^5.0.0"
webidl-conversions: "npm:^8.0.1"
whatwg-mimetype: "npm:^5.0.0"
@@ -10994,7 +10994,7 @@ __metadata:
peerDependenciesMeta:
canvas:
optional: true
checksum: 10/dc73c071e67224465018733525047d05772667bd8e00a3703a6f6515238c027b6ca768bf86874a53d512fd0bb962d72cc6a6c31c1bc38e52318f9d412ad0bb90
checksum: 10/5089ceca7d340b3beec451b7a3286f2bf38d707482e0bdcf046e63b4de3ea2e679372fbb733c5c24c1ce1cc9e70272d10e49fd1b4b146beb77b12c17c069cb36
languageName: node
linkType: hard
@@ -12748,27 +12748,27 @@ __metadata:
languageName: node
linkType: hard
"playwright-core@npm:1.62.0":
version: 1.62.0
resolution: "playwright-core@npm:1.62.0"
"playwright-core@npm:1.62.1":
version: 1.62.1
resolution: "playwright-core@npm:1.62.1"
bin:
playwright-core: cli.js
checksum: 10/1cf036e9ed51ea80d311ac25a871dddbc57d5e7e7a5ad23fc2741452aa8406c95e820901ec38aeecc6fca2ddc383ccc8acb0e2f29a4c12942dd0a1a63e7134a2
checksum: 10/2dab88793a6a5cbfa27641664548ded72a4f869d7eab8d3541e070081b5e09595253aa3dbd42eb4e6eca1b03d96a727c60704359b5b309e71ca58b12549a4c06
languageName: node
linkType: hard
"playwright@npm:1.62.0":
version: 1.62.0
resolution: "playwright@npm:1.62.0"
"playwright@npm:1.62.1":
version: 1.62.1
resolution: "playwright@npm:1.62.1"
dependencies:
fsevents: "npm:2.3.2"
playwright-core: "npm:1.62.0"
playwright-core: "npm:1.62.1"
dependenciesMeta:
fsevents:
optional: true
bin:
playwright: cli.js
checksum: 10/52401b5f2b67abcb555c1b1c229e5204a3ac72a604343a99e60b00bd0cd46ad661a9471ced4e6c3ff39de957a0b1f413810d191ce81cd40e455700d73a6a80a5
checksum: 10/f99546873ab2545160ad5a0145fef8e2c1d805efd1ba77356f5b0ee3d8688192b3a2af08cd948bece36ca386fdfad889ef7e53b7aaad309940744c0bbccc0a19
languageName: node
linkType: hard
@@ -15056,7 +15056,7 @@ __metadata:
languageName: node
linkType: hard
"undici@npm:^8.4.1, undici@npm:^8.7.0":
"undici@npm:^8.4.1, undici@npm:^8.9.0":
version: 8.9.0
resolution: "undici@npm:8.9.0"
checksum: 10/dfad3e233087eafdf1d361acd17c4d45a9590d5db9400458f1c03f47d8f1ef68647e2109ebb982c862e50c227093abd2d5f44b154904fc0b3d22576b6e95cfe7