Compare commits

..

2 Commits

Author SHA1 Message Date
Bram Kragten
d79d309b96 Change drag selected styling 2025-09-01 17:56:03 +02:00
Bram Kragten
4609d610dc Update hover and hightlight states for automation rows 2025-09-01 17:28:20 +02:00
18 changed files with 74 additions and 64 deletions

View File

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

View File

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

View File

@@ -162,7 +162,7 @@
"@rspack/core": "1.5.1", "@rspack/core": "1.5.1",
"@rspack/dev-server": "1.1.4", "@rspack/dev-server": "1.1.4",
"@types/babel__plugin-transform-runtime": "7.9.5", "@types/babel__plugin-transform-runtime": "7.9.5",
"@types/chromecast-caf-receiver": "6.0.24", "@types/chromecast-caf-receiver": "6.0.22",
"@types/chromecast-caf-sender": "1.0.11", "@types/chromecast-caf-sender": "1.0.11",
"@types/color-name": "2.0.0", "@types/color-name": "2.0.0",
"@types/culori": "4.0.0", "@types/culori": "4.0.0",

View File

@@ -25,6 +25,8 @@ export class HaAutomationRow extends LitElement {
@property({ type: Boolean, reflect: true, attribute: "building-block" }) @property({ type: Boolean, reflect: true, attribute: "building-block" })
public buildingBlock = false; public buildingBlock = false;
@property({ type: Boolean, reflect: true }) public highlight?: boolean;
@query(".row") @query(".row")
private _rowElement?: HTMLDivElement; private _rowElement?: HTMLDivElement;
@@ -168,9 +170,20 @@ export class HaAutomationRow extends LitElement {
margin: 0 12px; margin: 0 12px;
} }
:host([sort-selected]) .row { :host([sort-selected]) .row {
box-shadow: outline: solid;
0px 0px 8px 4px rgba(var(--rgb-accent-color), 0.8), outline-color: rgba(var(--rgb-accent-color), 0.6);
inset 0px 2px 8px 4px rgba(var(--rgb-accent-color), 0.4); outline-offset: -2px;
outline-width: 2px;
background-color: rgba(var(--rgb-accent-color), 0.08);
}
.row:hover {
background-color: rgba(var(--rgb-primary-text-color), 0.04);
}
:host([highlight]) .row {
background-color: rgba(var(--rgb-primary-color), 0.08);
}
:host([highlight]) .row:hover {
background-color: rgba(var(--rgb-primary-color), 0.16);
} }
`; `;
} }

View File

