Skip to content

Commit c496aff

Browse files
committed
feat: add alert transition effects and configuration options for alert modes
1 parent 666032c commit c496aff

File tree

7 files changed

+455
-91
lines changed

7 files changed

+455
-91
lines changed

src/core/helpers/lcards-helper-manager.js

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,14 @@ export class LCARdSHelperManager extends BaseService {
192192
this.subscribeToHelper('alert_mode', (newMode, oldMode) => {
193193
lcardsLog.info(`[HelperManager] Alert mode changed to: ${newMode}`);
194194

195+
// Guard: if ThemeManager already applied this mode it means window.lcards.setAlertMode
196+
// fired first and synced the helper itself — don't run the transition a second time.
197+
const alreadyApplied = window.lcards?.core?.themeManager?.getAlertMode?.() === newMode;
198+
if (alreadyApplied) {
199+
lcardsLog.debug('[HelperManager] Alert mode already applied by ThemeManager — skipping duplicate call');
200+
return;
201+
}
202+
195203
// Ensure HASS is available (critical for green_alert)
196204
if (this.hass && window.lcards?.core) {
197205
window.lcards.core.ingestHass(this.hass);
@@ -256,8 +264,9 @@ export class LCARdSHelperManager extends BaseService {
256264

257265
// Apply the mode
258266
if (window.lcards?.setAlertMode) {
259-
lcardsLog.info(`[HelperManager] Calling setAlertMode('${currentMode}') on initial load`);
260-
window.lcards.setAlertMode(currentMode).catch(error => {
267+
lcardsLog.info(`[HelperManager] Calling setAlertMode('${currentMode}') on initial load (no transition)`);
268+
// Skip transition on initial load — there is nothing visible to transition from.
269+
window.lcards.setAlertMode(currentMode, { skipTransition: true }).catch(error => {
261270
lcardsLog.error('[HelperManager] Failed to apply initial alert mode:', error);
262271
});
263272
} else {

src/core/helpers/lcards-helper-registry.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,33 @@ export const HELPER_REGISTRY = {
8282
icon: mdi:message-alert`
8383
},
8484

85+
alert_transition_style: {
86+
entity_id: 'input_select.lcards_alert_transition_style',
87+
domain: 'input_select',
88+
name: 'LCARdS Alert Transition Style',
89+
description: 'Visual screen-transition effect played when switching alert modes. Defaults to off.',
90+
icon: 'mdi:transition',
91+
category: 'alert_system',
92+
ws_create_params: {
93+
options: ['off', 'blur_fade', 'fade_only', 'flash', 'color_bleed', 'flicker', 'static', 'wipe']
94+
},
95+
default_value: 'off',
96+
yaml_config: `input_select:
97+
lcards_alert_transition_style:
98+
name: LCARdS Alert Transition Style
99+
options:
100+
- off
101+
- blur_fade
102+
- fade_only
103+
- flash
104+
- color_bleed
105+
- flicker
106+
- static
107+
- wipe
108+
initial: off
109+
icon: mdi:transition`
110+
},
111+
85112
// ===== RED ALERT HSL =====
86113

87114
alert_lab_red_hue: {

src/core/themes/ThemeManager.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -601,7 +601,7 @@ export class ThemeManager extends BaseService {
601601
* @param {string} mode - Alert mode ('red_alert', 'blue_alert', etc.)
602602
* @returns {Promise<void>}
603603
*/
604-
async setAlertMode(mode) {
604+
async setAlertMode(mode, opts = {}) {
605605
if (!ALERT_MODE_TRANSFORMS[mode]) {
606606
lcardsLog.warn(`[ThemeManager] Unknown alert mode: ${mode}`);
607607
return;
@@ -617,8 +617,8 @@ export class ThemeManager extends BaseService {
617617
// Load user-customized transform parameters from persistent HA helpers (before injection)
618618
loadAlertTransformsFromHelpers(window.lcards?.core?.helperManager);
619619

620-
// Apply alert mode (injectAlertMode handles CSS variable updates and event dispatch)
621-
await injectAlertMode(mode, hass);
620+
// Apply alert mode — opts.transitionStyle selects the visual transition effect
621+
await injectAlertMode(mode, hass, undefined, opts);
622622

623623
// Update state
624624
this.currentAlertMode = mode;

0 commit comments

Comments
 (0)