diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 4e35b0b..403b427 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -12,7 +12,10 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: - node-version: 16 + node-version: 22 cache: 'npm' + - run: rm -rf node_modules + - run: rm package-lock.json + - run: npm install - run: npm ci - run: npm run build diff --git a/index.html b/index.html index 84d2111..a8f30c4 100644 --- a/index.html +++ b/index.html @@ -325,6 +325,22 @@

Select USB Host Folder

IP Address: + + Build Date: + + + + MCU Name: + + + + Board ID: + + + + UID: + +

More network devices

@@ -333,6 +349,45 @@

More network devicesClose + diff --git a/js/common/ble-file-transfer.js b/js/common/ble-file-transfer.js new file mode 100644 index 0000000..fd7abf9 --- /dev/null +++ b/js/common/ble-file-transfer.js @@ -0,0 +1,43 @@ +import {FileTransferClient as BLEFileTransferClient} from '@adafruit/ble-file-transfer-js'; + +// Wrapper for BLEFileTransferClient to add additional functionality +class FileTransferClient extends BLEFileTransferClient { + constructor(bleDevice, bufferSize) { + super(bleDevice, bufferSize); + } + + async versionInfo() { + // Possibly open /boot_out.txt and read the version info + let versionInfo = {}; + console.log("Reading version info"); + let bootout = await this.readFile('/boot_out.txt', false); + console.log(bootout); + if (!bootout) { + console.error("Unable to read boot_out.txt"); + return null; + } + bootout += "\n"; + + // Add these items as they are found + const searchItems = { + version: /Adafruit CircuitPython (.*?) on/, + build_date: /on ([0-9]{4}-[0-9]{2}-[0-9]{2});/, + board_name: /; (.*?) with/, + mcu_name: /with (.*?)\r?\n/, + board_id: /Board ID:(.*?)\r?\n/, + uid: /UID:([0-9A-F]{12,16})\r?\n/, + } + + for (const [key, regex] of Object.entries(searchItems)) { + const match = bootout.match(regex); + + if (match) { + versionInfo[key] = match[1]; + } + } + + return versionInfo; + } +} + +export {FileTransferClient}; \ No newline at end of file diff --git a/js/common/dialogs.js b/js/common/dialogs.js index 74d110f..73b87e1 100644 --- a/js/common/dialogs.js +++ b/js/common/dialogs.js @@ -329,6 +329,10 @@ class DiscoveryModal extends GenericModal { let ip = this._currentModal.querySelector("#ip"); ip.href = `http://${deviceInfo.ip + port}/code/`; ip.textContent = deviceInfo.ip; + this._currentModal.querySelector("#builddate").textContent = deviceInfo.build_date; + this._currentModal.querySelector("#mcuname").textContent = deviceInfo.mcu_name; + this._currentModal.querySelector("#boardid").textContent = deviceInfo.board_id; + this._currentModal.querySelector("#uid").textContent = deviceInfo.uid; } async _refreshDevices() { @@ -378,11 +382,43 @@ class DiscoveryModal extends GenericModal { } } +class DeviceInfoModal extends GenericModal { + async _getDeviceInfo() { + const deviceInfo = await this._showBusy(this._fileHelper.versionInfo()); + this._currentModal.querySelector("#version").textContent = deviceInfo.version; + const boardLink = this._currentModal.querySelector("#board"); + boardLink.href = `https://circuitpython.org/board/${deviceInfo.board_id}/`; + boardLink.textContent = deviceInfo.board_name; + this._currentModal.querySelector("#builddate").textContent = deviceInfo.build_date; + this._currentModal.querySelector("#mcuname").textContent = deviceInfo.mcu_name; + this._currentModal.querySelector("#boardid").textContent = deviceInfo.board_id; + this._currentModal.querySelector("#uid").textContent = deviceInfo.uid; + } + + async open(workflow, documentState) { + this._workflow = workflow; + this._fileHelper = workflow.fileHelper; + this._showBusy = workflow.showBusy.bind(workflow); + this._docState = documentState; + + let p = super.open(); + const okButton = this._currentModal.querySelector("button.ok-button"); + this._addDialogElement('okButton', okButton, 'click', this._closeModal); + + const refreshIcon = this._currentModal.querySelector("i.refresh"); + this._addDialogElement('refreshIcon', refreshIcon, 'click', this._refreshDevices); + + await this._getDeviceInfo(); + return p; + } +} + export { GenericModal, MessageModal, ButtonValueDialog, UnsavedDialog, DiscoveryModal, - ProgressDialog + ProgressDialog, + DeviceInfoModal }; \ No newline at end of file diff --git a/js/common/file_dialog.js b/js/common/file_dialog.js index 8bd7a38..c051903 100644 --- a/js/common/file_dialog.js +++ b/js/common/file_dialog.js @@ -42,7 +42,7 @@ const extensionMap = { "mp4": {style: FA_STYLE_REGULAR, icon: "file-video", type: "bin"}, "mpy": {style: FA_STYLE_REGULAR, icon: "file", type: "bin"}, "pdf": {style: FA_STYLE_REGULAR, icon: "file-pdf", type: "bin"}, - "py": {style: FA_STYLE_REGULAR, icon: "file-lines", type: "text"}, + "py": {style: FA_STYLE_REGULAR, icon: "file-code", type: "text"}, "toml": {style: FA_STYLE_REGULAR, icon: "file-lines", type: "text"}, "txt": {style: FA_STYLE_REGULAR, icon: "file-lines", type: "text"}, "wav": {style: FA_STYLE_REGULAR, icon: "file-audio", type: "bin"}, @@ -57,6 +57,9 @@ const FILESIZE_UNITS = ["bytes", "KB", "MB", "GB", "TB"]; const COMPACT_UNITS = ["", "K", "M", "G", "T"]; function getFileExtension(filename) { + if (filename === null) { + return null; + } let extension = filename.split('.').pop(); if (extension !== null) { return String(extension).toLowerCase(); @@ -189,7 +192,7 @@ class FileDialog extends GenericModal { this._currentPath = path; } const currentPathLabel = this._getElement('currentPathLabel'); - currentPathLabel.innerHTML = this._currentPath; + currentPathLabel.innerHTML = ` ` + this._currentPath; if (this._currentPath != "/") { this._addFile({path: "..", isDir: true}, "fa-folder-open"); diff --git a/js/common/fsapi-file-transfer.js b/js/common/fsapi-file-transfer.js index 645fdd1..d8a0af5 100644 --- a/js/common/fsapi-file-transfer.js +++ b/js/common/fsapi-file-transfer.js @@ -325,8 +325,10 @@ class FileTransferClient { let bootout = await this.readFile('/boot_out.txt', false); console.log(bootout); if (!bootout) { + console.error("Unable to read boot_out.txt"); return null; } + bootout += "\n"; // Add these items as they are found const searchItems = { @@ -335,7 +337,7 @@ class FileTransferClient { board_name: /; (.*?) with/, mcu_name: /with (.*?)\r?\n/, board_id: /Board ID:(.*?)\r?\n/, - uid: /UID:([0-9A-F]{12})\r?\n/, + uid: /UID:([0-9A-F]{12,16})\r?\n/, } for (const [key, regex] of Object.entries(searchItems)) { diff --git a/js/common/repl-file-transfer.js b/js/common/repl-file-transfer.js index c76f9f1..97ae832 100644 --- a/js/common/repl-file-transfer.js +++ b/js/common/repl-file-transfer.js @@ -91,8 +91,10 @@ class FileTransferClient { let bootout = await this.readFile('/boot_out.txt', false); console.log(bootout); if (!bootout) { + console.error("Unable to read boot_out.txt"); return null; } + bootout += "\n"; // Add these items as they are found const searchItems = { @@ -101,7 +103,7 @@ class FileTransferClient { board_name: /; (.*?) with/, mcu_name: /with (.*?)\r?\n/, board_id: /Board ID:(.*?)\r?\n/, - uid: /UID:([0-9A-F]{12})\r?\n/, + uid: /UID:([0-9A-F]{12,16})\r?\n/, } for (const [key, regex] of Object.entries(searchItems)) { diff --git a/js/script.js b/js/script.js index d562a46..83ece82 100644 --- a/js/script.js +++ b/js/script.js @@ -5,6 +5,7 @@ import {indentWithTab} from "@codemirror/commands" import { python } from "@codemirror/lang-python"; import { syntaxHighlighting, indentUnit } from "@codemirror/language"; import { classHighlighter } from "@lezer/highlight"; +import { getFileIcon } from "./common/file_dialog.js"; import { Terminal } from '@xterm/xterm'; import { FitAddon } from '@xterm/addon-fit'; @@ -237,7 +238,13 @@ async function checkReadOnly() { /* Update the filename and update the UI */ function setFilename(path) { + // Use the extension_map to figure out the file icon let filename = path; + + // Prepend an icon to the path + const [style, icon] = getFileIcon(path); + filename = ` ` + filename; + if (path === null) { filename = "[New Document]"; btnSave.forEach((b) => b.style.display = 'none'); diff --git a/js/workflows/ble.js b/js/workflows/ble.js index 2d2e201..fc8fde2 100644 --- a/js/workflows/ble.js +++ b/js/workflows/ble.js @@ -2,11 +2,10 @@ * This class will encapsulate all of the workflow functions specific to BLE */ -import {FileTransferClient} from '@adafruit/ble-file-transfer-js'; - +import {FileTransferClient} from '../common/ble-file-transfer.js'; import {CONNTYPE, CONNSTATE} from '../constants.js'; import {Workflow} from './workflow.js'; -import {GenericModal} from '../common/dialogs.js'; +import {GenericModal, DeviceInfoModal} from '../common/dialogs.js'; import {sleep, getUrlParam} from '../common/utilities.js'; const bleNusServiceUUID = 'adaf0001-4369-7263-7569-74507974686e'; @@ -27,6 +26,7 @@ class BLEWorkflow extends Workflow { this.bleDevice = null; this.decoder = new TextDecoder(); this.connectDialog = new GenericModal("ble-connect"); + this.infoDialog = new DeviceInfoModal("device-info"); this.partialWrites = true; this.type = CONNTYPE.Ble; } @@ -270,6 +270,10 @@ class BLEWorkflow extends Workflow { return true; } + async showInfo(documentState) { + return await this.infoDialog.open(this, documentState); + } + // Handle the different button states for various connection steps connectionStep(step) { const buttonStates = [ diff --git a/js/workflows/usb copy.js b/js/workflows/usb copy.js deleted file mode 100644 index f149137..0000000 --- a/js/workflows/usb copy.js +++ /dev/null @@ -1,328 +0,0 @@ -import {CONNTYPE, CONNSTATE} from '../constants.js'; -import {Workflow} from './workflow.js'; -import {GenericModal} from '../common/dialogs.js'; -import {FileTransferClient} from '../common/repl-file-transfer.js'; - -let btnRequestSerialDevice, btnSelectHostFolder, btnUseHostFolder, lblWorkingfolder; - -class USBWorkflow extends Workflow { - constructor() { - super(); - this._serialDevice = null; - this.titleMode = false; - this.reader = null; - this.writer = null; - this.connectDialog = new GenericModal("usb-connect"); - this._fileContents = null; - this.type = CONNTYPE.Usb; - this._partialToken = null; - this._uid = null; - this._readLoopPromise = null; - } - - async init(params) { - await super.init(params); - } - - // This is called when a user clicks the main disconnect button - async disconnectButtonHandler(e) { - await super.disconnectButtonHandler(e); - if (this.connectionStatus()) { - await this.onDisconnected(null, false); - } - } - - async onConnected(e) { - this.connectDialog.close(); - await this.loadEditor(); - super.onConnected(e); - } - - async onDisconnected(e, reconnect = true) { - if (this.reader) { - await this.reader.cancel(); - this.reader = null; - } - if (this.writer) { - await this.writer.releaseLock(); - this.writer = null; - } - - if (this._serialDevice) { - await this._serialDevice.close(); - this._serialDevice = null; - } - - super.onDisconnected(e, reconnect); - } - - async serialTransmit(msg) { - const encoder = new TextEncoder(); - if (this.writer) { - const encMessage = encoder.encode(msg); - await this.writer.ready.catch((err) => { - console.error(`Ready error: ${err}`); - }); - await this.writer.write(encMessage).catch((err) => { - console.error(`Chunk error: ${err}`); - }); - await this.writer.ready; - } - } - - async connect() { - let result; - if (result = await super.connect() instanceof Error) { - return result; - } - - return await this.connectToDevice(); - } - - async connectToDevice() { - return await this.connectToSerial(); - } - - async connectToSerial() { - // There's no way to reference a specific port, so we just hope the user - // only has a single device stored and connected. However, we can check that - // the device on the stored port is currently connected by checking if the - // readable and writable properties are null. - - let allDevices = await navigator.serial.getPorts(); - let connectedDevices = []; - for (let device of allDevices) { - let devInfo = await device.getInfo(); - if (devInfo.readable && devInfo.writable) { - connectedDevices.push(device); - } - } - let device = null; - - if (connectedDevices.length == 1) { - device = connectedDevices[0]; - console.log(await device.getInfo()); - try { - // Attempt to connect to the saved device. If it's not found, this will fail. - await this._switchToDevice(device); - } catch (e) { - // We should probably remove existing devices if it fails here - await device.forget(); - - console.log("Failed to automatically connect to saved device. Prompting user to select a device."); - device = await navigator.serial.requestPort(); - console.log(device); - } - - // TODO: Make it more obvious to user that something happened for smaller screens - // Perhaps providing checkmarks by adding a css class when a step is complete would be helpful - // This would help with other workflows as well - } else { - console.log('Requesting any serial device...'); - device = await navigator.serial.requestPort(); - } - - // 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) { - this._connectionStep(2); - return true; - } - - 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'); - lblWorkingfolder = modal.querySelector('#workingFolder'); - - btnRequestSerialDevice.disabled = true; - btnSelectHostFolder.disabled = true; - - btnRequestSerialDevice.addEventListener('click', async (event) => { - try { - 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 - } - }); - - btnSelectHostFolder.addEventListener('click', async (event) => { - await this._selectHostFolder(); - }); - - btnUseHostFolder.addEventListener('click', async (event) => { - await this._useHostFolder(); - }); - - if (!(await this.available() instanceof Error)) { - let stepOne; - if (stepOne = modal.querySelector('.step:first-of-type')) { - stepOne.classList.add("hidden"); - } - this._connectionStep(1); - } else { - modal.querySelectorAll('.step:not(:first-of-type)').forEach((stepItem) => { - stepItem.classList.add("hidden"); - }); - this._connectionStep(0); - } - - // TODO: If this is closed before all steps are completed, we should close the serial connection - // probably by calling onDisconnect() - - return await p; - } - - async available() { - if (!('serial' in navigator)) { - return Error("Web Serial is not enabled in this browser"); - } - return true; - } - - // Workflow specific functions - async _selectHostFolder() { - console.log('Initializing File Transfer Client...'); - const fileClient = this.fileHelper.getFileClient(); - const changed = await fileClient.loadDirHandle(false); - if (changed) { - await this._hostFolderChanged(); - } - } - - async _useHostFolder() { - await this.fileHelper.listDir('/'); - this.onConnected(); - } - - async _hostFolderChanged() { - const fileClient = this.fileHelper.getFileClient(); - const folderName = fileClient.getWorkingDirectoryName(); - console.log("New folder name:", folderName); - if (folderName) { - // Set the working folder label - lblWorkingfolder.innerHTML = folderName; - btnUseHostFolder.classList.remove("hidden"); - btnSelectHostFolder.innerHTML = "Select Different Folder"; - btnSelectHostFolder.classList.add("inverted"); - btnSelectHostFolder.classList.remove("first-item"); - } - } - - async _switchToDevice(device) { - device.addEventListener("message", this.onSerialReceive.bind(this)); - - 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 - this._readLoopPromise = this._readSerialLoop().catch( - async function(error) { - await this.onDisconnected(); - }.bind(this) - ); - - if (this._serialDevice.writable) { - this.writer = this._serialDevice.writable.getWriter(); - await this.writer.ready; - } - - await this.showBusy(this._getDeviceUid()); - - this.updateConnected(CONNSTATE.partial); - - // At this point we should see if we should init the file client and check if have a saved dir handle - this.initFileClient(new FileTransferClient(this.connectionStatus.bind(this), this.repl)); - const fileClient = this.fileHelper.getFileClient(); - const result = await fileClient.loadSavedDirHandle(); - if (result) { - console.log("Successfully loaded directory:", fileClient.getWorkingDirectoryName()); - await this._hostFolderChanged(); - } else { - console.log("Failed to load directory"); - } - } - - async _getDeviceUid() { - // TODO: Make this python code more robust for older devices - // For instance what if there is an import error with binascii - // or uid is not set due to older firmware - // or microcontroller is a list - // It might be better to take a minimal python approach and do most of - // the conversion in the javascript code - - console.log("Getting Device UID..."); - let result = await this.repl.runCode( -`import microcontroller -import binascii -binascii.hexlify(microcontroller.cpu.uid).decode('ascii').upper()` - ); - // Strip out whitespace as well as start and end quotes - if (result) { - this._uid = result.trim().slice(1, -1); - console.log("Device UID: " + this._uid); - this.debugLog("Device UID: " + this._uid) - } else { - console.log("Failed to get Device UID, result was", result); - } - } - - async _readSerialLoop() { - console.log("Read Loop Init"); - if (!this._serialDevice) { - return; - } - - const messageEvent = new Event("message"); - const decoder = new TextDecoder(); - - if (this._serialDevice.readable) { - this.reader = this._serialDevice.readable.getReader(); - console.log("Read Loop Started"); - while (true) { - const {value, done} = await this.reader.read(); - if (value) { - messageEvent.data = decoder.decode(value); - this._serialDevice.dispatchEvent(messageEvent); - } - if (done) { - this.reader.releaseLock(); - break; - } - } - } - - console.log("Read Loop Stopped. Closing Serial Port."); - } - - // Handle the different button states for various connection steps - _connectionStep(step) { - const buttonStates = [ - {request: false, select: false}, - {request: true, select: false}, - {request: true, select: true}, - ]; - - if (step < 0) step = 0; - if (step > buttonStates.length - 1) step = buttonStates.length - 1; - - btnRequestSerialDevice.disabled = !buttonStates[step].request; - btnSelectHostFolder.disabled = !buttonStates[step].select; - } -} - -export {USBWorkflow}; diff --git a/js/workflows/usb.js b/js/workflows/usb.js index ba4ed07..f0da219 100644 --- a/js/workflows/usb.js +++ b/js/workflows/usb.js @@ -1,6 +1,6 @@ import {CONNTYPE, CONNSTATE} from '../constants.js'; import {Workflow} from './workflow.js'; -import {GenericModal} from '../common/dialogs.js'; +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'; @@ -15,6 +15,7 @@ class USBWorkflow extends Workflow { this.reader = null; this.writer = null; this.connectDialog = new GenericModal("usb-connect"); + this.infoDialog = new DeviceInfoModal("device-info"); this._fileContents = null; this.type = CONNTYPE.Usb; this._partialToken = null; @@ -341,6 +342,10 @@ print(binascii.hexlify(microcontroller.cpu.uid).decode('ascii').upper())` console.log("Read Loop Stopped. Closing Serial Port."); } + async showInfo(documentState) { + return await this.infoDialog.open(this, documentState); + } + // Handle the different button states for various connection steps _connectionStep(step) { const buttonStates = [ diff --git a/package-lock.json b/package-lock.json index de4ff71..bc0a494 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,12 +23,9 @@ }, "devDependencies": { "sass": "^1.77.8", - "vite": "^5.3.4" + "vite": "^5.3.5" } }, - "../../circuitpython-repl-js/repl.js": { - "extraneous": true - }, "node_modules/@adafruit/ble-file-transfer-js": { "name": "@adafruit/ble-file-transfer", "version": "1.0.2", @@ -42,8 +39,6 @@ }, "node_modules/@codemirror/autocomplete": { "version": "6.16.2", - "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.16.2.tgz", - "integrity": "sha512-MjfDrHy0gHKlPWsvSsikhO1+BOh+eBHNgfH1OXs1+DAf30IonQldgMM3kxLDTG9ktE7kDLaA1j/l7KMPA4KNfw==", "license": "MIT", "dependencies": { "@codemirror/language": "^6.0.0", @@ -60,8 +55,6 @@ }, "node_modules/@codemirror/commands": { "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.6.0.tgz", - "integrity": "sha512-qnY+b7j1UNcTS31Eenuc/5YJB6gQOzkUoNmJQc0rznwqSRpeaWWpjkWy2C/MPTcePpsKJEM26hXrOXl1+nceXg==", "license": "MIT", "dependencies": { "@codemirror/language": "^6.0.0", @@ -72,8 +65,6 @@ }, "node_modules/@codemirror/lang-python": { "version": "6.1.6", - "resolved": "https://registry.npmjs.org/@codemirror/lang-python/-/lang-python-6.1.6.tgz", - "integrity": "sha512-ai+01WfZhWqM92UqjnvorkxosZ2aq2u28kHvr+N3gu012XqY2CThD67JPMHnGceRfXPDBmn1HnyqowdpF57bNg==", "license": "MIT", "dependencies": { "@codemirror/autocomplete": "^6.3.2", @@ -85,8 +76,6 @@ }, "node_modules/@codemirror/language": { "version": "6.10.2", - "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.10.2.tgz", - "integrity": "sha512-kgbTYTo0Au6dCSc/TFy7fK3fpJmgHDv1sG1KNQKJXVi+xBTEeBPY/M30YXiU6mMXeH+YIDLsbrT4ZwNRdtF+SA==", "license": "MIT", "dependencies": { "@codemirror/state": "^6.0.0", @@ -99,8 +88,6 @@ }, "node_modules/@codemirror/lint": { "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.8.0.tgz", - "integrity": "sha512-lsFofvaw0lnPRJlQylNsC4IRt/1lI4OD/yYslrSGVndOJfStc58v+8p9dgGiD90ktOfL7OhBWns1ZETYgz0EJA==", "license": "MIT", "dependencies": { "@codemirror/state": "^6.0.0", @@ -110,8 +97,6 @@ }, "node_modules/@codemirror/search": { "version": "6.5.6", - "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.5.6.tgz", - "integrity": "sha512-rpMgcsh7o0GuCDUXKPvww+muLA1pDJaFrpq/CCHtpQJYz8xopu4D1hPcKRoDD0YlF8gZaqTNIRa4VRBWyhyy7Q==", "license": "MIT", "dependencies": { "@codemirror/state": "^6.0.0", @@ -121,14 +106,10 @@ }, "node_modules/@codemirror/state": { "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.4.1.tgz", - "integrity": "sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==", "license": "MIT" }, "node_modules/@codemirror/view": { "version": "6.28.1", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.28.1.tgz", - "integrity": "sha512-BUWr+zCJpMkA/u69HlJmR+YkV4yPpM81HeMkOMZuwFa8iM5uJdEPKAs1icIRZKkKmy0Ub1x9/G3PQLTXdpBxrQ==", "license": "MIT", "dependencies": { "@codemirror/state": "^6.4.0", @@ -136,95 +117,8 @@ "w3c-keyname": "^2.2.4" } }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@esbuild/darwin-x64": { "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", "cpu": [ "x64" ], @@ -238,313 +132,19 @@ "node": ">=12" } }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@fortawesome/fontawesome-free": { "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.6.0.tgz", - "integrity": "sha512-60G28ke/sXdtS9KZCpZSHHkCbdsOGEhIUGlwq6yhY74UpTiToIh8np7A8yphhM4BWsvNFtIvLpi4co+h9Mr9Ow==", + "license": "(CC-BY-4.0 AND OFL-1.1 AND MIT)", "engines": { "node": ">=6" } }, "node_modules/@lezer/common": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.2.1.tgz", - "integrity": "sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ==", "license": "MIT" }, "node_modules/@lezer/highlight": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.0.tgz", - "integrity": "sha512-WrS5Mw51sGrpqjlh3d4/fOwpEV2Hd3YOkp9DBt4k8XZQcoTHZFB7sx030A6OcahF4J1nDQAa3jXlTVVYH50IFA==", "license": "MIT", "dependencies": { "@lezer/common": "^1.0.0" @@ -552,8 +152,6 @@ }, "node_modules/@lezer/lr": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.1.tgz", - "integrity": "sha512-CHsKq8DMKBf9b3yXPDIU4DbH+ZJd/sJdYOW2llbW/HudP5u0VS6Bfq1hLYfgU7uAYGFIyGGQIsSOXGPEErZiJw==", "license": "MIT", "dependencies": { "@lezer/common": "^1.0.0" @@ -561,8 +159,6 @@ }, "node_modules/@lezer/python": { "version": "1.1.14", - "resolved": "https://registry.npmjs.org/@lezer/python/-/python-1.1.14.tgz", - "integrity": "sha512-ykDOb2Ti24n76PJsSa4ZoDF0zH12BSw1LGfQXCYJhJyOGiFTfGaX0Du66Ze72R+u/P35U+O6I9m8TFXov1JzsA==", "license": "MIT", "dependencies": { "@lezer/common": "^1.2.0", @@ -570,52 +166,8 @@ "@lezer/lr": "^1.0.0" } }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz", - "integrity": "sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz", - "integrity": "sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz", - "integrity": "sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, "node_modules/@rollup/rollup-darwin-x64": { "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz", - "integrity": "sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==", "cpu": [ "x64" ], @@ -626,185 +178,13 @@ "darwin" ] }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz", - "integrity": "sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz", - "integrity": "sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz", - "integrity": "sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz", - "integrity": "sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz", - "integrity": "sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz", - "integrity": "sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz", - "integrity": "sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz", - "integrity": "sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz", - "integrity": "sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz", - "integrity": "sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz", - "integrity": "sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz", - "integrity": "sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, "node_modules/@types/estree": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true, "license": "MIT" }, "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" @@ -812,8 +192,6 @@ }, "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" @@ -821,14 +199,10 @@ }, "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/anymatch": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "license": "ISC", "dependencies": { @@ -841,8 +215,6 @@ }, "node_modules/binary-extensions": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, "license": "MIT", "engines": { @@ -854,8 +226,6 @@ }, "node_modules/braces": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "license": "MIT", "dependencies": { @@ -867,8 +237,6 @@ }, "node_modules/chokidar": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, "license": "MIT", "dependencies": { @@ -892,8 +260,6 @@ }, "node_modules/codemirror": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-6.0.1.tgz", - "integrity": "sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==", "license": "MIT", "dependencies": { "@codemirror/autocomplete": "^6.0.0", @@ -907,20 +273,14 @@ }, "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/esbuild": { "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -958,14 +318,10 @@ }, "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": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "license": "MIT", "dependencies": { @@ -977,8 +333,6 @@ }, "node_modules/focus-trap": { "version": "7.5.4", - "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.4.tgz", - "integrity": "sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==", "license": "MIT", "dependencies": { "tabbable": "^6.2.0" @@ -986,10 +340,7 @@ }, "node_modules/fsevents": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, - "hasInstallScript": true, "license": "MIT", "optional": true, "os": [ @@ -1001,8 +352,6 @@ }, "node_modules/glob-parent": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "license": "ISC", "dependencies": { @@ -1014,33 +363,23 @@ }, "node_modules/idb-keyval": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.1.tgz", - "integrity": "sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==", "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": { "version": "4.3.6", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.6.tgz", - "integrity": "sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==", "dev": true, "license": "MIT" }, "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-binary-path": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "license": "MIT", "dependencies": { @@ -1052,8 +391,6 @@ }, "node_modules/is-extglob": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "license": "MIT", "engines": { @@ -1062,8 +399,6 @@ }, "node_modules/is-glob": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "license": "MIT", "dependencies": { @@ -1075,8 +410,6 @@ }, "node_modules/is-number": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, "license": "MIT", "engines": { @@ -1085,14 +418,10 @@ }, "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", @@ -1103,8 +432,6 @@ }, "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" @@ -1112,8 +439,6 @@ }, "node_modules/nanoid": { "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "dev": true, "funding": [ { @@ -1121,6 +446,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -1130,8 +456,6 @@ }, "node_modules/normalize-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, "license": "MIT", "engines": { @@ -1140,20 +464,15 @@ }, "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": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "license": "MIT", "engines": { @@ -1165,8 +484,6 @@ }, "node_modules/postcss": { "version": "8.4.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", - "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", "dev": true, "funding": [ { @@ -1182,6 +499,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.1", @@ -1193,14 +511,10 @@ }, "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/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", @@ -1214,8 +528,6 @@ }, "node_modules/readdirp": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "license": "MIT", "dependencies": { @@ -1227,8 +539,6 @@ }, "node_modules/rollup": { "version": "4.18.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.0.tgz", - "integrity": "sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==", "dev": true, "license": "MIT", "dependencies": { @@ -1263,15 +573,12 @@ }, "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.77.8", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.8.tgz", - "integrity": "sha512-4UHg6prsrycW20fqLGPShtEvo/WyHRVRHwOP4DzkUrObWoWI05QBSfzU71TVB7PFaL104TwNaHpjlWXAZbQiNQ==", "dev": true, + "license": "MIT", "dependencies": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", @@ -1286,14 +593,10 @@ }, "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": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -1302,8 +605,6 @@ }, "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" @@ -1311,20 +612,14 @@ }, "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", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", - "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", "license": "MIT" }, "node_modules/to-regex-range": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1336,15 +631,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": "5.3.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.4.tgz", - "integrity": "sha512-Cw+7zL3ZG9/NZBB8C+8QbQZmR54GwqIz+WMI4b3JgdYJvX+ny9AjJXqkGQlDXSXRP9rP0B4tbciRMOVEKulVOA==", + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.5.tgz", + "integrity": "sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA==", "dev": true, + "license": "MIT", "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.39", @@ -1397,8 +691,6 @@ }, "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 40135c3..9f75bbe 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ }, "devDependencies": { "sass": "^1.77.8", - "vite": "^5.3.4" + "vite": "^5.3.5" }, "dependencies": { "@adafruit/ble-file-transfer-js": "adafruit/ble-file-transfer-js#1.0.2", diff --git a/sass/layout/_layout.scss b/sass/layout/_layout.scss index eb71a34..a5182f3 100644 --- a/sass/layout/_layout.scss +++ b/sass/layout/_layout.scss @@ -401,7 +401,8 @@ } } - &[data-popup-modal="device-discovery"] { + &[data-popup-modal="device-discovery"], + &[data-popup-modal="device-info"] { .device-info { margin-top: 5px; width: 100%;