@@ -393,10 +393,13 @@ export class HaItemDisplayEditor extends LitElement {
--md-list-item-one-line-container-height: 48px; --md-list-item-one-line-container-height: 48px;
} }
ha-md-list-item.drag-selected { ha-md-list-item.drag-selected {
box-shadow: --md-focus-ring-color: rgba(var(--rgb-accent-color), 0.6);
0px 0px 8px 4px rgba(var(--rgb-accent-color), 0.8),
inset 0px 2px 8px 4px rgba(var(--rgb-accent-color), 0.4);
border-radius: 8px; border-radius: 8px;
outline: solid;
outline-color: rgba(var(--rgb-accent-color), 0.6);
outline-offset: -2px;
outline-width: 2px;
background-color: rgba(var(--rgb-accent-color), 0.08);
} }
ha-md-list-item ha-icon-button { ha-md-list-item ha-icon-button {
margin-left: -12px; margin-left: -12px;

View File

@@ -151,6 +151,8 @@ export default class HaAutomationActionRow extends LitElement {
@property({ type: Boolean }) public last?: boolean; @property({ type: Boolean }) public last?: boolean;
@property({ type: Boolean }) public highlight?: boolean;
@property({ type: Boolean, attribute: "sidebar" }) @property({ type: Boolean, attribute: "sidebar" })
public optionsInSidebar = false; public optionsInSidebar = false;
@@ -447,6 +449,7 @@ export default class HaAutomationActionRow extends LitElement {
))} ))}
.collapsed=${this._collapsed} .collapsed=${this._collapsed}
.selected=${this._selected} .selected=${this._selected}
.highlight=${this.highlight}
@toggle-collapsed=${this._toggleCollapse} @toggle-collapsed=${this._toggleCollapse}
.buildingBlock=${[ .buildingBlock=${[
...ACTION_BUILDING_BLOCKS, ...ACTION_BUILDING_BLOCKS,

View File

@@ -97,7 +97,7 @@ export default class HaAutomationAction extends LitElement {
@move-up=${this._moveUp} @move-up=${this._moveUp}
@value-changed=${this._actionChanged} @value-changed=${this._actionChanged}
.hass=${this.hass} .hass=${this.hass}
?highlight=${this.highlightedActions?.includes(action)} .highlight=${this.highlightedActions?.includes(action)}
.optionsInSidebar=${this.optionsInSidebar} .optionsInSidebar=${this.optionsInSidebar}
.sortSelected=${this._rowSortSelected === idx} .sortSelected=${this._rowSortSelected === idx}
@stop-sort-selection=${this._stopSortSelection} @stop-sort-selection=${this._stopSortSelection}

View File

@@ -116,6 +116,8 @@ export default class HaAutomationConditionRow extends LitElement {
@property({ type: Boolean }) public narrow = false; @property({ type: Boolean }) public narrow = false;
@property({ type: Boolean }) public highlight?: boolean;
@property({ type: Boolean, attribute: "sort-selected" }) @property({ type: Boolean, attribute: "sort-selected" })
public sortSelected = false; public sortSelected = false;
@@ -355,6 +357,7 @@ export default class HaAutomationConditionRow extends LitElement {
)} )}
.collapsed=${this._collapsed} .collapsed=${this._collapsed}
.selected=${this._selected} .selected=${this._selected}
.highlight=${this.highlight}
@click=${this._toggleSidebar} @click=${this._toggleSidebar}
@toggle-collapsed=${this._toggleCollapse} @toggle-collapsed=${this._toggleCollapse}
.buildingBlock=${CONDITION_BUILDING_BLOCKS.includes( .buildingBlock=${CONDITION_BUILDING_BLOCKS.includes(

View File

@@ -175,7 +175,7 @@ export default class HaAutomationCondition extends LitElement {
@move-up=${this._moveUp} @move-up=${this._moveUp}
@value-changed=${this._conditionChanged} @value-changed=${this._conditionChanged}
.hass=${this.hass} .hass=${this.hass}
?highlight=${this.highlightedConditions?.includes(cond)} .highlight=${this.highlightedConditions?.includes(cond)}
.optionsInSidebar=${this.optionsInSidebar} .optionsInSidebar=${this.optionsInSidebar}
.sortSelected=${this._rowSortSelected === idx} .sortSelected=${this._rowSortSelected === idx}
@stop-sort-selection=${this._stopSortSelection} @stop-sort-selection=${this._stopSortSelection}

View File

@@ -37,12 +37,6 @@ export const rowStyles = css`
ha-tooltip { ha-tooltip {
cursor: default; cursor: default;
} }
:host([highlight]) ha-card {
--shadow-default: var(--ha-card-box-shadow, 0 0 0 0 transparent);
--shadow-focus: 0 0 0 1px var(--state-inactive-color);
border-color: var(--state-inactive-color);
box-shadow: var(--shadow-default), var(--shadow-focus);
}
.hidden { .hidden {
display: none; display: none;
} }

View File

@@ -113,6 +113,8 @@ export default class HaAutomationTriggerRow extends LitElement {
@property({ type: Boolean }) public last?: boolean; @property({ type: Boolean }) public last?: boolean;
@property({ type: Boolean }) public highlight?: boolean;
@property({ type: Boolean, attribute: "sidebar" }) @property({ type: Boolean, attribute: "sidebar" })
public optionsInSidebar = false; public optionsInSidebar = false;
@@ -349,6 +351,7 @@ export default class HaAutomationTriggerRow extends LitElement {
this.trigger.enabled === false} this.trigger.enabled === false}
@click=${this._toggleSidebar} @click=${this._toggleSidebar}
.selected=${this._selected} .selected=${this._selected}
.highlight=${this.highlight}
.sortSelected=${this.sortSelected} .sortSelected=${this.sortSelected}
>${this._selected >${this._selected
? "selected" ? "selected"

View File

@@ -92,7 +92,7 @@ export default class HaAutomationTrigger extends LitElement {
.hass=${this.hass} .hass=${this.hass}
.disabled=${this.disabled} .disabled=${this.disabled}
.narrow=${this.narrow} .narrow=${this.narrow}
?highlight=${this.highlightedTriggers?.includes(trg)} .highlight=${this.highlightedTriggers?.includes(trg)}
.optionsInSidebar=${this.optionsInSidebar} .optionsInSidebar=${this.optionsInSidebar}
.sortSelected=${this._rowSortSelected === idx} .sortSelected=${this._rowSortSelected === idx}
@stop-sort-selection=${this._stopSortSelection} @stop-sort-selection=${this._stopSortSelection}

View File

@@ -246,7 +246,11 @@ class HaConfigDashboard extends SubscribeMixin(LitElement) {
</ha-list-item> </ha-list-item>
</ha-button-menu> </ha-button-menu>
<div class="content"> <ha-config-section
.narrow=${this.narrow}
.isWide=${this.isWide}
full-width
>
${repairsIssues.length || canInstallUpdates.length ${repairsIssues.length || canInstallUpdates.length
? html`<ha-card outlined> ? html`<ha-card outlined>
${repairsIssues.length ${repairsIssues.length
@@ -317,7 +321,7 @@ class HaConfigDashboard extends SubscribeMixin(LitElement) {
></ha-config-navigation> ></ha-config-navigation>
</ha-card> </ha-card>
<ha-tip .hass=${this.hass}>${this._tip}</ha-tip> <ha-tip .hass=${this.hass}>${this._tip}</ha-tip>
</div> </ha-config-section>
</ha-top-app-bar-fixed> </ha-top-app-bar-fixed>
`; `;
} }
@@ -388,19 +392,10 @@ class HaConfigDashboard extends SubscribeMixin(LitElement) {
:host(:not([narrow])) ha-card:last-child { :host(:not([narrow])) ha-card:last-child {
margin-bottom: max(24px, var(--safe-area-inset-bottom)); margin-bottom: max(24px, var(--safe-area-inset-bottom));
} }
.content { ha-config-section {
display: flex; margin: auto;
flex-direction: column; margin-top: -32px;
align-items: center;
gap: 24px;
margin-top: 24px;
margin-left: var(--safe-area-content-inset-left);
margin-right: var(--safe-area-content-inset-right);
}
.content > * {
max-width: 600px; max-width: 600px;
width: 100%;
display: block;
} }
ha-card { ha-card {
overflow: hidden; overflow: hidden;
@@ -424,10 +419,8 @@ class HaConfigDashboard extends SubscribeMixin(LitElement) {
border-radius: 0; border-radius: 0;
box-shadow: unset; box-shadow: unset;
} }
.content { ha-config-section {
margin-top: -1px; margin-top: -42px;
margin-left: 0;
margin-right: 0;
} }
} }

View File

@@ -39,8 +39,7 @@ export class HaConfigSection extends LitElement {
display: block; display: block;
} }
.content { .content {
padding: 28px max(20px, var(--safe-area-content-inset-right)) 0 padding: 28px 20px 0;
max(20px, var(--safe-area-content-inset-left));
max-width: 1040px; max-width: 1040px;
margin: 0 auto; margin: 0 auto;
} }

View File

@@ -32,6 +32,8 @@ export default class HaScriptFieldRow extends LitElement {
@property({ type: Boolean }) public narrow = false; @property({ type: Boolean }) public narrow = false;
@property({ type: Boolean }) public highlight?: boolean;
@state() private _yamlMode = false; @state() private _yamlMode = false;
@state() private _selected = false; @state() private _selected = false;
@@ -61,6 +63,7 @@ export default class HaScriptFieldRow extends LitElement {
left-chevron left-chevron
@toggle-collapsed=${this._toggleCollapse} @toggle-collapsed=${this._toggleCollapse}
.collapsed=${this._collapsed} .collapsed=${this._collapsed}
.highlight=${this.highlight}
> >
<h3 slot="header">${this.key}</h3> <h3 slot="header">${this.key}</h3>
@@ -83,6 +86,7 @@ export default class HaScriptFieldRow extends LitElement {
.leftChevron=${SELECTOR_SELECTOR_BUILDING_BLOCKS.includes( .leftChevron=${SELECTOR_SELECTOR_BUILDING_BLOCKS.includes(
Object.keys(this.field.selector)[0] Object.keys(this.field.selector)[0]
)} )}
.highlight=${this.highlight}
> >
<h3 slot="header"> <h3 slot="header">
${this.hass.localize( ${this.hass.localize(
@@ -331,13 +335,6 @@ export default class HaScriptFieldRow extends LitElement {
li[role="separator"] { li[role="separator"] {
border-bottom-color: var(--divider-color); border-bottom-color: var(--divider-color);
} }
:host([highlight]) ha-card {
--shadow-default: var(--ha-card-box-shadow, 0 0 0 0 transparent);
--shadow-focus: 0 0 0 1px var(--state-inactive-color);
border-color: var(--state-inactive-color);
box-shadow: var(--shadow-default), var(--shadow-focus);
}
.selector-row { .selector-row {
padding: 12px 0 16px 16px; padding: 12px 0 16px 16px;
} }

View File

@@ -43,7 +43,7 @@ export default class HaScriptFields extends LitElement {
.disabled=${this.disabled} .disabled=${this.disabled}
@value-changed=${this._fieldChanged} @value-changed=${this._fieldChanged}
.hass=${this.hass} .hass=${this.hass}
?highlight=${this.highlightedFields?.[key] !== undefined} .highlight=${this.highlightedFields?.[key] !== undefined}
.narrow=${this.narrow} .narrow=${this.narrow}
> >
</ha-script-field-row> </ha-script-field-row>

View File

@@ -612,7 +612,7 @@ class HaPanelDevAction extends LitElement {
padding: max(16px, var(--safe-area-inset-top)) padding: max(16px, var(--safe-area-inset-top))
max(16px, var(--safe-area-inset-right)) max(16px, var(--safe-area-inset-right))
max(16px, var(--safe-area-inset-bottom)) max(16px, var(--safe-area-inset-bottom))
max(16px, var(--safe-area-content-inset-left)); max(16px, var(--safe-area-inset-left));
max-width: 1200px; max-width: 1200px;
margin: auto; margin: auto;
} }
@@ -621,7 +621,7 @@ class HaPanelDevAction extends LitElement {
padding: max(8px, var(--safe-area-inset-top)) padding: max(8px, var(--safe-area-inset-top))
max(16px, var(--safe-area-inset-right)) max(16px, var(--safe-area-inset-right))
max(8px, var(--safe-area-inset-bottom)) max(8px, var(--safe-area-inset-bottom))
max(16px, var(--safe-area-content-inset-left)); max(16px, var(--safe-area-inset-left));
border-top: 1px solid var(--divider-color); border-top: 1px solid var(--divider-color);
border-bottom: 1px solid var(--divider-color); border-bottom: 1px solid var(--divider-color);
background: var(--card-background-color); background: var(--card-background-color);

View File

@@ -4445,10 +4445,10 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@types/chromecast-caf-receiver@npm:6.0.24": "@types/chromecast-caf-receiver@npm:6.0.22":
version: 6.0.24 version: 6.0.22
resolution: "@types/chromecast-caf-receiver@npm:6.0.24" resolution: "@types/chromecast-caf-receiver@npm:6.0.22"
checksum: 10/1f2b95e8a15dbb36d5328895229d4a5cb255b33e62d46335bd6ed75e16aa9ea6a7d765a64ae120d19b3134fb3e51e9547d2544c7277f7bffe0bf0b3999f026da checksum: 10/6c51cb52527776ddfa187a261b88184c98bdd61c129dd8719cba213894d565cf69073734d6473696ffd60a768f6fb5a3fe9932693f43174fbc5e7af201db8a90
languageName: node languageName: node
linkType: hard linkType: hard
@@ -9385,7 +9385,7 @@ __metadata:
"@tsparticles/engine": "npm:3.9.1" "@tsparticles/engine": "npm:3.9.1"
"@tsparticles/preset-links": "npm:3.2.0" "@tsparticles/preset-links": "npm:3.2.0"
"@types/babel__plugin-transform-runtime": "npm:7.9.5" "@types/babel__plugin-transform-runtime": "npm:7.9.5"
"@types/chromecast-caf-receiver": "npm:6.0.24" "@types/chromecast-caf-receiver": "npm:6.0.22"
"@types/chromecast-caf-sender": "npm:1.0.11" "@types/chromecast-caf-sender": "npm:1.0.11"
"@types/color-name": "npm:2.0.0" "@types/color-name": "npm:2.0.0"
"@types/culori": "npm:4.0.0" "@types/culori": "npm:4.0.0"