import * as Blockly from 'blockly'; import { pythonGenerator } from 'blockly/python'; import { arduinoGenerator } from './generators/arduino.js'; import './generators/arduino_builtins.js'; import './blocks/esp32_blocks.js'; import './blocks/esp32_generators.js'; import './blocks/arduino_generators.js'; import { getDeviceId, setDeviceId, getDevice, canFlashInBrowser, buildToolbox, getAllDevices, } from './devices/registry.js'; import { setRefreshCallback, setDeviceListRefreshCallback, loadAllSavedAddons, installAddonFromFile, removeAddon, getInstalledAddons, } from './addons/loader.js'; import { connect, disconnect, isConnected, getPort, onData, writeString } from './serial/connection.js'; import { executeCode, stopExecution, saveToDevice, writeFileToDevice } from './serial/repl.js'; import { flashFirmware } from './serial/flasher.js'; import { flashPicoFirmware } from './serial/picoFlasher.js'; import { appendToTerminal, clearTerminal } from './ui/terminal.js'; import { initResizablePanels, initPanelToggles, initProjectTabs, setProjectsPanelCallbacks } from './ui/panels.js'; import { initToolboxCustomizer, toggleCustomizeMode, refreshCustomizer } from './ui/toolboxCustomizer.js'; import { initProjectsDialog, refreshAll as refreshProjects, loadWorkspaceFromDevice, saveCurrentWorkspaceToDevice, } from './ui/projectsDialog.js'; import { initRobotPanel, syncRobotPanelDevice } from './ui/robotPanel.js'; import { uploadHex, BOARDS } from './arduino/stk500.js'; import './style.css'; // ─── Blockly Workspace ─────────────────────────────────── // Load saved addons before building toolbox so their categories are included loadAllSavedAddons(); const workspace = Blockly.inject('blockly-div', { toolbox: buildToolbox(getDeviceId()), theme: Blockly.Themes.Dark, grid: { spacing: 25, length: 3, colour: '#333', snap: true }, zoom: { controls: true, wheel: true, startScale: 0.9, maxScale: 3, minScale: 0.3, scaleSpeed: 1.2 }, trashcan: true, renderer: 'zelos', }); // Now that workspace exists, set the refresh callback for addons setRefreshCallback(() => { workspace.updateToolbox(buildToolbox(getDeviceId())); }); // Rebuild the device