import { TYPE_KEYS, WIDGET_DEFAULTS } from './constants'; export function typeKeyFor(type) { return TYPE_KEYS[type] || 'label'; } export function clamp(value, min, max) { if (Number.isNaN(value)) return min; return Math.max(min, Math.min(max, value)); } export function minSizeFor(widget) { const key = typeKeyFor(widget.type); if (key === 'button') return { w: 60, h: 30 }; if (key === 'led') return { w: 20, h: 20 }; if (key === 'icon') return { w: 24, h: 24 }; return { w: 40, h: 20 }; } export function hexToRgba(hex, alpha) { const r = parseInt(hex.slice(1, 3), 16); const g = parseInt(hex.slice(3, 5), 16); const b = parseInt(hex.slice(5, 7), 16); return `rgba(${r},${g},${b},${alpha})`; } export function normalizeWidget(w, nextWidgetIdRef) { const key = typeKeyFor(w.type); const defaults = WIDGET_DEFAULTS[key]; Object.keys(defaults).forEach((prop) => { if (prop === 'shadow') return; if (w[prop] === undefined || w[prop] === null) { w[prop] = defaults[prop]; } }); if (!w.shadow) { w.shadow = { ...defaults.shadow }; } else { Object.keys(defaults.shadow).forEach((prop) => { if (w.shadow[prop] === undefined || w.shadow[prop] === null) { w.shadow[prop] = defaults.shadow[prop]; } }); } if (w.visible === undefined || w.visible === null) w.visible = true; if (w.x === undefined || w.x === null) w.x = 100; if (w.y === undefined || w.y === null) w.y = 100; if (w.id === undefined || w.id === null) { if (nextWidgetIdRef) w.id = nextWidgetIdRef.value++; } // Action defaults if (w.action === undefined) w.action = 0; // BUTTON_ACTIONS.KNX if (w.targetScreen === undefined) w.targetScreen = 0; // Icon defaults if (w.iconCodepoint === undefined) w.iconCodepoint = defaults.iconCodepoint || 0; if (w.iconPosition === undefined) w.iconPosition = defaults.iconPosition || 0; if (w.iconSize === undefined) w.iconSize = defaults.iconSize || 1; if (w.iconGap === undefined) w.iconGap = defaults.iconGap || 8; // Hierarchy if (w.parentId === undefined) w.parentId = -1; } export function normalizeScreen(screen, nextScreenIdRef, nextWidgetIdRef) { if (screen.id === undefined || screen.id === null) { if (nextScreenIdRef) screen.id = nextScreenIdRef.value++; } if (!screen.name) screen.name = `Screen ${screen.id}`; if (screen.mode === undefined || screen.mode === null) screen.mode = 0; if (!screen.bgColor) screen.bgColor = '#1A1A2E'; if (!Array.isArray(screen.widgets)) screen.widgets = []; // Modal defaults if (!screen.modal) { screen.modal = { x: 0, y: 0, w: 0, h: 0, radius: 12, dim: true }; } else { if (screen.modal.x === undefined) screen.modal.x = 0; if (screen.modal.y === undefined) screen.modal.y = 0; if (screen.modal.w === undefined) screen.modal.w = 0; if (screen.modal.h === undefined) screen.modal.h = 0; if (screen.modal.radius === undefined) screen.modal.radius = 12; if (screen.modal.dim === undefined) screen.modal.dim = true; } screen.widgets.forEach(w => normalizeWidget(w, nextWidgetIdRef)); }