/** * Entry point — imports all modules, registers globals, initializes app. */ // Layer 0: state import { apiKey, setApiKey, refreshInterval } from './core/state.js'; import { Modal } from './core/modal.js'; // Layer 1: api, i18n import { loadServerInfo, loadDisplays, configureApiKey, startConnectionMonitor, stopConnectionMonitor } from './core/api.js'; import { t, initLocale, changeLocale } from './core/i18n.js'; // Layer 1.5: visual effects import { initCardGlare } from './core/card-glare.js'; import { initBgAnim, updateBgAnimAccent, updateBgAnimTheme } from './core/bg-anim.js'; import { initTabIndicator, updateTabIndicator } from './core/tab-indicator.js'; // Layer 2: ui import { toggleHint, lockBody, unlockBody, closeLightbox, showToast, showConfirm, closeConfirmModal, openFullImageLightbox, showOverlaySpinner, hideOverlaySpinner, } from './core/ui.js'; // Layer 3: displays, tutorials import { openDisplayPicker, closeDisplayPicker, selectDisplay, formatDisplayLabel, } from './features/displays.js'; import { startCalibrationTutorial, startDeviceTutorial, startGettingStartedTutorial, startDashboardTutorial, startTargetsTutorial, startSourcesTutorial, startAutomationsTutorial, closeTutorial, tutorialNext, tutorialPrev, } from './features/tutorials.js'; // Layer 4: devices, dashboard, streams, kc-targets, pattern-templates, automations import { showSettings, closeDeviceSettingsModal, forceCloseDeviceSettingsModal, saveDeviceSettings, updateBrightnessLabel, saveCardBrightness, turnOffDevice, pingDevice, removeDevice, loadDevices, updateSettingsBaudFpsHint, copyWsUrl, } from './features/devices.js'; import { loadDashboard, stopUptimeTimer, dashboardToggleAutomation, dashboardStartTarget, dashboardStopTarget, dashboardStopAll, dashboardPauseClock, dashboardResumeClock, dashboardResetClock, toggleDashboardSection, changeDashboardPollInterval, } from './features/dashboard.js'; import { startEventsWS, stopEventsWS } from './core/events-ws.js'; import { startEntityEventListeners } from './core/entity-events.js'; import { startPerfPolling, stopPerfPolling, } from './features/perf-charts.js'; import { loadPictureSources, switchStreamTab, showAddTemplateModal, editTemplate, closeTemplateModal, saveTemplate, deleteTemplate, showTestTemplateModal, closeTestTemplateModal, onEngineChange, runTemplateTest, showAddAudioTemplateModal, editAudioTemplate, closeAudioTemplateModal, saveAudioTemplate, deleteAudioTemplate, cloneAudioTemplate, onAudioEngineChange, showTestAudioTemplateModal, closeTestAudioTemplateModal, startAudioTemplateTest, showAddStreamModal, editStream, closeStreamModal, saveStream, deleteStream, onStreamTypeChange, onStreamDisplaySelected, onTestDisplaySelected, showTestStreamModal, closeTestStreamModal, updateStreamTestDuration, runStreamTest, showTestPPTemplateModal, closeTestPPTemplateModal, updatePPTestDuration, runPPTemplateTest, showAddPPTemplateModal, editPPTemplate, closePPTemplateModal, savePPTemplate, deletePPTemplate, addFilterFromSelect, toggleFilterExpand, removeFilter, moveFilter, updateFilterOption, renderModalFilterList, updateCaptureDuration, cloneStream, cloneCaptureTemplate, clonePPTemplate, showAddCSPTModal, editCSPT, closeCSPTModal, saveCSPT, deleteCSPT, cloneCSPT, csptAddFilterFromSelect, csptToggleFilterExpand, csptRemoveFilter, csptUpdateFilterOption, renderCSPTModalFilterList, expandAllStreamSections, collapseAllStreamSections, } from './features/streams.js'; import { createKCTargetCard, testKCTarget, toggleKCTestAutoRefresh, showKCEditor, closeKCEditorModal, forceCloseKCEditorModal, saveKCEditor, deleteKCTarget, disconnectAllKCWebSockets, updateKCBrightnessLabel, saveKCBrightness, cloneKCTarget, } from './features/kc-targets.js'; import { createPatternTemplateCard, showPatternTemplateEditor, closePatternTemplateModal, forceClosePatternTemplateModal, savePatternTemplate, deletePatternTemplate, renderPatternRectList, selectPatternRect, updatePatternRect, addPatternRect, deleteSelectedPatternRect, removePatternRect, capturePatternBackground, clonePatternTemplate, } from './features/pattern-templates.js'; import { loadAutomations, openAutomationEditor, closeAutomationEditorModal, saveAutomationEditor, addAutomationCondition, toggleAutomationEnabled, cloneAutomation, deleteAutomation, copyWebhookUrl, expandAllAutomationSections, collapseAllAutomationSections, } from './features/automations.js'; import { openScenePresetCapture, editScenePreset, saveScenePreset, closeScenePresetEditor, activateScenePreset, recaptureScenePreset, cloneScenePreset, deleteScenePreset, addSceneTarget, removeSceneTarget, } from './features/scene-presets.js'; // Layer 5: device-discovery, targets import { onDeviceTypeChanged, updateBaudFpsHint, onSerialPortFocus, showAddDevice, closeAddDeviceModal, scanForDevices, handleAddDevice, cloneDevice, } from './features/device-discovery.js'; import { loadTargetsTab, switchTargetSubTab, showTargetEditor, closeTargetEditorModal, forceCloseTargetEditorModal, saveTargetEditor, startTargetProcessing, stopTargetProcessing, stopAllLedTargets, stopAllKCTargets, startTargetOverlay, stopTargetOverlay, deleteTarget, cloneTarget, toggleLedPreview, expandAllTargetSections, collapseAllTargetSections, disconnectAllLedPreviewWS, } from './features/targets.js'; // Layer 5: color-strip sources import { showCSSEditor, closeCSSEditorModal, forceCSSEditorClose, saveCSSEditor, deleteColorStrip, onCSSTypeChange, onEffectTypeChange, onAnimationTypeChange, onCSSClockChange, onDaylightRealTimeChange, colorCycleAddColor, colorCycleRemoveColor, compositeAddLayer, compositeRemoveLayer, mappedAddZone, mappedRemoveZone, onAudioVizChange, applyGradientPreset, onGradientPresetChange, promptAndSaveGradientPreset, applyCustomGradientPreset, deleteAndRefreshGradientPreset, cloneColorStrip, toggleCSSOverlay, previewCSSFromEditor, copyEndpointUrl, onNotificationFilterModeChange, notificationAddAppColor, notificationRemoveAppColor, testNotification, showNotificationHistory, closeNotificationHistory, refreshNotificationHistory, testColorStrip, testCSPT, closeTestCssSourceModal, applyCssTestSettings, fireCssTestNotification, fireCssTestNotificationLayer, } from './features/color-strips.js'; // Layer 5: audio sources import { showAudioSourceModal, closeAudioSourceModal, saveAudioSource, editAudioSource, cloneAudioSource, deleteAudioSource, testAudioSource, closeTestAudioSourceModal, refreshAudioDevices, } from './features/audio-sources.js'; // Layer 5: value sources import { showValueSourceModal, closeValueSourceModal, saveValueSource, editValueSource, cloneValueSource, deleteValueSource, onValueSourceTypeChange, onDaylightVSRealTimeChange, addSchedulePoint, testValueSource, closeTestValueSourceModal, } from './features/value-sources.js'; // Layer 5: calibration import { showCalibration, closeCalibrationModal, forceCloseCalibrationModal, saveCalibration, updateOffsetSkipLock, updateCalibrationPreview, setStartPosition, toggleEdgeInputs, toggleDirection, toggleTestEdge, showCSSCalibration, toggleCalibrationOverlay, } from './features/calibration.js'; import { showAdvancedCalibration, closeAdvancedCalibration, saveAdvancedCalibration, addCalibrationLine, removeCalibrationLine, selectCalibrationLine, moveCalibrationLine, updateCalibrationLine, resetCalibrationView, } from './features/advanced-calibration.js'; // Layer 5.5: graph editor import { loadGraphEditor, toggleGraphLegend, toggleGraphMinimap, toggleGraphFilter, toggleGraphFilterTypes, toggleGraphHelp, graphUndo, graphRedo, graphFitAll, graphZoomIn, graphZoomOut, graphRelayout, graphToggleFullscreen, graphAddEntity, } from './features/graph-editor.js'; // Layer 6: tabs, navigation, command palette, settings import { switchTab, initTabs, startAutoRefresh, handlePopState } from './features/tabs.js'; import { navigateToCard } from './core/navigation.js'; import { openCommandPalette, closeCommandPalette, initCommandPalette } from './core/command-palette.js'; import { openSettingsModal, closeSettingsModal, downloadBackup, handleRestoreFileSelected, saveAutoBackupSettings, restoreSavedBackup, downloadSavedBackup, deleteSavedBackup, restartServer, saveMqttSettings, loadApiKeysList, downloadPartialExport, handlePartialImportFileSelected, connectLogViewer, disconnectLogViewer, clearLogViewer, applyLogFilter, loadLogLevel, setLogLevel, } from './features/settings.js'; // ─── Register all HTML onclick / onchange / onfocus globals ─── Object.assign(window, { // core / state (for inline script) setApiKey, // visual effects (called from inline