diff --git a/src/card.ts b/src/card.ts
index c4f316e0..77b9223d 100644
--- a/src/card.ts
+++ b/src/card.ts
@@ -636,6 +636,7 @@ export class FrigateCard extends LitElement {
.hass=${this._hass}
.menuMode=${this.config.menu_mode}
.buttons=${this._getMenuButtons()}
+ .buttonSize=${this.config.menu_button_size}
@frigate-card:menu-interaction=${this._menuInteractionHandler.bind(this)}
>
`;
@@ -931,6 +932,7 @@ export class FrigateCard extends LitElement {
.view=${this._view}
.browseMediaQueryParameters=${mediaQueryParameters}
.nextPreviousControlStyle=${this.config.controls?.nextprev ?? 'thumbnails'}
+ .nextPreviousControlSize=${this.config.controls?.nextprev_size}
.autoplayClip=${this.config.autoplay_clip}
.resolvedMediaCache=${this._resolvedMediaCache}
.lazyLoad=${this.config.event_viewer?.lazy_load ?? true}
diff --git a/src/components/menu.ts b/src/components/menu.ts
index 65441e29..484a1009 100644
--- a/src/components/menu.ts
+++ b/src/components/menu.ts
@@ -41,6 +41,11 @@ export class FrigateCardMenu extends LitElement {
@property({ attribute: false })
public buttons: MenuButton[] = [];
+ @property({ attribute: false })
+ set buttonSize(buttonSize: string) {
+ this.style.setProperty('--frigate-card-menu-button-size', buttonSize);
+ }
+
protected _interactionHandler(ev: CustomEvent, button: MenuButton): void {
if (this.menuMode.startsWith('hidden-')) {
if (button.type == 'internal-menu-icon' && button.tap_action === 'frigate') {
diff --git a/src/components/next-prev-control.ts b/src/components/next-prev-control.ts
index 9587a5d8..708f97ff 100644
--- a/src/components/next-prev-control.ts
+++ b/src/components/next-prev-control.ts
@@ -17,6 +17,13 @@ export class FrigateCardMessage extends LitElement {
@property({ attribute: false })
protected thumbnail?: string;
+ @property({ attribute: false })
+ set controlSize(controlSize: string | undefined) {
+ if (controlSize) {
+ this.style.setProperty('--frigate-card-next-prev-size', controlSize);
+ }
+ }
+
protected render(): TemplateResult {
if (!this.controlStyle || this.controlStyle == 'none') {
return html``;
@@ -32,11 +39,20 @@ export class FrigateCardMessage extends LitElement {
};
if (this.controlStyle == 'chevrons') {
+ const icon = this.direction == 'previous' ? 'mdi:chevron-left' : 'mdi:chevron-right';
+
+ // TODO: Upon a safe distance from the release of HA 2021.11 these
+ // attributes can be removed from the .
+ // - icon (replaced with the embedded )
+ // - title (replaced with .label)
return html` `;
+ >
+
+ `;
}
if (!this.thumbnail) {
diff --git a/src/components/viewer.ts b/src/components/viewer.ts
index f70b9d0f..feaf5f17 100644
--- a/src/components/viewer.ts
+++ b/src/components/viewer.ts
@@ -55,6 +55,9 @@ export class FrigateCardViewer extends LitElement {
@property({ attribute: false })
protected nextPreviousControlStyle?: NextPreviousControlStyle;
+ @property({ attribute: false })
+ protected nextPreviousControlSize?: string;
+
@property({ attribute: false })
protected autoplayClip?: boolean;
@@ -142,6 +145,7 @@ export class FrigateCardViewer extends LitElement {
return html` this._nextPreviousHandler('previous')}
@@ -512,6 +520,7 @@ export class FrigateCardViewerCore extends LitElement {
? html` this._nextPreviousHandler('next')}
diff --git a/src/scss/button.scss b/src/scss/button.scss
index 164f4824..ebeaaa88 100644
--- a/src/scss/button.scss
+++ b/src/scss/button.scss
@@ -6,7 +6,6 @@ ha-icon-button.button {
border-radius: 50%;
padding: 0px;
margin: 3px;
- --mdc-icon-button-size: 40px;
--ha-icon-display: block;
/* Buttons can always be clicked */
pointer-events: auto;
diff --git a/src/scss/menu.scss b/src/scss/menu.scss
index 1598ab61..19bce486 100644
--- a/src/scss/menu.scss
+++ b/src/scss/menu.scss
@@ -1,8 +1,14 @@
@use './button.scss';
+:host {
+ --frigate-card-menu-button-size: 40px;
+ --mdc-icon-button-size: var(--frigate-card-menu-button-size);
+ --mdc-icon-size: calc(var(--mdc-icon-button-size) / 2);
+}
+
.frigate-card-menu {
z-index: 1;
- height: 46px;
+ height: calc(var(--frigate-card-menu-button-size) + 6px);
overflow: hidden;
/* Menu div itself does not handle click events. Without this, in overlay
mode, the menu div prevents clicking on gallery items 'behind' the overlay.
@@ -11,7 +17,7 @@
}
.frigate-card-menu.overlay-hidden {
position: absolute;
- width: 46px;
+ width: calc(var(--frigate-card-menu-button-size) + 6px);
}
.frigate-card-menu.overlay-hidden.left, .frigate-card-menu.overlay-hidden.top {
left: 0px;
diff --git a/src/scss/next-previous-control.scss b/src/scss/next-previous-control.scss
index cb21f094..b3b87333 100644
--- a/src/scss/next-previous-control.scss
+++ b/src/scss/next-previous-control.scss
@@ -1,15 +1,24 @@
@use './button.scss';
+:host {
+ --frigate-card-next-prev-size: 48px;
+ --frigate-card-next-prev-size-hover: calc(var(--frigate-card-next-prev-size) * 2);
+ --frigate-card-prev-position: 45px;
+ --frigate-card-next-position: 45px;
+ --mdc-icon-button-size: var(--frigate-card-next-prev-size);
+ --mdc-icon-size: calc(var(--mdc-icon-button-size) / 2);
+}
+
.controls {
position: absolute;
z-index: 1;
overflow: hidden;
}
.controls.previous {
- left: 45px;
+ left: var(--frigate-card-prev-position);
}
.controls.next {
- right: 45px;
+ right: var(--frigate-card-next-position);
}
.controls.chevrons {
@@ -18,22 +27,28 @@
.controls.thumbnails {
border-radius: 50%;
- height: 48px;
- top: calc(50% - (48px / 2));
- box-shadow: 0px 0px 30px 1px black;
- transition: all .2s ease;
+ height: var(--frigate-card-next-prev-size);
+ top: calc(50% - (var(--frigate-card-next-prev-size) / 2));
+ box-shadow: 0px 0px 20px 5px black;
+ transition: all 0.2s ease-out;
opacity: 0.8;
}
.controls.thumbnails:hover {
opacity: 1 !important;
- height: 72px;
- top: calc(50% - (72px / 2));
+ height: var(--frigate-card-next-prev-size-hover);
+ top: calc(50% - (var(--frigate-card-next-prev-size-hover) / 2));
}
.controls.previous.thumbnails:hover {
- left: 33px;
+ left: calc(
+ var(--frigate-card-prev-position) -
+ (var(--frigate-card-next-prev-size-hover) - var(--frigate-card-next-prev-size)) / 2
+ );
}
.controls.next.thumbnails:hover {
- right: 33px;
+ right: calc(
+ var(--frigate-card-next-position) -
+ (var(--frigate-card-next-prev-size-hover) - var(--frigate-card-next-prev-size)) / 2
+ );
}
diff --git a/src/types.ts b/src/types.ts
index f43a6c7a..42c5db02 100644
--- a/src/types.ts
+++ b/src/types.ts
@@ -318,11 +318,13 @@ export const frigateCardConfigSchema = z.object({
fullscreen: z.boolean().default(true),
})
.optional(),
+ menu_button_size: z.string().default('40px'),
update_entities: z.string().array().optional(),
elements: pictureElementsSchema,
controls: z
.object({
nextprev: z.enum(NEXT_PREVIOUS_CONTROL_STYLES).default('thumbnails'),
+ nextprev_size: z.string().default('48px'),
})
.optional(),
dimensions: z