Add CSS performance controls.

This commit is contained in:
Dermot Duffy
2022-10-06 20:58:14 -07:00
parent 65cf4cf22d
commit 535069d68e
12 changed files with 66 additions and 15 deletions
+5 -1
View File
@@ -102,7 +102,7 @@ import { View } from './view.js';
import pkg from '../package.json'; import pkg from '../package.json';
import { ViewContext } from 'view'; import { ViewContext } from 'view';
import { DataManager } from './utils/data-manager.js'; import { DataManager } from './utils/data-manager.js';
import { setLowPerformanceProfile } from './performance.js'; import { setLowPerformanceProfile, setPerformanceCSSStyles } from './performance.js';
/** A note on media callbacks: /** A note on media callbacks:
* *
@@ -1097,6 +1097,10 @@ export class FrigateCard extends LitElement {
if (this._cameras && (changedProps.has('_config') || changedProps.has('_cameras'))) { if (this._cameras && (changedProps.has('_config') || changedProps.has('_cameras'))) {
this._dataManager = new DataManager(this._cameras); this._dataManager = new DataManager(this._cameras);
} }
if (changedProps.has('_cardWideConfig')) {
setPerformanceCSSStyles(this, this._cardWideConfig?.performance);
}
} }
/** /**
+2
View File
@@ -206,6 +206,8 @@ export const CONF_OVERRIDES = 'overrides' as const;
export const CONF_PERFORMANCE = 'performance' as const; export const CONF_PERFORMANCE = 'performance' as const;
export const CONF_PERFORMANCE_FEATURES_ANIMATED_PROGRESS_INDICATOR = `${CONF_PERFORMANCE}.features.animated_progress_indicator`; export const CONF_PERFORMANCE_FEATURES_ANIMATED_PROGRESS_INDICATOR = `${CONF_PERFORMANCE}.features.animated_progress_indicator`;
export const CONF_PERFORMANCE_STYLE_BOX_SHADOW = `${CONF_PERFORMANCE}.style.box_shadow`;
export const CONF_PERFORMANCE_STYLE_BORDER_RADIUS = `${CONF_PERFORMANCE}.style.border_radius`;
// Taken from https://github.dev/home-assistant/frontend/blob/b5861869e39290fd2e15737e89571dfc543b3ad3/src/data/media-player.ts#L93 // Taken from https://github.dev/home-assistant/frontend/blob/b5861869e39290fd2e15737e89571dfc543b3ad3/src/data/media-player.ts#L93
export const MEDIA_PLAYER_SUPPORT_BROWSE_MEDIA = 131072; export const MEDIA_PLAYER_SUPPORT_BROWSE_MEDIA = 131072;
+33 -1
View File
@@ -1,12 +1,13 @@
// TODO: Change defaults themselves? // TODO: Change defaults themselves?
// TODO: CSS
// TODO: Don't pump out conditionStates based on state? // TODO: Don't pump out conditionStates based on state?
// TODO: view history
import { deepRemoveDefaults } from './utils/zod.js'; import { deepRemoveDefaults } from './utils/zod.js';
import { import {
frigateCardConfigSchema, frigateCardConfigSchema,
FrigateCardConfig, FrigateCardConfig,
RawFrigateCardConfig, RawFrigateCardConfig,
PerformanceConfig,
} from './types'; } from './types';
import { getArrayConfigPath, getConfigValue, setConfigValue } from './config-mgmt.js'; import { getArrayConfigPath, getConfigValue, setConfigValue } from './config-mgmt.js';
import { import {
@@ -42,6 +43,8 @@ import {
CONF_MENU_BUTTONS_TIMELINE, CONF_MENU_BUTTONS_TIMELINE,
CONF_MENU_STYLE, CONF_MENU_STYLE,
CONF_PERFORMANCE_FEATURES_ANIMATED_PROGRESS_INDICATOR, CONF_PERFORMANCE_FEATURES_ANIMATED_PROGRESS_INDICATOR,
CONF_PERFORMANCE_STYLE_BORDER_RADIUS,
CONF_PERFORMANCE_STYLE_BOX_SHADOW,
CONF_TIMELINE_CONTROLS_THUMBNAILS_MODE, CONF_TIMELINE_CONTROLS_THUMBNAILS_MODE,
CONF_TIMELINE_CONTROLS_THUMBNAILS_SHOW_DETAILS, CONF_TIMELINE_CONTROLS_THUMBNAILS_SHOW_DETAILS,
CONF_TIMELINE_CONTROLS_THUMBNAILS_SHOW_FAVORITE_CONTROL, CONF_TIMELINE_CONTROLS_THUMBNAILS_SHOW_FAVORITE_CONTROL,
@@ -114,6 +117,10 @@ const LOW_PROFILE_DEFAULTS = {
// Disable all optional performance related features. // Disable all optional performance related features.
[CONF_PERFORMANCE_FEATURES_ANIMATED_PROGRESS_INDICATOR]: false, [CONF_PERFORMANCE_FEATURES_ANIMATED_PROGRESS_INDICATOR]: false,
// Disable all expensive CSS features.
[CONF_PERFORMANCE_STYLE_BORDER_RADIUS]: false,
[CONF_PERFORMANCE_STYLE_BOX_SHADOW]: false,
}; };
const LOW_PROFILE_CAMERA_DEFAULTS = { const LOW_PROFILE_CAMERA_DEFAULTS = {
@@ -163,3 +170,28 @@ export const setLowPerformanceProfile = (
} }
return parsedConfig; return parsedConfig;
}; };
const STYLE_DISABLE_MAP = {
box_shadow: 'none',
border_radius: '0px',
};
/**
* Set card-wide CSS variables for performance.
* @param element The element to set the variables on.
* @param performance The performance configuration.
*/
export const setPerformanceCSSStyles = (
element: HTMLElement,
performance?: PerformanceConfig,
): void => {
const styles = performance?.style ?? {};
for (const configKey of Object.keys(styles)) {
const CSSKey = `--frigate-card-css-${configKey.replaceAll('_', '-')}`;
if (styles[configKey] === false) {
element.style.setProperty(CSSKey, STYLE_DISABLE_MAP[configKey]);
} else {
element.style.removeProperty(CSSKey);
}
}
};
+3 -3
View File
@@ -27,16 +27,16 @@
max-width: 90%; max-width: 90%;
} }
:host([location=right]) #d { :host([location='right']) #d {
// Position to the right. // Position to the right.
left: unset; left: unset;
right: 0; right: 0;
transform: translateX(100%); transform: translateX(100%);
} }
:host([location=right][open]) #d { :host([location='right'][open]) #d {
transform: none; transform: none;
box-shadow: 0px 0px 25px 0px black; box-shadow: var(--frigate-card-css-box-shadow, 0px 0px 25px 0px black);
} }
#ifs { #ifs {
+1 -1
View File
@@ -31,7 +31,7 @@
text-align: center; text-align: center;
color: var(--primary-text-color, white); color: var(--primary-text-color, white);
border: 1px solid var(--primary-color); border: 1px solid var(--primary-color);
border-radius: var(--ha-card-border-radius, 4px); border-radius: var(--frigate-card-css-border-radius, var(--ha-card-border-radius, 4px));
// Folder background color should match the thumbnail element background // Folder background color should match the thumbnail element background
// color. // color.
+1 -1
View File
@@ -29,7 +29,7 @@
border-radius: 50%; border-radius: 50%;
height: var(--frigate-card-next-prev-size); height: var(--frigate-card-next-prev-size);
top: calc(50% - (var(--frigate-card-next-prev-size) / 2)); top: calc(50% - (var(--frigate-card-next-prev-size) / 2));
box-shadow: 0px 0px 20px 5px black; box-shadow: var(--frigate-card-css-box-shadow, 0px 0px 20px 5px black);
transition: all 0.2s ease-out; transition: all 0.2s ease-out;
opacity: 0.8; opacity: 0.8;
aspect-ratio: 1 / 1; aspect-ratio: 1 / 1;
+1 -1
View File
@@ -12,7 +12,7 @@ ha-icon {
// Safari will occasionally not load thumbnails correctly with display block. // Safari will occasionally not load thumbnails correctly with display block.
display: inline-block; display: inline-block;
border-radius: var(--ha-card-border-radius, 4px); border-radius: var(--frigate-card-css-border-radius, var(--ha-card-border-radius, 4px));
max-width: var(--frigate-card-thumbnail-size); max-width: var(--frigate-card-thumbnail-size);
max-height: 100%; max-height: 100%;
+1 -1
View File
@@ -12,7 +12,7 @@
border: 1px solid var(--secondary-color); border: 1px solid var(--secondary-color);
background-color: var(--secondary-background-color); background-color: var(--secondary-background-color);
border-radius: var(--ha-card-border-radius, 4px); border-radius: var(--frigate-card-css-border-radius, var(--ha-card-border-radius, 4px));
box-sizing: border-box; box-sizing: border-box;
color: var(--primary-text-color); color: var(--primary-text-color);
+1 -1
View File
@@ -16,7 +16,7 @@
:host([details]) { :host([details]) {
border: 1px solid var(--primary-color); border: 1px solid var(--primary-color);
border-radius: var(--ha-card-border-radius, 4px); border-radius: var(--frigate-card-css-border-radius, var(--ha-card-border-radius, 4px));
padding: 2px; padding: 2px;
// When details are enabled, use a background color so that the details have // When details are enabled, use a background color so that the details have
+6 -3
View File
@@ -49,7 +49,7 @@ div.timeline {
.vis-item.vis-selected { .vis-item.vis-selected {
border-color: var(--accent-color); border-color: var(--accent-color);
background-color: var(--accent-color); background-color: var(--accent-color);
box-shadow: 0px 0px 5px 1px var(--primary-color); box-shadow: var(--frigate-card-css-box-shadow, 0px 0px 5px 1px var(--primary-color));
} }
.vis-item.vis-background { .vis-item.vis-background {
background-color: var(--primary-color); background-color: var(--primary-color);
@@ -88,7 +88,10 @@ div.timeline {
border-style: dotted; border-style: dotted;
color: var(--primary-text-color); color: var(--primary-text-color);
background-color: var(--primary-background-color); background-color: var(--primary-background-color);
box-shadow: 0px 0px 5px 1px var(--primary-color); box-shadow: var(--frigate-card-css-box-shadow, 0px 0px 5px 1px var(--primary-color));
}
.vis-item.vis-range {
border-radius: var(--frigate-card-css-border-radius, unset);
} }
.vis-time-axis .vis-grid.vis-minor { .vis-time-axis .vis-grid.vis-minor {
@@ -127,7 +130,7 @@ div.vis-tooltip {
.target_bar { .target_bar {
border-left: 2px solid var(--primary-color); border-left: 2px solid var(--primary-color);
opacity: 0.7; opacity: 0.7;
box-shadow: 0px 0px 3px 1px var(--primary-color); box-shadow: var(--frigate-card-css-box-shadow, 0px 0px 3px 1px var(--primary-color));
// Prevent the mouse interacting with the custom time. // Prevent the mouse interacting with the custom time.
pointer-events: none; pointer-events: none;
+10
View File
@@ -1211,6 +1211,10 @@ const performanceConfigDefault = {
features: { features: {
animated_progress_indicator: true, animated_progress_indicator: true,
}, },
style: {
border_radius: false,
box_shadow: true,
},
}; };
const performanceConfigSchema = z const performanceConfigSchema = z
@@ -1223,6 +1227,12 @@ const performanceConfigSchema = z
.default(performanceConfigDefault.features.animated_progress_indicator), .default(performanceConfigDefault.features.animated_progress_indicator),
}) })
.default(performanceConfigDefault.features), .default(performanceConfigDefault.features),
style: z
.object({
border_radius: z.boolean().default(performanceConfigDefault.style.border_radius),
box_shadow: z.boolean().default(performanceConfigDefault.style.box_shadow),
})
.default(performanceConfigDefault.style),
}) })
.default(performanceConfigDefault); .default(performanceConfigDefault);
export type PerformanceConfig = z.infer<typeof performanceConfigSchema>; export type PerformanceConfig = z.infer<typeof performanceConfigSchema>;
+2 -2
View File
@@ -1,9 +1,9 @@
{ {
"compilerOptions": { "compilerOptions": {
"target": "es2017", "target": "es2021",
"module": "es2020", "module": "es2020",
"moduleResolution": "node", "moduleResolution": "node",
"lib": ["es2017", "dom", "dom.iterable"], "lib": ["es2021", "dom", "dom.iterable"],
"noEmit": true, "noEmit": true,
"noUnusedParameters": true, "noUnusedParameters": true,
"noImplicitReturns": true, "noImplicitReturns": true,