mirror of
https://github.com/home-assistant/frontend.git
synced 2026-06-04 23:41:46 +00:00
Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 69b33ff015 | |||
| 6e2968671b | |||
| 453d412549 | |||
| 4a3eea5d2b | |||
| ee755ff58a | |||
| 635a6442b4 |
@@ -276,7 +276,7 @@ fireEvent(this, "show-dialog", {
|
||||
|
||||
- **`variant`** (color): `"brand"` (default), `"neutral"`, `"danger"`, `"warning"`, `"success"`
|
||||
- **`appearance`** (fill style): `"accent"`, `"filled"`, `"outlined"`, `"plain"`
|
||||
- **`size`**: `"small"` (32px), `"medium"` (40px - default), `"large"` (48px)
|
||||
- **`size`**: `"xs"` (extra small, 40px), `"s"` (small, 32px), `"m"` (medium, 40px - default), `"l"` (large, 48px), `"xl"` (extra large, 40px)
|
||||
|
||||
Common patterns:
|
||||
|
||||
|
||||
@@ -77,9 +77,22 @@ jobs:
|
||||
env:
|
||||
GITHUB_REF: ${{ github.ref }}
|
||||
run: |
|
||||
# Sleep to give pypi time to populate the new version across mirrors
|
||||
sleep 240
|
||||
version=$(echo "$GITHUB_REF" | awk -F"/" '{print $NF}' )
|
||||
# Wait for the package to become available on PyPI
|
||||
echo "Waiting for home-assistant-frontend==$version to appear on PyPI..."
|
||||
for i in $(seq 1 30); do
|
||||
status=$(curl -s -o /dev/null -w "%{http_code}" "https://pypi.org/pypi/home-assistant-frontend/$version/json")
|
||||
if [ "$status" = "200" ]; then
|
||||
echo "Package is available on PyPI!"
|
||||
break
|
||||
fi
|
||||
if [ "$i" = "30" ]; then
|
||||
echo "Timed out waiting for package to appear on PyPI"
|
||||
exit 1
|
||||
fi
|
||||
echo "Not available yet (HTTP $status), retrying in 30 seconds... ($i/30)"
|
||||
sleep 30
|
||||
done
|
||||
echo "home-assistant-frontend==$version" > ./requirements.txt
|
||||
|
||||
# home-assistant/wheels doesn't support SHA pinning
|
||||
|
||||
+3
-3
@@ -70,8 +70,8 @@
|
||||
"@replit/codemirror-indentation-markers": "6.5.3",
|
||||
"@swc/helpers": "0.5.23",
|
||||
"@thomasloven/round-slider": "0.6.0",
|
||||
"@tsparticles/engine": "4.1.1",
|
||||
"@tsparticles/preset-links": "4.1.1",
|
||||
"@tsparticles/engine": "4.1.2",
|
||||
"@tsparticles/preset-links": "4.1.2",
|
||||
"@vibrant/color": "4.0.4",
|
||||
"@webcomponents/scoped-custom-element-registry": "0.0.10",
|
||||
"@webcomponents/webcomponentsjs": "2.8.0",
|
||||
@@ -190,7 +190,7 @@
|
||||
"rspack-manifest-plugin": "5.2.1",
|
||||
"serve": "14.2.6",
|
||||
"sinon": "22.0.0",
|
||||
"tar": "7.5.15",
|
||||
"tar": "7.5.16",
|
||||
"terser-webpack-plugin": "5.6.1",
|
||||
"ts-lit-plugin": "2.0.2",
|
||||
"typescript": "6.0.3",
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
import type { HassEntities, HassEntity } from "home-assistant-js-websocket";
|
||||
import { computeStateDomain } from "./compute_state_domain";
|
||||
|
||||
export interface EntityLocation {
|
||||
latitude: number;
|
||||
longitude: number;
|
||||
gpsAccuracy?: number;
|
||||
}
|
||||
|
||||
const findFirstActiveZone = (
|
||||
inZones: readonly string[],
|
||||
states: HassEntities
|
||||
): HassEntity | undefined => {
|
||||
for (const zoneId of inZones) {
|
||||
const zone = states[zoneId];
|
||||
if (
|
||||
zone &&
|
||||
!zone.attributes.passive &&
|
||||
typeof zone.attributes.latitude === "number" &&
|
||||
typeof zone.attributes.longitude === "number"
|
||||
) {
|
||||
return zone;
|
||||
}
|
||||
}
|
||||
return undefined;
|
||||
};
|
||||
|
||||
export const getEntityLocation = (
|
||||
stateObj: HassEntity,
|
||||
states: HassEntities
|
||||
): EntityLocation | undefined => {
|
||||
const {
|
||||
latitude,
|
||||
longitude,
|
||||
gps_accuracy: gpsAccuracy,
|
||||
} = stateObj.attributes;
|
||||
if (typeof latitude === "number" && typeof longitude === "number") {
|
||||
return { latitude, longitude, gpsAccuracy };
|
||||
}
|
||||
|
||||
if (computeStateDomain(stateObj) !== "person") {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
const inZones = stateObj.attributes.in_zones;
|
||||
if (!Array.isArray(inZones) || inZones.length === 0) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
const zone = findFirstActiveZone(inZones, states);
|
||||
if (!zone) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
return {
|
||||
latitude: zone.attributes.latitude,
|
||||
longitude: zone.attributes.longitude,
|
||||
};
|
||||
};
|
||||
@@ -23,6 +23,7 @@ import type { LeafletModuleType } from "../../common/dom/setup-leaflet-map";
|
||||
import { setupLeafletMap } from "../../common/dom/setup-leaflet-map";
|
||||
import { computeStateDomain } from "../../common/entity/compute_state_domain";
|
||||
import { computeStateName } from "../../common/entity/compute_state_name";
|
||||
import { getEntityLocation } from "../../common/entity/get_entity_location";
|
||||
import { DecoratedMarker } from "../../common/map/decorated_marker";
|
||||
import { filterXSS } from "../../common/util/xss";
|
||||
import type { HomeAssistant, ThemeMode } from "../../types";
|
||||
@@ -584,18 +585,17 @@ export class HaMap extends ReactiveElement {
|
||||
const customTitle = typeof entity !== "string" ? entity.name : undefined;
|
||||
const title = customTitle ?? computeStateName(stateObj);
|
||||
const {
|
||||
latitude,
|
||||
longitude,
|
||||
passive,
|
||||
icon,
|
||||
radius,
|
||||
entity_picture: entityPicture,
|
||||
gps_accuracy: gpsAccuracy,
|
||||
} = stateObj.attributes;
|
||||
|
||||
if (!(latitude && longitude)) {
|
||||
const location = getEntityLocation(stateObj, hass.states);
|
||||
if (!location) {
|
||||
continue;
|
||||
}
|
||||
const { latitude, longitude, gpsAccuracy } = location;
|
||||
|
||||
if (computeStateDomain(stateObj) === "zone") {
|
||||
// DRAW ZONE
|
||||
|
||||
@@ -3,6 +3,7 @@ import { css, html, LitElement, nothing } from "lit";
|
||||
import { customElement, property } from "lit/decorators";
|
||||
import memoizeOne from "memoize-one";
|
||||
import { fireEvent } from "../../../common/dom/fire_event";
|
||||
import { getEntityLocation } from "../../../common/entity/get_entity_location";
|
||||
import "../../../components/ha-button";
|
||||
import "../../../components/map/ha-map";
|
||||
import { showZoneEditor } from "../../../data/zone";
|
||||
@@ -21,8 +22,13 @@ class MoreInfoPerson extends LitElement {
|
||||
return nothing;
|
||||
}
|
||||
|
||||
const location = getEntityLocation(this.stateObj, this.hass.states);
|
||||
const hasOwnCoordinates =
|
||||
typeof this.stateObj.attributes.latitude === "number" &&
|
||||
typeof this.stateObj.attributes.longitude === "number";
|
||||
|
||||
return html`
|
||||
${this.stateObj.attributes.latitude && this.stateObj.attributes.longitude
|
||||
${location
|
||||
? html`
|
||||
<ha-map
|
||||
.hass=${this.hass}
|
||||
@@ -31,10 +37,7 @@ class MoreInfoPerson extends LitElement {
|
||||
></ha-map>
|
||||
`
|
||||
: ""}
|
||||
${!__DEMO__ &&
|
||||
this.hass.user?.is_admin &&
|
||||
this.stateObj.attributes.latitude &&
|
||||
this.stateObj.attributes.longitude
|
||||
${!__DEMO__ && this.hass.user?.is_admin && hasOwnCoordinates
|
||||
? html`
|
||||
<div class="actions">
|
||||
<ha-button
|
||||
|
||||
@@ -5,7 +5,6 @@ in core bundle slows things down and causes duplicate registration.
|
||||
This is the entry point for providing external app stuff from app entrypoint.
|
||||
*/
|
||||
|
||||
import type { HASSDomEvent } from "../common/dom/fire_event";
|
||||
import { fireEvent } from "../common/dom/fire_event";
|
||||
import { mainWindow } from "../common/dom/get_main_window";
|
||||
import { navigate } from "../common/navigate";
|
||||
@@ -16,7 +15,6 @@ import type {
|
||||
EMIncomingMessageBarCodeScanResult,
|
||||
EMIncomingMessageCommands,
|
||||
ImprovDiscoveredDevice,
|
||||
MatterCommissionFinish,
|
||||
} from "./external_messaging";
|
||||
|
||||
const barCodeListeners = new Set<
|
||||
@@ -93,8 +91,6 @@ export const handleExternalMessage = (
|
||||
fireEvent(window, "improv-discovered-device", msg.payload);
|
||||
} else if (msg.command === "improv/device_setup_done") {
|
||||
fireEvent(window, "improv-device-setup-done");
|
||||
} else if (msg.command === "matter/commission/finish") {
|
||||
fireEvent(window, "matter-commission-finish", msg.payload);
|
||||
} else if (msg.command === "bar_code/scan_result") {
|
||||
barCodeListeners.forEach((listener) => listener(msg));
|
||||
} else if (msg.command === "bar_code/aborted") {
|
||||
@@ -119,10 +115,5 @@ declare global {
|
||||
interface HASSDomEvents {
|
||||
"improv-discovered-device": ImprovDiscoveredDevice;
|
||||
"improv-device-setup-done": undefined;
|
||||
"matter-commission-finish": MatterCommissionFinish;
|
||||
}
|
||||
|
||||
interface GlobalEventHandlersEventMap {
|
||||
"matter-commission-finish": HASSDomEvent<MatterCommissionFinish>;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -320,18 +320,6 @@ export interface EMIncomingMessageKioskModeSet {
|
||||
};
|
||||
}
|
||||
|
||||
export interface MatterCommissionFinish {
|
||||
name: string | null;
|
||||
success: boolean;
|
||||
}
|
||||
|
||||
export interface EMIncomingMessageMatterCommissionFinish extends EMMessage {
|
||||
id: number;
|
||||
type: "command";
|
||||
command: "matter/commission/finish";
|
||||
payload: MatterCommissionFinish;
|
||||
}
|
||||
|
||||
export type EMIncomingMessageCommands =
|
||||
| EMIncomingMessageRestart
|
||||
| EMIncomingMessageNavigate
|
||||
@@ -343,7 +331,6 @@ export type EMIncomingMessageCommands =
|
||||
| EMIncomingMessageBarCodeScanAborted
|
||||
| EMIncomingMessageImprovDeviceDiscovered
|
||||
| EMIncomingMessageImprovDeviceSetupDone
|
||||
| EMIncomingMessageMatterCommissionFinish
|
||||
| EMIncomingMessageKioskModeSet;
|
||||
|
||||
type EMIncomingMessage =
|
||||
@@ -359,7 +346,6 @@ export interface ExternalConfig {
|
||||
canWriteTag?: boolean;
|
||||
hasExoPlayer?: boolean;
|
||||
canCommissionMatter?: boolean;
|
||||
hasMatterStatusReport?: boolean;
|
||||
canImportThreadCredentials?: boolean;
|
||||
canTransferThreadCredentialsToKeychain?: boolean;
|
||||
hasAssist?: boolean;
|
||||
|
||||
+1
-62
@@ -2,7 +2,6 @@ import type { UnsubscribeFunc } from "home-assistant-js-websocket";
|
||||
import { css, html, LitElement, nothing } from "lit";
|
||||
import { customElement, property, state } from "lit/decorators";
|
||||
import { dynamicElement } from "../../../../../common/dom/dynamic-element-directive";
|
||||
import type { HASSDomEvent } from "../../../../../common/dom/fire_event";
|
||||
import { fireEvent } from "../../../../../common/dom/fire_event";
|
||||
import { computeDomain } from "../../../../../common/entity/compute_domain";
|
||||
import { computeDeviceName } from "../../../../../common/entity/compute_device_name";
|
||||
@@ -11,7 +10,6 @@ import "../../../../../components/ha-dialog-footer";
|
||||
import "../../../../../components/ha-icon-button-arrow-prev";
|
||||
import "../../../../../components/ha-button";
|
||||
import "../../../../../components/ha-dialog";
|
||||
import type { MatterCommissionFinish } from "../../../../../external_app/external_messaging";
|
||||
import {
|
||||
commissionMatterDevice,
|
||||
watchForNewMatterDevice,
|
||||
@@ -84,10 +82,6 @@ class DialogMatterAddDevice extends LitElement {
|
||||
|
||||
@state() private _mainEntity?: ExtEntityRegistryEntry;
|
||||
|
||||
@state() private _proposedDeviceName?: string;
|
||||
|
||||
@state() private _commissioningFinished = false;
|
||||
|
||||
@state() private _deviceAddedState: {
|
||||
name: string;
|
||||
area: string | undefined;
|
||||
@@ -110,63 +104,15 @@ class DialogMatterAddDevice extends LitElement {
|
||||
// make sure a refresh of the page will navigate to the device page, old iOS apps will refresh the webview when commissioning is done
|
||||
setRefreshUrl(`/config/devices/device/${device.id}`);
|
||||
this._newDevice = device;
|
||||
this._step = "device_added";
|
||||
this._fetchMainEntity();
|
||||
this._maybeShowDeviceAdded();
|
||||
});
|
||||
if (this._waitForCommissioningFinish) {
|
||||
window.addEventListener(
|
||||
"matter-commission-finish",
|
||||
this._handleCommissionFinish
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
public closeDialog(): void {
|
||||
this._open = false;
|
||||
}
|
||||
|
||||
private get _waitForCommissioningFinish(): boolean {
|
||||
// When the app supports reporting Matter commissioning status, defer
|
||||
// advancing past the spinner until we receive matter/commission/finish.
|
||||
return !!this.hass.auth.external?.config.hasMatterStatusReport;
|
||||
}
|
||||
|
||||
private _maybeShowDeviceAdded(): void {
|
||||
if (!this._newDevice) {
|
||||
return;
|
||||
}
|
||||
if (this._waitForCommissioningFinish && !this._commissioningFinished) {
|
||||
return;
|
||||
}
|
||||
this._step = "device_added";
|
||||
}
|
||||
|
||||
private _handleCommissionFinish = (
|
||||
ev: HASSDomEvent<MatterCommissionFinish>
|
||||
) => {
|
||||
const { name, success } = ev.detail;
|
||||
if (!success) {
|
||||
if (this._newDevice) {
|
||||
// Device already showed up in the registry — ignore the failure signal
|
||||
// and let the user finish the rename flow.
|
||||
return;
|
||||
}
|
||||
showToast(this, {
|
||||
message: this.hass.localize(
|
||||
"ui.dialogs.matter-add-device.add_device_failed"
|
||||
),
|
||||
duration: 2000,
|
||||
});
|
||||
this.closeDialog();
|
||||
return;
|
||||
}
|
||||
this._commissioningFinished = true;
|
||||
if (name) {
|
||||
this._proposedDeviceName = name;
|
||||
}
|
||||
this._maybeShowDeviceAdded();
|
||||
};
|
||||
|
||||
protected updated(changedProps: Map<string, unknown>): void {
|
||||
// Retry fetching main entity when hass updates (entities may not be available immediately)
|
||||
if (
|
||||
@@ -214,8 +160,6 @@ class DialogMatterAddDevice extends LitElement {
|
||||
this._newDevice = undefined;
|
||||
this._mainEntity = undefined;
|
||||
this._mainEntityFetched = false;
|
||||
this._proposedDeviceName = undefined;
|
||||
this._commissioningFinished = false;
|
||||
this._deviceAddedState = {
|
||||
name: "",
|
||||
area: undefined,
|
||||
@@ -224,10 +168,6 @@ class DialogMatterAddDevice extends LitElement {
|
||||
};
|
||||
this._unsub?.();
|
||||
this._unsub = undefined;
|
||||
window.removeEventListener(
|
||||
"matter-commission-finish",
|
||||
this._handleCommissionFinish
|
||||
);
|
||||
fireEvent(this, "dialog-closed", { dialog: this.localName });
|
||||
}
|
||||
|
||||
@@ -271,7 +211,6 @@ class DialogMatterAddDevice extends LitElement {
|
||||
hass: this.hass,
|
||||
device: this._newDevice,
|
||||
mainEntity: this._mainEntity,
|
||||
proposedName: this._proposedDeviceName,
|
||||
}
|
||||
)}
|
||||
</div>
|
||||
|
||||
+2
-16
@@ -36,8 +36,6 @@ class MatterAddDeviceDeviceAdded extends LitElement {
|
||||
|
||||
@property({ attribute: false }) public mainEntity?: ExtEntityRegistryEntry;
|
||||
|
||||
@property({ attribute: false }) public proposedName?: string;
|
||||
|
||||
@state() private _deviceName = "";
|
||||
|
||||
@state() private _area: string | undefined;
|
||||
@@ -51,18 +49,8 @@ class MatterAddDeviceDeviceAdded extends LitElement {
|
||||
protected willUpdate(changedProps: PropertyValues) {
|
||||
if (!this._initialized && this.device) {
|
||||
this._initialized = true;
|
||||
this._deviceName =
|
||||
this.proposedName || (computeDeviceName(this.device) ?? "");
|
||||
this._deviceName = computeDeviceName(this.device) ?? "";
|
||||
this._area = this.device.area_id ?? undefined;
|
||||
} else if (
|
||||
changedProps.has("proposedName") &&
|
||||
this.proposedName &&
|
||||
this.device &&
|
||||
this._deviceName === (computeDeviceName(this.device) ?? "")
|
||||
) {
|
||||
// proposedName arrived after we initialized, and the user hasn't
|
||||
// changed the name yet — adopt it
|
||||
this._deviceName = this.proposedName;
|
||||
}
|
||||
if (
|
||||
!this._deviceClassInitialized &&
|
||||
@@ -170,9 +158,7 @@ class MatterAddDeviceDeviceAdded extends LitElement {
|
||||
referrerpolicy="no-referrer"
|
||||
/>
|
||||
<div class="device-name">
|
||||
<span
|
||||
>${this.proposedName || computeDeviceName(this.device)}</span
|
||||
>
|
||||
<span>${computeDeviceName(this.device)}</span>
|
||||
<span class="secondary">Matter</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -15,6 +15,7 @@ import { isComponentLoaded } from "../../../common/config/is_component_loaded";
|
||||
import { computeDomain } from "../../../common/entity/compute_domain";
|
||||
import { computeStateDomain } from "../../../common/entity/compute_state_domain";
|
||||
import { computeStateName } from "../../../common/entity/compute_state_name";
|
||||
import { getEntityLocation } from "../../../common/entity/get_entity_location";
|
||||
import { deepEqual } from "../../../common/util/deep-equal";
|
||||
import parseAspectRatio from "../../../common/util/parse-aspect-ratio";
|
||||
import "../../../components/ha-alert";
|
||||
@@ -90,10 +91,7 @@ class HuiMapCard extends LitElement implements LovelaceCard {
|
||||
const personSources = new Set<string>();
|
||||
const locationEntities: string[] = [];
|
||||
Object.values(hass.states).forEach((entity) => {
|
||||
if (
|
||||
!("latitude" in entity.attributes) ||
|
||||
!("longitude" in entity.attributes)
|
||||
) {
|
||||
if (!getEntityLocation(entity, hass.states)) {
|
||||
return;
|
||||
}
|
||||
locationEntities.push(entity.entity_id);
|
||||
|
||||
@@ -16,10 +16,11 @@ import {
|
||||
union,
|
||||
} from "superstruct";
|
||||
import { ContextProvider } from "@lit/context";
|
||||
import type { HassEntity } from "home-assistant-js-websocket";
|
||||
import type { HASSDomEvent } from "../../../../common/dom/fire_event";
|
||||
import { fireEvent } from "../../../../common/dom/fire_event";
|
||||
import { computeDomain } from "../../../../common/entity/compute_domain";
|
||||
import { hasLocation } from "../../../../common/entity/has_location";
|
||||
import { getEntityLocation } from "../../../../common/entity/get_entity_location";
|
||||
import type { LocalizeFunc } from "../../../../common/translations/localize";
|
||||
import { orderProperties } from "../../../../common/util/order-properties";
|
||||
import "../../../../components/ha-form/ha-form";
|
||||
@@ -275,10 +276,13 @@ export class HuiMapCardEditor extends LitElement implements LovelaceCardEditor {
|
||||
this._locationEntities = !this.hass
|
||||
? []
|
||||
: Object.keys(this.hass!.states).filter((entity_id) =>
|
||||
hasLocation(this.hass!.states[entity_id])
|
||||
getEntityLocation(this.hass!.states[entity_id], this.hass!.states)
|
||||
);
|
||||
}
|
||||
|
||||
private _entityHasLocation = (stateObj: HassEntity) =>
|
||||
!!getEntityLocation(stateObj, this.hass!.states);
|
||||
|
||||
protected render() {
|
||||
if (!this.hass || !this._config) {
|
||||
return nothing;
|
||||
@@ -320,7 +324,7 @@ export class HuiMapCardEditor extends LitElement implements LovelaceCardEditor {
|
||||
<hui-entity-editor
|
||||
.hass=${this.hass}
|
||||
.entities=${configEntities}
|
||||
.entityFilter=${hasLocation}
|
||||
.entityFilter=${this._entityHasLocation}
|
||||
can-edit
|
||||
.required=${!this._config.show_all}
|
||||
@entities-changed=${this._entitiesValueChanged}
|
||||
|
||||
+39
-35
@@ -11,6 +11,11 @@ import type {
|
||||
MediaPlayerSoundModeCardFeatureConfig,
|
||||
} from "../../card-features/types";
|
||||
import type { LovelaceCardFeatureEditor } from "../../types";
|
||||
import {
|
||||
customizableListData,
|
||||
customizableListSchema,
|
||||
processCustomizableListValue,
|
||||
} from "./customizable-list-feature";
|
||||
|
||||
@customElement("hui-media-player-sound-mode-card-feature-editor")
|
||||
export class HuiMediaPlayerSoundModeCardFeatureEditor
|
||||
@@ -28,28 +33,20 @@ export class HuiMediaPlayerSoundModeCardFeatureEditor
|
||||
}
|
||||
|
||||
private _schema = memoizeOne(
|
||||
(hass: HomeAssistant, stateObj?: MediaPlayerEntity) =>
|
||||
[
|
||||
{
|
||||
name: "sound_modes",
|
||||
selector: {
|
||||
select: {
|
||||
multiple: true,
|
||||
mode: "list" as const,
|
||||
reorder: true,
|
||||
options:
|
||||
stateObj?.attributes.sound_mode_list?.map((mode) => ({
|
||||
value: mode,
|
||||
label: hass.formatEntityAttributeValue(
|
||||
stateObj,
|
||||
"sound_mode",
|
||||
mode
|
||||
),
|
||||
})) ?? [],
|
||||
},
|
||||
},
|
||||
},
|
||||
] as const
|
||||
(stateObj: MediaPlayerEntity | undefined, customize: boolean) =>
|
||||
customizableListSchema({
|
||||
field: "sound_modes",
|
||||
customize,
|
||||
options:
|
||||
stateObj?.attributes.sound_mode_list?.map((mode) => ({
|
||||
value: mode,
|
||||
label: this.hass!.formatEntityAttributeValue(
|
||||
stateObj,
|
||||
"sound_mode",
|
||||
mode
|
||||
),
|
||||
})) ?? [],
|
||||
})
|
||||
);
|
||||
|
||||
protected render() {
|
||||
@@ -63,12 +60,13 @@ export class HuiMediaPlayerSoundModeCardFeatureEditor
|
||||
| undefined)
|
||||
: undefined;
|
||||
|
||||
const schema = this._schema(this.hass!, stateObj);
|
||||
const data = customizableListData(this._config, "sound_modes");
|
||||
const schema = this._schema(stateObj, data.customize);
|
||||
|
||||
return html`
|
||||
<ha-form
|
||||
.hass=${this.hass}
|
||||
.data=${this._config}
|
||||
.data=${data}
|
||||
.schema=${schema}
|
||||
.computeLabel=${this._computeLabelCallback}
|
||||
@value-changed=${this._valueChanged}
|
||||
@@ -79,21 +77,27 @@ export class HuiMediaPlayerSoundModeCardFeatureEditor
|
||||
private _valueChanged(
|
||||
ev: ValueChangedEvent<MediaPlayerSoundModeCardFeatureConfig>
|
||||
): void {
|
||||
fireEvent(this, "config-changed", { config: ev.detail.value });
|
||||
const stateObj = this.context?.entity_id
|
||||
? (this.hass!.states[this.context.entity_id] as
|
||||
| MediaPlayerEntity
|
||||
| undefined)
|
||||
: undefined;
|
||||
const defaults = stateObj?.attributes.sound_mode_list ?? [];
|
||||
const config =
|
||||
processCustomizableListValue<MediaPlayerSoundModeCardFeatureConfig>(
|
||||
ev.detail.value,
|
||||
"sound_modes",
|
||||
defaults
|
||||
);
|
||||
fireEvent(this, "config-changed", { config });
|
||||
}
|
||||
|
||||
private _computeLabelCallback = (
|
||||
schema: SchemaUnion<ReturnType<typeof this._schema>>
|
||||
) => {
|
||||
switch (schema.name) {
|
||||
case "sound_modes":
|
||||
return this.hass?.localize(
|
||||
`ui.panel.lovelace.editor.features.types.media-player-sound-mode.${schema.name}`
|
||||
);
|
||||
default:
|
||||
return "";
|
||||
}
|
||||
};
|
||||
) =>
|
||||
this.hass!.localize(
|
||||
`ui.panel.lovelace.editor.features.types.media-player-sound-mode.${schema.name}`
|
||||
);
|
||||
}
|
||||
|
||||
declare global {
|
||||
|
||||
+39
-31
@@ -11,6 +11,11 @@ import type {
|
||||
MediaPlayerSourceCardFeatureConfig,
|
||||
} from "../../card-features/types";
|
||||
import type { LovelaceCardFeatureEditor } from "../../types";
|
||||
import {
|
||||
customizableListData,
|
||||
customizableListSchema,
|
||||
processCustomizableListValue,
|
||||
} from "./customizable-list-feature";
|
||||
|
||||
@customElement("hui-media-player-source-card-feature-editor")
|
||||
export class HuiMediaPlayerSourceCardFeatureEditor
|
||||
@@ -28,24 +33,20 @@ export class HuiMediaPlayerSourceCardFeatureEditor
|
||||
}
|
||||
|
||||
private _schema = memoizeOne(
|
||||
(stateObj?: MediaPlayerEntity) =>
|
||||
[
|
||||
{
|
||||
name: "sources",
|
||||
selector: {
|
||||
select: {
|
||||
multiple: true,
|
||||
mode: "list" as const,
|
||||
reorder: true,
|
||||
options:
|
||||
stateObj?.attributes.source_list?.map((source) => ({
|
||||
value: source,
|
||||
label: source,
|
||||
})) ?? [],
|
||||
},
|
||||
},
|
||||
},
|
||||
] as const
|
||||
(stateObj: MediaPlayerEntity | undefined, customize: boolean) =>
|
||||
customizableListSchema({
|
||||
field: "sources",
|
||||
customize,
|
||||
options:
|
||||
stateObj?.attributes.source_list?.map((source) => ({
|
||||
value: source,
|
||||
label: this.hass!.formatEntityAttributeValue(
|
||||
stateObj,
|
||||
"source",
|
||||
source
|
||||
),
|
||||
})) ?? [],
|
||||
})
|
||||
);
|
||||
|
||||
protected render() {
|
||||
@@ -59,12 +60,13 @@ export class HuiMediaPlayerSourceCardFeatureEditor
|
||||
| undefined)
|
||||
: undefined;
|
||||
|
||||
const schema = this._schema(stateObj);
|
||||
const data = customizableListData(this._config, "sources");
|
||||
const schema = this._schema(stateObj, data.customize);
|
||||
|
||||
return html`
|
||||
<ha-form
|
||||
.hass=${this.hass}
|
||||
.data=${this._config}
|
||||
.data=${data}
|
||||
.schema=${schema}
|
||||
.computeLabel=${this._computeLabelCallback}
|
||||
@value-changed=${this._valueChanged}
|
||||
@@ -75,21 +77,27 @@ export class HuiMediaPlayerSourceCardFeatureEditor
|
||||
private _valueChanged(
|
||||
ev: ValueChangedEvent<MediaPlayerSourceCardFeatureConfig>
|
||||
): void {
|
||||
fireEvent(this, "config-changed", { config: ev.detail.value });
|
||||
const stateObj = this.context?.entity_id
|
||||
? (this.hass!.states[this.context.entity_id] as
|
||||
| MediaPlayerEntity
|
||||
| undefined)
|
||||
: undefined;
|
||||
const defaults = stateObj?.attributes.source_list ?? [];
|
||||
const config =
|
||||
processCustomizableListValue<MediaPlayerSourceCardFeatureConfig>(
|
||||
ev.detail.value,
|
||||
"sources",
|
||||
defaults
|
||||
);
|
||||
fireEvent(this, "config-changed", { config });
|
||||
}
|
||||
|
||||
private _computeLabelCallback = (
|
||||
schema: SchemaUnion<ReturnType<typeof this._schema>>
|
||||
) => {
|
||||
switch (schema.name) {
|
||||
case "sources":
|
||||
return this.hass?.localize(
|
||||
`ui.panel.lovelace.editor.features.types.media-player-source.${schema.name}`
|
||||
);
|
||||
default:
|
||||
return "";
|
||||
}
|
||||
};
|
||||
) =>
|
||||
this.hass!.localize(
|
||||
`ui.panel.lovelace.editor.features.types.media-player-source.${schema.name}`
|
||||
);
|
||||
}
|
||||
|
||||
declare global {
|
||||
|
||||
@@ -3,6 +3,7 @@ import type { CSSResultGroup, PropertyValues } from "lit";
|
||||
import { css, html, LitElement } from "lit";
|
||||
import { customElement, property } from "lit/decorators";
|
||||
import { computeStateDomain } from "../../common/entity/compute_state_domain";
|
||||
import { getEntityLocation } from "../../common/entity/get_entity_location";
|
||||
import { navigate } from "../../common/navigate";
|
||||
import "../../components/ha-icon-button";
|
||||
import "../../components/ha-menu-button";
|
||||
@@ -64,11 +65,10 @@ class HaPanelMap extends LitElement {
|
||||
const personSources = new Set<string>();
|
||||
const locationEntities: string[] = [];
|
||||
Object.values(this.hass!.states).forEach((entity) => {
|
||||
if (
|
||||
entity.state === "home" ||
|
||||
!("latitude" in entity.attributes) ||
|
||||
!("longitude" in entity.attributes)
|
||||
) {
|
||||
if (entity.state === "home") {
|
||||
return;
|
||||
}
|
||||
if (!getEntityLocation(entity, this.hass!.states)) {
|
||||
return;
|
||||
}
|
||||
locationEntities.push(entity.entity_id);
|
||||
|
||||
@@ -10149,11 +10149,13 @@
|
||||
},
|
||||
"media-player-sound-mode": {
|
||||
"label": "Media player sound mode",
|
||||
"sound_modes": "Sound modes"
|
||||
"sound_modes": "Sound modes",
|
||||
"customize": "Customize sound modes"
|
||||
},
|
||||
"media-player-source": {
|
||||
"label": "Media player source",
|
||||
"sources": "Sources"
|
||||
"sources": "Sources",
|
||||
"customize": "Customize sources"
|
||||
},
|
||||
"media-player-volume-buttons": {
|
||||
"label": "Media player volume buttons",
|
||||
|
||||
@@ -4041,161 +4041,161 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@tsparticles/basic@npm:4.1.1":
|
||||
version: 4.1.1
|
||||
resolution: "@tsparticles/basic@npm:4.1.1"
|
||||
"@tsparticles/basic@npm:4.1.2":
|
||||
version: 4.1.2
|
||||
resolution: "@tsparticles/basic@npm:4.1.2"
|
||||
dependencies:
|
||||
"@tsparticles/engine": "npm:4.1.1"
|
||||
"@tsparticles/plugin-blend": "npm:4.1.1"
|
||||
"@tsparticles/plugin-hex-color": "npm:4.1.1"
|
||||
"@tsparticles/plugin-hsl-color": "npm:4.1.1"
|
||||
"@tsparticles/plugin-move": "npm:4.1.1"
|
||||
"@tsparticles/plugin-rgb-color": "npm:4.1.1"
|
||||
"@tsparticles/shape-circle": "npm:4.1.1"
|
||||
"@tsparticles/updater-opacity": "npm:4.1.1"
|
||||
"@tsparticles/updater-out-modes": "npm:4.1.1"
|
||||
"@tsparticles/updater-paint": "npm:4.1.1"
|
||||
"@tsparticles/updater-size": "npm:4.1.1"
|
||||
checksum: 10/99191aeee4b9a3856aa82a2cea21e54d2099b6d58b4af3bacf4bb133277bd71de16ac07fe632ebabe08cc2a06be1aa6c00d82d593027276bf588870afc9182f5
|
||||
"@tsparticles/engine": "npm:4.1.2"
|
||||
"@tsparticles/plugin-blend": "npm:4.1.2"
|
||||
"@tsparticles/plugin-hex-color": "npm:4.1.2"
|
||||
"@tsparticles/plugin-hsl-color": "npm:4.1.2"
|
||||
"@tsparticles/plugin-move": "npm:4.1.2"
|
||||
"@tsparticles/plugin-rgb-color": "npm:4.1.2"
|
||||
"@tsparticles/shape-circle": "npm:4.1.2"
|
||||
"@tsparticles/updater-opacity": "npm:4.1.2"
|
||||
"@tsparticles/updater-out-modes": "npm:4.1.2"
|
||||
"@tsparticles/updater-paint": "npm:4.1.2"
|
||||
"@tsparticles/updater-size": "npm:4.1.2"
|
||||
checksum: 10/1c145d25373562cd3b45f20664610226c050a0a6867396c2d138a76761d3e7a5796cf107d8bdcbb8eb8cca19a3a1e4192eb356d37387d6547bf6b1ff796b71b2
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@tsparticles/canvas-utils@npm:4.1.1":
|
||||
version: 4.1.1
|
||||
resolution: "@tsparticles/canvas-utils@npm:4.1.1"
|
||||
"@tsparticles/canvas-utils@npm:4.1.2":
|
||||
version: 4.1.2
|
||||
resolution: "@tsparticles/canvas-utils@npm:4.1.2"
|
||||
peerDependencies:
|
||||
"@tsparticles/engine": 4.1.1
|
||||
checksum: 10/2b5d7e9a55aa8086007f2dff940800c650233751ebb708fdbf9f91be4b0cd9d975400da42cdf531bb74860974dff5ea3c76199520ccd3f089904fba0d1bc0722
|
||||
"@tsparticles/engine": 4.1.2
|
||||
checksum: 10/ffedc8400b5ff758331bdf1ef2362aac713c3e41d5bcece00153acc04c725947c41d545202d73bd6ef290d2ec220353f1801fb4ad22e99870989b0c68d7540c4
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@tsparticles/engine@npm:4.1.1":
|
||||
version: 4.1.1
|
||||
resolution: "@tsparticles/engine@npm:4.1.1"
|
||||
checksum: 10/74886de63046f8752515f097176cae2fa8d506fd9d2d6a84106d43a89ff688e047d99a5018e56e3fffc17d5d13a9061f63fafcb2b4ebe773f78379621d0d9855
|
||||
"@tsparticles/engine@npm:4.1.2":
|
||||
version: 4.1.2
|
||||
resolution: "@tsparticles/engine@npm:4.1.2"
|
||||
checksum: 10/6fe6aa50bba564a8a8691945cb378267e695ec58323066a4157e8a036e7a3caa99e1ced08d05bffd173045bbc33c4d41523afc28624b1bea015393c1a88ef2bb
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@tsparticles/interaction-particles-links@npm:4.1.1":
|
||||
version: 4.1.1
|
||||
resolution: "@tsparticles/interaction-particles-links@npm:4.1.1"
|
||||
"@tsparticles/interaction-particles-links@npm:4.1.2":
|
||||
version: 4.1.2
|
||||
resolution: "@tsparticles/interaction-particles-links@npm:4.1.2"
|
||||
dependencies:
|
||||
"@tsparticles/canvas-utils": "npm:4.1.1"
|
||||
"@tsparticles/canvas-utils": "npm:4.1.2"
|
||||
peerDependencies:
|
||||
"@tsparticles/engine": 4.1.1
|
||||
"@tsparticles/plugin-interactivity": 4.1.1
|
||||
checksum: 10/c0c7ad3740f2168b75ca7ae09341fefcc1d8c8d117fbee7a6519a622843dfe5d57bb65113a4eba40f26906904f069cbac196840f45fc7be12864fddfa8106184
|
||||
"@tsparticles/engine": 4.1.2
|
||||
"@tsparticles/plugin-interactivity": 4.1.2
|
||||
checksum: 10/b9e1e85bdb3226a25d7a4486556abfe458c81c109855c04857623d2d3506ef325fcc2dc4fcee962414e216aa6346bc0849df1bf7199a3e4e75bed2fb7f069702
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@tsparticles/plugin-blend@npm:4.1.1":
|
||||
version: 4.1.1
|
||||
resolution: "@tsparticles/plugin-blend@npm:4.1.1"
|
||||
"@tsparticles/plugin-blend@npm:4.1.2":
|
||||
version: 4.1.2
|
||||
resolution: "@tsparticles/plugin-blend@npm:4.1.2"
|
||||
peerDependencies:
|
||||
"@tsparticles/engine": 4.1.1
|
||||
checksum: 10/9a666dc1fe0ed9ff4743fc23ca3bf27bd5d66073cc0127203b566077d431321b61af440875e96c87950e18011b1e6b9b43d328e4200923dd4be9fd934c07a5cd
|
||||
"@tsparticles/engine": 4.1.2
|
||||
checksum: 10/1f51bcf76d6d749a0a18799fd3a814a82e62f060fd3c20d28f8bb170311815aeba8efc361e73cef7356c51151c7debafc75d34bff6ab2d4e58099b51774a28c6
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@tsparticles/plugin-hex-color@npm:4.1.1":
|
||||
version: 4.1.1
|
||||
resolution: "@tsparticles/plugin-hex-color@npm:4.1.1"
|
||||
"@tsparticles/plugin-hex-color@npm:4.1.2":
|
||||
version: 4.1.2
|
||||
resolution: "@tsparticles/plugin-hex-color@npm:4.1.2"
|
||||
peerDependencies:
|
||||
"@tsparticles/engine": 4.1.1
|
||||
checksum: 10/33fde7c2763affb1dd7fa033431a2553646bde79c9ab52106be6226a9716ae973c90c8b4bf381d96f661ab75467934019cd456fe27ccac59dca11b5c989c3a75
|
||||
"@tsparticles/engine": 4.1.2
|
||||
checksum: 10/d32a39bbd6732b9e630f84a7d226753735f02d65b70a1d5d11fa680421d5f1378aee75af1ecb5ada5af9875822bbaf2b5d1f213d1e0cbce2a50820743eb9c2fc
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@tsparticles/plugin-hsl-color@npm:4.1.1":
|
||||
version: 4.1.1
|
||||
resolution: "@tsparticles/plugin-hsl-color@npm:4.1.1"
|
||||
"@tsparticles/plugin-hsl-color@npm:4.1.2":
|
||||
version: 4.1.2
|
||||
resolution: "@tsparticles/plugin-hsl-color@npm:4.1.2"
|
||||
peerDependencies:
|
||||
"@tsparticles/engine": 4.1.1
|
||||
checksum: 10/594f4a840f6f6f134a11d76c1a7fa80ed60a5d945534aad53e8ab5718341187f0fac73eb45d1c39246b98e982f1d60f9dbb95a083edcf8407e015048056b84e7
|
||||
"@tsparticles/engine": 4.1.2
|
||||
checksum: 10/c130e80b0fd2750402fa0e309d0bb624b2138474069ae4ccb76610722c4f0966f278ad1a35c85fbcf5449914936f1c53322246f1cdd028106d83f779beee538c
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@tsparticles/plugin-interactivity@npm:4.1.1":
|
||||
version: 4.1.1
|
||||
resolution: "@tsparticles/plugin-interactivity@npm:4.1.1"
|
||||
"@tsparticles/plugin-interactivity@npm:4.1.2":
|
||||
version: 4.1.2
|
||||
resolution: "@tsparticles/plugin-interactivity@npm:4.1.2"
|
||||
peerDependencies:
|
||||
"@tsparticles/engine": 4.1.1
|
||||
checksum: 10/448bd8f7c741ed0359ace49a6c58d58947d95660158a131c86c248427b9caa41645c6e8c9cea6a8f0f6a70cd25c0dd64017edba79c8f225b6db07f39b660eb4d
|
||||
"@tsparticles/engine": 4.1.2
|
||||
checksum: 10/78efd4ffe3a07752f26262fe27ee0a931b45fea6c81d62e156d8f965dc22a2141d64395eb99477624ca9aac9e152f9e2585fc8aced9c822c61cb22ecfad184a4
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@tsparticles/plugin-move@npm:4.1.1":
|
||||
version: 4.1.1
|
||||
resolution: "@tsparticles/plugin-move@npm:4.1.1"
|
||||
"@tsparticles/plugin-move@npm:4.1.2":
|
||||
version: 4.1.2
|
||||
resolution: "@tsparticles/plugin-move@npm:4.1.2"
|
||||
peerDependencies:
|
||||
"@tsparticles/engine": 4.1.1
|
||||
checksum: 10/b854cb6e2dcea2971f1abaca75c6e8cde40611178f13513559f60cc45da568e8b61c2f027619041d94e11c60af08a76eb4957d344a910b7a6255265937199094
|
||||
"@tsparticles/engine": 4.1.2
|
||||
checksum: 10/fac5b90904d3fa62b310a1ce19647c5ae4a592111b5eeccfc6e946c6d17d677b0f3931ba3c114f04045827a92c1a0ed66791e99b352cb75d6c50f3749f389bfc
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@tsparticles/plugin-rgb-color@npm:4.1.1":
|
||||
version: 4.1.1
|
||||
resolution: "@tsparticles/plugin-rgb-color@npm:4.1.1"
|
||||
"@tsparticles/plugin-rgb-color@npm:4.1.2":
|
||||
version: 4.1.2
|
||||
resolution: "@tsparticles/plugin-rgb-color@npm:4.1.2"
|
||||
peerDependencies:
|
||||
"@tsparticles/engine": 4.1.1
|
||||
checksum: 10/2372dfe5ceec163b49c02b3b0169e6032fae34e4ade3c29d42bd26af23fac76b3416d70eed9cac9a0f2b470c763ee903d12d0e9156b7693b3c8908e25714cf76
|
||||
"@tsparticles/engine": 4.1.2
|
||||
checksum: 10/7e3e83171f74f7e9e3f68ce8d0aeb4685b277ecac3c4874a951e86228d3db78978d6197ef9e04b17190471294323c561c18c92c9d9ae8e8a115e6238cbecdb43
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@tsparticles/preset-links@npm:4.1.1":
|
||||
version: 4.1.1
|
||||
resolution: "@tsparticles/preset-links@npm:4.1.1"
|
||||
"@tsparticles/preset-links@npm:4.1.2":
|
||||
version: 4.1.2
|
||||
resolution: "@tsparticles/preset-links@npm:4.1.2"
|
||||
dependencies:
|
||||
"@tsparticles/basic": "npm:4.1.1"
|
||||
"@tsparticles/engine": "npm:4.1.1"
|
||||
"@tsparticles/interaction-particles-links": "npm:4.1.1"
|
||||
"@tsparticles/plugin-interactivity": "npm:4.1.1"
|
||||
checksum: 10/26dd1dcd4ede3bae32cae3585a7f929e0089a75e389f83cb5b00213e977b647c3e7e743b5e83d3a5400beffcff9343bde7538412579708bad761d2e933708638
|
||||
"@tsparticles/basic": "npm:4.1.2"
|
||||
"@tsparticles/engine": "npm:4.1.2"
|
||||
"@tsparticles/interaction-particles-links": "npm:4.1.2"
|
||||
"@tsparticles/plugin-interactivity": "npm:4.1.2"
|
||||
checksum: 10/d907884c4e9fd023aa8e0e1ff2388ef24d06a446433cc4ffbd620a4d22801f52ce97fe5f441b9fdea854f36d6f421d7571648925e5ea5c0976c121194156a2b1
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@tsparticles/shape-circle@npm:4.1.1":
|
||||
version: 4.1.1
|
||||
resolution: "@tsparticles/shape-circle@npm:4.1.1"
|
||||
"@tsparticles/shape-circle@npm:4.1.2":
|
||||
version: 4.1.2
|
||||
resolution: "@tsparticles/shape-circle@npm:4.1.2"
|
||||
peerDependencies:
|
||||
"@tsparticles/engine": 4.1.1
|
||||
checksum: 10/401e8a267cf9301dae8386e9bb1c5ff3a02dfb5b5f136187c73ed6b89e33f176f929fdc53acaa60b13f3ee1ed7f8c6f35f3f0e26ff6930a33d1949a0f23e4c1f
|
||||
"@tsparticles/engine": 4.1.2
|
||||
checksum: 10/60a87755d4e598c278c1850b58b07bcfbef603de242de3979702cd8120cf24fd95d985b2092c7a8a2cccd43eb6a1939ab215f74a93898ea1e2d425be5deb405c
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@tsparticles/updater-opacity@npm:4.1.1":
|
||||
version: 4.1.1
|
||||
resolution: "@tsparticles/updater-opacity@npm:4.1.1"
|
||||
"@tsparticles/updater-opacity@npm:4.1.2":
|
||||
version: 4.1.2
|
||||
resolution: "@tsparticles/updater-opacity@npm:4.1.2"
|
||||
peerDependencies:
|
||||
"@tsparticles/engine": 4.1.1
|
||||
checksum: 10/3fe157203e02dfec1ef9ac693d517cd9abcad8c28acaac8d4ca923b8301a99ae73129ed4559ea507c0d7d6ad626bdbbdb03f25868d7d28f852e2d8ffc7d13790
|
||||
"@tsparticles/engine": 4.1.2
|
||||
checksum: 10/4dc426175bb3e4c5d3bc35e7d83ace7130c4f8817c7f88ee6bf1b4b1a52b28511d99b1fc7ded3c549a5baae401f7c22cc701d83919694387154aef86ea6974c2
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@tsparticles/updater-out-modes@npm:4.1.1":
|
||||
version: 4.1.1
|
||||
resolution: "@tsparticles/updater-out-modes@npm:4.1.1"
|
||||
"@tsparticles/updater-out-modes@npm:4.1.2":
|
||||
version: 4.1.2
|
||||
resolution: "@tsparticles/updater-out-modes@npm:4.1.2"
|
||||
peerDependencies:
|
||||
"@tsparticles/engine": 4.1.1
|
||||
checksum: 10/bc5f074661c42acc20a87ee3ff093fe63d2fd87a7f7d3156c2fb23dc1d24881ccc9e9cb82313ff7265317fcdc447a5b17b2204930faf8ba627278e2dc0fab2c3
|
||||
"@tsparticles/engine": 4.1.2
|
||||
checksum: 10/901be7b7dfa97d3d4ff857715a6b61dd4bc2ca09f23fee38d86cd6827351134c5cd4c3fa702d2aec8601544b1f6935f2b4034c4567a00128f9cf36cbaf379722
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@tsparticles/updater-paint@npm:4.1.1":
|
||||
version: 4.1.1
|
||||
resolution: "@tsparticles/updater-paint@npm:4.1.1"
|
||||
"@tsparticles/updater-paint@npm:4.1.2":
|
||||
version: 4.1.2
|
||||
resolution: "@tsparticles/updater-paint@npm:4.1.2"
|
||||
peerDependencies:
|
||||
"@tsparticles/engine": 4.1.1
|
||||
checksum: 10/77459f6337b869d654573696dbe2bc1d238ddf3410857d8b91df606f7402301acae34f4a334727faa552f9816f518353b7a98e0bda4854ea5419cb34e8d447d2
|
||||
"@tsparticles/engine": 4.1.2
|
||||
checksum: 10/5a0b4bc0a4c6061e1eb93a6af7a97b472e5d552677dafe8c888b0f9a71b68ed10ef255d86f2cf8d8466ecd1d33ba8f5e52920947237fe1218cbcd002c50dff47
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@tsparticles/updater-size@npm:4.1.1":
|
||||
version: 4.1.1
|
||||
resolution: "@tsparticles/updater-size@npm:4.1.1"
|
||||
"@tsparticles/updater-size@npm:4.1.2":
|
||||
version: 4.1.2
|
||||
resolution: "@tsparticles/updater-size@npm:4.1.2"
|
||||
peerDependencies:
|
||||
"@tsparticles/engine": 4.1.1
|
||||
checksum: 10/33ae9d51394e299459478a9dedd369de1bd266ad9c2e2236ec2c20bb455aad9118efa13afc7d359b6d7d010a34bba5b60cbf2e3d8b853e124c0b53c2aae8db18
|
||||
"@tsparticles/engine": 4.1.2
|
||||
checksum: 10/d5c4f79d5c1d3d977dd5ebac56c9679df134ddba919b8e2ee1473820f2c551f5b162356b49b22e6e54134b87a27c51cb5a6c2e2441ba2569b0dab62974e91a47
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -8487,8 +8487,8 @@ __metadata:
|
||||
"@rspack/dev-server": "npm:2.0.3"
|
||||
"@swc/helpers": "npm:0.5.23"
|
||||
"@thomasloven/round-slider": "npm:0.6.0"
|
||||
"@tsparticles/engine": "npm:4.1.1"
|
||||
"@tsparticles/preset-links": "npm:4.1.1"
|
||||
"@tsparticles/engine": "npm:4.1.2"
|
||||
"@tsparticles/preset-links": "npm:4.1.2"
|
||||
"@types/chromecast-caf-receiver": "npm:6.0.26"
|
||||
"@types/chromecast-caf-sender": "npm:1.0.11"
|
||||
"@types/color-name": "npm:2.0.0"
|
||||
@@ -8582,7 +8582,7 @@ __metadata:
|
||||
sortablejs: "patch:sortablejs@npm%3A1.15.6#~/.yarn/patches/sortablejs-npm-1.15.6-3235a8f83b.patch"
|
||||
stacktrace-js: "npm:2.0.2"
|
||||
superstruct: "npm:2.0.2"
|
||||
tar: "npm:7.5.15"
|
||||
tar: "npm:7.5.16"
|
||||
terser-webpack-plugin: "npm:5.6.1"
|
||||
tinykeys: "npm:4.0.0"
|
||||
ts-lit-plugin: "npm:2.0.2"
|
||||
@@ -12999,16 +12999,16 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"tar@npm:*, tar@npm:7.5.15, tar@npm:^7.4.3, tar@npm:^7.5.4":
|
||||
version: 7.5.15
|
||||
resolution: "tar@npm:7.5.15"
|
||||
"tar@npm:*, tar@npm:7.5.16, tar@npm:^7.4.3, tar@npm:^7.5.4":
|
||||
version: 7.5.16
|
||||
resolution: "tar@npm:7.5.16"
|
||||
dependencies:
|
||||
"@isaacs/fs-minipass": "npm:^4.0.0"
|
||||
chownr: "npm:^3.0.0"
|
||||
minipass: "npm:^7.1.2"
|
||||
minizlib: "npm:^3.1.0"
|
||||
yallist: "npm:^5.0.0"
|
||||
checksum: 10/b4cb6acd822159867f81ebda8d765c6941ec8292f1cf2f870d3713f4933c14bf0ed7bf4a92338143c31e8815ca0a1fdd62aa03ddb48a42ae187f7ef696583ffe
|
||||
checksum: 10/fafa22efceb9f056bf29ddc47d9bd90bb82fe3ce57b8d1242fc45771251741964cebba69d4e14a24fd1643f3c7f68478e945a19def534703cf370c2d9dca2e09
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
|
||||
Reference in New Issue
Block a user