diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml
index bda2a4b..8da9161 100644
--- a/.github/workflows/build.yaml
+++ b/.github/workflows/build.yaml
@@ -10,7 +10,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- - uses: actions/setup-node@v4
+ - uses: actions/setup-node@v6
with:
node-version: 22
cache: 'npm'
diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml
index 8305f88..84d66be 100644
--- a/.github/workflows/publish.yaml
+++ b/.github/workflows/publish.yaml
@@ -28,7 +28,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- - uses: actions/setup-node@v4
+ - uses: actions/setup-node@v6
with:
node-version: 22
cache: 'npm'
diff --git a/index.html b/index.html
index 4f10992..26db8e2 100644
--- a/index.html
+++ b/index.html
@@ -96,6 +96,7 @@
Restart
+
Halt
Clear
Plotter
@@ -221,26 +222,21 @@
Web Bluetooth not available!
Request Bluetooth Device
-
CircuitPython boards with nrf chips need
- CircuitPython 7.0.0 or newer . The first time a device is connected to your host,
- you'll need to enable public broadcasting by pressing reset when the faster, blue blink
- is happening on start up. The device will reset and the second, blue blink will be solid
- when done successfully.
-
+
See the online documentation
+ for platform specific notes on how to use Bluetooth. Note that CircuitPython boards with nrf chips need
+ CircuitPython 7.0.0 or newer .
+
+
The first time a device is connected to your host, you'll need to enable
+ public broadcasting by pressing reset (or bootsel on some devices) when the faster, blue blink
+ is happening on start up. The device will reset and the second, blue blink will be solid
+ when done successfully.
Request Bluetooth Device
-
-
-
-
Bond Device
-
Once you are connected, we need to prompt a bond. Without this CircuitPython boards with
- USB won't continue to advertise after a hard reset or powerloss. This button also loads
- code.py from the device so click it even if the device has been connected before.
-
- Bond Bluetooth Device
-
+
@@ -274,6 +270,14 @@ Navigate to your Device
Once your device is connected to your Local Area Network, you can navigate to
http://circuitpython.local/code/ . This opens
a page on your device that loads this website onto the device and to avoid any cross domain security issues.
+ If your device doesn't support the .local domain or the connection times out, connect with serial to read the
+ IP address assigned to your device, then open http://device-ip-address:80/code/ from another tab in your browser
+
+
+
+
@@ -308,11 +312,16 @@ Select Serial Device
Select USB Host Folder
Select the root folder of your device. This is typically the CIRCUITPY Drive on your computer unless you renamed it. If your device does not appear as a drive on your computer, it will need to have the USB Host functionality enabled.
- Use
+
Select New Folder
+
diff --git a/js/common/ble-file-transfer.js b/js/common/ble-file-transfer.js
index fd7abf9..288f91d 100644
--- a/js/common/ble-file-transfer.js
+++ b/js/common/ble-file-transfer.js
@@ -1,4 +1,5 @@
import {FileTransferClient as BLEFileTransferClient} from '@adafruit/ble-file-transfer-js';
+//import {FileTransferClient as BLEFileTransferClient} from '../../../ble-file-transfer-js/adafruit-ble-file-transfer.js';
// Wrapper for BLEFileTransferClient to add additional functionality
class FileTransferClient extends BLEFileTransferClient {
@@ -6,6 +7,22 @@ class FileTransferClient extends BLEFileTransferClient {
super(bleDevice, bufferSize);
}
+ async readOnly() {
+ let readonly = false;
+ return false;
+ // Check if the device is read only
+ console.log("Checking if device is read only");
+ // Attempt to write a 0-byte temp file and remove it
+ const testPath = '/._ble_readonly_check';
+ try {
+ await this.writeFile(testPath, 0, new Uint8Array(0));
+ await this.deleteFile(testPath);
+ } catch (e) {
+ readonly = true;
+ }
+ return readonly;
+ }
+
async versionInfo() {
// Possibly open /boot_out.txt and read the version info
let versionInfo = {};
diff --git a/js/common/dialogs.js b/js/common/dialogs.js
index 73b87e1..74bb077 100644
--- a/js/common/dialogs.js
+++ b/js/common/dialogs.js
@@ -195,6 +195,10 @@ class GenericModal {
this._closeModal();
}
+ isOpen() {
+ return this._currentModal !== null;
+ }
+
isVisible() {
var style = window.getComputedStyle(this._currentModal);
return style.display !== 'none';
diff --git a/js/common/file_dialog.js b/js/common/file_dialog.js
index 3875482..3e05266 100644
--- a/js/common/file_dialog.js
+++ b/js/common/file_dialog.js
@@ -291,8 +291,9 @@ class FileDialog extends GenericModal {
} else if (clickedItem.getAttribute("data-type") != "folder") {
this._getElement('fileNameField').value = clickedItem.querySelector("span").innerHTML;
}
-
- this._lastSelectedNode = clickedItem;
+ if (this._lastSelectedNode == null || !modifierKeys.includes(MODIFIER_SHIFT)) {
+ this._lastSelectedNode = clickedItem;
+ }
this._setElementEnabled('okButton', !this._multipleItemsSelected() && clickedItem.getAttribute("data-type") != "bin");
this._updateToolbar();
}
@@ -444,13 +445,12 @@ class FileDialog extends GenericModal {
}
for (let filename of filenames) {
- // Delete the item
- await this._showBusy(this._fileHelper.delete(filename));
+ await this._showBusy(this._fileHelper.delete(this._currentPath + filename));
}
// Refresh the file list
await this._openFolder();
- };
+ }
async _handleUploadButton() {
if (this._readOnlyMode) return;
@@ -670,12 +670,16 @@ class FileDialog extends GenericModal {
}
// Rename the file, by moving in the same folder
- await this._showBusy(
- this._fileHelper.move(
- this._currentPath + oldName,
- this._currentPath + newName
- )
- );
+ try {
+ await this._showBusy(
+ this._fileHelper.move(
+ this._currentPath + oldName,
+ this._currentPath + newName
+ )
+ );
+ } catch (error) {
+ console.error(error);
+ }
// Refresh the file list
await this._openFolder();
diff --git a/js/common/fsapi-file-transfer.js b/js/common/fsapi-file-transfer.js
index d8a0af5..efc242b 100644
--- a/js/common/fsapi-file-transfer.js
+++ b/js/common/fsapi-file-transfer.js
@@ -289,7 +289,18 @@ class FileTransferClient {
const [parentFolder, itemName] = this._splitPath(path);
const parentFolderHandle = await this._getSubfolderHandle(parentFolder);
- await parentFolderHandle.removeEntry(itemName);
+ try {
+ await parentFolderHandle.removeEntry(itemName, {recursive: true});
+ } catch (error) {
+ // If this was a folder with items inside, a NotFoundError is thrown due to a bug in the browser
+ if (error.name == 'NotFoundError') {
+ // Recursive items should be removed at this point,
+ // so attempt again without recursive
+ await parentFolderHandle.removeEntry(itemName);
+ } else {
+ throw error;
+ }
+ }
return true;
}
diff --git a/js/common/plotter.js b/js/common/plotter.js
index c80a8e8..f0e6303 100644
--- a/js/common/plotter.js
+++ b/js/common/plotter.js
@@ -48,7 +48,7 @@ export function plotValues(chartObj, serialMessage, bufferSize) {
// handle possible tuple in textLine
if (textLine.startsWith("(") && textLine.endsWith(")")) {
- textValues = textLine.substring(1, textLine.length - 1).trim();
+ let textValues = textLine.substring(1, textLine.length - 1).trim();
// Python tuples can end with a comma, but JS arrays cannot
if (textValues.endsWith(",")) {
textValues = textValues.substring(0, textValues.length - 1);
diff --git a/js/common/utilities.js b/js/common/utilities.js
index 25105f7..0b9f881 100644
--- a/js/common/utilities.js
+++ b/js/common/utilities.js
@@ -56,6 +56,25 @@ function isLocal() {
return (isMdns() || location.hostname == "localhost" || isIp()) && (location.pathname == "/code/");
}
+// Test to see if browser is running on Microsoft Windows OS
+function isMicrosoftWindows() {
+ // Newer test on Chromium
+ if (navigator.userAgentData?.platform === "Windows") {
+ return true;
+ } else if (navigator.userAgent.includes("Windows")) {
+ return true;
+ }
+ return false;
+}
+
+// Test to see if browser is running on Microsoft Windows OS
+function isChromeOs() {
+ if (navigator.userAgent.includes("CrOS")) {
+ return true;
+ }
+ return false;
+}
+
// Parse out the url parameters from the current url
function getUrlParams() {
// This should look for and validate very specific values
@@ -146,6 +165,8 @@ export {
isMdns,
isIp,
isLocal,
+ isMicrosoftWindows,
+ isChromeOs,
getUrlParams,
getUrlParam,
timeout,
diff --git a/js/layout.js b/js/layout.js
index 216899a..8323a67 100644
--- a/js/layout.js
+++ b/js/layout.js
@@ -135,8 +135,8 @@ function refitTerminal() {
let viewportHeight = window.innerHeight;
let terminalHeight = viewportHeight - headerHeight - footerBarHeight - serialBarHeight;
let terminalWidth = document.getElementById('serial-page').offsetWidth;
- let screen = document.querySelector('.xterm-screen');
- if (screen) {
+ let xterm_screen = document.querySelector('.xterm-screen');
+ if (xterm_screen) {
let cols = Math.floor(terminalWidth / TERMINAL_COL_WIDTH);
let rows = Math.floor(terminalHeight / TERMINAL_ROW_HEIGHT);
if (cols < MINIMUM_COLS) {
@@ -145,8 +145,13 @@ function refitTerminal() {
if (rows < MINIMUM_ROWS) {
rows = MINIMUM_ROWS;
}
- screen.style.width = (cols * TERMINAL_COL_WIDTH) + 'px';
- screen.style.height = (rows * TERMINAL_ROW_HEIGHT) + 'px';
+ xterm_screen.style.width = (cols * TERMINAL_COL_WIDTH) + 'px';
+ xterm_screen.style.height = (rows * TERMINAL_ROW_HEIGHT) + 'px';
+ let xterm_rows = document.querySelector('.xterm-rows');
+ if (xterm_rows) {
+ xterm_rows.style.height = (rows * TERMINAL_ROW_HEIGHT) + 'px';
+ }
+ state.terminal.resize(cols, rows);
}
});
});
diff --git a/js/script.js b/js/script.js
index f18886d..6b32d71 100644
--- a/js/script.js
+++ b/js/script.js
@@ -33,6 +33,7 @@ let unchanged = 0;
let connectionPromise = null;
const btnRestart = document.querySelector('.btn-restart');
+const btnHalt = document.querySelector('.btn-halt');
const btnPlotter = document.querySelector('.btn-plotter');
const btnClear = document.querySelector('.btn-clear');
const btnConnect = document.querySelectorAll('.btn-connect');
@@ -130,6 +131,14 @@ btnRestart.addEventListener('click', async function(e) {
}
});
+// Halt Button
+btnHalt.addEventListener('click', async function(e) {
+ if (await checkConnected()) {
+ // Perform a device soft halt
+ await workflow.haltScript();
+ }
+});
+
// Clear Button
btnClear.addEventListener('click', async function(e) {
if (workflow.plotterChart){
diff --git a/js/workflows/ble.js b/js/workflows/ble.js
index 8ff6f0c..c2ad323 100644
--- a/js/workflows/ble.js
+++ b/js/workflows/ble.js
@@ -14,7 +14,7 @@ const bleNusCharTXUUID = 'adaf0003-4369-7263-7569-74507974686e';
const BYTES_PER_WRITE = 20;
-let btnRequestBluetoothDevice, btnBond, btnReconnect;
+let btnRequestBluetoothDevice, btnReconnect;
class BLEWorkflow extends Workflow {
constructor() {
@@ -30,10 +30,9 @@ class BLEWorkflow extends Workflow {
this.partialWrites = true;
this.type = CONNTYPE.Ble;
this.buttonStates = [
- {reconnect: false, request: false, bond: false},
- {reconnect: false, request: true, bond: false},
- {reconnect: true, request: true, bond: false},
- {reconnect: false, request: false, bond: true},
+ {reconnect: false, request: false},
+ {reconnect: false, request: true},
+ {reconnect: true, request: true},
];
}
@@ -53,18 +52,15 @@ class BLEWorkflow extends Workflow {
let p = this.connectDialog.open();
let modal = this.connectDialog.getModal();
btnRequestBluetoothDevice = modal.querySelector('#requestBluetoothDevice');
- btnBond = modal.querySelector('#promptBond');
btnReconnect = modal.querySelector('#bleReconnect');
// Map the button states to the buttons
this.connectButtons = {
reconnect: btnReconnect,
- request: btnRequestBluetoothDevice,
- bond: btnBond
+ request: btnRequestBluetoothDevice
};
btnRequestBluetoothDevice.addEventListener('click', this.onRequestBluetoothDeviceButtonClick.bind(this));
- btnBond.addEventListener('click', this.onBond.bind(this));
btnReconnect.addEventListener('click', this.reconnectButtonHandler.bind(this));
// Check if Web Bluetooth is available
@@ -74,11 +70,12 @@ class BLEWorkflow extends Workflow {
stepOne.classList.add("hidden");
}
try {
+ this.clearConnectStatus();
const devices = await navigator.bluetooth.getDevices();
- console.log(devices);
this.connectionStep(devices.length > 0 ? 2 : 1);
- } catch (e) {
- console.log("New Permissions backend for Web Bluetooth not enabled. Go to chrome://flags/#enable-web-bluetooth-new-permissions-backend to enable.", e);
+ } catch (error) {
+ console.error(error);
+ this.showConnectStatus(this._suggestBLEConnectActions(error));
}
} else {
modal.querySelectorAll('.step:not(:first-of-type)').forEach((stepItem) => {
@@ -131,7 +128,7 @@ class BLEWorkflow extends Workflow {
}
catch (error) {
console.error(error);
- await this._showMessage(error);
+ this.showConnectStatus(this._suggestBLEConnectActions(error));
}
}
}
@@ -153,11 +150,15 @@ class BLEWorkflow extends Workflow {
abortController.abort();
console.log('Connecting to GATT Server from "' + device.name + '"...');
try {
- await device.gatt.connect();
+ this.bleServer = await device.gatt.connect();
} catch (error) {
- await this._showMessage("Failed to connect to device. Try forgetting device from OS bluetooth devices and try again.");
+ console.log(error);
+ // TODO(ericzundel): Add to suggestBLEConnectAction if we can determine the exception type
+ this.showConnectStatus("Failed to connect to device. Try forgetting device from OS bluetooth devices and try again.");
+ // Disable the reconnect button
+ this.connectionStep(1);
}
- if (device.gatt.connected) {
+ if (this.bleServer && this.bleServer.connected) {
console.log('> Bluetooth device "' + device.name + ' connected.');
await this.switchToDevice(device);
} else {
@@ -168,78 +169,58 @@ class BLEWorkflow extends Workflow {
device.removeEventListener('advertisementreceived', onAdvertisementReceived.bind(this));
device.addEventListener('advertisementreceived', onAdvertisementReceived.bind(this));
- this.debugLog("connecting to " + device.name);
+ this.debugLog("Attempting to connect to " + device.name + "...");
try {
+ this.clearConnectStatus();
console.log('Watching advertisements from "' + device.name + '"...');
+ console.log('If no advertisements are received, make sure the device is powered on and in range. You can also try resetting the device.');
await device.watchAdvertisements({signal: abortController.signal});
}
catch (error) {
console.error(error);
- await this._showMessage(error);
+ this.showConnectStatus(this._suggestBLEConnectActions(error));
}
}
// Request Bluetooth Device
async onRequestBluetoothDeviceButtonClick(e) {
- //try {
- console.log('Requesting any Bluetooth device...');
- this.debugLog("Requesting device. Cancel if empty and try existing");
- let device = await this.requestDevice();
+ console.log('Requesting any Bluetooth device...');
+ this.debugLog("Requesting device. Cancel if empty and try existing");
+ let device = await this.requestDevice();
- console.log('> Requested ' + device.name);
- await device.gatt.connect();
+ console.log('> Requested ' + device.name);
+ await this.connectToBluetoothDevice(device);
+ }
- await this.switchToDevice(device);
- /*}
- catch (error) {
- console.error(error);
- await this._showMessage(error);
- this.debugLog('No device selected. Try to connect to existing.');
- }*/
+ async onConnected(e) {
+ this.debugLog("Connected to " + this.bleDevice.name);
+ await super.onConnected(e);
}
async switchToDevice(device) {
- console.log(device);
this.bleDevice = device;
this.bleDevice.removeEventListener("gattserverdisconnected", this.onDisconnected.bind(this));
this.bleDevice.addEventListener("gattserverdisconnected", this.onDisconnected.bind(this));
- this.bleServer = this.bleDevice.gatt;
console.log("connected", this.bleServer);
- let services;
- console.log(device.gatt.connected);
- //try {
+ try {
+ let services;
services = await this.bleServer.getPrimaryServices();
- /*} catch (e) {
+ console.log(services);
+ } catch (e) {
console.log(e, e.stack);
- }*/
- console.log(services);
+ }
console.log('Initializing File Transfer Client...');
this.initFileClient(new FileTransferClient(this.bleDevice, 65536));
await this.fileHelper.bond();
await this.connectToSerial();
- // Enable/Disable UI buttons
- this.connectionStep(3);
-
await this.onConnected();
this.connectDialog.close();
await this.loadEditor();
}
- // Bond
- async onBond(e) {
- try {
- console.log("bond");
- await this.fileHelper.bond();
- console.log("bond done");
- } catch (e) {
- console.log(e, e.stack);
- }
- await this.loadEditor();
- }
-
async serialTransmit(msg) {
if (this.rxCharacteristic) {
let encoder = new TextEncoder();
@@ -272,17 +253,16 @@ class BLEWorkflow extends Workflow {
}
// Is this a new connection?
if (!this.bleDevice) {
- let devices = await navigator.bluetooth.getDevices();
- for (const device of devices) {
- await this.connectToBluetoothDevice(device);
+ try {
+ let devices = await navigator.bluetooth.getDevices();
+ for (const device of devices) {
+ await this.connectToBluetoothDevice(device);
+ }
+ } catch (error) {
+ console.error(error);
+ this.showConnectStatus(this._suggestBLEConnectActions(error));
}
}
-
- // Do we have a connection now but still need to connect serial?
- if (this.bleDevice && !this.bleServer) {
- await this.showBusy(this.bleDevice.gatt.connect());
- this.switchToDevice(this.bleDevice);
- }
}
updateConnected(connectionState) {
@@ -302,6 +282,16 @@ class BLEWorkflow extends Workflow {
async showInfo(documentState) {
return await this.infoDialog.open(this, documentState);
}
+
+ // Analyze an exception and make user friendly suggestions
+ _suggestBLEConnectActions(error) {
+ if (error.name == "TypeError" &&
+ (error.message.includes("getDevices is not a function")
+ || error.message.includes("watchAdvertisements is not a function"))) {
+ return "Bluetooth API not available. Make sure you are loading from a secure context (HTTPS), then go to chrome://flags/#enable-web-bluetooth-new-permissions-backend to enable.";
+ }
+ return `Connect via Bluetooth returned error: ${error}`;
+ }
}
export {BLEWorkflow};
diff --git a/js/workflows/usb.js b/js/workflows/usb.js
index 36605ad..d441fed 100644
--- a/js/workflows/usb.js
+++ b/js/workflows/usb.js
@@ -4,6 +4,7 @@ import {GenericModal, DeviceInfoModal} from '../common/dialogs.js';
import {FileOps} from '@adafruit/circuitpython-repl-js'; // Use this to determine which FileTransferClient to load
import {FileTransferClient as ReplFileTransferClient} from '../common/repl-file-transfer.js';
import {FileTransferClient as FSAPIFileTransferClient} from '../common/fsapi-file-transfer.js';
+import { isChromeOs, isMicrosoftWindows } from '../common/utilities.js';
let btnRequestSerialDevice, btnSelectHostFolder, btnUseHostFolder, lblWorkingfolder;
@@ -46,21 +47,34 @@ class USBWorkflow extends Workflow {
async onConnected(e) {
this.connectDialog.close();
await this.loadEditor();
+ this.debugLog("connected");
super.onConnected(e);
}
async onDisconnected(e, reconnect = true) {
if (this.reader) {
- await this.reader.cancel();
+ try {
+ await this.reader.cancel();
+ } catch (error) {
+ console.warn("Error calling reader.cancel:", error);
+ }
this.reader = null;
}
if (this.writer) {
- await this.writer.releaseLock();
+ try {
+ await this.writer.releaseLock();
+ } catch (error) {
+ console.warn("Error calling writer.releaseLock:", error);
+ }
this.writer = null;
}
if (this._serialDevice) {
- await this._serialDevice.close();
+ try {
+ await this._serialDevice.close();
+ } catch (error) {
+ console.warn("Error calling _serialDevice.close:", error);
+ }
this._serialDevice = null;
}
@@ -100,6 +114,7 @@ class USBWorkflow extends Workflow {
// the device on the stored port is currently connected by checking if the
// readable and writable properties are null.
+ // Can throw a Security Error if permissions are not granted
let allDevices = await navigator.serial.getPorts();
let connectedDevices = [];
for (let device of allDevices) {
@@ -112,7 +127,8 @@ class USBWorkflow extends Workflow {
if (connectedDevices.length == 1) {
device = connectedDevices[0];
- console.log(await device.getInfo());
+ deviceInfo = await device.getInfo()
+ console.log(`Got previously connected device: ${deviceInfo}`);
try {
// Attempt to connect to the saved device. If it's not found, this will fail.
await this._switchToDevice(device);
@@ -121,37 +137,35 @@ class USBWorkflow extends Workflow {
await device.forget();
console.log("Failed to automatically connect to saved device. Prompting user to select a device.");
+ // If the user doesn't select a port, an exception is thrown
device = await navigator.serial.requestPort();
- console.log(device);
}
} else {
- console.log('Requesting any serial device...');
- try {
- device = await navigator.serial.requestPort();
- } catch (e) {
- console.log(e);
- return false;
- }
+ console.log('No previously connected device. Prompting user to select a device.');
+ // If the user doesn't select a port, an exception is thrown
+ device = await navigator.serial.requestPort();
}
+ console.log(`Selected device: ${device}`);
+
// If we didn't automatically use a saved device
if (!this._serialDevice) {
console.log('> Requested ', device);
await this._switchToDevice(device);
}
- console.log(this._serialDevice);
+
if (this._serialDevice != null) {
+ console.log(`Current serial device is: ${this._serialDevice}. Proceeding to step 2.`);
this.connectionStep(2);
return true;
}
-
+ console.log("Couldn't connect to serial port");
return false;
}
async showConnect(documentState) {
let p = this.connectDialog.open();
let modal = this.connectDialog.getModal();
-
btnRequestSerialDevice = modal.querySelector('#requestSerialDevice');
btnSelectHostFolder = modal.querySelector('#selectHostFolder');
btnUseHostFolder = modal.querySelector('#useHostFolder');
@@ -165,14 +179,14 @@ class USBWorkflow extends Workflow {
btnRequestSerialDevice.disabled = true;
btnSelectHostFolder.disabled = true;
+ this.clearConnectStatus();
let serialConnect = async (event) => {
try {
+ this.clearConnectStatus();
await this.connectToSerial();
} catch (e) {
- //console.log(e);
- //alert(e.message);
- //alert("Unable to connect to device. Make sure it is not already in use.");
- // TODO: I think this also occurs if the user cancels the requestPort dialog
+ console.log('connectToSerial() returned error: ', e);
+ this.showConnectStatus(this._suggestSerialConnectActions(e));
}
};
btnRequestSerialDevice.removeEventListener('click', serialConnect);
@@ -180,7 +194,12 @@ class USBWorkflow extends Workflow {
btnSelectHostFolder.removeEventListener('click', this._btnSelectHostFolderCallback)
this._btnSelectHostFolderCallback = async (event) => {
- await this._selectHostFolder();
+ try {
+ this.clearConnectStatus();
+ await this._selectHostFolder();
+ } catch (e) {
+ this.showConnectStatus(this._suggestFileConnectActions(e));
+ }
};
btnSelectHostFolder.addEventListener('click', this._btnSelectHostFolderCallback);
@@ -247,7 +266,11 @@ class USBWorkflow extends Workflow {
console.log("New folder name:", folderName);
if (folderName) {
// Set the working folder label
- lblWorkingfolder.innerHTML = folderName;
+ if (isMicrosoftWindows() || isChromeOs()) {
+ lblWorkingfolder.innerHTML = "OK";
+ } else {
+ lblWorkingfolder.innerHTML = `Use ${folderName}`;
+ }
btnUseHostFolder.classList.remove("hidden");
btnSelectHostFolder.innerHTML = "Select Different Folder";
btnSelectHostFolder.classList.add("inverted");
@@ -262,16 +285,19 @@ class USBWorkflow extends Workflow {
device.addEventListener("message", this._messageCallback);
let onDisconnect = async (e) => {
- await this.onDisconnected(e, false);
+ try {
+ await this.onDisconnected(e, false);
+ } catch (error) {
+ console.warn("Error calling onDisconnected (maybe already disconnected):", error);
+ }
};
device.removeEventListener("disconnect", onDisconnect);
device.addEventListener("disconnect", onDisconnect);
this._serialDevice = device;
console.log("switch to", this._serialDevice);
- await this._serialDevice.open({baudRate: 115200}); // TODO: Will fail if something else is already connected or it isn't found.
-
- // Start the read loop
+ await this._serialDevice.open({baudRate: 115200}); // Throws if something else is already connected or it isn't found.
+ console.log("Starting Read Loop");
this._readLoopPromise = this._readSerialLoop().catch(
async function(error) {
await this.onDisconnected();
@@ -368,6 +394,29 @@ print(binascii.hexlify(microcontroller.cpu.uid).decode('ascii').upper())`
console.log("Read Loop Stopped. Closing Serial Port.");
}
+ // Analyzes the error returned from the WebSerial API and returns human readable feedback.
+ _suggestSerialConnectActions(error) {
+ if (error.name == "NetworkError" && error.message.includes("Failed to open serial port")) {
+ return "The serial port could not be opened. Make sure the correct port is selected and no other program is using it. For more information, see the JavaScript console.";
+ } else if (error.name == "NotFoundError" && error.message.includes("No port selected")) {
+ return "No serial port was selected. Press the 'Connect to Device' button to try again.";
+ } else if (error.name == "SecurityError") {
+ return "Permissions to access the serial port were not granted. Please check your browser settings and try again.";
+ }
+ return `Connect to Serial Port returned error: ${error}`;
+ }
+
+ // Analyzes the error from the FSAPI and returns human readable feedback
+ _suggestFileConnectActions(error) {
+ if (error.name == "SecurityError") {
+ return "Permissions to access the filesystem were not granted. Please check your browser settings and try again.";
+ } else if (error.name == "AbortError") {
+ return "No folder selected. Press the 'Select New Folder' button to try again.";
+ } else if (error.name == "TypeError")
+ return `Connect to Filesystem returned error: ${error}`;
+
+ }
+
async showInfo(documentState) {
return await this.infoDialog.open(this, documentState);
}
diff --git a/js/workflows/web.js b/js/workflows/web.js
index 5c26438..7e0872e 100644
--- a/js/workflows/web.js
+++ b/js/workflows/web.js
@@ -59,6 +59,7 @@ class WebWorkflow extends Workflow {
}
async onConnected(e) {
+ this.debugLog("connected");
await super.onConnected(e);
//this.connIntervalId = setInterval(this._checkConnection.bind(this), PING_INTERVAL_MS);
}
diff --git a/js/workflows/workflow.js b/js/workflows/workflow.js
index 661acb0..33c7ada 100644
--- a/js/workflows/workflow.js
+++ b/js/workflows/workflow.js
@@ -86,11 +86,16 @@ class Workflow {
}
async connect() {
+ this.clearConnectStatus();
return await this.available();
}
async restartDevice() {
- this.repl.softRestart();
+ await this.repl.softRestart();
+ }
+
+ async haltScript() {
+ await this.repl.interruptCode();
}
makeDocState(document, docChangePos) {
@@ -102,6 +107,7 @@ class Workflow {
}
async onDisconnected(e, reconnect = true) {
+ console.log("onDisconnected called in workflow");
this.debugLog("disconnected");
this.updateConnected(CONNSTATE.disconnected);
// Update Common UI Elements
@@ -114,7 +120,6 @@ class Workflow {
}
async onConnected(e) {
- this.debugLog("connected");
console.log("Connected!");
this.updateConnected(CONNSTATE.connected);
if (this.connectDialog) {
@@ -182,6 +187,7 @@ class Workflow {
}
this.terminalTitle.textContent = title;
+ this.terminalTitle.title = title;
}
async showConnect(documentState) {
@@ -213,7 +219,9 @@ class Workflow {
} else {
path = path.slice(1, -3);
path = path.replace(/\//g, ".");
- await (this.repl.runCode("import " + path));
+ this.repl.writeToTerminal("\r\nRunning 'import " + path + "'...\r\n");
+ this.repl.writeToTerminal(await (this.repl.runCode("import " + path)));
+ this.repl.writeToTerminal("\r\nCode done running.\r\n");
}
}
@@ -313,6 +321,11 @@ class Workflow {
// Handle the different button states for various connection steps
connectionStep(step) {
+ // Check if a dialog exists
+ if (!this.connectDialog.isOpen()) {
+ return;
+ }
+
if (step < 0) step = 0;
if (step > this.buttonStates.length - 1) step = this.buttonStates.length - 1;
@@ -337,6 +350,32 @@ class Workflow {
}
}
}
+
+ clearConnectStatus(modal) {
+ // Check if a dialog exists
+ if (!this.connectDialog.isOpen()) {
+ return;
+ }
+
+ try {
+ const modal = this.connectDialog.getModal();
+ modal.querySelector('.connect-status').hidden = true;
+ } catch (e) {
+ console.log("Modal not active on clearStatus()", e);
+ }
+ }
+
+ showConnectStatus(message) {
+ try {
+ const modal = this.connectDialog.getModal();
+ const statusBox = modal.querySelector('.connect-status');
+ statusBox.hidden = false;
+ let statusContentBox = statusBox.querySelector('.connect-status-content');
+ statusContentBox.innerHTML = message;
+ } catch (e) {
+ console.log("Modal not active on showStatus()", e);
+ }
+ }
}
export {
diff --git a/package-lock.json b/package-lock.json
index 80bbf3e..cc612cf 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8,33 +8,35 @@
"name": "web-editor",
"version": "0.0.0",
"dependencies": {
- "@adafruit/ble-file-transfer-js": "adafruit/ble-file-transfer-js#1.0.2",
+ "@adafruit/ble-file-transfer-js": "adafruit/ble-file-transfer-js#1.0.4",
"@adafruit/circuitpython-repl-js": "adafruit/circuitpython-repl-js#3.2.4",
"@codemirror/lang-python": "^6.2.1",
- "@fortawesome/fontawesome-free": "^7.0.0",
+ "@fortawesome/fontawesome-free": "^7.1.0",
+ "@rollup/rollup-linux-x64-gnu": "^4.53.2",
"@xterm/addon-fit": "^0.10.0",
"@xterm/addon-web-links": "^0.11.0",
"@xterm/xterm": "^5.5.0",
- "chart.js": "^4.5.0",
+ "chart.js": "^4.5.1",
"codemirror": "^6.0.2",
"file-saver": "^2.0.5",
- "focus-trap": "^7.6.1",
+ "focus-trap": "^7.6.6",
"idb-keyval": "^6.2.2",
"jszip": "^3.10.1"
},
"devDependencies": {
- "sass": "^1.90.0",
- "vite": "^7.1.3",
- "vite-plugin-mkcert": "^1.17.8"
+ "sass": "^1.94.0",
+ "vite": "^7.2.2",
+ "vite-plugin-mkcert": "^1.17.9"
},
"optionalDependencies": {
- "@rollup/rollup-linux-x64-gnu": "^4.48.1"
+ "@rollup/rollup-linux-x64-gnu": "^4.53.2"
}
},
"node_modules/@adafruit/ble-file-transfer-js": {
"name": "@adafruit/ble-file-transfer",
"version": "1.0.2",
- "resolved": "git+ssh://git@github.com/adafruit/ble-file-transfer-js.git#f85c66c2dec4b4019885eb3b7e2f4b8e3a4ab6a6",
+ "resolved": "git+ssh://git@github.com/adafruit/ble-file-transfer-js.git#585c05f25f362bce498324e7966f4768ba6224dd",
+ "integrity": "sha512-TSOV5Mc9JEJ6F8ZBra7JMkcSEyVtfEP4E7VHwlVN2whREu6dpzngl5hFdZvF5cXbE3OSM3WaSJ7LxGrKZE0mEg==",
"license": "MIT"
},
"node_modules/@adafruit/circuitpython-repl-js": {
@@ -43,23 +45,21 @@
"license": "MIT"
},
"node_modules/@codemirror/autocomplete": {
- "version": "6.16.2",
+ "version": "6.18.7",
+ "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.18.7.tgz",
+ "integrity": "sha512-8EzdeIoWPJDsMBwz3zdzwXnUpCzMiCyz5/A3FIPpriaclFCGDkAzK13sMcnsu5rowqiyeQN2Vs2TsOcoDPZirQ==",
"license": "MIT",
"dependencies": {
"@codemirror/language": "^6.0.0",
"@codemirror/state": "^6.0.0",
"@codemirror/view": "^6.17.0",
"@lezer/common": "^1.0.0"
- },
- "peerDependencies": {
- "@codemirror/language": "^6.0.0",
- "@codemirror/state": "^6.0.0",
- "@codemirror/view": "^6.0.0",
- "@lezer/common": "^1.0.0"
}
},
"node_modules/@codemirror/commands": {
- "version": "6.6.0",
+ "version": "6.8.1",
+ "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.8.1.tgz",
+ "integrity": "sha512-KlGVYufHMQzxbdQONiLyGQDUW0itrLZwq3CcY7xpv9ZLRHqzkBSoteocBHtMCoY7/Ci4xhzSrToIeLg7FxHuaw==",
"license": "MIT",
"dependencies": {
"@codemirror/language": "^6.0.0",
@@ -82,7 +82,9 @@
}
},
"node_modules/@codemirror/language": {
- "version": "6.10.2",
+ "version": "6.11.3",
+ "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.11.3.tgz",
+ "integrity": "sha512-9HBM2XnwDj7fnu0551HkGdrUrrqmYq/WC5iv6nbY2WdicXdGbhR/gfbZOH73Aqj4351alY1+aoG9rCNfiwS1RA==",
"license": "MIT",
"dependencies": {
"@codemirror/state": "^6.0.0",
@@ -94,16 +96,20 @@
}
},
"node_modules/@codemirror/lint": {
- "version": "6.8.0",
+ "version": "6.8.5",
+ "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.8.5.tgz",
+ "integrity": "sha512-s3n3KisH7dx3vsoeGMxsbRAgKe4O1vbrnKBClm99PU0fWxmxsx5rR2PfqQgIt+2MMJBHbiJ5rfIdLYfB9NNvsA==",
"license": "MIT",
"dependencies": {
"@codemirror/state": "^6.0.0",
- "@codemirror/view": "^6.0.0",
+ "@codemirror/view": "^6.35.0",
"crelt": "^1.0.5"
}
},
"node_modules/@codemirror/search": {
- "version": "6.5.6",
+ "version": "6.5.11",
+ "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.5.11.tgz",
+ "integrity": "sha512-KmWepDE6jUdL6n8cAAqIpRmLPBZ5ZKnicE8oGU/s3QrAVID+0VhLFrzUucVKHG5035/BSykhExDL/Xm7dHthiA==",
"license": "MIT",
"dependencies": {
"@codemirror/state": "^6.0.0",
@@ -112,22 +118,30 @@
}
},
"node_modules/@codemirror/state": {
- "version": "6.4.1",
- "license": "MIT"
+ "version": "6.5.2",
+ "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.5.2.tgz",
+ "integrity": "sha512-FVqsPqtPWKVVL3dPSxy8wEF/ymIEuVzF1PK3VbUgrxXpJUSHQWWZz4JMToquRxnkw+36LTamCZG2iua2Ptq0fA==",
+ "license": "MIT",
+ "dependencies": {
+ "@marijn/find-cluster-break": "^1.0.0"
+ }
},
"node_modules/@codemirror/view": {
- "version": "6.28.1",
+ "version": "6.38.2",
+ "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.38.2.tgz",
+ "integrity": "sha512-bTWAJxL6EOFLPzTx+O5P5xAO3gTqpatQ2b/ARQ8itfU/v2LlpS3pH2fkL0A3E/Fx8Y2St2KES7ZEV0sHTsSW/A==",
"license": "MIT",
"dependencies": {
- "@codemirror/state": "^6.4.0",
+ "@codemirror/state": "^6.5.0",
+ "crelt": "^1.0.6",
"style-mod": "^4.1.0",
"w3c-keyname": "^2.2.4"
}
},
"node_modules/@esbuild/aix-ppc64": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz",
- "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==",
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz",
+ "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==",
"cpu": [
"ppc64"
],
@@ -142,9 +156,9 @@
}
},
"node_modules/@esbuild/android-arm": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz",
- "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==",
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz",
+ "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==",
"cpu": [
"arm"
],
@@ -159,9 +173,9 @@
}
},
"node_modules/@esbuild/android-arm64": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz",
- "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==",
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz",
+ "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==",
"cpu": [
"arm64"
],
@@ -176,9 +190,9 @@
}
},
"node_modules/@esbuild/android-x64": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz",
- "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==",
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz",
+ "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==",
"cpu": [
"x64"
],
@@ -193,9 +207,9 @@
}
},
"node_modules/@esbuild/darwin-arm64": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz",
- "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==",
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz",
+ "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==",
"cpu": [
"arm64"
],
@@ -210,9 +224,9 @@
}
},
"node_modules/@esbuild/darwin-x64": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz",
- "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==",
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz",
+ "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==",
"cpu": [
"x64"
],
@@ -227,9 +241,9 @@
}
},
"node_modules/@esbuild/freebsd-arm64": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz",
- "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==",
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz",
+ "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==",
"cpu": [
"arm64"
],
@@ -244,9 +258,9 @@
}
},
"node_modules/@esbuild/freebsd-x64": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz",
- "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==",
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz",
+ "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==",
"cpu": [
"x64"
],
@@ -261,9 +275,9 @@
}
},
"node_modules/@esbuild/linux-arm": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz",
- "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==",
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz",
+ "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==",
"cpu": [
"arm"
],
@@ -278,9 +292,9 @@
}
},
"node_modules/@esbuild/linux-arm64": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz",
- "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==",
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz",
+ "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==",
"cpu": [
"arm64"
],
@@ -295,9 +309,9 @@
}
},
"node_modules/@esbuild/linux-ia32": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz",
- "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==",
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz",
+ "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==",
"cpu": [
"ia32"
],
@@ -312,9 +326,9 @@
}
},
"node_modules/@esbuild/linux-loong64": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz",
- "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==",
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz",
+ "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==",
"cpu": [
"loong64"
],
@@ -329,9 +343,9 @@
}
},
"node_modules/@esbuild/linux-mips64el": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz",
- "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==",
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz",
+ "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==",
"cpu": [
"mips64el"
],
@@ -346,9 +360,9 @@
}
},
"node_modules/@esbuild/linux-ppc64": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz",
- "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==",
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz",
+ "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==",
"cpu": [
"ppc64"
],
@@ -363,9 +377,9 @@
}
},
"node_modules/@esbuild/linux-riscv64": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz",
- "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==",
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz",
+ "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==",
"cpu": [
"riscv64"
],
@@ -380,9 +394,9 @@
}
},
"node_modules/@esbuild/linux-s390x": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz",
- "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==",
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz",
+ "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==",
"cpu": [
"s390x"
],
@@ -397,9 +411,9 @@
}
},
"node_modules/@esbuild/linux-x64": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz",
- "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==",
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz",
+ "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==",
"cpu": [
"x64"
],
@@ -414,9 +428,9 @@
}
},
"node_modules/@esbuild/netbsd-arm64": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz",
- "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==",
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz",
+ "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==",
"cpu": [
"arm64"
],
@@ -431,9 +445,9 @@
}
},
"node_modules/@esbuild/netbsd-x64": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz",
- "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==",
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz",
+ "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==",
"cpu": [
"x64"
],
@@ -448,9 +462,9 @@
}
},
"node_modules/@esbuild/openbsd-arm64": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz",
- "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==",
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz",
+ "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==",
"cpu": [
"arm64"
],
@@ -465,9 +479,9 @@
}
},
"node_modules/@esbuild/openbsd-x64": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz",
- "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==",
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz",
+ "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==",
"cpu": [
"x64"
],
@@ -481,10 +495,27 @@
"node": ">=18"
}
},
+ "node_modules/@esbuild/openharmony-arm64": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz",
+ "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/@esbuild/sunos-x64": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz",
- "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==",
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz",
+ "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==",
"cpu": [
"x64"
],
@@ -499,9 +530,9 @@
}
},
"node_modules/@esbuild/win32-arm64": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz",
- "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==",
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz",
+ "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==",
"cpu": [
"arm64"
],
@@ -516,9 +547,9 @@
}
},
"node_modules/@esbuild/win32-ia32": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz",
- "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==",
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz",
+ "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==",
"cpu": [
"ia32"
],
@@ -533,9 +564,9 @@
}
},
"node_modules/@esbuild/win32-x64": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz",
- "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==",
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz",
+ "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==",
"cpu": [
"x64"
],
@@ -550,38 +581,48 @@
}
},
"node_modules/@fortawesome/fontawesome-free": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-7.0.0.tgz",
- "integrity": "sha512-X48nISrSOa89zu2VMljC4XaRf8NmgTwQBVHfS2Nu5G00ZwM31oOVrAtGxZF3b6wDYf9lJsf/Eq4cCSFKIkOWPQ==",
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-7.1.0.tgz",
+ "integrity": "sha512-+WxNld5ZCJHvPQCr/GnzCTVREyStrAJjisUPtUxG5ngDA8TMlPnKp6dddlTpai4+1GNmltAeuk1hJEkBohwZYA==",
"license": "(CC-BY-4.0 AND OFL-1.1 AND MIT)",
"engines": {
"node": ">=6"
}
},
"node_modules/@kurkle/color": {
- "version": "0.3.2",
+ "version": "0.3.4",
+ "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz",
+ "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==",
"license": "MIT"
},
"node_modules/@lezer/common": {
- "version": "1.2.1",
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.2.3.tgz",
+ "integrity": "sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==",
"license": "MIT"
},
"node_modules/@lezer/highlight": {
- "version": "1.2.0",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.1.tgz",
+ "integrity": "sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==",
"license": "MIT",
"dependencies": {
"@lezer/common": "^1.0.0"
}
},
"node_modules/@lezer/lr": {
- "version": "1.4.1",
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.2.tgz",
+ "integrity": "sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==",
"license": "MIT",
"dependencies": {
"@lezer/common": "^1.0.0"
}
},
"node_modules/@lezer/python": {
- "version": "1.1.14",
+ "version": "1.1.18",
+ "resolved": "https://registry.npmjs.org/@lezer/python/-/python-1.1.18.tgz",
+ "integrity": "sha512-31FiUrU7z9+d/ElGQLJFXl+dKOdx0jALlP3KEOsGTex8mvj+SoE1FgItcHWK/axkxCHGUSpqIHt6JAWfWu9Rhg==",
"license": "MIT",
"dependencies": {
"@lezer/common": "^1.2.0",
@@ -589,6 +630,12 @@
"@lezer/lr": "^1.0.0"
}
},
+ "node_modules/@marijn/find-cluster-break": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz",
+ "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==",
+ "license": "MIT"
+ },
"node_modules/@parcel/watcher": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz",
@@ -900,9 +947,9 @@
}
},
"node_modules/@rollup/rollup-android-arm-eabi": {
- "version": "4.44.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.44.0.tgz",
- "integrity": "sha512-xEiEE5oDW6tK4jXCAyliuntGR+amEMO7HLtdSshVuhFnKTYoeYMyXQK7pLouAJJj5KHdwdn87bfHAR2nSdNAUA==",
+ "version": "4.50.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.50.1.tgz",
+ "integrity": "sha512-HJXwzoZN4eYTdD8bVV22DN8gsPCAj3V20NHKOs8ezfXanGpmVPR7kalUHd+Y31IJp9stdB87VKPFbsGY3H/2ag==",
"cpu": [
"arm"
],
@@ -914,9 +961,9 @@
]
},
"node_modules/@rollup/rollup-android-arm64": {
- "version": "4.44.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.44.0.tgz",
- "integrity": "sha512-uNSk/TgvMbskcHxXYHzqwiyBlJ/lGcv8DaUfcnNwict8ba9GTTNxfn3/FAoFZYgkaXXAdrAA+SLyKplyi349Jw==",
+ "version": "4.50.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.50.1.tgz",
+ "integrity": "sha512-PZlsJVcjHfcH53mOImyt3bc97Ep3FJDXRpk9sMdGX0qgLmY0EIWxCag6EigerGhLVuL8lDVYNnSo8qnTElO4xw==",
"cpu": [
"arm64"
],
@@ -928,9 +975,9 @@
]
},
"node_modules/@rollup/rollup-darwin-arm64": {
- "version": "4.44.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.44.0.tgz",
- "integrity": "sha512-VGF3wy0Eq1gcEIkSCr8Ke03CWT+Pm2yveKLaDvq51pPpZza3JX/ClxXOCmTYYq3us5MvEuNRTaeyFThCKRQhOA==",
+ "version": "4.50.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.50.1.tgz",
+ "integrity": "sha512-xc6i2AuWh++oGi4ylOFPmzJOEeAa2lJeGUGb4MudOtgfyyjr4UPNK+eEWTPLvmPJIY/pgw6ssFIox23SyrkkJw==",
"cpu": [
"arm64"
],
@@ -942,9 +989,9 @@
]
},
"node_modules/@rollup/rollup-darwin-x64": {
- "version": "4.44.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.44.0.tgz",
- "integrity": "sha512-fBkyrDhwquRvrTxSGH/qqt3/T0w5Rg0L7ZIDypvBPc1/gzjJle6acCpZ36blwuwcKD/u6oCE/sRWlUAcxLWQbQ==",
+ "version": "4.50.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.50.1.tgz",
+ "integrity": "sha512-2ofU89lEpDYhdLAbRdeyz/kX3Y2lpYc6ShRnDjY35bZhd2ipuDMDi6ZTQ9NIag94K28nFMofdnKeHR7BT0CATw==",
"cpu": [
"x64"
],
@@ -956,9 +1003,9 @@
]
},
"node_modules/@rollup/rollup-freebsd-arm64": {
- "version": "4.44.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.44.0.tgz",
- "integrity": "sha512-u5AZzdQJYJXByB8giQ+r4VyfZP+walV+xHWdaFx/1VxsOn6eWJhK2Vl2eElvDJFKQBo/hcYIBg/jaKS8ZmKeNQ==",
+ "version": "4.50.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.50.1.tgz",
+ "integrity": "sha512-wOsE6H2u6PxsHY/BeFHA4VGQN3KUJFZp7QJBmDYI983fgxq5Th8FDkVuERb2l9vDMs1D5XhOrhBrnqcEY6l8ZA==",
"cpu": [
"arm64"
],
@@ -970,9 +1017,9 @@
]
},
"node_modules/@rollup/rollup-freebsd-x64": {
- "version": "4.44.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.44.0.tgz",
- "integrity": "sha512-qC0kS48c/s3EtdArkimctY7h3nHicQeEUdjJzYVJYR3ct3kWSafmn6jkNCA8InbUdge6PVx6keqjk5lVGJf99g==",
+ "version": "4.50.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.50.1.tgz",
+ "integrity": "sha512-A/xeqaHTlKbQggxCqispFAcNjycpUEHP52mwMQZUNqDUJFFYtPHCXS1VAG29uMlDzIVr+i00tSFWFLivMcoIBQ==",
"cpu": [
"x64"
],
@@ -984,9 +1031,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
- "version": "4.44.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.44.0.tgz",
- "integrity": "sha512-x+e/Z9H0RAWckn4V2OZZl6EmV0L2diuX3QB0uM1r6BvhUIv6xBPL5mrAX2E3e8N8rEHVPwFfz/ETUbV4oW9+lQ==",
+ "version": "4.50.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.50.1.tgz",
+ "integrity": "sha512-54v4okehwl5TaSIkpp97rAHGp7t3ghinRd/vyC1iXqXMfjYUTm7TfYmCzXDoHUPTTf36L8pr0E7YsD3CfB3ZDg==",
"cpu": [
"arm"
],
@@ -998,9 +1045,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm-musleabihf": {
- "version": "4.44.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.44.0.tgz",
- "integrity": "sha512-1exwiBFf4PU/8HvI8s80icyCcnAIB86MCBdst51fwFmH5dyeoWVPVgmQPcKrMtBQ0W5pAs7jBCWuRXgEpRzSCg==",
+ "version": "4.50.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.50.1.tgz",
+ "integrity": "sha512-p/LaFyajPN/0PUHjv8TNyxLiA7RwmDoVY3flXHPSzqrGcIp/c2FjwPPP5++u87DGHtw+5kSH5bCJz0mvXngYxw==",
"cpu": [
"arm"
],
@@ -1012,9 +1059,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-gnu": {
- "version": "4.44.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.44.0.tgz",
- "integrity": "sha512-ZTR2mxBHb4tK4wGf9b8SYg0Y6KQPjGpR4UWwTFdnmjB4qRtoATZ5dWn3KsDwGa5Z2ZBOE7K52L36J9LueKBdOQ==",
+ "version": "4.50.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.50.1.tgz",
+ "integrity": "sha512-2AbMhFFkTo6Ptna1zO7kAXXDLi7H9fGTbVaIq2AAYO7yzcAsuTNWPHhb2aTA6GPiP+JXh85Y8CiS54iZoj4opw==",
"cpu": [
"arm64"
],
@@ -1026,9 +1073,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-musl": {
- "version": "4.44.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.44.0.tgz",
- "integrity": "sha512-GFWfAhVhWGd4r6UxmnKRTBwP1qmModHtd5gkraeW2G490BpFOZkFtem8yuX2NyafIP/mGpRJgTJ2PwohQkUY/Q==",
+ "version": "4.50.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.50.1.tgz",
+ "integrity": "sha512-Cgef+5aZwuvesQNw9eX7g19FfKX5/pQRIyhoXLCiBOrWopjo7ycfB292TX9MDcDijiuIJlx1IzJz3IoCPfqs9w==",
"cpu": [
"arm64"
],
@@ -1040,9 +1087,9 @@
]
},
"node_modules/@rollup/rollup-linux-loongarch64-gnu": {
- "version": "4.44.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.44.0.tgz",
- "integrity": "sha512-xw+FTGcov/ejdusVOqKgMGW3c4+AgqrfvzWEVXcNP6zq2ue+lsYUgJ+5Rtn/OTJf7e2CbgTFvzLW2j0YAtj0Gg==",
+ "version": "4.50.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.50.1.tgz",
+ "integrity": "sha512-RPhTwWMzpYYrHrJAS7CmpdtHNKtt2Ueo+BlLBjfZEhYBhK00OsEqM08/7f+eohiF6poe0YRDDd8nAvwtE/Y62Q==",
"cpu": [
"loong64"
],
@@ -1053,10 +1100,10 @@
"linux"
]
},
- "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
- "version": "4.44.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.44.0.tgz",
- "integrity": "sha512-bKGibTr9IdF0zr21kMvkZT4K6NV+jjRnBoVMt2uNMG0BYWm3qOVmYnXKzx7UhwrviKnmK46IKMByMgvpdQlyJQ==",
+ "node_modules/@rollup/rollup-linux-ppc64-gnu": {
+ "version": "4.50.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.50.1.tgz",
+ "integrity": "sha512-eSGMVQw9iekut62O7eBdbiccRguuDgiPMsw++BVUg+1K7WjZXHOg/YOT9SWMzPZA+w98G+Fa1VqJgHZOHHnY0Q==",
"cpu": [
"ppc64"
],
@@ -1068,9 +1115,9 @@
]
},
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
- "version": "4.44.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.44.0.tgz",
- "integrity": "sha512-vV3cL48U5kDaKZtXrti12YRa7TyxgKAIDoYdqSIOMOFBXqFj2XbChHAtXquEn2+n78ciFgr4KIqEbydEGPxXgA==",
+ "version": "4.50.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.50.1.tgz",
+ "integrity": "sha512-S208ojx8a4ciIPrLgazF6AgdcNJzQE4+S9rsmOmDJkusvctii+ZvEuIC4v/xFqzbuP8yDjn73oBlNDgF6YGSXQ==",
"cpu": [
"riscv64"
],
@@ -1082,9 +1129,9 @@
]
},
"node_modules/@rollup/rollup-linux-riscv64-musl": {
- "version": "4.44.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.44.0.tgz",
- "integrity": "sha512-TDKO8KlHJuvTEdfw5YYFBjhFts2TR0VpZsnLLSYmB7AaohJhM8ctDSdDnUGq77hUh4m/djRafw+9zQpkOanE2Q==",
+ "version": "4.50.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.50.1.tgz",
+ "integrity": "sha512-3Ag8Ls1ggqkGUvSZWYcdgFwriy2lWo+0QlYgEFra/5JGtAd6C5Hw59oojx1DeqcA2Wds2ayRgvJ4qxVTzCHgzg==",
"cpu": [
"riscv64"
],
@@ -1096,9 +1143,9 @@
]
},
"node_modules/@rollup/rollup-linux-s390x-gnu": {
- "version": "4.44.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.44.0.tgz",
- "integrity": "sha512-8541GEyktXaw4lvnGp9m84KENcxInhAt6vPWJ9RodsB/iGjHoMB2Pp5MVBCiKIRxrxzJhGCxmNzdu+oDQ7kwRA==",
+ "version": "4.50.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.50.1.tgz",
+ "integrity": "sha512-t9YrKfaxCYe7l7ldFERE1BRg/4TATxIg+YieHQ966jwvo7ddHJxPj9cNFWLAzhkVsbBvNA4qTbPVNsZKBO4NSg==",
"cpu": [
"s390x"
],
@@ -1110,9 +1157,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.48.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.48.1.tgz",
- "integrity": "sha512-90taWXCWxTbClWuMZD0DKYohY1EovA+W5iytpE89oUPmT5O1HFdf8cuuVIylE6vCbrGdIGv85lVRzTcpTRZ+kA==",
+ "version": "4.53.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.2.tgz",
+ "integrity": "sha512-yo8d6tdfdeBArzC7T/PnHd7OypfI9cbuZzPnzLJIyKYFhAQ8SvlkKtKBMbXDxe1h03Rcr7u++nFS7tqXz87Gtw==",
"cpu": [
"x64"
],
@@ -1123,9 +1170,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-musl": {
- "version": "4.44.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.44.0.tgz",
- "integrity": "sha512-PQUobbhLTQT5yz/SPg116VJBgz+XOtXt8D1ck+sfJJhuEsMj2jSej5yTdp8CvWBSceu+WW+ibVL6dm0ptG5fcA==",
+ "version": "4.50.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.50.1.tgz",
+ "integrity": "sha512-nEvqG+0jeRmqaUMuwzlfMKwcIVffy/9KGbAGyoa26iu6eSngAYQ512bMXuqqPrlTyfqdlB9FVINs93j534UJrg==",
"cpu": [
"x64"
],
@@ -1136,10 +1183,24 @@
"linux"
]
},
+ "node_modules/@rollup/rollup-openharmony-arm64": {
+ "version": "4.50.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.50.1.tgz",
+ "integrity": "sha512-RDsLm+phmT3MJd9SNxA9MNuEAO/J2fhW8GXk62G/B4G7sLVumNFbRwDL6v5NrESb48k+QMqdGbHgEtfU0LCpbA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ]
+ },
"node_modules/@rollup/rollup-win32-arm64-msvc": {
- "version": "4.44.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.44.0.tgz",
- "integrity": "sha512-M0CpcHf8TWn+4oTxJfh7LQuTuaYeXGbk0eageVjQCKzYLsajWS/lFC94qlRqOlyC2KvRT90ZrfXULYmukeIy7w==",
+ "version": "4.50.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.50.1.tgz",
+ "integrity": "sha512-hpZB/TImk2FlAFAIsoElM3tLzq57uxnGYwplg6WDyAxbYczSi8O2eQ+H2Lx74504rwKtZ3N2g4bCUkiamzS6TQ==",
"cpu": [
"arm64"
],
@@ -1151,9 +1212,9 @@
]
},
"node_modules/@rollup/rollup-win32-ia32-msvc": {
- "version": "4.44.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.44.0.tgz",
- "integrity": "sha512-3XJ0NQtMAXTWFW8FqZKcw3gOQwBtVWP/u8TpHP3CRPXD7Pd6s8lLdH3sHWh8vqKCyyiI8xW5ltJScQmBU9j7WA==",
+ "version": "4.50.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.50.1.tgz",
+ "integrity": "sha512-SXjv8JlbzKM0fTJidX4eVsH+Wmnp0/WcD8gJxIZyR6Gay5Qcsmdbi9zVtnbkGPG8v2vMR1AD06lGWy5FLMcG7A==",
"cpu": [
"ia32"
],
@@ -1165,9 +1226,9 @@
]
},
"node_modules/@rollup/rollup-win32-x64-msvc": {
- "version": "4.44.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.44.0.tgz",
- "integrity": "sha512-Q2Mgwt+D8hd5FIPUuPDsvPR7Bguza6yTkJxspDGkZj7tBRn2y4KSWYuIXpftFSjBra76TbKerCV7rgFPQrn+wQ==",
+ "version": "4.50.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.50.1.tgz",
+ "integrity": "sha512-StxAO/8ts62KZVRAm4JZYq9+NqNsV7RvimNK+YM7ry//zebEH6meuugqW/P5OFUCjyQgui+9fUxT6d5NShvMvA==",
"cpu": [
"x64"
],
@@ -1187,6 +1248,8 @@
},
"node_modules/@xterm/addon-fit": {
"version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/@xterm/addon-fit/-/addon-fit-0.10.0.tgz",
+ "integrity": "sha512-UFYkDm4HUahf2lnEyHvio51TNGiLK66mqP2JoATy7hRZeXaGMRDr00JiSF7m63vR5WKATF605yEggJKsw0JpMQ==",
"license": "MIT",
"peerDependencies": {
"@xterm/xterm": "^5.0.0"
@@ -1194,6 +1257,8 @@
},
"node_modules/@xterm/addon-web-links": {
"version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@xterm/addon-web-links/-/addon-web-links-0.11.0.tgz",
+ "integrity": "sha512-nIHQ38pQI+a5kXnRaTgwqSHnX7KE6+4SVoceompgHL26unAxdfP6IPqUTSYPQgSwM56hsElfoNrrW5V7BUED/Q==",
"license": "MIT",
"peerDependencies": {
"@xterm/xterm": "^5.0.0"
@@ -1201,22 +1266,26 @@
},
"node_modules/@xterm/xterm": {
"version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@xterm/xterm/-/xterm-5.5.0.tgz",
+ "integrity": "sha512-hqJHYaQb5OptNunnyAnkHyM8aCjZ1MEIDTQu1iIbbTD/xops91NB5yq1ZK/dC2JDbVWtF23zUtl9JE2NqwT87A==",
"license": "MIT"
},
"node_modules/asynckit": {
"version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
"dev": true,
"license": "MIT"
},
"node_modules/axios": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz",
- "integrity": "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==",
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz",
+ "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==",
"dev": true,
"license": "MIT",
"dependencies": {
"follow-redirects": "^1.15.6",
- "form-data": "^4.0.0",
+ "form-data": "^4.0.4",
"proxy-from-env": "^1.1.0"
}
},
@@ -1236,6 +1305,8 @@
},
"node_modules/call-bind-apply-helpers": {
"version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1247,9 +1318,10 @@
}
},
"node_modules/chart.js": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.0.tgz",
- "integrity": "sha512-aYeC/jDgSEx8SHWZvANYMioYMZ2KX02W6f6uVfyteuCGcadDLcYVHdfdygsTQkQ4TKn5lghoojAsPj5pu0SnvQ==",
+ "version": "4.5.1",
+ "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.1.tgz",
+ "integrity": "sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==",
+ "license": "MIT",
"dependencies": {
"@kurkle/color": "^0.3.0"
},
@@ -1277,6 +1349,7 @@
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/codemirror/-/codemirror-6.0.2.tgz",
"integrity": "sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw==",
+ "license": "MIT",
"dependencies": {
"@codemirror/autocomplete": "^6.0.0",
"@codemirror/commands": "^6.0.0",
@@ -1289,6 +1362,8 @@
},
"node_modules/combined-stream": {
"version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1300,14 +1375,20 @@
},
"node_modules/core-util-is": {
"version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
"license": "MIT"
},
"node_modules/crelt": {
"version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz",
+ "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==",
"license": "MIT"
},
"node_modules/debug": {
- "version": "4.4.0",
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1324,6 +1405,8 @@
},
"node_modules/delayed-stream": {
"version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
"dev": true,
"license": "MIT",
"engines": {
@@ -1346,6 +1429,8 @@
},
"node_modules/dunder-proto": {
"version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1359,6 +1444,8 @@
},
"node_modules/es-define-property": {
"version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
"dev": true,
"license": "MIT",
"engines": {
@@ -1367,6 +1454,8 @@
},
"node_modules/es-errors": {
"version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -1375,6 +1464,8 @@
},
"node_modules/es-object-atoms": {
"version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1386,6 +1477,8 @@
},
"node_modules/es-set-tostringtag": {
"version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1399,9 +1492,9 @@
}
},
"node_modules/esbuild": {
- "version": "0.25.5",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz",
- "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==",
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz",
+ "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
@@ -1412,35 +1505,38 @@
"node": ">=18"
},
"optionalDependencies": {
- "@esbuild/aix-ppc64": "0.25.5",
- "@esbuild/android-arm": "0.25.5",
- "@esbuild/android-arm64": "0.25.5",
- "@esbuild/android-x64": "0.25.5",
- "@esbuild/darwin-arm64": "0.25.5",
- "@esbuild/darwin-x64": "0.25.5",
- "@esbuild/freebsd-arm64": "0.25.5",
- "@esbuild/freebsd-x64": "0.25.5",
- "@esbuild/linux-arm": "0.25.5",
- "@esbuild/linux-arm64": "0.25.5",
- "@esbuild/linux-ia32": "0.25.5",
- "@esbuild/linux-loong64": "0.25.5",
- "@esbuild/linux-mips64el": "0.25.5",
- "@esbuild/linux-ppc64": "0.25.5",
- "@esbuild/linux-riscv64": "0.25.5",
- "@esbuild/linux-s390x": "0.25.5",
- "@esbuild/linux-x64": "0.25.5",
- "@esbuild/netbsd-arm64": "0.25.5",
- "@esbuild/netbsd-x64": "0.25.5",
- "@esbuild/openbsd-arm64": "0.25.5",
- "@esbuild/openbsd-x64": "0.25.5",
- "@esbuild/sunos-x64": "0.25.5",
- "@esbuild/win32-arm64": "0.25.5",
- "@esbuild/win32-ia32": "0.25.5",
- "@esbuild/win32-x64": "0.25.5"
+ "@esbuild/aix-ppc64": "0.25.9",
+ "@esbuild/android-arm": "0.25.9",
+ "@esbuild/android-arm64": "0.25.9",
+ "@esbuild/android-x64": "0.25.9",
+ "@esbuild/darwin-arm64": "0.25.9",
+ "@esbuild/darwin-x64": "0.25.9",
+ "@esbuild/freebsd-arm64": "0.25.9",
+ "@esbuild/freebsd-x64": "0.25.9",
+ "@esbuild/linux-arm": "0.25.9",
+ "@esbuild/linux-arm64": "0.25.9",
+ "@esbuild/linux-ia32": "0.25.9",
+ "@esbuild/linux-loong64": "0.25.9",
+ "@esbuild/linux-mips64el": "0.25.9",
+ "@esbuild/linux-ppc64": "0.25.9",
+ "@esbuild/linux-riscv64": "0.25.9",
+ "@esbuild/linux-s390x": "0.25.9",
+ "@esbuild/linux-x64": "0.25.9",
+ "@esbuild/netbsd-arm64": "0.25.9",
+ "@esbuild/netbsd-x64": "0.25.9",
+ "@esbuild/openbsd-arm64": "0.25.9",
+ "@esbuild/openbsd-x64": "0.25.9",
+ "@esbuild/openharmony-arm64": "0.25.9",
+ "@esbuild/sunos-x64": "0.25.9",
+ "@esbuild/win32-arm64": "0.25.9",
+ "@esbuild/win32-ia32": "0.25.9",
+ "@esbuild/win32-x64": "0.25.9"
}
},
"node_modules/file-saver": {
"version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz",
+ "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==",
"license": "MIT"
},
"node_modules/fill-range": {
@@ -1458,16 +1554,18 @@
}
},
"node_modules/focus-trap": {
- "version": "7.6.5",
- "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.6.5.tgz",
- "integrity": "sha512-7Ke1jyybbbPZyZXFxEftUtxFGLMpE2n6A+z//m4CRDlj0hW+o3iYSmh8nFlYMurOiJVDmJRilUQtJr08KfIxlg==",
+ "version": "7.6.6",
+ "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.6.6.tgz",
+ "integrity": "sha512-v/Z8bvMCajtx4mEXmOo7QEsIzlIOqRXTIwgUfsFOF9gEsespdbD0AkPIka1bSXZ8Y8oZ+2IVDQZePkTfEHZl7Q==",
"license": "MIT",
"dependencies": {
- "tabbable": "^6.2.0"
+ "tabbable": "^6.3.0"
}
},
"node_modules/follow-redirects": {
- "version": "1.15.9",
+ "version": "1.15.11",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz",
+ "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==",
"dev": true,
"funding": [
{
@@ -1519,6 +1617,8 @@
},
"node_modules/function-bind": {
"version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
"dev": true,
"license": "MIT",
"funding": {
@@ -1526,16 +1626,18 @@
}
},
"node_modules/get-intrinsic": {
- "version": "1.2.7",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "call-bind-apply-helpers": "^1.0.1",
+ "call-bind-apply-helpers": "^1.0.2",
"es-define-property": "^1.0.1",
"es-errors": "^1.3.0",
- "es-object-atoms": "^1.0.0",
+ "es-object-atoms": "^1.1.1",
"function-bind": "^1.1.2",
- "get-proto": "^1.0.0",
+ "get-proto": "^1.0.1",
"gopd": "^1.2.0",
"has-symbols": "^1.1.0",
"hasown": "^2.0.2",
@@ -1550,6 +1652,8 @@
},
"node_modules/get-proto": {
"version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1562,6 +1666,8 @@
},
"node_modules/gopd": {
"version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -1573,6 +1679,8 @@
},
"node_modules/has-symbols": {
"version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
"dev": true,
"license": "MIT",
"engines": {
@@ -1584,6 +1692,8 @@
},
"node_modules/has-tostringtag": {
"version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1598,6 +1708,8 @@
},
"node_modules/hasown": {
"version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1610,10 +1722,13 @@
"node_modules/idb-keyval": {
"version": "6.2.2",
"resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.2.tgz",
- "integrity": "sha512-yjD9nARJ/jb1g+CvD0tlhUHOrJ9Sy0P8T9MF3YaLlHnSRpwPfpTX0XIvpmw3gAJUmEu3FiICLBDPXVwyEvrleg=="
+ "integrity": "sha512-yjD9nARJ/jb1g+CvD0tlhUHOrJ9Sy0P8T9MF3YaLlHnSRpwPfpTX0XIvpmw3gAJUmEu3FiICLBDPXVwyEvrleg==",
+ "license": "Apache-2.0"
},
"node_modules/immediate": {
"version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
+ "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==",
"license": "MIT"
},
"node_modules/immutable": {
@@ -1625,6 +1740,8 @@
},
"node_modules/inherits": {
"version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"license": "ISC"
},
"node_modules/is-extglob": {
@@ -1665,10 +1782,14 @@
},
"node_modules/isarray": {
"version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
"license": "MIT"
},
"node_modules/jszip": {
"version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz",
+ "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==",
"license": "(MIT OR GPL-3.0-or-later)",
"dependencies": {
"lie": "~3.3.0",
@@ -1679,6 +1800,8 @@
},
"node_modules/lie": {
"version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz",
+ "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==",
"license": "MIT",
"dependencies": {
"immediate": "~3.0.5"
@@ -1686,6 +1809,8 @@
},
"node_modules/math-intrinsics": {
"version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
"dev": true,
"license": "MIT",
"engines": {
@@ -1709,6 +1834,8 @@
},
"node_modules/mime-db": {
"version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -1717,6 +1844,8 @@
},
"node_modules/mime-types": {
"version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1728,6 +1857,8 @@
},
"node_modules/ms": {
"version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"dev": true,
"license": "MIT"
},
@@ -1760,6 +1891,8 @@
},
"node_modules/pako": {
"version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
+ "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
"license": "(MIT AND Zlib)"
},
"node_modules/picocolors": {
@@ -1814,15 +1947,21 @@
},
"node_modules/process-nextick-args": {
"version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
"license": "MIT"
},
"node_modules/proxy-from-env": {
"version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
"dev": true,
"license": "MIT"
},
"node_modules/readable-stream": {
"version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
"license": "MIT",
"dependencies": {
"core-util-is": "~1.0.0",
@@ -1849,9 +1988,9 @@
}
},
"node_modules/rollup": {
- "version": "4.44.0",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.44.0.tgz",
- "integrity": "sha512-qHcdEzLCiktQIfwBq420pn2dP+30uzqYxv9ETm91wdt2R9AFcWfjNAmje4NWlnCIQ5RMTzVf0ZyisOKqHR6RwA==",
+ "version": "4.50.1",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.50.1.tgz",
+ "integrity": "sha512-78E9voJHwnXQMiQdiqswVLZwJIzdBKJ1GdI5Zx6XwoFKUIk09/sSrr+05QFzvYb8q6Y9pPV45zzDuYa3907TZA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1865,37 +2004,39 @@
"npm": ">=8.0.0"
},
"optionalDependencies": {
- "@rollup/rollup-android-arm-eabi": "4.44.0",
- "@rollup/rollup-android-arm64": "4.44.0",
- "@rollup/rollup-darwin-arm64": "4.44.0",
- "@rollup/rollup-darwin-x64": "4.44.0",
- "@rollup/rollup-freebsd-arm64": "4.44.0",
- "@rollup/rollup-freebsd-x64": "4.44.0",
- "@rollup/rollup-linux-arm-gnueabihf": "4.44.0",
- "@rollup/rollup-linux-arm-musleabihf": "4.44.0",
- "@rollup/rollup-linux-arm64-gnu": "4.44.0",
- "@rollup/rollup-linux-arm64-musl": "4.44.0",
- "@rollup/rollup-linux-loongarch64-gnu": "4.44.0",
- "@rollup/rollup-linux-powerpc64le-gnu": "4.44.0",
- "@rollup/rollup-linux-riscv64-gnu": "4.44.0",
- "@rollup/rollup-linux-riscv64-musl": "4.44.0",
- "@rollup/rollup-linux-s390x-gnu": "4.44.0",
- "@rollup/rollup-linux-x64-gnu": "4.44.0",
- "@rollup/rollup-linux-x64-musl": "4.44.0",
- "@rollup/rollup-win32-arm64-msvc": "4.44.0",
- "@rollup/rollup-win32-ia32-msvc": "4.44.0",
- "@rollup/rollup-win32-x64-msvc": "4.44.0",
+ "@rollup/rollup-android-arm-eabi": "4.50.1",
+ "@rollup/rollup-android-arm64": "4.50.1",
+ "@rollup/rollup-darwin-arm64": "4.50.1",
+ "@rollup/rollup-darwin-x64": "4.50.1",
+ "@rollup/rollup-freebsd-arm64": "4.50.1",
+ "@rollup/rollup-freebsd-x64": "4.50.1",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.50.1",
+ "@rollup/rollup-linux-arm-musleabihf": "4.50.1",
+ "@rollup/rollup-linux-arm64-gnu": "4.50.1",
+ "@rollup/rollup-linux-arm64-musl": "4.50.1",
+ "@rollup/rollup-linux-loongarch64-gnu": "4.50.1",
+ "@rollup/rollup-linux-ppc64-gnu": "4.50.1",
+ "@rollup/rollup-linux-riscv64-gnu": "4.50.1",
+ "@rollup/rollup-linux-riscv64-musl": "4.50.1",
+ "@rollup/rollup-linux-s390x-gnu": "4.50.1",
+ "@rollup/rollup-linux-x64-gnu": "4.50.1",
+ "@rollup/rollup-linux-x64-musl": "4.50.1",
+ "@rollup/rollup-openharmony-arm64": "4.50.1",
+ "@rollup/rollup-win32-arm64-msvc": "4.50.1",
+ "@rollup/rollup-win32-ia32-msvc": "4.50.1",
+ "@rollup/rollup-win32-x64-msvc": "4.50.1",
"fsevents": "~2.3.2"
}
},
"node_modules/rollup/node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.44.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.44.0.tgz",
- "integrity": "sha512-iUVJc3c0o8l9Sa/qlDL2Z9UP92UZZW1+EmQ4xfjTc1akr0iUFZNfxrXJ/R1T90h/ILm9iXEY6+iPrmYB3pXKjw==",
+ "version": "4.50.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.50.1.tgz",
+ "integrity": "sha512-MCgtFB2+SVNuQmmjHf+wfI4CMxy3Tk8XjA5Z//A0AKD7QXUYFMQcns91K6dEHBvZPCnhJSyDWLApk40Iq/H3tA==",
"cpu": [
"x64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
@@ -1903,12 +2044,14 @@
},
"node_modules/safe-buffer": {
"version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
"license": "MIT"
},
"node_modules/sass": {
- "version": "1.90.0",
- "resolved": "https://registry.npmjs.org/sass/-/sass-1.90.0.tgz",
- "integrity": "sha512-9GUyuksjw70uNpb1MTYWsH9MQHOHY6kwfnkafC24+7aOMZn9+rVMBxRbLvw756mrBFbIsFg6Xw9IkR2Fnn3k+Q==",
+ "version": "1.94.0",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.94.0.tgz",
+ "integrity": "sha512-Dqh7SiYcaFtdv5Wvku6QgS5IGPm281L+ZtVD1U2FJa7Q0EFRlq8Z3sjYtz6gYObsYThUOz9ArwFqPZx+1azILQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1928,6 +2071,8 @@
},
"node_modules/setimmediate": {
"version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
+ "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==",
"license": "MIT"
},
"node_modules/source-map-js": {
@@ -1942,6 +2087,8 @@
},
"node_modules/string_decoder": {
"version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"license": "MIT",
"dependencies": {
"safe-buffer": "~5.1.0"
@@ -1949,21 +2096,25 @@
},
"node_modules/style-mod": {
"version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.2.tgz",
+ "integrity": "sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==",
"license": "MIT"
},
"node_modules/tabbable": {
- "version": "6.2.0",
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.3.0.tgz",
+ "integrity": "sha512-EIHvdY5bPLuWForiR/AN2Bxngzpuwn1is4asboytXtpTgsArc+WmSJKVLlhdh71u7jFcryDqB2A8lQvj78MkyQ==",
"license": "MIT"
},
"node_modules/tinyglobby": {
- "version": "0.2.14",
- "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz",
- "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==",
+ "version": "0.2.15",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
+ "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "fdir": "^6.4.4",
- "picomatch": "^4.0.2"
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.3"
},
"engines": {
"node": ">=12.0.0"
@@ -1973,11 +2124,14 @@
}
},
"node_modules/tinyglobby/node_modules/fdir": {
- "version": "6.4.6",
- "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz",
- "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==",
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
"dev": true,
"license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ },
"peerDependencies": {
"picomatch": "^3 || ^4"
},
@@ -1988,9 +2142,9 @@
}
},
"node_modules/tinyglobby/node_modules/picomatch": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
- "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
+ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
"dev": true,
"license": "MIT",
"engines": {
@@ -2016,12 +2170,14 @@
},
"node_modules/util-deprecate": {
"version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
"license": "MIT"
},
"node_modules/vite": {
- "version": "7.1.3",
- "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.3.tgz",
- "integrity": "sha512-OOUi5zjkDxYrKhTV3V7iKsoS37VUM7v40+HuwEmcrsf11Cdx9y3DIr2Px6liIcZFwt3XSRpQvFpL3WVy7ApkGw==",
+ "version": "7.2.2",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.2.tgz",
+ "integrity": "sha512-BxAKBWmIbrDgrokdGZH1IgkIk/5mMHDreLDmCJ0qpyJaAteP8NvMhkwr/ZCQNqNH97bw/dANTE9PDzqwJghfMQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2030,7 +2186,7 @@
"picomatch": "^4.0.3",
"postcss": "^8.5.6",
"rollup": "^4.43.0",
- "tinyglobby": "^0.2.14"
+ "tinyglobby": "^0.2.15"
},
"bin": {
"vite": "bin/vite.js"
@@ -2094,13 +2250,14 @@
}
},
"node_modules/vite-plugin-mkcert": {
- "version": "1.17.8",
- "resolved": "https://registry.npmjs.org/vite-plugin-mkcert/-/vite-plugin-mkcert-1.17.8.tgz",
- "integrity": "sha512-S+4tNEyGqdZQ3RLAG54ETeO2qyURHWrVjUWKYikLAbmhh/iJ+36gDEja4OWwFyXNuvyXcZwNt5TZZR9itPeG5Q==",
+ "version": "1.17.9",
+ "resolved": "https://registry.npmjs.org/vite-plugin-mkcert/-/vite-plugin-mkcert-1.17.9.tgz",
+ "integrity": "sha512-SwI7yqp2Cq4r2XItarnHRCj2uzHPqevbxFNMLpyN+LDXd5w1vmZeM4l5X/wCZoP4mjPQYN+9+4kmE6e3nPO5fg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "axios": "^1.8.3",
- "debug": "^4.4.0",
+ "axios": "^1.12.2",
+ "debug": "^4.4.3",
"picocolors": "^1.1.1"
},
"engines": {
@@ -2143,6 +2300,8 @@
},
"node_modules/w3c-keyname": {
"version": "2.2.8",
+ "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz",
+ "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==",
"license": "MIT"
}
}
diff --git a/package.json b/package.json
index 3f5d5fc..49ae268 100644
--- a/package.json
+++ b/package.json
@@ -9,26 +9,26 @@
"preview": "vite preview"
},
"devDependencies": {
- "sass": "^1.90.0",
- "vite": "^7.1.3",
- "vite-plugin-mkcert": "^1.17.8"
+ "sass": "^1.94.0",
+ "vite": "^7.2.2",
+ "vite-plugin-mkcert": "^1.17.9"
},
"dependencies": {
- "@adafruit/ble-file-transfer-js": "adafruit/ble-file-transfer-js#1.0.2",
+ "@adafruit/ble-file-transfer-js": "adafruit/ble-file-transfer-js#1.0.4",
"@adafruit/circuitpython-repl-js": "adafruit/circuitpython-repl-js#3.2.4",
"@codemirror/lang-python": "^6.2.1",
- "@fortawesome/fontawesome-free": "^7.0.0",
+ "@fortawesome/fontawesome-free": "^7.1.0",
"@xterm/addon-fit": "^0.10.0",
"@xterm/addon-web-links": "^0.11.0",
"@xterm/xterm": "^5.5.0",
- "chart.js": "^4.5.0",
+ "chart.js": "^4.5.1",
"codemirror": "^6.0.2",
"file-saver": "^2.0.5",
- "focus-trap": "^7.6.1",
+ "focus-trap": "^7.6.6",
"idb-keyval": "^6.2.2",
"jszip": "^3.10.1"
},
"optionalDependencies": {
- "@rollup/rollup-linux-x64-gnu": "^4.48.1"
+ "@rollup/rollup-linux-x64-gnu": "^4.53.2"
}
}
diff --git a/sass/layout/_header.scss b/sass/layout/_header.scss
index 4de3d11..30d1fea 100644
--- a/sass/layout/_header.scss
+++ b/sass/layout/_header.scss
@@ -138,6 +138,9 @@
flex: auto;
overflow: hidden;
text-overflow: ellipsis;
+ white-space: nowrap;
+ flex-shrink: 1;
+ max-width: fit-content;
}
@media (max-width: $screen-xs-max) {
diff --git a/sass/layout/_layout.scss b/sass/layout/_layout.scss
index ef987e4..eae8f4f 100644
--- a/sass/layout/_layout.scss
+++ b/sass/layout/_layout.scss
@@ -60,13 +60,16 @@
#editor-bar, #serial-bar {
display: flex;
- flex-wrap: wrap;
align-items: center;
padding: 0 10px;
min-height: 60px;
height: 4em;
}
+#editor-bar {
+ flex-wrap: wrap;
+}
+
#editor-page {
#editor {
flex: 1 1 0%;
@@ -151,6 +154,14 @@
}
}
+.connect-status-content {
+ background-color: #eebbbb;
+ color: #222222;
+ border-radius: 10px;
+ padding: 10px;
+ margin: 10px;
+}
+
.popup-modal {
#message {
a {