+
+ ${renderIcon('right', 'mdi:arrow-right', this._config.actions_right)}
+ ${renderIcon('left', 'mdi:arrow-left', this._config.actions_left)}
+ ${renderIcon('up', 'mdi:arrow-up', this._config.actions_up)}
+ ${renderIcon('down', 'mdi:arrow-down', this._config.actions_down)}
+
+ ${this._config.actions_zoom_in || this._config.actions_zoom_out
+ ? html`
+ ${renderIcon('zoom_in', 'mdi:plus', this._config.actions_zoom_in)}
+ ${renderIcon('zoom_out', 'mdi:minus', this._config.actions_zoom_out)}
+
`
+ : html``}
+ ${this._config.actions_home
+ ? html`
+
+ ${renderIcon('home', 'mdi:home', this._config.actions_home)}
+
+ `
+ : html``}
+
`;
+ }
+
+ /**
+ * Return compiled CSS styles.
+ */
+ static get styles(): CSSResultGroup {
+ return unsafeCSS(ptzStyle);
+ }
+}
+
declare global {
- interface HTMLElementTagNameMap {
- "frigate-card-conditional": FrigateCardElementsConditional
- "frigate-card-elements": FrigateCardElements
- "frigate-card-menu-submenu-select": FrigateCardElementsMenuSubmenuSelect
- "frigate-card-menu-submenu": FrigateCardElementsMenuSubmenu
- "frigate-card-menu-state-icon": FrigateCardElementsMenuStateIcon
- "frigate-card-menu-icon": FrigateCardElementsMenuIcon
- "frigate-card-elements-core": FrigateCardElementsCore
- }
+ interface HTMLElementTagNameMap {
+ 'frigate-card-conditional': FrigateCardElementsConditional;
+ 'frigate-card-elements': FrigateCardElements;
+ 'frigate-card-menu-submenu-select': FrigateCardElementsMenuSubmenuSelect;
+ 'frigate-card-menu-submenu': FrigateCardElementsMenuSubmenu;
+ 'frigate-card-menu-state-icon': FrigateCardElementsMenuStateIcon;
+ 'frigate-card-menu-icon': FrigateCardElementsMenuIcon;
+ 'frigate-card-elements-core': FrigateCardElementsCore;
+ 'frigate-card-ptz': FrigateCardPTZ;
+ }
}
diff --git a/src/components/image.ts b/src/components/image.ts
index b1ffb6f8..a8f5a743 100644
--- a/src/components/image.ts
+++ b/src/components/image.ts
@@ -21,8 +21,9 @@ import { updateElementStyleFromMediaLayoutConfig } from '../utils/media-layout.j
import { dispatchMediaLoadedEvent } from '../utils/media-info.js';
import { View } from '../view.js';
import { dispatchErrorMessageEvent } from './message.js';
+import { contentsChanged } from '../utils/basic.js';
-// See: https://github.com/home-assistant/core/blob/dev/homeassistant/components/camera/__init__.py#L101
+// See TOKEN_CHANGE_INTERVAL in https://github.com/home-assistant/core/blob/dev/homeassistant/components/camera/__init__.py .
const HASS_REJECTION_CUTOFF_MS = 5 * 60 * 1000;
@customElement('frigate-card-image')
@@ -36,7 +37,10 @@ export class FrigateCardImage extends LitElement {
@property({ attribute: false })
public cameraConfig?: CameraConfig;
- @property({ attribute: false })
+ // Using contentsChanged to ensure overridden configs (e.g. when the
+ // 'show_image_during_load' option is true for live views, an overridden
+ // config may be used here).
+ @property({ attribute: false, hasChanged: contentsChanged })
public imageConfig?: ImageViewConfig;
protected _refImage: Ref