From 65e53cc7bdd84a6dadabdd089f42186faa4b1f4e Mon Sep 17 00:00:00 2001 From: Sebastian Romero <s.romero@arduino.cc> Date: Tue, 17 Dec 2024 16:55:12 +0100 Subject: [PATCH 01/65] Auto connect if only one port available --- ui/arduino/store.js | 14 ++++++++++++++ ui/arduino/views/components/toolbar.js | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/ui/arduino/store.js b/ui/arduino/store.js index 09a373e..116c0dc 100644 --- a/ui/arduino/store.js +++ b/ui/arduino/store.js @@ -210,6 +210,20 @@ async function store(state, emitter) { emitter.emit('render') }) + emitter.on('connect', async () => { + try { + state.availablePorts = await getAvailablePorts() + } catch(e) { + console.error('Could not get available ports. ', e) + } + + if(state.availablePorts.length == 1) { + emitter.emit('select-port', state.availablePorts[0]) + } else { + emitter.emit('open-connection-dialog') + } + }) + // CODE EXECUTION emitter.on('run', async (onlySelected = false) => { log('run') diff --git a/ui/arduino/views/components/toolbar.js b/ui/arduino/views/components/toolbar.js index 70982b0..eff0731 100644 --- a/ui/arduino/views/components/toolbar.js +++ b/ui/arduino/views/components/toolbar.js @@ -16,7 +16,7 @@ function Toolbar(state, emit) { ${Button({ icon: state.isConnected ? 'connect.svg' : 'disconnect.svg', tooltip: state.isConnected ? `Disconnect (${metaKeyString}+Shift+D)` : `Connect (${metaKeyString}+Shift+C)`, - onClick: () => state.isConnected ? emit('disconnect') : emit('open-connection-dialog'), + onClick: () => state.isConnected ? emit('disconnect') : emit('connect'), active: state.isConnected })} From 07fa1cea111127303b839bbc31c2da1c62d670c2 Mon Sep 17 00:00:00 2001 From: Sebastian Romero <s.romero@arduino.cc> Date: Tue, 17 Dec 2024 16:55:55 +0100 Subject: [PATCH 02/65] Display connection status --- ui/arduino/main.css | 15 ++++++++++++++- ui/arduino/views/components/repl-panel.js | 4 ++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/ui/arduino/main.css b/ui/arduino/main.css index cc0e95c..37fa561 100644 --- a/ui/arduino/main.css +++ b/ui/arduino/main.css @@ -273,7 +273,7 @@ button.small .icon { } #panel #drag-handle { - width: 100%; + flex-grow: 2; height: 100%; cursor: grab; } @@ -293,6 +293,19 @@ button.small .icon { background: #008184; } +.panel-bar #connection-status { + display: flex; + align-items: center; + gap: 10px; + color: white; +} + +.panel-bar #connection-status img { + width: 1.25em; + height: 1.25em; + filter: invert(1); +} + .panel-bar .term-operations { transition: opacity 0.15s; display: flex; diff --git a/ui/arduino/views/components/repl-panel.js b/ui/arduino/views/components/repl-panel.js index 3974d50..7a89fbd 100644 --- a/ui/arduino/views/components/repl-panel.js +++ b/ui/arduino/views/components/repl-panel.js @@ -13,6 +13,10 @@ function ReplPanel(state, emit) { return html` <div id="panel" style="height: ${state.panelHeight}px"> <div class="panel-bar"> + <div id="connection-status" style="visibility:${state.isConnected ? 'visible' : 'hidden'};"> + <img src="media/connect.svg" /> + <div>${state.isConnected ? 'Connected to ' + state.connectedPort : ''}</div> + </div> <div id="drag-handle" onmousedown=${() => emit('start-resizing-panel')} onmouseup=${() => emit('stop-resizing-panel')} From e2784f4d043c8f2e66f3eb5a336a88bff06fe9ed Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Wed, 18 Dec 2024 18:24:57 +0100 Subject: [PATCH 03/65] WIP: new file from editor. Signed-off-by: ubi de feo <me@ubidefeo.com> --- ui/arduino/index.html | 1 + ui/arduino/main.css | 17 +++++---- ui/arduino/store.js | 38 +++++++++++++------ .../views/components/connection-dialog.js | 4 +- .../components/new-file-destination-dialog.js | 22 +++++++++++ ui/arduino/views/components/toolbar.js | 7 ++++ ui/arduino/views/editor.js | 1 + ui/arduino/views/file-manager.js | 1 + 8 files changed, 71 insertions(+), 20 deletions(-) create mode 100644 ui/arduino/views/components/new-file-destination-dialog.js diff --git a/ui/arduino/index.html b/ui/arduino/index.html index 8478cc7..63a5981 100644 --- a/ui/arduino/index.html +++ b/ui/arduino/index.html @@ -25,6 +25,7 @@ <!-- Components --> <script type="text/javascript" src="views/components/code-editor.js" charset="utf-8"></script> <script type="text/javascript" src="views/components/connection-dialog.js" charset="utf-8"></script> + <script type="text/javascript" src="views/components/new-file-destination-dialog.js" charset="utf-8"></script> <script type="text/javascript" src="views/components/file-actions.js" charset="utf-8"></script> <script type="text/javascript" src="views/components/file-list.js" charset="utf-8"></script> <script type="text/javascript" src="views/components/repl-panel.js" charset="utf-8"></script> diff --git a/ui/arduino/main.css b/ui/arduino/main.css index cc0e95c..f25c61e 100644 --- a/ui/arduino/main.css +++ b/ui/arduino/main.css @@ -330,7 +330,7 @@ button.small .icon { opacity: 0.5; } -#dialog { +.dialog { display: flex; flex-direction: column; justify-content: center; @@ -350,13 +350,16 @@ button.small .icon { line-height: normal; background: rgba(236, 241, 241, 0.50); } -#dialog.open { + +.dialog.open { opacity: 1; pointer-events: inherit; transition: opacity 0.15s; } -#dialog .dialog-content { + + +.dialog .dialog-content { display: flex; width: 576px; padding: 36px; @@ -372,16 +375,16 @@ button.small .icon { transition: transform 0.15s; } -#dialog.open .dialog-content { +.dialog.open .dialog-content { transform: translateY(0px); transition: transform 0.15s; } -#dialog .dialog-content > * { +.dialog .dialog-content > * { width: 100%; } -#dialog .dialog-content .item { +.dialog .dialog-content .item { border-radius: 4.5px; display: flex; padding: 10px; @@ -391,7 +394,7 @@ button.small .icon { cursor: pointer; } -#dialog .dialog-content .item:hover { +.dialog .dialog-content .item:hover { background: #008184; color: #ffffff; } diff --git a/ui/arduino/store.js b/ui/arduino/store.js index 09a373e..67b2b70 100644 --- a/ui/arduino/store.js +++ b/ui/arduino/store.js @@ -49,6 +49,8 @@ async function store(state, emitter) { state.isConnected = false state.connectedPort = null + state.isNewFileDialogOpen = false + state.isSaving = false state.savingProgress = 0 state.isTransferring = false @@ -295,7 +297,17 @@ async function store(state, emitter) { window.removeEventListener('mousemove', state.resizePanel) }) - // SAVING + // NEW FILE AND SAVING + emitter.on('create-new-file', () => { + log('create-new-file') + state.isNewFileDialogOpen = true + emitter.emit('render') + }) + emitter.on('close-new-file-dialog', () => { + state.isNewFileDialogOpen = false + emitter.emit('render') + }) + emitter.on('save', async () => { log('save') let response = canSave({ @@ -514,18 +526,22 @@ async function store(state, emitter) { emitter.emit('render') }) - emitter.on('create-file', (device) => { + emitter.on('create-file', (device, fileName = null) => { log('create-file', device) if (state.creatingFile !== null) return state.creatingFile = device state.creatingFolder = null + if (fileName != null) { + emitter.emit('finish-creating-file', fileName) + } emitter.emit('render') }) - emitter.on('finish-creating-file', async (value) => { - log('finish-creating', value) + + emitter.on('finish-creating-file', async (fileNameParameter) => { + log('finish-creating', fileNameParameter) if (!state.creatingFile) return - if (!value) { + if (!fileNameParameter) { state.creatingFile = null emitter.emit('render') return @@ -535,10 +551,10 @@ async function store(state, emitter) { let willOverwrite = await checkBoardFile({ root: state.boardNavigationRoot, parentFolder: state.boardNavigationPath, - fileName: value + fileName: fileNameParameter }) if (willOverwrite) { - const confirmAction = await confirm(`You are about to overwrite the file ${value} on your board.\n\nAre you sure you want to proceed?`, 'Cancel', 'Yes') + const confirmAction = await confirm(`You are about to overwrite the file ${fileNameParameter} on your board.\n\nAre you sure you want to proceed?`, 'Cancel', 'Yes') if (!confirmAction) { state.creatingFile = null emitter.emit('render') @@ -550,7 +566,7 @@ async function store(state, emitter) { serialBridge.getFullPath( '/', state.boardNavigationPath, - value + fileNameParameter ), newFileContent ) @@ -558,10 +574,10 @@ async function store(state, emitter) { let willOverwrite = await checkDiskFile({ root: state.diskNavigationRoot, parentFolder: state.diskNavigationPath, - fileName: value + fileName: fileNameParameter }) if (willOverwrite) { - const confirmAction = await confirm(`You are about to overwrite the file ${value} on your disk.\n\nAre you sure you want to proceed?`, 'Cancel', 'Yes') + const confirmAction = await confirm(`You are about to overwrite the file ${fileNameParameter} on your disk.\n\nAre you sure you want to proceed?`, 'Cancel', 'Yes') if (!confirmAction) { state.creatingFile = null emitter.emit('render') @@ -573,7 +589,7 @@ async function store(state, emitter) { disk.getFullPath( state.diskNavigationRoot, state.diskNavigationPath, - value + fileNameParameter ), newFileContent ) diff --git a/ui/arduino/views/components/connection-dialog.js b/ui/arduino/views/components/connection-dialog.js index 2d99a47..56b1424 100644 --- a/ui/arduino/views/components/connection-dialog.js +++ b/ui/arduino/views/components/connection-dialog.js @@ -1,13 +1,13 @@ function ConnectionDialog(state, emit) { const stateClass = state.isConnectionDialogOpen ? 'open' : 'closed' function onClick(e) { - if (e.target.id == 'dialog') { + if (e.target.id == 'dialog-connection') { emit('close-connection-dialog') } } return html` - <div id="dialog" class="${stateClass}" onclick=${onClick}> + <div id="dialog-connection" class="dialog ${stateClass}" onclick=${onClick}> <div class="dialog-content"> ${state.availablePorts.map( (port) => html` diff --git a/ui/arduino/views/components/new-file-destination-dialog.js b/ui/arduino/views/components/new-file-destination-dialog.js new file mode 100644 index 0000000..9979443 --- /dev/null +++ b/ui/arduino/views/components/new-file-destination-dialog.js @@ -0,0 +1,22 @@ +function NewFileDestinationDialog(state, emit) { + const stateClass = state.isNewFileDialogOpen ? 'open' : 'closed' + function onClick(e) { + if (e.target.id == 'dialog-new-file') { + emit('close-new-file-dialog') + } + } + let boardOption = '' + if (state.isConnected) { + boardOption = html` + <div class="item" onclick=${() => {emit('create-file','board', 'board_capocchia.py')}}>Board</div> + ` + } + return html` + <div id="dialog-new-file" class="dialog ${stateClass}" onclick=${onClick}> + <div class="dialog-content"> + ${boardOption} + <div class="item" onclick=${() => {emit('create-file', 'disk', 'disk_capocchia.py')}}>Computer</div> + </div> + </div> + ` +} diff --git a/ui/arduino/views/components/toolbar.js b/ui/arduino/views/components/toolbar.js index 70982b0..2aaa447 100644 --- a/ui/arduino/views/components/toolbar.js +++ b/ui/arduino/views/components/toolbar.js @@ -49,6 +49,13 @@ function Toolbar(state, emit) { <div class="separator"></div> + ${Button({ + icon: 'new-file.svg', + tooltip: `New (${metaKeyString}+N)`, + disabled: state.view != 'editor', + onClick: () => emit('create-new-file') + })} + ${Button({ icon: 'save.svg', tooltip: `Save (${metaKeyString}+S)`, diff --git a/ui/arduino/views/editor.js b/ui/arduino/views/editor.js index fd93b08..796bdea 100644 --- a/ui/arduino/views/editor.js +++ b/ui/arduino/views/editor.js @@ -7,5 +7,6 @@ function EditorView(state, emit) { ${ReplPanel(state, emit)} </div> ${ConnectionDialog(state, emit)} + ${NewFileDestinationDialog(state, emit)} ` } diff --git a/ui/arduino/views/file-manager.js b/ui/arduino/views/file-manager.js index eafdf65..fd8a3c8 100644 --- a/ui/arduino/views/file-manager.js +++ b/ui/arduino/views/file-manager.js @@ -44,5 +44,6 @@ function FileManagerView(state, emit) { </div> </div> ${ConnectionDialog(state, emit)} + ${NewFileDestinationDialog(state, emit)} ` } From 6f025a78c165578801ab655adc8117bd8f816088 Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Wed, 18 Dec 2024 19:36:14 +0100 Subject: [PATCH 04/65] WIP: dialog style. Signed-off-by: ubi de feo <me@ubidefeo.com> --- ui/arduino/main.css | 2 +- ui/arduino/views/components/new-file-destination-dialog.js | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/ui/arduino/main.css b/ui/arduino/main.css index f25c61e..36e9468 100644 --- a/ui/arduino/main.css +++ b/ui/arduino/main.css @@ -381,7 +381,7 @@ button.small .icon { } .dialog .dialog-content > * { - width: 100%; + /* width: 100%; */ } .dialog .dialog-content .item { diff --git a/ui/arduino/views/components/new-file-destination-dialog.js b/ui/arduino/views/components/new-file-destination-dialog.js index 9979443..cf6b620 100644 --- a/ui/arduino/views/components/new-file-destination-dialog.js +++ b/ui/arduino/views/components/new-file-destination-dialog.js @@ -14,6 +14,7 @@ function NewFileDestinationDialog(state, emit) { return html` <div id="dialog-new-file" class="dialog ${stateClass}" onclick=${onClick}> <div class="dialog-content"> + <input type="text" id="file-name" placeholder="File name" /> ${boardOption} <div class="item" onclick=${() => {emit('create-file', 'disk', 'disk_capocchia.py')}}>Computer</div> </div> From 5a7bd0f6f77f50dd314b77d9e1d2c098f7ae8e96 Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Thu, 19 Dec 2024 07:59:22 +0100 Subject: [PATCH 05/65] WIP: new file dialog box. Signed-off-by: ubi de feo <me@ubidefeo.com> --- ui/arduino/main.css | 20 +++++++++ ui/arduino/store.js | 3 ++ .../components/new-file-destination-dialog.js | 42 +++++++++++++++++-- ui/arduino/views/components/repl-panel.js | 7 +++- 4 files changed, 68 insertions(+), 4 deletions(-) diff --git a/ui/arduino/main.css b/ui/arduino/main.css index 36e9468..e141767 100644 --- a/ui/arduino/main.css +++ b/ui/arduino/main.css @@ -272,6 +272,10 @@ button.small .icon { min-height: 45px; } +#panel.dialog-open { + pointer-events: none; +} + #panel #drag-handle { width: 100%; height: 100%; @@ -384,6 +388,10 @@ button.small .icon { /* width: 100%; */ } +.dialog .dialog-content input { + font-size: 1.4em; + width:100%; +} .dialog .dialog-content .item { border-radius: 4.5px; display: flex; @@ -399,6 +407,18 @@ button.small .icon { color: #ffffff; } +.dialog .buttons-horizontal { + display: flex; + flex-direction: row; + justify-content: center; + width: 100%; + gap: 20px; +} +.dialog .buttons-horizontal .item { + flex-basis: 40%; + align-items: center; + background-color: #eee;; +} #file-manager { display: flex; padding: 12px 32px 24px 32px; diff --git a/ui/arduino/store.js b/ui/arduino/store.js index 67b2b70..51202d5 100644 --- a/ui/arduino/store.js +++ b/ui/arduino/store.js @@ -1467,6 +1467,9 @@ async function store(state, emitter) { if (state.isConnectionDialogOpen) { emitter.emit('close-connection-dialog') } + if (state.isNewFileDialogOpen) { + emitter.emit('close-new-file-dialog') + } } }) diff --git a/ui/arduino/views/components/new-file-destination-dialog.js b/ui/arduino/views/components/new-file-destination-dialog.js index cf6b620..c9944e9 100644 --- a/ui/arduino/views/components/new-file-destination-dialog.js +++ b/ui/arduino/views/components/new-file-destination-dialog.js @@ -11,13 +11,49 @@ function NewFileDestinationDialog(state, emit) { <div class="item" onclick=${() => {emit('create-file','board', 'board_capocchia.py')}}>Board</div> ` } + const now = new Date(); + const dateStr = String(now.getMonth() + 1).padStart(2, '0') + + String(now.getDate()).padStart(2, '0') + + String(now.getHours()).padStart(2, '0') + + String(now.getMinutes()).padStart(2, '0') + + const fileName = `script_${dateStr}.py`; + + const newFileDialog = html` + <div id="dialog-new-file" class="dialog ${stateClass}" onclick=${onClick}> + <div class="dialog-content"> + <input type="text" id="file-name" placeholder="${generateFileName()}" autofocus /> + <div class="buttons-horizontal"> + ${boardOption} + <div class="item" onclick=${() => {emit('create-file', 'disk', 'disk_capocchia.py')}}>Computer</div> + </div> + </div> + </div> +` + + + const observer = new MutationObserver((mutations, obs) => { + const el = newFileDialog.querySelector('input') + if (el) { + el.focus() + obs.disconnect() + } + }) + observer.observe(newFileDialog, { childList: true, subtree:true, attributes: true }) + + return newFileDialog + return html` <div id="dialog-new-file" class="dialog ${stateClass}" onclick=${onClick}> <div class="dialog-content"> - <input type="text" id="file-name" placeholder="File name" /> - ${boardOption} - <div class="item" onclick=${() => {emit('create-file', 'disk', 'disk_capocchia.py')}}>Computer</div> + <input type="text" id="file-name" placeholder="${generateFileName()}" /> + <div class="buttons-horizontal"> + ${boardOption} + <div class="item" onclick=${() => {emit('create-file', 'disk', 'disk_capocchia.py')}}>Computer</div> + </div> </div> </div> ` + + } diff --git a/ui/arduino/views/components/repl-panel.js b/ui/arduino/views/components/repl-panel.js index 3974d50..63a608e 100644 --- a/ui/arduino/views/components/repl-panel.js +++ b/ui/arduino/views/components/repl-panel.js @@ -7,8 +7,13 @@ function ReplPanel(state, emit) { } } const panelOpenClass = state.isPanelOpen ? 'open' : 'closed' + // const pointerEventsClass = state.isNewFileDialogOpen || state.isDialogOpen ? 'open' : 'closed' const termOperationsVisibility = state.panelHeight > PANEL_TOO_SMALL ? 'visible' : 'hidden' - const terminalDisabledClass = state.isConnected ? 'terminal-enabled' : 'terminal-disabled' + let terminalDisabledClass = 'terminal-enabled' + if (!state.isConnected || state.isNewFileDialogOpen) { + terminalDisabledClass = 'terminal-disabled' + } + // const terminalDisabledClass = state.isConnected ? 'terminal-enabled' : 'terminal-disabled' return html` <div id="panel" style="height: ${state.panelHeight}px"> From cc935436ef75cc80920c1a59c4e1017abc418fd5 Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Thu, 19 Dec 2024 08:07:00 +0100 Subject: [PATCH 06/65] Removed ESC from global shortcuts to locally handle it in dialog. Signed-off-by: ubi de feo <me@ubidefeo.com> --- backend/shortcuts.js | 1 - ui/arduino/store.js | 10 +++++----- ui/arduino/views/components/connection-dialog.js | 13 +++++++++++++ 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/backend/shortcuts.js b/backend/shortcuts.js index e6b7159..49311a4 100644 --- a/backend/shortcuts.js +++ b/backend/shortcuts.js @@ -11,7 +11,6 @@ module.exports = { CLEAR_TERMINAL: 'CommandOrControl+L', EDITOR_VIEW: 'CommandOrControl+Alt+1', FILES_VIEW: 'CommandOrControl+Alt+2', - ESC: 'Escape' }, menu: { CONNECT: 'CmdOrCtrl+Shift+C', diff --git a/ui/arduino/store.js b/ui/arduino/store.js index 09a373e..28e3a0a 100644 --- a/ui/arduino/store.js +++ b/ui/arduino/store.js @@ -1447,11 +1447,11 @@ async function store(state, emitter) { if (state.view != 'editor') return emitter.emit('change-view', 'file-manager') } - if (key === shortcuts.ESC) { - if (state.isConnectionDialogOpen) { - emitter.emit('close-connection-dialog') - } - } + // if (key === shortcuts.ESC) { + // if (state.isConnectionDialogOpen) { + // emitter.emit('close-connection-dialog') + // } + // } }) diff --git a/ui/arduino/views/components/connection-dialog.js b/ui/arduino/views/components/connection-dialog.js index 2d99a47..6b0e3ca 100644 --- a/ui/arduino/views/components/connection-dialog.js +++ b/ui/arduino/views/components/connection-dialog.js @@ -6,6 +6,19 @@ function ConnectionDialog(state, emit) { } } + function onKeyDown(e) { + if (e.key.toLowerCase() === 'escape') { + emit('close-connection-dialog') + } + } + + // Add/remove event listener based on dialog state + if (state.isConnectionDialogOpen) { + document.addEventListener('keydown', onKeyDown) + } else { + document.removeEventListener('keydown', onKeyDown) + } + return html` <div id="dialog" class="${stateClass}" onclick=${onClick}> <div class="dialog-content"> From 7fbc40caf8941d4cb30e829b8121a47ea494f9a6 Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Fri, 20 Dec 2024 14:58:37 +0100 Subject: [PATCH 07/65] Refactor of Tab creation and new file action/button. Signed-off-by: ubi de feo <me@ubidefeo.com> --- backend/shortcuts.js | 6 +- ui/arduino/index.html | 2 +- ui/arduino/main.css | 19 +++ ui/arduino/store.js | 149 ++++++++++++------ .../views/components/connection-dialog.js | 47 +++--- .../components/new-file-destination-dialog.js | 59 ------- .../views/components/new-file-dialog.js | 76 +++++++++ ui/arduino/views/editor.js | 2 +- ui/arduino/views/file-manager.js | 2 +- 9 files changed, 228 insertions(+), 134 deletions(-) delete mode 100644 ui/arduino/views/components/new-file-destination-dialog.js create mode 100644 ui/arduino/views/components/new-file-dialog.js diff --git a/backend/shortcuts.js b/backend/shortcuts.js index 49311a4..7d970fa 100644 --- a/backend/shortcuts.js +++ b/backend/shortcuts.js @@ -2,12 +2,13 @@ module.exports = { global: { CONNECT: 'CommandOrControl+Shift+C', DISCONNECT: 'CommandOrControl+Shift+D', - SAVE: 'CommandOrControl+S', RUN: 'CommandOrControl+R', RUN_SELECTION: 'CommandOrControl+Alt+R', RUN_SELECTION_WL: 'CommandOrControl+Alt+S', STOP: 'CommandOrControl+H', RESET: 'CommandOrControl+Shift+R', + NEW: 'CommandOrControl+N', + SAVE: 'CommandOrControl+S', CLEAR_TERMINAL: 'CommandOrControl+L', EDITOR_VIEW: 'CommandOrControl+Alt+1', FILES_VIEW: 'CommandOrControl+Alt+2', @@ -15,12 +16,13 @@ module.exports = { menu: { CONNECT: 'CmdOrCtrl+Shift+C', DISCONNECT: 'CmdOrCtrl+Shift+D', - SAVE: 'CmdOrCtrl+S', RUN: 'CmdOrCtrl+R', RUN_SELECTION: 'CmdOrCtrl+Alt+R', RUN_SELECTION_WL: 'CmdOrCtrl+Alt+S', STOP: 'CmdOrCtrl+H', RESET: 'CmdOrCtrl+Shift+R', + NEW: 'CmdOrCtrl+N', + SAVE: 'CmdOrCtrl+S', CLEAR_TERMINAL: 'CmdOrCtrl+L', EDITOR_VIEW: 'CmdOrCtrl+Alt+1', FILES_VIEW: 'CmdOrCtrl+Alt+2' diff --git a/ui/arduino/index.html b/ui/arduino/index.html index 63a5981..332dfc3 100644 --- a/ui/arduino/index.html +++ b/ui/arduino/index.html @@ -25,7 +25,7 @@ <!-- Components --> <script type="text/javascript" src="views/components/code-editor.js" charset="utf-8"></script> <script type="text/javascript" src="views/components/connection-dialog.js" charset="utf-8"></script> - <script type="text/javascript" src="views/components/new-file-destination-dialog.js" charset="utf-8"></script> + <script type="text/javascript" src="views/components/new-file-dialog.js" charset="utf-8"></script> <script type="text/javascript" src="views/components/file-actions.js" charset="utf-8"></script> <script type="text/javascript" src="views/components/file-list.js" charset="utf-8"></script> <script type="text/javascript" src="views/components/repl-panel.js" charset="utf-8"></script> diff --git a/ui/arduino/main.css b/ui/arduino/main.css index e141767..68af001 100644 --- a/ui/arduino/main.css +++ b/ui/arduino/main.css @@ -392,6 +392,10 @@ button.small .icon { font-size: 1.4em; width:100%; } + +.dialog .dialog-content input:focus { + outline-color: #008184; +} .dialog .dialog-content .item { border-radius: 4.5px; display: flex; @@ -419,6 +423,21 @@ button.small .icon { align-items: center; background-color: #eee;; } + +.dialog-title{ + width: 100%; + font-size: 0.8em; + padding: 0.7em; + margin: 0; + flex-basis: max-content; +} +.dialog-feedback { + font-size: 0.6em; + align-self: stretch; + padding: 0.5em; + background: #eee; +} + #file-manager { display: flex; padding: 12px 32px 24px 32px; diff --git a/ui/arduino/store.js b/ui/arduino/store.js index c25fdc1..948e7f7 100644 --- a/ui/arduino/store.js +++ b/ui/arduino/store.js @@ -10,9 +10,12 @@ const newFileContent = `# This program was created in Arduino Lab for MicroPytho print('Hello, MicroPython!') ` -async function confirm(msg, cancelMsg, confirmMsg) { - cancelMsg = cancelMsg || 'Cancel' - confirmMsg = confirmMsg || 'Yes' +async function confirmDialog(msg, cancelMsg, confirmMsg) { + // cancelMsg = cancelMsg || 'Cancel' + // confirmMsg = confirmMsg || 'Yes' + let buttons = [] + if (cancelMsg) buttons.push(cancelMsg) + if (confirmMsg) buttons.push(confirmMsg) let response = await win.openDialog({ type: 'question', buttons: [cancelMsg, confirmMsg], @@ -36,6 +39,8 @@ async function store(state, emitter) { state.boardFiles = [] state.openFiles = [] state.selectedFiles = [] + + state.newTabFileName = null state.editingFile = null state.creatingFile = null state.renamingFile = null @@ -62,17 +67,7 @@ async function store(state, emitter) { state.isTerminalBound = false - const newFile = createEmptyFile({ - parentFolder: null, // Null parent folder means not saved? - source: 'disk' - }) - newFile.editor.onChange = function() { - newFile.hasChanges = true - emitter.emit('render') - } - state.openFiles.push(newFile) - state.editingFile = newFile.id - + await createNewTab('disk') state.savedPanelHeight = PANEL_DEFAULT state.panelHeight = PANEL_CLOSED state.resizePanel = function(e) { @@ -117,15 +112,19 @@ async function store(state, emitter) { emitter.on('open-connection-dialog', async () => { log('open-connection-dialog') // UI should be in disconnected state, no need to update + dismissOpenDialogs() await serialBridge.disconnect() state.availablePorts = await getAvailablePorts() state.isConnectionDialogOpen = true emitter.emit('render') + document.addEventListener('keydown', dismissOpenDialogs) }) emitter.on('close-connection-dialog', () => { state.isConnectionDialogOpen = false + dismissOpenDialogs() emitter.emit('render') }) + emitter.on('update-ports', async () => { state.availablePorts = await getAvailablePorts() emitter.emit('render') @@ -300,14 +299,17 @@ async function store(state, emitter) { // NEW FILE AND SAVING emitter.on('create-new-file', () => { log('create-new-file') + dismissOpenDialogs() state.isNewFileDialogOpen = true emitter.emit('render') + document.addEventListener('keydown', dismissOpenDialogs) }) emitter.on('close-new-file-dialog', () => { state.isNewFileDialogOpen = false + + dismissOpenDialogs() emitter.emit('render') }) - emitter.on('save', async () => { log('save') let response = canSave({ @@ -389,7 +391,7 @@ async function store(state, emitter) { } if (willOverwrite) { - const confirmation = await confirm(`You are about to overwrite the file ${openFile.fileName} on your ${openFile.source}.\n\n Are you sure you want to proceed?`, 'Cancel', 'Yes') + const confirmation = await confirmDialog(`You are about to overwrite the file ${openFile.fileName} on your ${openFile.source}.\n\n Are you sure you want to proceed?`, 'Cancel', 'Yes') if (!confirmation) { state.isSaving = false openFile.parentFolder = oldParentFolder @@ -446,7 +448,7 @@ async function store(state, emitter) { log('close-tab', id) const currentTab = state.openFiles.find(f => f.id === id) if (currentTab.hasChanges) { - let response = await confirm("Your file has unsaved changes. Are you sure you want to proceed?") + let response = await confirmDialog("Your file has unsaved changes. Are you sure you want to proceed?", "Cancel", "Yes") if (!response) return false } state.openFiles = state.openFiles.filter(f => f.id !== id) @@ -455,16 +457,7 @@ async function store(state, emitter) { if(state.openFiles.length > 0) { state.editingFile = state.openFiles[0].id } else { - const newFile = createEmptyFile({ - source: 'disk', - parentFolder: null - }) - newFile.editor.onChange = function() { - newFile.hasChanges = true - emitter.emit('render') - } - state.openFiles.push(newFile) - state.editingFile = newFile.id + await createNewTab('disk') } emitter.emit('render') @@ -525,10 +518,19 @@ async function store(state, emitter) { }) emitter.emit('render') }) - + emitter.on('create-new-tab', async (device, fileName = null) => { + const parentFolder = device == 'board' ? state.boardNavigationPath : state.diskNavigationPath + log('create-new-tab', device, fileName, parentFolder) + const success = await createNewTab(device, fileName, parentFolder) + if (success) { + emitter.emit('close-new-file-dialog') + emitter.emit('render') + } + }) emitter.on('create-file', (device, fileName = null) => { log('create-file', device) if (state.creatingFile !== null) return + state.creatingFile = device state.creatingFolder = null if (fileName != null) { @@ -554,7 +556,7 @@ async function store(state, emitter) { fileName: fileNameParameter }) if (willOverwrite) { - const confirmAction = await confirm(`You are about to overwrite the file ${fileNameParameter} on your board.\n\nAre you sure you want to proceed?`, 'Cancel', 'Yes') + const confirmAction = await confirmDialog(`You are about to overwrite the file ${fileNameParameter} on your board.\n\nAre you sure you want to proceed?`, 'Cancel', 'Yes') if (!confirmAction) { state.creatingFile = null emitter.emit('render') @@ -577,7 +579,7 @@ async function store(state, emitter) { fileName: fileNameParameter }) if (willOverwrite) { - const confirmAction = await confirm(`You are about to overwrite the file ${fileNameParameter} on your disk.\n\nAre you sure you want to proceed?`, 'Cancel', 'Yes') + const confirmAction = await confirmDialog(`You are about to overwrite the file ${fileNameParameter} on your disk.\n\nAre you sure you want to proceed?`, 'Cancel', 'Yes') if (!confirmAction) { state.creatingFile = null emitter.emit('render') @@ -597,6 +599,7 @@ async function store(state, emitter) { setTimeout(() => { state.creatingFile = null + dismissOpenDialogs() emitter.emit('refresh-files') emitter.emit('render') }, 200) @@ -625,7 +628,7 @@ async function store(state, emitter) { fileName: value }) if (willOverwrite) { - const confirmAction = await confirm(`You are about to overwrite ${value} on your board.\n\nAre you sure you want to proceed?`, 'Cancel', 'Yes') + const confirmAction = await confirmDialog(`You are about to overwrite ${value} on your board.\n\nAre you sure you want to proceed?`, 'Cancel', 'Yes') if (!confirmAction) { state.creatingFolder = null emitter.emit('render') @@ -654,7 +657,7 @@ async function store(state, emitter) { fileName: value }) if (willOverwrite) { - const confirmAction = await confirm(`You are about to overwrite ${value} on your disk.\n\nAre you sure you want to proceed?`, 'Cancel', 'Yes') + const confirmAction = await confirmDialog(`You are about to overwrite ${value} on your disk.\n\nAre you sure you want to proceed?`, 'Cancel', 'Yes') if (!confirmAction) { state.creatingFolder = null emitter.emit('render') @@ -711,7 +714,7 @@ async function store(state, emitter) { } message += `Are you sure you want to proceed?` - const confirmAction = await confirm(message, 'Cancel', 'Yes') + const confirmAction = await confirmDialog(message, 'Cancel', 'Yes') if (!confirmAction) { state.isRemoving = false emitter.emit('render') @@ -799,7 +802,7 @@ async function store(state, emitter) { let message = `You are about to overwrite the following file/folder on your board:\n\n` message += `${value}\n\n` message += `Are you sure you want to proceed?` - const confirmAction = await confirm(message, 'Cancel', 'Yes') + const confirmAction = await confirmDialog(message, 'Cancel', 'Yes') if (!confirmAction) { state.isSaving = false state.renamingFile = null @@ -838,7 +841,7 @@ async function store(state, emitter) { let message = `You are about to overwrite the following file/folder on your disk:\n\n` message += `${value}\n\n` message += `Are you sure you want to proceed?` - const confirmAction = await confirm(message, 'Cancel', 'Yes') + const confirmAction = await confirmDialog(message, 'Cancel', 'Yes') if (!confirmAction) { state.isSaving = false state.renamingFile = null @@ -993,7 +996,7 @@ async function store(state, emitter) { } if (willOverwrite) { - const confirmation = await confirm(`You are about to overwrite the file ${openFile.fileName} on your ${openFile.source}.\n\n Are you sure you want to proceed?`, 'Cancel', 'Yes') + const confirmation = await confirmDialog(`You are about to overwrite the file ${openFile.fileName} on your ${openFile.source}.\n\n Are you sure you want to proceed?`, 'Cancel', 'Yes') if (!confirmation) { state.renamingTab = null state.isSaving = false @@ -1256,7 +1259,7 @@ async function store(state, emitter) { willOverwrite.forEach(f => message += `${f.fileName}\n`) message += `\n` message += `Are you sure you want to proceed?` - const confirmAction = await confirm(message, 'Cancel', 'Yes') + const confirmAction = await confirmDialog(message, 'Cancel', 'Yes') if (!confirmAction) { state.isTransferring = false emitter.emit('render') @@ -1321,7 +1324,7 @@ async function store(state, emitter) { willOverwrite.forEach(f => message += `${f.fileName}\n`) message += `\n` message += `Are you sure you want to proceed?` - const confirmAction = await confirm(message, 'Cancel', 'Yes') + const confirmAction = await confirmDialog(message, 'Cancel', 'Yes') if (!confirmAction) { state.isTransferring = false emitter.emit('render') @@ -1408,7 +1411,7 @@ async function store(state, emitter) { win.beforeClose(async () => { const hasChanges = !!state.openFiles.find(f => f.hasChanges) if (hasChanges) { - const response = await confirm('You may have unsaved changes. Are you sure you want to proceed?', 'Cancel', 'Yes') + const response = await confirmDialog('You may have unsaved changes. Are you sure you want to proceed?', 'Cancel', 'Yes') if (!response) return false } await win.confirmClose() @@ -1451,6 +1454,10 @@ async function store(state, emitter) { if (state.view != 'editor') return stopCode() } + if (key === shortcuts.NEW) { + if (state.view != 'editor') return + emitter.emit('create-new-file') + } if (key === shortcuts.SAVE) { if (state.view != 'editor') return emitter.emit('save') @@ -1471,6 +1478,14 @@ async function store(state, emitter) { }) + function dismissOpenDialogs(keyEvent = null) { + if (keyEvent && keyEvent.key != 'Escape') return + document.removeEventListener('keydown', dismissOpenDialogs) + state.isConnectionDialogOpen = false + state.isNewFileDialogOpen = false + emitter.emit('render') + } + function runCode() { if (canExecute({ view: state.view, isConnected: state.isConnected })) { emitter.emit('run') @@ -1507,14 +1522,60 @@ async function store(state, emitter) { } } - function createEmptyFile({ source, parentFolder }) { - return createFile({ - fileName: generateFileName(), - parentFolder, - source, + // function createEmptyFile({ source, parentFolder }) { + // return createFile({ + // fileName: generateFileName(), + // parentFolder, + // source, + // hasChanges: true + // }) + // } + + async function createNewTab(source, fileName = null, parentFolder = null) { + const navigationPath = source == 'board' ? state.boardNavigationPath : state.diskNavigationPath + const newFile = createFile({ + fileName: fileName === null ? generateFileName() : fileName, + parentFolder: parentFolder, + source: source, hasChanges: true }) + + let fullPathExists = false + + if (parentFolder != null) { + if (source == 'board') { + await serialBridge.getPrompt() + fullPathExists = await serialBridge.fileExists( + serialBridge.getFullPath( + state.boardNavigationRoot, + newFile.parentFolder, + newFile.fileName + ) + ) + } else if (source == 'disk') { + fullPathExists = await disk.fileExists( + disk.getFullPath( + state.diskNavigationRoot, + newFile.parentFolder, + newFile.fileName + ) + ) + } + } + const tabExists = state.openFiles.find(f => f.parentFolder === newFile.parentFolder && f.fileName === newFile.fileName && f.source === newFile.source) + if (tabExists || fullPathExists) { + const confirmation = confirmDialog(`File ${newFile.fileName} already exists on ${source}. Please choose another name.`, 'OK') + return false + } + newFile.editor.onChange = function() { + newFile.hasChanges = true + emitter.emit('render') + } + state.openFiles.push(newFile) + state.editingFile = newFile.id + return true } + } diff --git a/ui/arduino/views/components/connection-dialog.js b/ui/arduino/views/components/connection-dialog.js index c75b21c..8723464 100644 --- a/ui/arduino/views/components/connection-dialog.js +++ b/ui/arduino/views/components/connection-dialog.js @@ -1,36 +1,31 @@ function ConnectionDialog(state, emit) { const stateClass = state.isConnectionDialogOpen ? 'open' : 'closed' - function onClick(e) { + function clickDismiss(e) { if (e.target.id == 'dialog-connection') { emit('close-connection-dialog') } } - function onKeyDown(e) { - if (e.key.toLowerCase() === 'escape') { - emit('close-connection-dialog') - } - } - - // Add/remove event listener based on dialog state - if (state.isConnectionDialogOpen) { - document.addEventListener('keydown', onKeyDown) - } else { - document.removeEventListener('keydown', onKeyDown) - } - - return html` - <div id="dialog-connection" class="dialog ${stateClass}" onclick=${onClick}> - <div class="dialog-content"> - ${state.availablePorts.map( - (port) => html` - <div class="item" onclick=${() => emit('select-port', port)}> - ${port.path} - </div> - ` - )} - <div class="item" onclick=${() => emit('update-ports')}>Refresh</div> - </div> + const connectionDialog = html` + <div id="dialog-connection" class="dialog ${stateClass}" onclick=${clickDismiss}> + + <div class="dialog-content"> + <div class="dialog-title">Connect to...</div> + ${state.availablePorts.map( + (port) => html` + <div class="item" onclick=${() => emit('select-port', port)}> + ${port.path} + </div> + ` + )} + <div class="item" onclick=${() => emit('update-ports')}>Refresh</div> + <!--div class="dialog-feedback">Select a board to connect to.</div--> </div> + + </div> ` + if (state.isConnectionDialogOpen) { + return connectionDialog + } + } diff --git a/ui/arduino/views/components/new-file-destination-dialog.js b/ui/arduino/views/components/new-file-destination-dialog.js deleted file mode 100644 index c9944e9..0000000 --- a/ui/arduino/views/components/new-file-destination-dialog.js +++ /dev/null @@ -1,59 +0,0 @@ -function NewFileDestinationDialog(state, emit) { - const stateClass = state.isNewFileDialogOpen ? 'open' : 'closed' - function onClick(e) { - if (e.target.id == 'dialog-new-file') { - emit('close-new-file-dialog') - } - } - let boardOption = '' - if (state.isConnected) { - boardOption = html` - <div class="item" onclick=${() => {emit('create-file','board', 'board_capocchia.py')}}>Board</div> - ` - } - const now = new Date(); - const dateStr = String(now.getMonth() + 1).padStart(2, '0') + - String(now.getDate()).padStart(2, '0') + - String(now.getHours()).padStart(2, '0') + - String(now.getMinutes()).padStart(2, '0') - - const fileName = `script_${dateStr}.py`; - - const newFileDialog = html` - <div id="dialog-new-file" class="dialog ${stateClass}" onclick=${onClick}> - <div class="dialog-content"> - <input type="text" id="file-name" placeholder="${generateFileName()}" autofocus /> - <div class="buttons-horizontal"> - ${boardOption} - <div class="item" onclick=${() => {emit('create-file', 'disk', 'disk_capocchia.py')}}>Computer</div> - </div> - </div> - </div> -` - - - const observer = new MutationObserver((mutations, obs) => { - const el = newFileDialog.querySelector('input') - if (el) { - el.focus() - obs.disconnect() - } - }) - observer.observe(newFileDialog, { childList: true, subtree:true, attributes: true }) - - return newFileDialog - - return html` - <div id="dialog-new-file" class="dialog ${stateClass}" onclick=${onClick}> - <div class="dialog-content"> - <input type="text" id="file-name" placeholder="${generateFileName()}" /> - <div class="buttons-horizontal"> - ${boardOption} - <div class="item" onclick=${() => {emit('create-file', 'disk', 'disk_capocchia.py')}}>Computer</div> - </div> - </div> - </div> - ` - - -} diff --git a/ui/arduino/views/components/new-file-dialog.js b/ui/arduino/views/components/new-file-dialog.js new file mode 100644 index 0000000..83ace3f --- /dev/null +++ b/ui/arduino/views/components/new-file-dialog.js @@ -0,0 +1,76 @@ +function NewFileDialog(state, emit) { + const stateClass = state.isNewFileDialogOpen ? 'open' : 'closed' + function clickDismiss(e) { + if (e.target.id == 'dialog-new-file') { + emit('close-new-file-dialog') + } + } + + function triggerTabCreation(device) { + return () => { + const input = document.querySelector('#file-name') + const fileName = input.value.trim() || input.placeholder + emit('create-new-tab', device, fileName) + } + } + + let boardOption = '' + let inputFocus = '' + if (state.isConnected) { + boardOption = html` + <div class="item" onclick=${triggerTabCreation('board')}>Board</div> + ` + } + + const newFileDialogObserver = new MutationObserver((mutations, obs) => { + const input = document.querySelector('#dialog-new-file input') + if (input) { + input.focus() + obs.disconnect() + } + }) + + newFileDialogObserver.observe(document.body, { + childList: true, + subtree: true + }) + + + + let inputFieldValue = `` + let inputFieldPlaceholder = `` + + inputFieldPlaceholder = generateFileName() + + const inputAttrs = { + type: 'text', + id: 'file-name', + value: inputFieldValue, + placeholder: inputFieldPlaceholder + } + + const randomFileName = generateFileName() + const placeholderAttr = state.newFileName === null ? `placeholder="${randomFileName}"` : '' + const newFileDialog = html` + <div id="dialog-new-file" class="dialog ${stateClass}" onclick=${clickDismiss}> + <div class="dialog-content"> + <div class="dialog-title">Create new file</div> + <input ${inputAttrs} /> + <div class="buttons-horizontal"> + ${boardOption} + <div class="item" onclick=${triggerTabCreation('disk')}>Computer</div> + </div> + </div> + </div> +` + + if (state.isNewFileDialogOpen) { + const el = newFileDialog.querySelector('#dialog-new-file .dialog-contents > input') + if (el) { + el.focus() + } + return newFileDialog + } + + +} diff --git a/ui/arduino/views/editor.js b/ui/arduino/views/editor.js index 796bdea..c6267f0 100644 --- a/ui/arduino/views/editor.js +++ b/ui/arduino/views/editor.js @@ -7,6 +7,6 @@ function EditorView(state, emit) { ${ReplPanel(state, emit)} </div> ${ConnectionDialog(state, emit)} - ${NewFileDestinationDialog(state, emit)} + ${NewFileDialog(state, emit)} ` } diff --git a/ui/arduino/views/file-manager.js b/ui/arduino/views/file-manager.js index fd8a3c8..89f7b89 100644 --- a/ui/arduino/views/file-manager.js +++ b/ui/arduino/views/file-manager.js @@ -44,6 +44,6 @@ function FileManagerView(state, emit) { </div> </div> ${ConnectionDialog(state, emit)} - ${NewFileDestinationDialog(state, emit)} + ${NewFileDialog(state, emit)} ` } From ea5b62063dc02257b95e1eae64415a6288f1c4a4 Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Fri, 20 Dec 2024 18:22:57 +0100 Subject: [PATCH 08/65] Rework toolbar and CSS. Signed-off-by: ubi de feo <me@ubidefeo.com> --- ui/arduino/main.css | 31 ++++++++++++++++--- .../views/components/elements/button.js | 3 ++ ui/arduino/views/components/toolbar.js | 8 +++++ 3 files changed, 38 insertions(+), 4 deletions(-) diff --git a/ui/arduino/main.css b/ui/arduino/main.css index 68af001..f137269 100644 --- a/ui/arduino/main.css +++ b/ui/arduino/main.css @@ -1,8 +1,8 @@ @font-face { - font-family: "RobotoMono", monospace; + font-family: "RobotoMono"; src: - url("media/roboto-mono-latin-ext-400-normal.woff"), - url("media/roboto-mono-latin-ext-400-normal.woff2"); + url("media/roboto-mono-latin-ext-400-normal.woff2") format("woff2"), + url("media/roboto-mono-latin-ext-400-normal.woff") format("woff"); font-weight: normal; font-style: normal; } @@ -73,6 +73,19 @@ button.small .icon { .button { position: relative; + display: flex; + flex-direction: column; + align-content: space-between; + align-items: center; + gap: 10px; +} +.button .label { + text-align: center; + color: #eee; + opacity: 50%; +} +.button .label.active { + opacity: 100%; } .button .tooltip { opacity: 0; @@ -124,11 +137,21 @@ button.small .icon { display: flex; padding: 20px; align-items: center; - gap: 20px; + gap: 16px; align-self: stretch; background: #008184; } +.separator { + height: 100%; + min-width: 1px; + flex-basis: fit-content; + background: #fff; + position: relative; + margin-left: 0.5em; + margin-right: 0.5em; +} + #tabs { display: flex; padding: 10px 10px 0px 60px; diff --git a/ui/arduino/views/components/elements/button.js b/ui/arduino/views/components/elements/button.js index 3d888dd..56cd77c 100644 --- a/ui/arduino/views/components/elements/button.js +++ b/ui/arduino/views/components/elements/button.js @@ -5,6 +5,7 @@ function Button(args) { onClick = (e) => false, disabled = false, active = false, + label, tooltip, background } = args @@ -14,11 +15,13 @@ function Button(args) { } let activeClass = active ? 'active' : '' let backgroundClass = background ? 'inverted' : '' + let labelActiveClass = disabled ? '' : 'active' return html` <div class="button"> <button class="${size} ${activeClass} ${backgroundClass}" onclick=${onClick} disabled=${disabled}> <img class="icon" src="media/${icon}" /> </button> + <div class="label ${labelActiveClass}">${label}</div> ${tooltipEl} </div> ` diff --git a/ui/arduino/views/components/toolbar.js b/ui/arduino/views/components/toolbar.js index 2aaa447..4f8f484 100644 --- a/ui/arduino/views/components/toolbar.js +++ b/ui/arduino/views/components/toolbar.js @@ -15,6 +15,7 @@ function Toolbar(state, emit) { <div id="toolbar"> ${Button({ icon: state.isConnected ? 'connect.svg' : 'disconnect.svg', + label: state.isConnected ? 'Disconnect' : 'Connect', tooltip: state.isConnected ? `Disconnect (${metaKeyString}+Shift+D)` : `Connect (${metaKeyString}+Shift+C)`, onClick: () => state.isConnected ? emit('disconnect') : emit('open-connection-dialog'), active: state.isConnected @@ -24,6 +25,7 @@ function Toolbar(state, emit) { ${Button({ icon: 'run.svg', + label: 'Run', tooltip: `Run (${metaKeyString}+R)`, disabled: !_canExecute, onClick: (e) => { @@ -36,12 +38,14 @@ function Toolbar(state, emit) { })} ${Button({ icon: 'stop.svg', + label: 'Stop', tooltip: `Stop (${metaKeyString}+H)`, disabled: !_canExecute, onClick: () => emit('stop') })} ${Button({ icon: 'reboot.svg', + label: 'Reset', tooltip: `Reset (${metaKeyString}+Shift+R)`, disabled: !_canExecute, onClick: () => emit('reset') @@ -51,6 +55,7 @@ function Toolbar(state, emit) { ${Button({ icon: 'new-file.svg', + label: 'New', tooltip: `New (${metaKeyString}+N)`, disabled: state.view != 'editor', onClick: () => emit('create-new-file') @@ -58,6 +63,7 @@ function Toolbar(state, emit) { ${Button({ icon: 'save.svg', + label: 'Save', tooltip: `Save (${metaKeyString}+S)`, disabled: !_canSave, onClick: () => emit('save') @@ -67,12 +73,14 @@ function Toolbar(state, emit) { ${Button({ icon: 'code.svg', + label: 'Editor', tooltip: `Editor (${metaKeyString}+Alt+1)`, active: state.view === 'editor', onClick: () => emit('change-view', 'editor') })} ${Button({ icon: 'files.svg', + label: 'Files', tooltip: `Files (${metaKeyString}+Alt+2)`, active: state.view === 'file-manager', onClick: () => emit('change-view', 'file-manager') From 49d3ec82c4d1f1831c0e3e13424a4e93bbb63a9b Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Fri, 20 Dec 2024 19:28:11 +0100 Subject: [PATCH 09/65] UI font update, CSS update, labels. Signed-off-by: ubi de feo <me@ubidefeo.com> --- ui/arduino/main.css | 34 +++++++++++++----- .../open-sans_5.0.29_latin-wght-normal.woff2 | Bin 0 -> 48236 bytes ui/arduino/store.js | 3 ++ .../views/components/elements/button.js | 6 ++-- ui/arduino/views/components/toolbar.js | 3 +- 5 files changed, 35 insertions(+), 11 deletions(-) create mode 100644 ui/arduino/media/open-sans_5.0.29_latin-wght-normal.woff2 diff --git a/ui/arduino/main.css b/ui/arduino/main.css index f137269..eff09bc 100644 --- a/ui/arduino/main.css +++ b/ui/arduino/main.css @@ -7,11 +7,18 @@ font-style: normal; } +@font-face { + font-family: "OpenSans"; + src: url("media/open-sans_5.0.29_latin-wght-normal.woff2") format("woff2"); + font-weight: normal; + font-style: normal; +} + * { -moz-user-select: none; -webkit-user-select: none; user-select: none; - font-family: "RobotoMono", monospace; + font-family: "OpenSans", sans-serif; } body, html { @@ -78,14 +85,19 @@ button.small .icon { align-content: space-between; align-items: center; gap: 10px; + width: 50px +} +.button.first{ + width:80px; } .button .label { text-align: center; color: #eee; - opacity: 50%; + opacity: 0.5; + font-family: "OpenSans", sans-serif; } .button .label.active { - opacity: 100%; + opacity: 1; } .button .tooltip { opacity: 0; @@ -147,6 +159,7 @@ button.small .icon { min-width: 1px; flex-basis: fit-content; background: #fff; + opacity: 0.7; position: relative; margin-left: 0.5em; margin-right: 0.5em; @@ -236,8 +249,12 @@ button.small .icon { font-size: 16px; height: 100%; overflow: hidden; + } +#code-editor * { + font-family: "RobotoMono", monospace; +} #code-editor .cm-editor { width: 100%; height: 100%; @@ -411,9 +428,10 @@ button.small .icon { /* width: 100%; */ } -.dialog .dialog-content input { - font-size: 1.4em; +.dialog .dialog-content #file-name { + font-size: 1.1em; width:100%; + font-family: "RobotoMono", monospace; } .dialog .dialog-content input:focus { @@ -439,10 +457,10 @@ button.small .icon { flex-direction: row; justify-content: center; width: 100%; - gap: 20px; + gap: 12px; } .dialog .buttons-horizontal .item { - flex-basis: 40%; + flex-basis: 50%; align-items: center; background-color: #eee;; } @@ -450,7 +468,7 @@ button.small .icon { .dialog-title{ width: 100%; font-size: 0.8em; - padding: 0.7em; + padding: 0; margin: 0; flex-basis: max-content; } diff --git a/ui/arduino/media/open-sans_5.0.29_latin-wght-normal.woff2 b/ui/arduino/media/open-sans_5.0.29_latin-wght-normal.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..0beab54695b31975886051af14f1ab9763d29f0c GIT binary patch literal 48236 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 ABLDyZ literal 0 HcmV?d00001 diff --git a/ui/arduino/store.js b/ui/arduino/store.js index 948e7f7..0d3d9c6 100644 --- a/ui/arduino/store.js +++ b/ui/arduino/store.js @@ -1567,7 +1567,10 @@ async function store(state, emitter) { const confirmation = confirmDialog(`File ${newFile.fileName} already exists on ${source}. Please choose another name.`, 'OK') return false } + // LEAK > listeners keep getting added and not removed when tabs are closed + // additionally I found that closing a tab has actually added an extra listener newFile.editor.onChange = function() { + console.log('editor has changes') newFile.hasChanges = true emitter.emit('render') } diff --git a/ui/arduino/views/components/elements/button.js b/ui/arduino/views/components/elements/button.js index 56cd77c..b25a02e 100644 --- a/ui/arduino/views/components/elements/button.js +++ b/ui/arduino/views/components/elements/button.js @@ -7,7 +7,8 @@ function Button(args) { active = false, label, tooltip, - background + background, + first } = args let tooltipEl = html`` if (tooltip) { @@ -16,8 +17,9 @@ function Button(args) { let activeClass = active ? 'active' : '' let backgroundClass = background ? 'inverted' : '' let labelActiveClass = disabled ? '' : 'active' + let buttonFirstClass = first ? 'first' : '' return html` - <div class="button"> + <div class="button ${buttonFirstClass}"> <button class="${size} ${activeClass} ${backgroundClass}" onclick=${onClick} disabled=${disabled}> <img class="icon" src="media/${icon}" /> </button> diff --git a/ui/arduino/views/components/toolbar.js b/ui/arduino/views/components/toolbar.js index 4f8f484..db6fecb 100644 --- a/ui/arduino/views/components/toolbar.js +++ b/ui/arduino/views/components/toolbar.js @@ -18,7 +18,8 @@ function Toolbar(state, emit) { label: state.isConnected ? 'Disconnect' : 'Connect', tooltip: state.isConnected ? `Disconnect (${metaKeyString}+Shift+D)` : `Connect (${metaKeyString}+Shift+C)`, onClick: () => state.isConnected ? emit('disconnect') : emit('open-connection-dialog'), - active: state.isConnected + active: state.isConnected, + first: true })} <div class="separator"></div> From 5bf544d898ba7e012e948b6496173748b7e5d168 Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Fri, 20 Dec 2024 23:55:18 +0100 Subject: [PATCH 10/65] Adjusted toolbar colours (hover) and layout. Signed-off-by: ubi de feo <me@ubidefeo.com> --- ui/arduino/main.css | 23 +++++++++++++------ .../views/components/elements/button.js | 13 +++++++---- ui/arduino/views/components/toolbar.js | 17 +++++++------- 3 files changed, 33 insertions(+), 20 deletions(-) diff --git a/ui/arduino/main.css b/ui/arduino/main.css index eff09bc..bf077cc 100644 --- a/ui/arduino/main.css +++ b/ui/arduino/main.css @@ -43,7 +43,7 @@ button { align-items: center; border: none; border-radius: 45px; - background: rgba(255, 255, 255, 0.8); + background: rgba(255, 255, 255, 0.6); cursor: pointer; transition: all 0.1s; } @@ -52,6 +52,9 @@ button.small { height: 28px; border-radius: 28px; } +button.square { + border-radius: 8px; +} button.inverted:hover, button.inverted.active { background: rgba(0, 129, 132, 0.8); @@ -61,12 +64,18 @@ button.inverted { } button[disabled] { - opacity: 0.5; + background: rgba(255, 255, 255, 0.2); cursor: not-allowed; } +button[disabled]:hover { + background: rgba(255, 255, 255, 0.2); +} button:hover, button.active { background: rgba(255, 255, 255, 1); } +/* button.inactive:hover { + background: rgba(255, 255, 255, 0.2); +} */ button .icon { width: 63%; @@ -85,19 +94,19 @@ button.small .icon { align-content: space-between; align-items: center; gap: 10px; - width: 50px + width: auto } .button.first{ width:80px; } .button .label { text-align: center; - color: #eee; - opacity: 0.5; + /* color: #eee; */ + color: rgba(255, 255, 255, 0.2); font-family: "OpenSans", sans-serif; } .button .label.active { - opacity: 1; + color: rgba(255, 255, 255, 1); } .button .tooltip { opacity: 0; @@ -147,7 +156,7 @@ button.small .icon { #toolbar { display: flex; - padding: 20px; + padding: 16px 10px 10px 10px; align-items: center; gap: 16px; align-self: stretch; diff --git a/ui/arduino/views/components/elements/button.js b/ui/arduino/views/components/elements/button.js index b25a02e..db2c576 100644 --- a/ui/arduino/views/components/elements/button.js +++ b/ui/arduino/views/components/elements/button.js @@ -8,22 +8,25 @@ function Button(args) { label, tooltip, background, - first + first, + square } = args let tooltipEl = html`` if (tooltip) { tooltipEl = html`<div class="tooltip">${tooltip}</div>` } - let activeClass = active ? 'active' : '' + let activeClass = active ? 'active' : 'inactive' let backgroundClass = background ? 'inverted' : '' - let labelActiveClass = disabled ? '' : 'active' + let labelActiveClass = disabled ? 'inactive' : 'active' let buttonFirstClass = first ? 'first' : '' + let squareClass = square ? 'square' : '' + let labelItem = size === 'small' ? '' : html`<div class="label ${labelActiveClass}">${label}</div>` return html` <div class="button ${buttonFirstClass}"> - <button class="${size} ${activeClass} ${backgroundClass}" onclick=${onClick} disabled=${disabled}> + <button disabled=${disabled} class="${squareClass}${size} ${activeClass} ${backgroundClass}" onclick=${onClick}> <img class="icon" src="media/${icon}" /> </button> - <div class="label ${labelActiveClass}">${label}</div> + ${labelItem} ${tooltipEl} </div> ` diff --git a/ui/arduino/views/components/toolbar.js b/ui/arduino/views/components/toolbar.js index db6fecb..4bc90b4 100644 --- a/ui/arduino/views/components/toolbar.js +++ b/ui/arduino/views/components/toolbar.js @@ -21,7 +21,13 @@ function Toolbar(state, emit) { active: state.isConnected, first: true })} - + ${Button({ + icon: 'reboot.svg', + label: 'Reset', + tooltip: `Reset (${metaKeyString}+Shift+R)`, + disabled: !_canExecute, + onClick: () => emit('reset') + })} <div class="separator"></div> ${Button({ @@ -44,13 +50,6 @@ function Toolbar(state, emit) { disabled: !_canExecute, onClick: () => emit('stop') })} - ${Button({ - icon: 'reboot.svg', - label: 'Reset', - tooltip: `Reset (${metaKeyString}+Shift+R)`, - disabled: !_canExecute, - onClick: () => emit('reset') - })} <div class="separator"></div> @@ -77,6 +76,7 @@ function Toolbar(state, emit) { label: 'Editor', tooltip: `Editor (${metaKeyString}+Alt+1)`, active: state.view === 'editor', + square: true, onClick: () => emit('change-view', 'editor') })} ${Button({ @@ -84,6 +84,7 @@ function Toolbar(state, emit) { label: 'Files', tooltip: `Files (${metaKeyString}+Alt+2)`, active: state.view === 'file-manager', + square: true, onClick: () => emit('change-view', 'file-manager') })} </div> From 07c7bc29d03b2d3104596cfcb844a206f87da81c Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Sat, 21 Dec 2024 01:13:30 +0100 Subject: [PATCH 11/65] Split navigation bar actions|views. Signed-off-by: ubi de feo <me@ubidefeo.com> --- ui/arduino/main.css | 12 +++ ui/arduino/views/components/toolbar.js | 143 +++++++++++++------------ 2 files changed, 85 insertions(+), 70 deletions(-) diff --git a/ui/arduino/main.css b/ui/arduino/main.css index bf077cc..e7ec23a 100644 --- a/ui/arduino/main.css +++ b/ui/arduino/main.css @@ -154,6 +154,13 @@ button.small .icon { flex-shrink: 0; } +#navigation-bar { + display: flex; + width: 100%; + background: #008184; + justify-content: space-between; +} + #toolbar { display: flex; padding: 16px 10px 10px 10px; @@ -163,6 +170,11 @@ button.small .icon { background: #008184; } +#app-views { + display: flex; + padding: 16px 10px 10px 10px; + gap: 16px; +} .separator { height: 100%; min-width: 1px; diff --git a/ui/arduino/views/components/toolbar.js b/ui/arduino/views/components/toolbar.js index 4bc90b4..138d891 100644 --- a/ui/arduino/views/components/toolbar.js +++ b/ui/arduino/views/components/toolbar.js @@ -12,81 +12,84 @@ function Toolbar(state, emit) { const metaKeyString = state.platform === 'darwin' ? 'Cmd' : 'Ctrl' return html` - <div id="toolbar"> - ${Button({ - icon: state.isConnected ? 'connect.svg' : 'disconnect.svg', - label: state.isConnected ? 'Disconnect' : 'Connect', - tooltip: state.isConnected ? `Disconnect (${metaKeyString}+Shift+D)` : `Connect (${metaKeyString}+Shift+C)`, - onClick: () => state.isConnected ? emit('disconnect') : emit('open-connection-dialog'), - active: state.isConnected, - first: true - })} - ${Button({ - icon: 'reboot.svg', - label: 'Reset', - tooltip: `Reset (${metaKeyString}+Shift+R)`, - disabled: !_canExecute, - onClick: () => emit('reset') - })} - <div class="separator"></div> + <div id="navigation-bar"> + <div id="toolbar"> + ${Button({ + icon: state.isConnected ? 'connect.svg' : 'disconnect.svg', + label: state.isConnected ? 'Disconnect' : 'Connect', + tooltip: state.isConnected ? `Disconnect (${metaKeyString}+Shift+D)` : `Connect (${metaKeyString}+Shift+C)`, + onClick: () => state.isConnected ? emit('disconnect') : emit('open-connection-dialog'), + active: state.isConnected, + first: true + })} + ${Button({ + icon: 'reboot.svg', + label: 'Reset', + tooltip: `Reset (${metaKeyString}+Shift+R)`, + disabled: !_canExecute, + onClick: () => emit('reset') + })} + <div class="separator"></div> - ${Button({ - icon: 'run.svg', - label: 'Run', - tooltip: `Run (${metaKeyString}+R)`, - disabled: !_canExecute, - onClick: (e) => { - if (e.altKey) { - emit('run', true) - }else{ - emit('run') + ${Button({ + icon: 'run.svg', + label: 'Run', + tooltip: `Run (${metaKeyString}+R)`, + disabled: !_canExecute, + onClick: (e) => { + if (e.altKey) { + emit('run', true) + }else{ + emit('run') + } } - } - })} - ${Button({ - icon: 'stop.svg', - label: 'Stop', - tooltip: `Stop (${metaKeyString}+H)`, - disabled: !_canExecute, - onClick: () => emit('stop') - })} + })} + ${Button({ + icon: 'stop.svg', + label: 'Stop', + tooltip: `Stop (${metaKeyString}+H)`, + disabled: !_canExecute, + onClick: () => emit('stop') + })} - <div class="separator"></div> + <div class="separator"></div> - ${Button({ - icon: 'new-file.svg', - label: 'New', - tooltip: `New (${metaKeyString}+N)`, - disabled: state.view != 'editor', - onClick: () => emit('create-new-file') - })} + ${Button({ + icon: 'new-file.svg', + label: 'New', + tooltip: `New (${metaKeyString}+N)`, + disabled: state.view != 'editor', + onClick: () => emit('create-new-file') + })} - ${Button({ - icon: 'save.svg', - label: 'Save', - tooltip: `Save (${metaKeyString}+S)`, - disabled: !_canSave, - onClick: () => emit('save') - })} - - <div class="separator"></div> - - ${Button({ - icon: 'code.svg', - label: 'Editor', - tooltip: `Editor (${metaKeyString}+Alt+1)`, - active: state.view === 'editor', - square: true, - onClick: () => emit('change-view', 'editor') - })} - ${Button({ - icon: 'files.svg', - label: 'Files', - tooltip: `Files (${metaKeyString}+Alt+2)`, - active: state.view === 'file-manager', - square: true, - onClick: () => emit('change-view', 'file-manager') - })} + ${Button({ + icon: 'save.svg', + label: 'Save', + tooltip: `Save (${metaKeyString}+S)`, + disabled: !_canSave, + onClick: () => emit('save') + })} + </div> + + <div id="app-views"> + ${Button({ + icon: 'code.svg', + label: 'Editor', + tooltip: `Editor (${metaKeyString}+Alt+1)`, + active: state.view === 'editor', + square: true, + onClick: () => emit('change-view', 'editor') + })} + ${Button({ + icon: 'files.svg', + label: 'Files', + tooltip: `Files (${metaKeyString}+Alt+2)`, + active: state.view === 'file-manager', + square: true, + onClick: () => emit('change-view', 'file-manager') + })} + + </div> </div> ` } From 689863a6578603e500a1dc27502d98513beb6196 Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Sat, 21 Dec 2024 09:53:56 +0100 Subject: [PATCH 12/65] Fixed file actions buttons states and CSS. Signed-off-by: ubi de feo <me@ubidefeo.com> --- ui/arduino/main.css | 12 ++++--- .../views/components/elements/button.js | 31 ++++++++++--------- ui/arduino/views/components/file-actions.js | 2 ++ 3 files changed, 26 insertions(+), 19 deletions(-) diff --git a/ui/arduino/main.css b/ui/arduino/main.css index e7ec23a..50be8db 100644 --- a/ui/arduino/main.css +++ b/ui/arduino/main.css @@ -57,15 +57,15 @@ button.square { } button.inverted:hover, button.inverted.active { - background: rgba(0, 129, 132, 0.8); + background: rgba(0, 129, 132, 0.8) !important; } button.inverted { - background: rgba(0, 129, 132, 1); + background: rgba(0, 129, 132, 1) !important; } button[disabled] { background: rgba(255, 255, 255, 0.2); - cursor: not-allowed; + cursor: default; } button[disabled]:hover { background: rgba(255, 255, 255, 0.2); @@ -531,13 +531,17 @@ button.small .icon { align-self: stretch; } +#file-actions button[disabled], #file-actions button[disabled]:hover { + opacity: 0.4; +} + #file-actions button .icon { width: 100%; height: 100%; } #file-actions button:hover { - opacity: 0.2; + opacity: 0.5; */ } .device-header { diff --git a/ui/arduino/views/components/elements/button.js b/ui/arduino/views/components/elements/button.js index db2c576..2a956c6 100644 --- a/ui/arduino/views/components/elements/button.js +++ b/ui/arduino/views/components/elements/button.js @@ -1,33 +1,34 @@ function Button(args) { const { + first = false, size = '', + square = false, icon = 'connect.svg', - onClick = (e) => false, + onClick = (e) => {console.log(e); false}, disabled = false, active = false, - label, tooltip, - background, - first, - square + label, + background } = args let tooltipEl = html`` if (tooltip) { tooltipEl = html`<div class="tooltip">${tooltip}</div>` } - let activeClass = active ? 'active' : 'inactive' + let activeClass = active ? 'active' : '' let backgroundClass = background ? 'inverted' : '' - let labelActiveClass = disabled ? 'inactive' : 'active' let buttonFirstClass = first ? 'first' : '' let squareClass = square ? 'square' : '' + let labelActiveClass = disabled ? 'inactive' : 'active' let labelItem = size === 'small' ? '' : html`<div class="label ${labelActiveClass}">${label}</div>` + return html` - <div class="button ${buttonFirstClass}"> - <button disabled=${disabled} class="${squareClass}${size} ${activeClass} ${backgroundClass}" onclick=${onClick}> - <img class="icon" src="media/${icon}" /> - </button> - ${labelItem} - ${tooltipEl} - </div> - ` + <div class="button ${buttonFirstClass}"> + <button disabled=${disabled} class="${squareClass}${size} ${activeClass} ${backgroundClass}" onclick=${onClick}> + <img class="icon" src="media/${icon}" /> + </button> + ${labelItem} + ${tooltipEl} + </div> + ` } diff --git a/ui/arduino/views/components/file-actions.js b/ui/arduino/views/components/file-actions.js index f48e0ad..75ffd54 100644 --- a/ui/arduino/views/components/file-actions.js +++ b/ui/arduino/views/components/file-actions.js @@ -15,6 +15,7 @@ function FileActions(state, emit) { icon: 'arrow-left-white.svg', size: 'small', background: 'inverted', + active: true, disabled: !canUpload({ isConnected, selectedFiles }), onClick: () => emit('upload-files') })} @@ -22,6 +23,7 @@ function FileActions(state, emit) { icon: 'arrow-right-white.svg', size: 'small', background: 'inverted', + active: true, disabled: !canDownload({ isConnected, selectedFiles }), onClick: () => emit('download-files') })} From 3a67bbbe4a223dbe2c945dc8cb77fa53b17ee11b Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Sat, 21 Dec 2024 10:02:17 +0100 Subject: [PATCH 13/65] Fixed clear state.selectedFiles. Signed-off-by: ubi de feo <me@ubidefeo.com> --- ui/arduino/store.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ui/arduino/store.js b/ui/arduino/store.js index 0d3d9c6..0ebb572 100644 --- a/ui/arduino/store.js +++ b/ui/arduino/store.js @@ -1209,6 +1209,7 @@ async function store(state, emitter) { // append it to the list of files that are already open filesAlreadyOpen.push(alreadyOpen) } + } // If opening an already open file, switch to its tab @@ -1221,7 +1222,7 @@ async function store(state, emitter) { } state.openFiles = state.openFiles.concat(filesToOpen) - + state.selectedFiles = [] state.view = 'editor' updateMenu() emitter.emit('render') From aede0a2668944288f0c9e0c4ad846ede166d535b Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Sat, 21 Dec 2024 10:50:08 +0100 Subject: [PATCH 14/65] Separator height adjustments. Signed-off-by: ubi de feo <me@ubidefeo.com> --- ui/arduino/main.css | 1 + 1 file changed, 1 insertion(+) diff --git a/ui/arduino/main.css b/ui/arduino/main.css index 50be8db..493e0a8 100644 --- a/ui/arduino/main.css +++ b/ui/arduino/main.css @@ -184,6 +184,7 @@ button.small .icon { position: relative; margin-left: 0.5em; margin-right: 0.5em; + height: 65%; } #tabs { From 0591824b1ee12c698bbcc84febad037e115d15cf Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Sat, 21 Dec 2024 11:08:05 +0100 Subject: [PATCH 15/65] Removed redundant About menu item. Signed-off-by: ubi de feo <me@ubidefeo.com> --- backend/menu.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/backend/menu.js b/backend/menu.js index 6db8023..bdd3452 100644 --- a/backend/menu.js +++ b/backend/menu.js @@ -11,8 +11,6 @@ module.exports = function registerMenu(win, state = {}) { ...(isMac ? [{ label: app.name, submenu: [ - { role: 'about'}, - { type: 'separator' }, { type: 'separator' }, { role: 'hide', accelerator: 'CmdOrCtrl+Shift+H' }, { role: 'hideOthers' }, @@ -167,7 +165,7 @@ module.exports = function registerMenu(win, state = {}) { } }, { - label:'Info about this app', + label:'About Arduino Lab for MicroPython', click: () => { openAboutWindow({ icon_path: path.resolve(__dirname, '../ui/arduino/media/about_image.png'), From c996824fe8ffa9da846bcd622cbd6f5f03ca986e Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Sat, 21 Dec 2024 11:47:33 +0100 Subject: [PATCH 16/65] Toolbar: Reduced space between buttons and label. Signed-off-by: ubi de feo <me@ubidefeo.com> --- ui/arduino/main.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/arduino/main.css b/ui/arduino/main.css index 493e0a8..e2219ef 100644 --- a/ui/arduino/main.css +++ b/ui/arduino/main.css @@ -93,7 +93,7 @@ button.small .icon { flex-direction: column; align-content: space-between; align-items: center; - gap: 10px; + gap: .5em; width: auto } .button.first{ @@ -106,7 +106,7 @@ button.small .icon { font-family: "OpenSans", sans-serif; } .button .label.active { - color: rgba(255, 255, 255, 1); + color: rgba(255, 255, 255, .9); } .button .tooltip { opacity: 0; From fa82c79e7545630b91366a7a2b82bb76ea330ff3 Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Sat, 21 Dec 2024 17:48:08 +0100 Subject: [PATCH 17/65] Refactor menu, shortcuts, about window logic. Signed-off-by: ubi de feo <me@ubidefeo.com> --- backend/menu.js | 67 ++++++++++++++++++++++++++------------------ backend/shortcuts.js | 33 ++++++++++++++++++++-- index.js | 23 +++------------ preload.js | 8 +++++- ui/arduino/store.js | 14 +++++---- 5 files changed, 90 insertions(+), 55 deletions(-) diff --git a/backend/menu.js b/backend/menu.js index bdd3452..11e41bc 100644 --- a/backend/menu.js +++ b/backend/menu.js @@ -1,10 +1,43 @@ const { app, Menu } = require('electron') +const { shortcuts, disableShortcuts } = require('./shortcuts.js') const path = require('path') const serial = require('./serial/serial.js').sharedInstance const openAboutWindow = require('about-window').default -const shortcuts = require('./shortcuts.js') + const { type } = require('os') +let appInfoWindow = null + +function closeAppInfo(win) { + disableShortcuts(win, false) + appInfoWindow.off('close', () => closeAppInfo(win)) + appInfoWindow = null + +} +function openAppInfo(win) { + if (appInfoWindow != null) { + appInfoWindow.show() + } else { + appInfoWindow = openAboutWindow({ + icon_path: path.resolve(__dirname, '../ui/arduino/media/about_image.png'), + css_path: path.resolve(__dirname, '../ui/arduino/views/about.css'), + copyright: '© Arduino SA 2022', + package_json_dir: path.resolve(__dirname, '..'), + bug_report_url: "https://github.com/arduino/lab-micropython-editor/issues", + bug_link_text: "report an issue", + homepage: "https://labs.arduino.cc", + use_version_info: false, + win_options: { + parent: win, + modal: true, + }, + show_close_button: 'Close', + }) + appInfoWindow.on('close', () => closeAppInfo(win)); + disableShortcuts(win, true) + } +} + module.exports = function registerMenu(win, state = {}) { const isMac = process.platform === 'darwin' const template = [ @@ -22,6 +55,10 @@ module.exports = function registerMenu(win, state = {}) { { label: 'File', submenu: [ + { label: 'Save', + accelerator: shortcuts.menu.SAVE, + click: () => win.webContents.send('shortcut-cmd', shortcuts.global.SAVE) + }, isMac ? { role: 'close' } : { role: 'quit' } ] }, @@ -166,23 +203,7 @@ module.exports = function registerMenu(win, state = {}) { }, { label:'About Arduino Lab for MicroPython', - click: () => { - openAboutWindow({ - icon_path: path.resolve(__dirname, '../ui/arduino/media/about_image.png'), - css_path: path.resolve(__dirname, '../ui/arduino/views/about.css'), - copyright: '© Arduino SA 2022', - package_json_dir: path.resolve(__dirname, '..'), - bug_report_url: "https://github.com/arduino/lab-micropython-editor/issues", - bug_link_text: "report an issue", - homepage: "https://labs.arduino.cc", - use_version_info: false, - win_options: { - parent: win, - modal: true, - }, - show_close_button: 'Close', - }) - } + click: () => { openAppInfo(win) } }, ] } @@ -190,16 +211,6 @@ module.exports = function registerMenu(win, state = {}) { const menu = Menu.buildFromTemplate(template) - app.setAboutPanelOptions({ - applicationName: app.name, - applicationVersion: app.getVersion(), - copyright: app.copyright, - credits: '(See "Info about this app" in the Help menu)', - authors: ['Arduino'], - website: 'https://arduino.cc', - iconPath: path.join(__dirname, '../assets/image.png'), - }) - Menu.setApplicationMenu(menu) } diff --git a/backend/shortcuts.js b/backend/shortcuts.js index e6b7159..1f6a2a3 100644 --- a/backend/shortcuts.js +++ b/backend/shortcuts.js @@ -1,4 +1,6 @@ -module.exports = { +const { globalShortcut } = require('electron') +let shortcutsActive = false +const shortcuts = { global: { CONNECT: 'CommandOrControl+Shift+C', DISCONNECT: 'CommandOrControl+Shift+D', @@ -25,5 +27,32 @@ module.exports = { CLEAR_TERMINAL: 'CmdOrCtrl+L', EDITOR_VIEW: 'CmdOrCtrl+Alt+1', FILES_VIEW: 'CmdOrCtrl+Alt+2' - } + }, + // Shortcuts +} + +function shortcutAction(key, win) { + console.log("key:", key) + win.send('shortcut-cmd', key); +} + +function registerShortcuts (win) { + console.log("registering shortcuts") + win.send('ignore-shortcuts', false) +} +function unregisterShortcuts(win) { + console.log("unregistering shortcuts") + // globalShortcut.unregisterAll() + win.send('ignore-shortcuts', true) +} + +function disableShortcuts (win, value) { + console.log("registering shortcuts") + win.send('ignore-shortcuts', value) +} + +module.exports = { + shortcuts, + disableShortcuts } + diff --git a/index.js b/index.js index a6fcc04..dda3fa4 100644 --- a/index.js +++ b/index.js @@ -1,8 +1,6 @@ const { app, BrowserWindow, ipcMain, dialog, globalShortcut } = require('electron') const path = require('path') const fs = require('fs') -const shortcuts = require('./backend/shortcuts.js').global - const registerIPCHandlers = require('./backend/ipc.js') const registerMenu = require('./backend/menu.js') @@ -63,28 +61,15 @@ function createWindow () { }) } -function shortcutAction(key) { - win.webContents.send('shortcut-cmd', key); -} - -// Shortcuts -function registerShortcuts() { - Object.entries(shortcuts).forEach(([command, shortcut]) => { - globalShortcut.register(shortcut, () => { - shortcutAction(shortcut) - }); - }) -} - app.on('ready', () => { createWindow() - registerShortcuts() win.on('focus', () => { - registerShortcuts() + console.log("win focus") }) + win.on('blur', () => { - globalShortcut.unregisterAll() + console.log("win blur") }) -}) \ No newline at end of file +}) diff --git a/preload.js b/preload.js index f67d43c..66b9ab0 100644 --- a/preload.js +++ b/preload.js @@ -1,7 +1,7 @@ console.log('preload') const { contextBridge, ipcRenderer } = require('electron') const path = require('path') -const shortcuts = require('./backend/shortcuts.js').global +const shortcuts = require('./backend/shortcuts.js').shortcuts.global const { emit, platform } = require('process') const SerialBridge = require('./backend/serial/serial-bridge.js') @@ -63,6 +63,12 @@ const Window = { callback(k); }) }, + onDisableShortcuts: (callback, value) => { + ipcRenderer.on('ignore-shortcuts', (e, value) => { + console.log("ipcRenderer ignore-shortcuts", value) + callback(value); + }) + }, beforeClose: (callback) => ipcRenderer.on('check-before-close', callback), confirmClose: () => ipcRenderer.invoke('confirm-close'), diff --git a/ui/arduino/store.js b/ui/arduino/store.js index 09a373e..9844a88 100644 --- a/ui/arduino/store.js +++ b/ui/arduino/store.js @@ -60,6 +60,8 @@ async function store(state, emitter) { state.isTerminalBound = false + state.shortcutsDisabled = false + const newFile = createEmptyFile({ parentFolder: null, // Null parent folder means not saved? source: 'disk' @@ -1398,12 +1400,14 @@ async function store(state, emitter) { await win.confirmClose() }) - // win.shortcutCmdR(() => { - // // Only run if we can execute - - // }) - + win.onDisableShortcuts((disable) => { + console.log('state.shortcutsDisabled', disable) + state.shortcutsDisabled = disable + }), + win.onKeyboardShortcut((key) => { + if (state.shortcutsDisabled) return + if (key === shortcuts.CONNECT) { emitter.emit('open-connection-dialog') } From ff5ca09a38d23cc70df74cb0ce7e648b74733755 Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Sat, 21 Dec 2024 18:11:31 +0100 Subject: [PATCH 18/65] Cleaned CSS typo. Signed-off-by: ubi de feo <me@ubidefeo.com> --- ui/arduino/main.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/arduino/main.css b/ui/arduino/main.css index e2219ef..926108a 100644 --- a/ui/arduino/main.css +++ b/ui/arduino/main.css @@ -542,7 +542,7 @@ button.small .icon { } #file-actions button:hover { - opacity: 0.5; */ + opacity: 0.5; } .device-header { From 2791e006942bb401b7c5a4c8f484d8c8a0dcce4b Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Sat, 21 Dec 2024 18:45:30 +0100 Subject: [PATCH 19/65] Added New/Save shortcuts to menu. Signed-off-by: ubi de feo <me@ubidefeo.com> --- backend/menu.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/backend/menu.js b/backend/menu.js index 11e41bc..033420f 100644 --- a/backend/menu.js +++ b/backend/menu.js @@ -55,8 +55,14 @@ module.exports = function registerMenu(win, state = {}) { { label: 'File', submenu: [ + { label: 'New', + accelerator: shortcuts.menu.NEW, + enabled: state.view === 'editor', + click: () => win.webContents.send('shortcut-cmd', shortcuts.global.NEW) + }, { label: 'Save', accelerator: shortcuts.menu.SAVE, + enabled: state.view === 'editor', click: () => win.webContents.send('shortcut-cmd', shortcuts.global.SAVE) }, isMac ? { role: 'close' } : { role: 'quit' } From 838aa6f8102d928dbc1fa01e23b25eefe5eb64b6 Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Sat, 21 Dec 2024 20:19:05 +0100 Subject: [PATCH 20/65] Updated Connect shortcut. Signed-off-by: ubi de feo <me@ubidefeo.com> --- ui/arduino/store.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/arduino/store.js b/ui/arduino/store.js index b558e4d..66b7ccf 100644 --- a/ui/arduino/store.js +++ b/ui/arduino/store.js @@ -1443,7 +1443,7 @@ async function store(state, emitter) { if (state.shortcutsDisabled) return if (key === shortcuts.CONNECT) { - emitter.emit('open-connection-dialog') + emitter.emit('connect') } if (key === shortcuts.DISCONNECT) { emitter.emit('disconnect') From 9a05dd90174d26e244e8396c2c855a487eccdfc6 Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Sat, 21 Dec 2024 20:48:38 +0100 Subject: [PATCH 21/65] Cleanup unused code. Signed-off-by: ubi de feo <me@ubidefeo.com> --- backend/shortcuts.js | 17 +---------------- preload.js | 1 - ui/arduino/store.js | 1 - ui/arduino/views/components/elements/button.js | 2 +- 4 files changed, 2 insertions(+), 19 deletions(-) diff --git a/backend/shortcuts.js b/backend/shortcuts.js index 3f8bde0..2be714c 100644 --- a/backend/shortcuts.js +++ b/backend/shortcuts.js @@ -32,23 +32,8 @@ const shortcuts = { // Shortcuts } -function shortcutAction(key, win) { - console.log("key:", key) - win.send('shortcut-cmd', key); -} - -function registerShortcuts (win) { - console.log("registering shortcuts") - win.send('ignore-shortcuts', false) -} -function unregisterShortcuts(win) { - console.log("unregistering shortcuts") - // globalShortcut.unregisterAll() - win.send('ignore-shortcuts', true) -} - function disableShortcuts (win, value) { - console.log("registering shortcuts") + console.log(value ? 'disabling' : 'enabling', 'shortcuts') win.send('ignore-shortcuts', value) } diff --git a/preload.js b/preload.js index 66b9ab0..fbc1579 100644 --- a/preload.js +++ b/preload.js @@ -65,7 +65,6 @@ const Window = { }, onDisableShortcuts: (callback, value) => { ipcRenderer.on('ignore-shortcuts', (e, value) => { - console.log("ipcRenderer ignore-shortcuts", value) callback(value); }) }, diff --git a/ui/arduino/store.js b/ui/arduino/store.js index 66b7ccf..fca99fe 100644 --- a/ui/arduino/store.js +++ b/ui/arduino/store.js @@ -1435,7 +1435,6 @@ async function store(state, emitter) { }) win.onDisableShortcuts((disable) => { - console.log('state.shortcutsDisabled', disable) state.shortcutsDisabled = disable }), diff --git a/ui/arduino/views/components/elements/button.js b/ui/arduino/views/components/elements/button.js index 2a956c6..2e69931 100644 --- a/ui/arduino/views/components/elements/button.js +++ b/ui/arduino/views/components/elements/button.js @@ -4,7 +4,7 @@ function Button(args) { size = '', square = false, icon = 'connect.svg', - onClick = (e) => {console.log(e); false}, + onClick = (e) => {}, disabled = false, active = false, tooltip, From b5c766ee98cac5de4a7db75d33cf95f30b13f97a Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Sat, 21 Dec 2024 20:52:43 +0100 Subject: [PATCH 22/65] Concealed tooltips. Signed-off-by: ubi de feo <me@ubidefeo.com> --- ui/arduino/views/components/elements/button.js | 1 + 1 file changed, 1 insertion(+) diff --git a/ui/arduino/views/components/elements/button.js b/ui/arduino/views/components/elements/button.js index 2e69931..1dd69ec 100644 --- a/ui/arduino/views/components/elements/button.js +++ b/ui/arduino/views/components/elements/button.js @@ -15,6 +15,7 @@ function Button(args) { if (tooltip) { tooltipEl = html`<div class="tooltip">${tooltip}</div>` } + tooltipEl = html`` let activeClass = active ? 'active' : '' let backgroundClass = background ? 'inverted' : '' let buttonFirstClass = first ? 'first' : '' From be5f149ca2ed2879d6a8fa289a00d587294d126a Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Sat, 21 Dec 2024 21:34:26 +0100 Subject: [PATCH 23/65] CSS fix line-height to show underscores in come cases. Signed-off-by: ubi de feo <me@ubidefeo.com> --- ui/arduino/main.css | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/ui/arduino/main.css b/ui/arduino/main.css index 957c777..10b9cef 100644 --- a/ui/arduino/main.css +++ b/ui/arduino/main.css @@ -225,7 +225,7 @@ button.small .icon { color: #000; font-style: normal; font-weight: 400; - line-height: 1.1em; + line-height: 1.3em; flex: 1 0 0; max-width: calc(100% - 46px); overflow: hidden; @@ -459,12 +459,9 @@ button.small .icon { transition: transform 0.15s; } -.dialog .dialog-content > * { - /* width: 100%; */ -} .dialog .dialog-content #file-name { - font-size: 1.1em; + font-size: 1.3em; width:100%; font-family: "RobotoMono", monospace; } @@ -678,7 +675,7 @@ button.small .icon { width: 100%; overflow: hidden; text-overflow: ellipsis; - line-height: 1.1em; + line-height: 1.3em; } .file-list .item .checkbox .icon.off, From 5b81693178944771d0bbfc7192d8b1d6411b4d4d Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Sat, 21 Dec 2024 23:17:15 +0100 Subject: [PATCH 24/65] Added META+W (close tab) and META+Q (quit). Signed-off-by: ubi de feo <me@ubidefeo.com> --- backend/menu.js | 7 ++++++- backend/shortcuts.js | 2 ++ ui/arduino/store.js | 4 +++- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/backend/menu.js b/backend/menu.js index 033420f..fe543a2 100644 --- a/backend/menu.js +++ b/backend/menu.js @@ -65,7 +65,12 @@ module.exports = function registerMenu(win, state = {}) { enabled: state.view === 'editor', click: () => win.webContents.send('shortcut-cmd', shortcuts.global.SAVE) }, - isMac ? { role: 'close' } : { role: 'quit' } + { label: 'Close tab', + accelerator: 'CmdOrCtrl+W', + enabled: state.view === 'editor', + click: () => win.webContents.send('shortcut-cmd', shortcuts.global.CLOSE) + }, + { role: 'quit' } ] }, { diff --git a/backend/shortcuts.js b/backend/shortcuts.js index 2be714c..925468e 100644 --- a/backend/shortcuts.js +++ b/backend/shortcuts.js @@ -2,6 +2,7 @@ const { globalShortcut } = require('electron') let shortcutsActive = false const shortcuts = { global: { + CLOSE: 'CommandOrControl+W', CONNECT: 'CommandOrControl+Shift+C', DISCONNECT: 'CommandOrControl+Shift+D', RUN: 'CommandOrControl+R', @@ -16,6 +17,7 @@ const shortcuts = { FILES_VIEW: 'CommandOrControl+Alt+2', }, menu: { + CLOSE: 'CmdOrCtrl+W', CONNECT: 'CmdOrCtrl+Shift+C', DISCONNECT: 'CmdOrCtrl+Shift+D', RUN: 'CmdOrCtrl+R', diff --git a/ui/arduino/store.js b/ui/arduino/store.js index fca99fe..bc41090 100644 --- a/ui/arduino/store.js +++ b/ui/arduino/store.js @@ -1440,7 +1440,9 @@ async function store(state, emitter) { win.onKeyboardShortcut((key) => { if (state.shortcutsDisabled) return - + if (key === shortcuts.CLOSE) { + emitter.emit('close-tab', state.editingFile) + } if (key === shortcuts.CONNECT) { emitter.emit('connect') } From 3c1fc6c9744b3b271f55316cff58e8bab48b579c Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Sun, 22 Dec 2024 00:03:55 +0100 Subject: [PATCH 25/65] Added multiple run safeguard to prevent too many Promises from crashing the app. Signed-off-by: ubi de feo <me@ubidefeo.com> --- ui/arduino/store.js | 34 +++++++++++++++++-- .../views/components/elements/button.js | 2 ++ ui/arduino/views/components/toolbar.js | 4 +-- 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/ui/arduino/store.js b/ui/arduino/store.js index bc41090..04afdb3 100644 --- a/ui/arduino/store.js +++ b/ui/arduino/store.js @@ -228,6 +228,15 @@ async function store(state, emitter) { }) // CODE EXECUTION + emitter.on('run-from-button', (onlySelected = false) => { + if (onlySelected) { + runCodeSelection() + } else { + runCode() + } + }) + + emitter.on('run', async (onlySelected = false) => { log('run') const openFile = state.openFiles.find(f => f.id == state.editingFile) @@ -1506,14 +1515,35 @@ async function store(state, emitter) { emitter.emit('render') } + // Ensures that even if the RUN button is clicked multiple times + // there's a 100ms delay between each execution to prevent double runs + // and entering an unstable state because of getPrompt() calls + let preventDoubleRun = false + function timedReset() { + preventDoubleRun = true + setTimeout(() => { + preventDoubleRun = false + }, 500); + + } + + function filterDoubleRun(onlySelected = false) { + if (preventDoubleRun) return + console.log('>>> RUN CODE ACTUAL <<<') + emitter.emit('run', onlySelected) + timedReset() + } + function runCode() { + console.log('>>> RUN CODE REQUEST <<<') if (canExecute({ view: state.view, isConnected: state.isConnected })) { - emitter.emit('run') + filterDoubleRun() } } function runCodeSelection() { + console.log('>>> RUN CODE REQUEST <<<') if (canExecute({ view: state.view, isConnected: state.isConnected })) { - emitter.emit('run', true) + filterDoubleRun(true) } } function stopCode() { diff --git a/ui/arduino/views/components/elements/button.js b/ui/arduino/views/components/elements/button.js index 1dd69ec..b1d1f55 100644 --- a/ui/arduino/views/components/elements/button.js +++ b/ui/arduino/views/components/elements/button.js @@ -11,6 +11,8 @@ function Button(args) { label, background } = args + + let tooltipEl = html`` if (tooltip) { tooltipEl = html`<div class="tooltip">${tooltip}</div>` diff --git a/ui/arduino/views/components/toolbar.js b/ui/arduino/views/components/toolbar.js index 5acc40d..cbdb82a 100644 --- a/ui/arduino/views/components/toolbar.js +++ b/ui/arduino/views/components/toolbar.js @@ -38,9 +38,9 @@ function Toolbar(state, emit) { disabled: !_canExecute, onClick: (e) => { if (e.altKey) { - emit('run', true) + emit('run-from-button', true) }else{ - emit('run') + emit('run-from-button') } } })} From f4426285017576b250aa84f914f6227765886332 Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Sun, 22 Dec 2024 00:27:12 +0100 Subject: [PATCH 26/65] Transfer operations lock shortcuts. Progress is reset. Signed-off-by: ubi de feo <me@ubidefeo.com> --- ui/arduino/store.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ui/arduino/store.js b/ui/arduino/store.js index 04afdb3..8ca4062 100644 --- a/ui/arduino/store.js +++ b/ui/arduino/store.js @@ -59,7 +59,7 @@ async function store(state, emitter) { state.isSaving = false state.savingProgress = 0 state.isTransferring = false - state.transferringProgress = 0 + state.transferringProgress = '' state.isRemoving = false state.isLoadingFiles = false @@ -1312,7 +1312,9 @@ async function store(state, emitter) { state.transferringProgress = `${fileName}: ${progress}` emitter.emit('render') } + ) + state.transferringProgress = '' } else { await serialBridge.uploadFile( srcPath, destPath, @@ -1321,6 +1323,7 @@ async function store(state, emitter) { emitter.emit('render') } ) + state.transferringProgress = '' } } @@ -1448,6 +1451,7 @@ async function store(state, emitter) { }), win.onKeyboardShortcut((key) => { + if (state.isTransferring || state.isRemoving || state.isSaving || state.isConnectionDialogOpen || state.isNewFileDialogOpen) return if (state.shortcutsDisabled) return if (key === shortcuts.CLOSE) { emitter.emit('close-tab', state.editingFile) From 9f2adfdcfa536a5e9081c6dfe6edf551d09756b8 Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Sun, 22 Dec 2024 00:46:49 +0100 Subject: [PATCH 27/65] Reworked panel bar to allow full area drag-to-resize. Signed-off-by: ubi de feo <me@ubidefeo.com> --- ui/arduino/main.css | 6 ++++++ ui/arduino/views/components/repl-panel.js | 2 ++ 2 files changed, 8 insertions(+) diff --git a/ui/arduino/main.css b/ui/arduino/main.css index 10b9cef..d9bce9a 100644 --- a/ui/arduino/main.css +++ b/ui/arduino/main.css @@ -342,6 +342,8 @@ button.small .icon { flex-grow: 2; height: 100%; cursor: grab; + position: absolute; + width: 100%; } #panel #drag-handle:active { @@ -357,6 +359,7 @@ button.small .icon { gap: 10px; align-self: stretch; background: #008184; + position: relative; } .panel-bar #connection-status { @@ -372,6 +375,9 @@ button.small .icon { filter: invert(1); } +.panel-bar .spacer { + flex-grow: 1; +} .panel-bar .term-operations { transition: opacity 0.15s; display: flex; diff --git a/ui/arduino/views/components/repl-panel.js b/ui/arduino/views/components/repl-panel.js index 4c85fcc..eca67d9 100644 --- a/ui/arduino/views/components/repl-panel.js +++ b/ui/arduino/views/components/repl-panel.js @@ -22,6 +22,7 @@ function ReplPanel(state, emit) { <img src="media/connect.svg" /> <div>${state.isConnected ? 'Connected to ' + state.connectedPort : ''}</div> </div> + <div class="spacer"></div> <div id="drag-handle" onmousedown=${() => emit('start-resizing-panel')} onmouseup=${() => emit('stop-resizing-panel')} @@ -34,6 +35,7 @@ function ReplPanel(state, emit) { size: 'small', onClick: onToggle })} + </div> <div class=${terminalDisabledClass}> ${state.cache(XTerm, 'terminal').render()} From aa91886f79a634538dc88af13f3e7dfeb0a12bda Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Sun, 22 Dec 2024 08:07:50 +0100 Subject: [PATCH 28/65] Clearing state.selectedFiles on open/view-switch. Signed-off-by: ubi de feo <me@ubidefeo.com> --- ui/arduino/store.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ui/arduino/store.js b/ui/arduino/store.js index 8ca4062..0039775 100644 --- a/ui/arduino/store.js +++ b/ui/arduino/store.js @@ -102,10 +102,14 @@ async function store(state, emitter) { emitter.emit('render') }) emitter.on('change-view', (view) => { - state.view = view + if (state.view === 'file-manager') { + if (view != state.view) { + state.selectedFiles = [] + } emitter.emit('refresh-files') } + state.view = view emitter.emit('render') updateMenu() }) From 828f21b8573f2f7fa005ce945b2e4afca582628a Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Sun, 22 Dec 2024 09:34:25 +0100 Subject: [PATCH 29/65] Renaming tabs/files will now reflect on the other view. Signed-off-by: ubi de feo <me@ubidefeo.com> --- ui/arduino/store.js | 73 ++++++++++++++++++++++----------------------- 1 file changed, 35 insertions(+), 38 deletions(-) diff --git a/ui/arduino/store.js b/ui/arduino/store.js index 0039775..b40a1c8 100644 --- a/ui/arduino/store.js +++ b/ui/arduino/store.js @@ -927,6 +927,12 @@ async function store(state, emitter) { ) ) } + // Update tab is renaming successful + const tabToRenameIndex = state.openFiles.findIndex(f => f.fileName === file.fileName && f.source === file.source && f.parentFolder === file.parentFolder) + if (tabToRenameIndex > -1) { + state.openFiles[tabToRenameIndex].fileName = value + emitter.emit('render') + } } catch (e) { alert(`The file ${file.fileName} could not be renamed to ${value}`) } @@ -955,17 +961,6 @@ async function store(state, emitter) { return } - let response = canSave({ - view: state.view, - isConnected: state.isConnected, - openFiles: state.openFiles, - editingFile: state.editingFile - }) - if (response == false) { - log("can't save") - return - } - state.isSaving = true emitter.emit('render') @@ -1037,34 +1032,36 @@ async function store(state, emitter) { if (fullPathExists) { // SAVE FILE CONTENTS - const contents = openFile.editor.editor.state.doc.toString() - try { - if (openFile.source == 'board') { - await serialBridge.getPrompt() - await serialBridge.saveFileContent( - serialBridge.getFullPath( - state.boardNavigationRoot, - openFile.parentFolder, - oldName - ), - contents, - (e) => { - state.savingProgress = e - emitter.emit('render') - } - ) - } else if (openFile.source == 'disk') { - await disk.saveFileContent( - disk.getFullPath( - state.diskNavigationRoot, - openFile.parentFolder, - oldName - ), - contents - ) + if (openFile.hasChanges) { + const contents = openFile.editor.editor.state.doc.toString() + try { + if (openFile.source == 'board') { + await serialBridge.getPrompt() + await serialBridge.saveFileContent( + serialBridge.getFullPath( + state.boardNavigationRoot, + openFile.parentFolder, + oldName + ), + contents, + (e) => { + state.savingProgress = e + emitter.emit('render') + } + ) + } else if (openFile.source == 'disk') { + await disk.saveFileContent( + disk.getFullPath( + state.diskNavigationRoot, + openFile.parentFolder, + oldName + ), + contents + ) + } + } catch (e) { + log('error', e) } - } catch (e) { - log('error', e) } // RENAME FILE try { From 64aabf76bf92cc9634a94a8a6131e2483c333a7f Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Sun, 22 Dec 2024 11:49:01 +0100 Subject: [PATCH 30/65] Sanitised path in getFullPath() to convert Windows separators to posix. Signed-off-by: ubi de feo <me@ubidefeo.com> --- backend/serial/serial-bridge.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/serial/serial-bridge.js b/backend/serial/serial-bridge.js index 90d4d2e..a7f5f35 100644 --- a/backend/serial/serial-bridge.js +++ b/backend/serial/serial-bridge.js @@ -97,7 +97,7 @@ const SerialBridge = { return path.posix.join(navigation, target) }, getFullPath: (root, navigation, file) => { - return path.posix.join(root, navigation, file) + return path.posix.join(root, navigation.replaceAll(path.win32.sep, path.posix.sep), file.replaceAll(path.win32.sep, path.posix.sep)) }, getParentPath: (navigation) => { return path.posix.dirname(navigation) From 2fcb6778cf134fe04c416db5919d0b1b0d7d01ae Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Thu, 26 Dec 2024 10:23:10 +0100 Subject: [PATCH 31/65] Minor adjustments to window size and file list padding. Signed-off-by: ubi de feo <me@ubidefeo.com> --- index.js | 4 ++-- ui/arduino/main.css | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/index.js b/index.js index a6fcc04..2b8a5ed 100644 --- a/index.js +++ b/index.js @@ -14,8 +14,8 @@ let splashTimestamp = null function createWindow () { // Create the browser window. win = new BrowserWindow({ - width: 720, - height: 640, + width: 820, + height: 700, webPreferences: { nodeIntegration: false, webSecurity: true, diff --git a/ui/arduino/main.css b/ui/arduino/main.css index cc0e95c..a798aaf 100644 --- a/ui/arduino/main.css +++ b/ui/arduino/main.css @@ -503,7 +503,7 @@ button.small .icon { .file-list .list { display: flex; - padding: 10px 20px; + padding: 6px 8px; flex-direction: column; align-items: flex-start; flex: 1 0 0; From 954010b75f654d0838180671768704f143bc0d47 Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Mon, 3 Mar 2025 11:15:47 +0100 Subject: [PATCH 32/65] Fixed auto-connect for FM view and amended text to connect. Signed-off-by: ubi de feo <me@ubidefeo.com> --- ui/arduino/views/file-manager.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/arduino/views/file-manager.js b/ui/arduino/views/file-manager.js index 89f7b89..fa43eff 100644 --- a/ui/arduino/views/file-manager.js +++ b/ui/arduino/views/file-manager.js @@ -1,5 +1,5 @@ function FileManagerView(state, emit) { - let boardFullPath = 'Select a board...' + let boardFullPath = 'Connect to board' let diskFullPath = `${state.diskNavigationRoot}${state.diskNavigationPath}` if (state.isConnected) { @@ -13,7 +13,7 @@ function FileManagerView(state, emit) { <div id="board-files"> <div class="device-header"> <img class="icon" src="media/${state.isConnected?'board':'disconnect'}.svg" /> - <div onclick=${() => emit('open-connection-dialog')} class="text"> + <div onclick=${() => emit('connect')} class="text"> <span>${boardFullPath}</span> </div> <button disabled=${!state.isConnected} onclick=${() => emit('create-folder', 'board')}> From 5266f50455bf1cbecf023d0816535a53db7d0144 Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Mon, 3 Mar 2025 11:30:08 +0100 Subject: [PATCH 33/65] Fixed toolbar icon opacity when disabled. Signed-off-by: ubi de feo <me@ubidefeo.com> --- ui/arduino/main.css | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/ui/arduino/main.css b/ui/arduino/main.css index d9bce9a..82eb0f6 100644 --- a/ui/arduino/main.css +++ b/ui/arduino/main.css @@ -63,19 +63,14 @@ button.inverted { background: rgba(0, 129, 132, 1) !important; } -button[disabled] { - background: rgba(255, 255, 255, 0.2); +button[disabled], button[disabled]:hover { cursor: default; + opacity: 0.5; } -button[disabled]:hover { - background: rgba(255, 255, 255, 0.2); -} -button:hover, button.active { + +button:not([disabled]):hover { background: rgba(255, 255, 255, 1); } -/* button.inactive:hover { - background: rgba(255, 255, 255, 0.2); -} */ button .icon { width: 63%; @@ -101,7 +96,6 @@ button.small .icon { } .button .label { text-align: center; - /* color: #eee; */ color: rgba(255, 255, 255, 0.2); font-family: "OpenSans", sans-serif; } From f7840ab0a1fd450b39aac4c4d0147ba18e3ff1c5 Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Mon, 3 Mar 2025 12:08:12 +0100 Subject: [PATCH 34/65] App views buttons made into segmented control. Signed-off-by: ubi de feo <me@ubidefeo.com> --- ui/arduino/main.css | 28 ++++++++++++++++++++++++-- ui/arduino/media/files.svg | 3 --- ui/arduino/views/components/toolbar.js | 2 +- 3 files changed, 27 insertions(+), 6 deletions(-) delete mode 100644 ui/arduino/media/files.svg diff --git a/ui/arduino/main.css b/ui/arduino/main.css index 82eb0f6..df4551a 100644 --- a/ui/arduino/main.css +++ b/ui/arduino/main.css @@ -63,7 +63,7 @@ button.inverted { background: rgba(0, 129, 132, 1) !important; } -button[disabled], button[disabled]:hover { +button[disabled], button[disabled]:hover{ cursor: default; opacity: 0.5; } @@ -72,6 +72,10 @@ button:not([disabled]):hover { background: rgba(255, 255, 255, 1); } +button.active { + background: rgba(255, 255, 255); +} + button .icon { width: 63%; height: 63%; @@ -167,8 +171,28 @@ button.small .icon { #app-views { display: flex; padding: 16px 10px 10px 10px; - gap: 16px; + width: 120px; + /* gap: 16px; */ +} + +#app-views .button{ + flex-grow: 1; + width: 100%; } + +#app-views .button button{ + width: 100% +} + +#app-views div:first-child button{ + border-radius: 8px 0px 0px 8px; + +} +#app-views div:last-child button{ + border-radius: 0px 8px 8px 0px; + +} + .separator { height: 100%; min-width: 1px; diff --git a/ui/arduino/media/files.svg b/ui/arduino/media/files.svg deleted file mode 100644 index 59ffe3f..0000000 --- a/ui/arduino/media/files.svg +++ /dev/null @@ -1,3 +0,0 @@ -<svg width="50" height="50" viewBox="-1 0 25 18" fill="none" xmlns="http://www.w3.org/2000/svg"> -<path d="M23.95 7.6C23.8685 7.49128 23.7629 7.40305 23.6414 7.34229C23.5198 7.28154 23.3859 7.24994 23.25 7.25H21.5V4.625C21.4993 4.39314 21.4069 4.17097 21.243 4.00702C21.079 3.84307 20.8569 3.75067 20.625 3.75H11.3587L8.12125 0.50375C7.95444 0.342525 7.73199 0.251665 7.5 0.25H1.375C1.14314 0.250669 0.92097 0.343072 0.757021 0.507021C0.593072 0.67097 0.500669 0.893141 0.5 1.125V16.875C0.500669 17.1069 0.593072 17.329 0.757021 17.493C0.92097 17.6569 1.14314 17.7493 1.375 17.75H20.625C20.8129 17.7494 20.9958 17.6888 21.1468 17.5771C21.2979 17.4653 21.4094 17.3083 21.465 17.1287L24.09 8.37875C24.1287 8.24698 24.1361 8.10802 24.1118 7.97286C24.0875 7.83771 24.0321 7.71005 23.95 7.6ZM2.25 2H7.14125L10.3787 5.24625C10.5456 5.40747 10.768 5.49834 11 5.5H19.75V7.25H4C3.81207 7.25059 3.62925 7.31117 3.47815 7.42292C3.32706 7.53466 3.2156 7.69174 3.16 7.87125L2.25 10.9075V2ZM19.9775 16H2.5475L4.6475 9H22.0775L19.9775 16Z" fill="black"/> -</svg> diff --git a/ui/arduino/views/components/toolbar.js b/ui/arduino/views/components/toolbar.js index cbdb82a..a0b8a45 100644 --- a/ui/arduino/views/components/toolbar.js +++ b/ui/arduino/views/components/toolbar.js @@ -81,7 +81,7 @@ function Toolbar(state, emit) { onClick: () => emit('change-view', 'editor') })} ${Button({ - icon: 'files.svg', + icon: 'folder.svg', label: 'Files', tooltip: `Files (${metaKeyString}+Alt+2)`, active: state.view === 'file-manager', From 505ba9a191bed1f717ac1540636ed983d1f5898d Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Mon, 3 Mar 2025 12:49:45 +0100 Subject: [PATCH 35/65] Fixed fonts inconsistencies. Updated woff2 files. Signed-off-by: ubi de feo <me@ubidefeo.com> --- ui/arduino/main.css | 25 +++++++++++++++--- .../open-sans_5.0.29_latin-wght-normal.woff2 | Bin 48236 -> 0 bytes ui/arduino/media/opensans-bold.woff2 | Bin 0 -> 18200 bytes ui/arduino/media/opensans-regular.woff2 | Bin 0 -> 18168 bytes .../roboto-mono-latin-ext-400-normal.woff | Bin 12228 -> 0 bytes .../roboto-mono-latin-ext-400-normal.woff2 | Bin 9556 -> 0 bytes ui/arduino/media/roboto-regular.woff2 | Bin 0 -> 18996 bytes .../views/components/elements/button.js | 3 ++- 8 files changed, 24 insertions(+), 4 deletions(-) delete mode 100644 ui/arduino/media/open-sans_5.0.29_latin-wght-normal.woff2 create mode 100644 ui/arduino/media/opensans-bold.woff2 create mode 100644 ui/arduino/media/opensans-regular.woff2 delete mode 100644 ui/arduino/media/roboto-mono-latin-ext-400-normal.woff delete mode 100644 ui/arduino/media/roboto-mono-latin-ext-400-normal.woff2 create mode 100644 ui/arduino/media/roboto-regular.woff2 diff --git a/ui/arduino/main.css b/ui/arduino/main.css index df4551a..c7f3e8c 100644 --- a/ui/arduino/main.css +++ b/ui/arduino/main.css @@ -1,19 +1,31 @@ +/* + On 20250303, due to font files inconsistencies, we sourced the updated fonts from here: + https://github.com/alsacreations/webfonts + +*/ @font-face { font-family: "RobotoMono"; src: - url("media/roboto-mono-latin-ext-400-normal.woff2") format("woff2"), - url("media/roboto-mono-latin-ext-400-normal.woff") format("woff"); + url("media/roboto-regular.woff2") format("woff2"); font-weight: normal; font-style: normal; } + @font-face { font-family: "OpenSans"; - src: url("media/open-sans_5.0.29_latin-wght-normal.woff2") format("woff2"); + src: url("media/opensans-regular.woff2") format("woff2"); font-weight: normal; font-style: normal; } +@font-face { + font-family: "OpenSans"; + src: url("media/opensans-bold.woff2") format("woff2"); + font-weight: bold; + font-style: normal; +} + * { -moz-user-select: none; -webkit-user-select: none; @@ -184,6 +196,13 @@ button.small .icon { width: 100% } +#app-views .button .label{ + +} +#app-views .button .label.selected{ + font-weight: bold; +} + #app-views div:first-child button{ border-radius: 8px 0px 0px 8px; diff --git a/ui/arduino/media/open-sans_5.0.29_latin-wght-normal.woff2 b/ui/arduino/media/open-sans_5.0.29_latin-wght-normal.woff2 deleted file mode 100644 index 0beab54695b31975886051af14f1ab9763d29f0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48236 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 ABLDyZ diff --git a/ui/arduino/media/opensans-bold.woff2 b/ui/arduino/media/opensans-bold.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..04b3556691424b3912ae8d73b4b02f95c1fd902b GIT binary patch literal 18200 zcmV(_K-9l?Pew8T0RR9107n=A6951J0H~}007k3;0U4SA00000000000000000000 z0000#Mn+Uk92y`Sl0qC%24Db#LI^Gigk=#73WAn2f%a?xHUcCAhYSmYNB{&N1&Ia+ zg*Oa=3qN;dVrB*#&XpI~HjSQPw*&e2wB9bW1GUEiWsQAD27-+PBy4CZ`~Uxh<YWxT z^uSEZdId8ALA0X`BOJnm3Q;ka!BL<XKH!XUMj93zc2@aP#*WUb)OihM7n}FcHA6QW z#yK-Ji)fHih7!V)Ui<$TU-A|f3@LF4oxAI5R>Mv{bl-2jVK@|u69;~De99N@M9pvZ z#y`J*cY=`kCG1ncetW$`Xqc*uLF5kSlThe{Dz}}QylB+r;s5QPcb|)y_XSl{FLh+d zE-SrU3##JPr-EmI=GHCA5Ru^+V^m6R<Th%9u^<PdG9<E;3ZpQIwy-f0F?fCb`u%?I z)6^H)JDVTBA}V`POC+&SmR1gU)T)}Ogvubd!Yoy6MsMo4sIOR@s!I#tkkC-yJ6Ls< z)XBHq3(!8{Tc-Q}rw}3#q(bfV_KC|dPcm*_@2%-OvulWFq(GTZ2uCDoWoZ7k-*KG8 zCGc7o@B25pm+(eF0w?*v4S;*6y-8NHEX$smwYRmT|1$55(iD6Ef(tsj^Z+pmARn|j z>Nl9MG8}yGHvX99=4J_|ZirM<ARV-K+W!Fl0SC{GIjSDOJW%m~<RTNONCYZ!fr<p4 zFPr|?^QBi`=9)H$%qTC-au9~++`jTc6uczb<%ld=x=s4!>!w#=j;`KeEW)^<JA*JI zWHg#HUjT5Z#Hq3(2ec_&c;1%3w;Z}92z5z@A`ud-+8Ks2@6y`P`sOK0Yr=F*FlvK> z-{lYgXSyo=)vXrQV%ETV_Kfi{44iXWMpbpU)J~$EK-~hKB$z=+!>n2`JAyHiFe^9* zXRM2iL%<rCwalJ#Hawri7ep6?mxeC9AkOZ8r_J6uz#^QvCTY^{8#|1t_WVEnHx_Fv z6cP&#jKfJD3d_CwsV$(AHI{6p_^vnxp@1#WHTU0=Qto~-GH!B}Q)4+vZbFlr<mV^c z?1;+N(n0@|4VOq^x!Y&Gi7;2H<QBINGUOykkRZAK9{*d0F_kJNHfGwM8Oy|lf)fx> z6gA%b-yg2}$C~xbR=mbc9cU9skoNBXZy^ADw7TOj0O0)%r`iDEi$|*zid6#vMo&vX zDLhAo9{8&7_C@Cjx@ilE4v4)Sd`gGCAC+XY%qi3!Yw#*{|IWQz9|MveGm2f<weeHF z2LwBcHM{}1F_wX{L4}|LlGk7?I5$p!=W_Z1jD=8PDIeMZy|sJ-&V^low}G<Z_u&U@ zoRCVu@3W~K*c%IJG#e+|yVRyKt<;s*Xdgpv^w<DvC7U482cb%|U?T@T?EKQXcVrdn zfm$uZEL8;*+UX>pUO+z^n{ap~ih007tb7V~pHqeA(}m&N2OK5SWsyw|x#VTHCR~Sf zYFD6}9(w7Mei>kpA%>Y?k}0N{VNT}#1r}M#2Bq9gB4MBq&_F9&$LX4$=m)S;fGVn~ zp_V!tq|usarX{pKMo>DqTqKy|M8TLsedS5Rv|Ni+PxZmeGsYNWUM}5sdstU6J{3^3 z03Wk7Ff4H(nU+O1Ipk`d$Z~gdAG)|Swdgr>duP@5q`2b~0UAXm-~3EX(jD2yx~GGA zoF_IyM|7#D`nvD_n}<gDw<b2Tg{}U!w?}n(;`<MQQ8Y~O1^@s+WQP;>qvAVJek)tL zx#cuwCLi7-I&;DTE1|&d|EP`zx?{jz9N}cn0T-B0b5)n0x##U2uG8y6y6K^pKIwM@ z3^K$p6HGG2G&9VFd1Qe_mbNe3hHgU3pq6vRX9A#T>ktt!x`Vm>fmw_QkhhH@Vib>o zh?rv`R-|C}In`*S8-w;i9UD@bNKl%P0#;E?4YkzKARX387v1#GOCS9VFvt+YOfbn5 z)66g@^ITw2m%4<9F!21%aY)1i0pRMs^GYb8sOtLJA%qZepSS@4000000001P=KJu7 z15O;_nQf2IV2^>5*v{?kT4$&DU-euI%hr`AZ;5U8+>E3I+wAdNE#MxN3Oc?26&z|M zB3RToaZx`u2wvqLDsD$@FQzyeD&N>Ts!yHz4NMo+{Y=e6BQ*rko*qhItr-~L=5x&j zgpU9SG<k3;RB_Xwg_jOP0`Q1VvtUVrb?TC2^T20O&>%6o&>S9Eh7%?Xw+B{`sf416 zk3~n7I=ULP!RgQoZ@@4s7s3PEm@viGOc&MMZZyj-qua2{!G17Z|9N_H5*r@Pt90l- zEjG6fa#@-dz(DJrRTB`C@^$6U`Np3fIQ8o_xt8{=EI$JOx(-0@2LQ7HELl%81CV%T z{ENQ-`vTD0n$jl&p!)!nnKcApGB7|UWBk921uucb{CH4Lndy-5g@EFbs)_&74e&nr z5t0)rj1)&oA~8r+q&|{`9FjuG{Ly<v0+WF@#=Qebexw*uqL<#6;NP+P@5<jlf8YK+ zJh*;v>0t3-;b8J$_@L_`{XpyK^8RZT%Om`ZBOHk4A$a)O82FzHkV0W_Hug2fF7<gB zp|AS~hey-de6c(}IXyeSxV*Z)xxKr8czk+(d3}5TSbhHFr+U1+zP*2ZetrM^{{2IQ z31wVJrHyqy#FR^IeayAb^L{_b{R)aI2dZo7?C9$0?(H8O7#bcO85_SiIWaXey)eJH zlwv^SA)f#s{(*Br&te0C{5ydtz|qTr#ZSViYk<BNGQ2_ofYaAL^vt}q7688dYO?CX zC%|REkKgSCz?I+bL-uW1C52_@%S)?kfU3Kj8-XitJp=%6UIo--?Xew)z6R>|8-uYD z?4Nl+V}SpH%d!gT@bzXF0F(fsc8ooWe$4~Y)j5!$mHz#s+x7emJt)oz!6JX6M+h#q z_i3Ye*EZqfat?!f)UDG#gb?GkapJc0hi*K<oKgSjqbG3?p{Uoq=U@n~DKRE8NA?OS z?iZ2#j4QK`ZHxdE3Hixa9kjI)(^9!K8bXb{n}T|6?2EylT7@B;+W<<_{&w@Vx`dqb zWUdI6re<gb%cW3?!&cBEKb9q7xD`>z7*pnEX_{VP<++*o6h<>MCFZtl+0g1~vFxi% zOB2KvXho_<UwqK~6M@&QOlm7%bDSf7H4=~*N5%{=ilw_KN9-v4nsQrVZSN-s_O4c% zE4GT2VBM-=WNAgueh7yJh%`6%^tzS@G&?8cy=tlw)U^Cq3GA<rWNq8##AIeGt)O$? zGX}9k7^87rUBvp#VF%$vBigHiHj~N>1JZS50wZD5ccDH#05aIvtvg`b2po%yBc=Q{ znJ|VzMu4|H!XQ{IbONv1FIbUxXop(?Wb6SbS`F|h2kQ5JWc8SoaU}a9sJo#(nPFJ2 zoQXQXF+NEqF-ajI+-Yt@m7x}p4$1B|86>Bt{y!Wx`8()Lz06>_n~R;Ujmzt2(7mEU zHQ|+DW7uM#y3$7mD$n(RaKH`37@+o)2ssxezw1<u=e;P$rnE-gH7bFx2GFi=B4cG) zgfv_fa>7<MM5&?3eIE5x2@FgiTNu;4-10{A!xUzLECp`2tdlnF@6IjSN413OaBBuV z&O;Y~r%|=mc@0De=PpU0DClxmwyLB5aYPX!NBAM<O%7#2M&bNQtmP}JbA<}as4}dq zKbAm-v?Af8b=4q$T$+QfY6vM#Or!i-d4$?jlDyp{Y(ciXCDtOr)Y<$&z<F#!jilve zof5+0p>55`NJ_b^dA+K-BPcW6<aa1HBa6&aQ(t?9pBxjhF^CfLb3pgG2lqYOnPQ`C z2vbIm2OJTs9Fmny>Kk|HpfuFe;U;&1P{d0ma5D@WvSl>L;I#@_;`3<(P61)a(0iTU z5JGqS&-Lhvi2gUTn<V}}rWtz<ns9~XVc%2jpdAYVb5)^w(MWf;L<SSv+pRH+zq@>_ zBW5)~(;R=z@^am<n*ght!kT5j3QQEmb@ZAw_q4g$)pxg4yP0)zlqn|?L_(=XoH^Px z%eo54pt8AjzG<Danyd-2*3U4AxHH<i&xNQP<IYkxMtEvogHsA-V7B_PKm}#cZ;8th zUa60p#p>D$lI*%$&_OF}43vm;qqMza$v)GM7Pt$ud<I1GlAm%$V8i*Q|7A3w&pO4$ zMU%0$?l`UY6lZY`hQiX3rKeDkMpLtWi#OG>ybtPE;r0uz!F)92h|z$zfk>_OhfK%T z(QDfrEj;)TbZ`zv&M5{Tc^C_@c{$lRP{1;p)HkRiS!KDtkF#ghMNRvBI!WcoUf&!S zgqVBnp1>WDi3S{f2OseqG3G~q6Ngh4qAi-aTni^So^snBlDjmRAu}Z#NNL$x;VU~h z8H*;d4kX0bcJQ`z3$dL8!8yYc9!8};ka8x#opVxwGZhy*Q<<seBU7EOJe)!ikz8pB zwJfC8^yN|^R#al<re=UG>TD~jW$e&UjA#`S`MicWn46|170Lb%awaX7MhVfDqq~KY zYLz4?A_=doC)xxlk>l6{TC7l|4(*v#WDk8CvLHALQ6~AuYXREP;-Mg>M59xeHQu0C z%k55q6m)m*kB`R6p|En^>sR6h@7hazW|@4u%ZBH}2`{?i?h-gyk-gHx@*Yc8E)V3e zBC3pbntR*KK+8&?f?-!7G+RPrUmeQ@tt_cIn4KuS2KqB_d9}fkP}zEHlyNOJ{8Fy0 zPBNAj!rcVCd`2oaRYfGF?yY2b5kO3)0K%FBc3I%_h$dzjlO?#42W9WSCl2;ykU$ba zj|hotYfuELiMlSM`IMsZMtT0}60QMo^j!Qoz)~)$L#aMSH#_^}5~Yyko=}RsRy&9- zIZ`uGG~^VAkt+jnZz^b(;??B~%VIHHaDz3+92&t-0vXS%y2c5IAwf#*dNuKo2&y69 zvQe4Z<c)S+MjlcRi&7#p1#?KV;X<Tk>w*cYveFkdKP*IODQGS7fauxngP$o^jsB8L z*I6`%K^D3Ec@VmQN2e;?%MrVr5(uv$jsf$bwzBnDWjeC;l#g??p?Kn+p=h^hC|EQ{ zTAlOlW&&QSJpPd1?_a<;5I6@*5<0jgVx?u|<{ZQ+@F2Ua!RFxgMd(>Bbd1<*zJ?)t zU7g_;?;+}*8%Z~eoud~U8_ThOX9dD+aY->!jk5a{?UfL{KPn*H%M~LQA%9u+J{YSR zutxh#8?C&%u2oi&cT{Eq+UO2sznstI5(9zb3tSd>ug^7V)VXFT{{}kV8nBK6XJ!=D zA4PSooA);N-*>hGy}QcZn{-h7*35Wy4`*NZ?d@&l+jU7;Mg1EI<5{`qOaC{JiuW}b zH{&nBp&a{qp{F|Mbve#eDDCYV%Brwj&(|laMQut_-twO&lP7gz=WN;OcaW579QSiz zaG|yfO2RZ+=`Ra8(oN|F*87~hDf=s;=%5(EehH(I@V8SfE5I{nYn{;X;8l>Ng6coh z574sEd=3A6X82rOKf1woxkjlmuV1NZ0OkIW=`WfdEOgH>G8?S@r!Ee-!azWnF_z{@ zcU0(^4XWD5Jo?~z{h(B=F$gtL(vJ1246?gdU4mcq`-VY4)TXEO@<uP-JCR=qnNzD^ zRL2`U=f6`qt4v-X{yqr;WiNbt<^?h@bbI`bKskR({jLv%X>qZ1NU!I#uj+85$8wz_ zI~rBo;9*y|(^j<SP?up*De|fCx<!eUV7kL669w5Ds;X%>pCebbm)cqFeSgq_lrWH% zLn1yw`%z3M1V#BC0TVGmL=;Xb009!FMj@fLrl*GH78kPqu#vUIETL$H_xHzo5C}Jq z<Vt6QD>djz^ta1M0;-~kfu#IO%}fcA%Nrhaem4y@>)a??)GFYz<M+?`=jN_@^alJR ze6zEVI{)(={Gl6=W2MD4I?Mx=C*s7s+8|;Q`x}l2Z4edtG<5-0h7H1C7W9AGtr&{( z<zs}5GX4X)DPgGFqor1o^;=aZ{yZZ35V*Y~bBS0`Es#+mLfA092WrXEdI7MWOn|*1 zVA^?|39!~jhDMkv-#1G(B7Q&|9O5SH#8g!Ub!8~f02gsEZ6Y4PfT>19L*iR1G@>$u zK%{=1;~d<(@2L87vEte#LnhVPaR1Xn>jR_rDOx#b(+DAQPXl0|98B3$2KDVD-OEcR zTX5uf@nk)sAtfd$Qd~@f9tN5<iD^u81x|Wy#)6F>zh;%N>oYL+hZyP8r5n=85duD= zIh}qUc-VThJv>Z*Egj^i@h0Thj?_3MK^zB1pA0`#`P{HKvp54(q3Uv#TOF=YYN$zV z(g`*Wow^FDx*rWl=kxc_tnOZ&N@yO1L9w&7r`lLM*xT4T&;f#mB}Az0(1q<)2nXhP zKH%8coTQL(l}+i<mm5MBnX7f_f@S92k(W0(p4a{3>KTiSHOq_{^NhQMjBi)w+RxnF zzucL<D%c*sBv_tVvd1w>c6wZiZR8f4B{uq7B-3m6rmhKG&0Ky19VVUF$sQUy!(@NX zTQ&|O(iN)zJWUYby9!DdahCgGEKvcu`rv{^+u*_4!@m8_=7EDx>j?_6YA#<sx~M5c zL$49k&V{^O6o)%6n72c~zSz|SYxfwV%KZF^srn;0Mvl#loG!E_QjDsc&OaKP9pC6G zh{&9)p!2}ZLe)l8q|)NPTe~7ee1iigQ(nE{+f-YnCb+xDv-I@!5)7T~m~<yEijsqa zfu@<Bj*$g6g)Co96j}IB#Z+O}$DFCWsl&I0<LRUCi`vUa&Oo|DJ{EPCPoJDrj1;!M zPa7#7e|MNabp~?v3HpPx2Zs5({w{lXNPaRE-8j7+StXZ&c^bZUnvaHG4U1Zh3SSKm zSq)(roZ$XQJ>}d|TaJOt=v93D|09Y~6)HSPpAa_ZU#lo#GW;X+=a=JP_n?oizrG&% zOSAr&zX853PyYbSCqDj;Pw;G797|r`09XhH4bFm=Sy<d?O_PCk&G|aynzvxQGH<$t z41~Iy^%jp^=p66mas7GcF4Mif*)37tPnYguN4BfAw8PUZbxtU9mo-@Bg`Odvt(4J# zXF(lRbid{s_!1?CPTtC5KHKi^k*3V%$x<nJpYTve!3ydL@AE+9*}E8_48DNgm%Z2j zcO%I!Y~CAi90;(X$m*8fZaV*4$==j(;(5G&N+UtYCCX6q>et_2#Q5P&jN2cdU3)8e z!u5u3Ms8wOFyl;l-qQuCwM))!7uY*_T-zSZtsmZhdIEmZ@Uk?SU)nw*w!y{CJ0-@) zHJas|5)}r)NB?{^gM4{W6Im6FG-Ji3&J+@2to#RjtA9-2ym>Uy5ER{=WztB^n+zW0 zda(ZzdYSJEHNx2|B*>L)6c`$BxWZHw*RybDsW25Sov|iv)>hUoq-e-d!@(c$!-m&o ziGoWFPE~HnA3oR!IaV$*yl3I<T-uK3&4VXb-<(<ZX2!6bQlm)`F%3+nPjXld=G<%< zcJ6zik;#s9@&=k7+g}*R%c`K8V?cAy*Z;cnvOuYT^94XFUL9S%tKp|waoVL9`JDMm zFGIc-`2f)4+=%^n?e%=KzgulK%f(ccpr`kT=t9o*v-Tt!Iq4WW8&ONAm~0m>Q0Nq@ zEu$!4|I<aWr^mV*yuX){y!UI(VqjeVLB9R-){FpRuvsjhPhxA|<=dkx|9`(ny()Pu zvYKsyGaoOjPkr|~vFeg|Q;qx;wo|7#eZD9~D@@;J{0gW{G6`7eVmQUK=W(xb;9|2Y zs{zUGD1XW8Q8;g_lls0MF$pZXgo^Pvn_xW(z(U4kIeTZ4qgvhhII<AYZMjQ=n;#Co zT}q5%x)1-Hem58&Xvv^N6H*)f!Y6i{37FxVx9@nkeIlcqv`M{_zn`wTRy?ryIY8V{ zH4Y;n+s6bw&ezl-Cpg0MTU!6hrJ`nCpRJHzPt<q5?f9M?nLmTX=htuN%Z`k3__SSm z9Ao=B!{c48b=UGMVE6gVr*Wp6Ad2l+b~Q)wJt|q>IwAqy!XSU?CE-9fdLhmxQe`F9 zLWUl+_;g5gq43e;zx!U6Ldt<>ksQ?-w`2aoS27E36J(L>_(jbtpQv@Dw5cr@&c?t+ zHZkS9{Rx$;f)hAl?4sVryu#m2*#$^px#<zwM9Ey^hx716lyjIjKUQY*47-46Y$+vt z*2O-=*q9pb?8t~TGMam6IUJ6@AM@DUW{r)1z$f}!&Hsh(?Hru?2u}O-)FVGP$k#vI zGa=XX>-Tv)WYtHqiAnfhM>IC)@^7H}4DY@5q}-*%bGjRD`9y2sW)Uc>IGgG1l}9Ue zc5yToD8^mUq<HvQTFO6l(9bhUHAoA!F87@Iz5Y1(nns|C+sjbpa%m#XiEJdRXLGKS zaG802E`Nb{_v_OLaCH3f>EncW*?9e~k7*ccdwO+sc}7hKMJB5u{|z*8oLf#%CkMAs zp5Mzr*h1wBgTn#4#~)=NkH`rz!FhgHpvI0>)`aUBvd<;CFLH`<cXDpXZgY@0Eae^v z;75;9q9P%b`MnyABRQ(_^X0i6+ZEvMozXUe;t~1?cX4cM-p-VJPzK&iqq7E51~`cg z3IZ*prn)R&IiGj*YH9x%7Y2`1@-zW>``wi-0LHhqq7O{E>_|oko2Y8w=9|B{ayR7P zw;9_<aY$}HA}aTVx+jOH0AxfiM-Cx0xhzaDV0A8vUz&Y0CufK4f8X|reHyCT-km;3 zVqKkPJ>7mWyL9c2P8pkpO9L^beq=<hC9%XiKFZx843Yv#qDI#Nup1~x6Rz{z-p#ib zHf8?NL*(LoK%TH#G+uPjyE4qlzq7eHpphBukp-#^vghXGLHwDiFlRh96OTa|JU7vK zPA^d;s{SG<l}d$v!P)b}_N13@1vGMq#JbX@G5;^{M5lnqqv_847E0z%Q&5vnm|r@i z;q0J)Wt>M~r=2|~7pL@xXD9z|@h~(guOQidK$fX+U@bF*P6i>xm9lC;fkDwsrhjw* zIEq}<O17CC@4a3Vtz^0BaK_3|+d|LmzrFv+Qe<b?kb7);)R_yW40SAlVv3<jySE09 zJX>5>O5}q?R(2~W6P*S=Ep4iIjVl<nPL57hm(OY6MLm66|GNVlY3AQFMz_NHD~Hrj zf~?@3D0>@kJ3DJ{`%BGjI|TX(P?m;gz#07Rjq3}SZY@ko1-~9l4C<QwuE%~|ucW!9 z1aD(y+YDSAz@RWXNjoM21S?ZJN+_zn|LW94n2jiZ?lFXJj_j-|dA~qX+vH5myYDVJ z+NcjFd0Oju66XsfQHObq$>UeBXs7yrrZtKySa#d_PtMHTos<raB1KYz{A;^KQ1@Bk zULEt_!(nUHNc}d!v&%OZ^Y+<`vWs*|3~FEaPO=w<@*#iJzs*km)eGTAAJ-q|q@2k1 zwD`8gMEkV19;j)%Mtto$0Q>zxwt!a%YEa+-uaoJ_lvRk2H(O-nomq9oq?y&|`@O55 zJwJ30z35YIt!vA6I`25y#~{6^&+WsbOsco_S=f}4{oCr@931MK0%?}6>3?7`cU|f* z4;99F)g60-y$t+B_~bMT8%oj<y09q0l7|f|mnLZrtG1{D1&a)VELFEiCrLfZK|8{> z^ZCH@=nhG9$<Gv-6%BHW3#!5A978%mGtyowJP5o&PHb_fJ)M0nzb6mE;q~=Mfymt; z)s~T#(NR!%dBg;Y3Lg~;^AwZEr))Vu37ucONy4b!WlBY|`@$hEGAY;RLiIEqBQFKg z!bl}-AyN=e;1F|(CSFSBALFDyT6}iAF5C`n=VuGA_^}{$OF{^ZF|dma*<#}svebRe z>4#vjS=_UGU}x#X7J#sP8Z>@JFc{n|x)_-w5YFL&u)jvvkwA}NyI*$ITU+qGCgI4D zu1GhiqSoO1=KGJu7M>J;d8{Ha@FG5mYQwHlJ{^0w?Fu$GF_D0d?;^P#Bm3DUOo%3K z;GM(i*a}5jvP0<TEWnny>U>Wl$V^ud(FiZWNe%M};p5st!p0@c2u5z;?beIxq!51< zPD->*>WjD}va4bsIp~5$YbcHLk-KjNArV1DBxt#5#9?I~vivHIBE;yZWGxr1SVPTF zH;7Q{o3HO0;i{KpM;eLZKqFHac2paC8ZmGA*L9v-5-t5T&Fm>S#uKwMF;WImAuSy` z&umf<Zt`E_^)lHm_Rp2-q}Y7$kh2J874)y(zYmso@7<i8B|Gj{VMDBJX|^-otKNAX zWtM|KW8oKH6cxtDG1Ps$8Jh74C3y)6>U4i!b^Dmuf`a&1Csp?lTh-WT>$9fe;N_v= zbbij#FMve$_qQSi`dM2A1SA7KAxggtP7LIOuFv+r&3fDKaa~~jegFHc<0cbFtykfz z(e<+fm-g1VPQuKeGo1~S!P3>N&khqZtHZ3#lB!c|OOrRMhuf!Z$rp_gIcip9f})Cw zD<Mds0bAbY*B4_`ZQw;LdEUKz8I~nuoah;%V0Dge!g5SiQC7FA<FD4i5lwMMM1sDa zIl<7lu2ch45>C(1!VIf#iO1=+&z7p&<kBLEw7k4TT3jYwnx8f&UB7XSbZy2wcfPTa zo2Q|^iMz3ZXQLq2(D+^bpmuHTaIvJylGqxk<HhtYPT{<)og(2p8F4P<%I1ek@J5S& zqwgrYD<mwQoS}zHds3sq$}G-J?n;;N%Z<Sj!(+lO`=H0qTGDKA(yp)qj`L(TG1l0F zaCWOP*sIb<#N5VKp9ZPGM4>z?zv`qpE?D7$eiaa8zyF3>v-3Oh3=WdM_L(S~K9e+J z7#UJcBsu|~8_T=P2w1ePqeE@2qmyH;gJYdzK90IthGXH<!ejxCMmI8|+Z$jRj)pjf zy$xLho&7C+H7s&9a_aJn;tk${7bZ?*R;Pwh97_{Jy_{^9{8~33xVxRBtIBL)NUk(z z9k<D1MogZs236fEsLs*WT3s9cSzXB%&0ysWmFjyY)F*i6w`*}b3VQlkNA+Zl=cNcu zG>UgF8n6h$0w1rKsmQ57qA)(U)JW&J;Lf@4QkaKwCA_k>5fr+ChvFgB7Fwm|48Qo~ z=lw5_4FULKJplXH;#@<6+9>xfeXtE3(ZuC}^>>d7>THfZj~L#-w)vD*`E)%|l*+;- zlm^vUACX|urHCg}#?O1ffe@#R9ZNlFh&Q^uf4cGf*j!7;@N{kY==`N-7LJ7{=(EyR z-<5#Jx!RCd*sR!C_x4$1VyqGV@TVtn0C)n~bdF6CHJOkX&im_ARuO_eI2G3xSN6PY zzICC=4#vz=_uXoQujkPowX<7C@9B_0EP~6;>5m%yT&nZDoJ=%``no6PuC!cV3tvlZ zDz?r<WLOVqJIlJSF}2<q`>cJO652Frn;a55z!}j1Nn-&WFb4)mqwub@iGdJ#%pj%A zi2`6B<tC8sN8%SQ7zNTUm-m~Qh+nR9u&}Wtl{$g58j=Dm=-UGO>~j?4HHOPtowYy{ z5Yh<Bl@gBpg2qr;D@hA9@hl2Ky#mdu+a*cnK(FIf$|#4>37pEwzI_2wVqTAp@xU)F zA=p1Z+0!pKIWQ<a0n#b+^;^UZE3T@@swpZO$;uhE0GL-H%&(`^kG>uGo;otLUN5!! zZQ`dE?=m5(DI}S<fwW1Hq+H7ez%GDDZ#^Qp0i833$ds%4QIeHVSSfACt6-80i7Ubg zr~Tz=7M10AmHj9e?2&H`u*rh-LaT#W89+PJ5iSfifP>Y<=U|bO(z$P$glXj4EYOxQ zO&MHyeC_$IM*6dF&-^B3b%Lu!36U^y(*ZM9=@I4;rQ7=SfGNP6uPT`=Iy()G0d`7a z$G@3a1szU9B}c^OvaU1RwSI~~wu|@5$`NOz&YUlil0uv<E?eg!BudYVBLK857Ya>n zV{1KWNz*fa=%>zS;ppl0zVq1m8Li++t&oFzwhG?qytIj0bF`Po=Ac?=@U&9m`XOLq zco_M#H^;4UTLZ^S@e?CM*T?5036RIwlz^gE3R2LTOZXSx@BjAq+15VK``;C!P*!2C zSF}&OXGW}bo&K`O&hg=?z7m|Q3)Y;VeJ@Vrw7{!Eh9^@k%Bt&e*N$8MnX=acO{%!o z7}=*}U4m>Jo*7QYntGe4SZL~7E9u3PSfPntE^2XOSDiydnw}IEO_<2Ko-+O=;4IG4 z;**kl!@T}y0|iO55aZJ@*|BZ>Z3Gl_<c2l#K8|a%k@*yU^%4$FK(j{}@NElDAp2>z zLP0{iKxaF8*SX}TF+TjOwwLS^P>LxXXPMJz;kJB{^>{Zp>3t_Ia{U|hN%06IDZe0j zZiISZg&vVf%i3h&y_lhM^qTsai*ogeIqng7`vV~{<2Bi({jLWEc*oH0&&)>Dbj;l` zVe;o4bPnNZG3#?anuTyF`h$fe(J5A#uvp%3=}Lj><KRVxNr=yJYpF83FCa9gipPk} zBohw%d~`HdOgaXIk!7#ah6lOOjXnl!_{QEZKM};rfUZw{2DtG5d9tt=onG$`)PD8x z5Aga`Q>K?;eQfxCu3Ke~kF~lPn$?q!4YJtEcB^RjtjaBNe9S2*cXW6PBKtTeA~!I` zyRpG9D#<s>Khtxj!;YI?-;63J&xR28E<3fN+6ekM;sRw3MK*ZdRjwYx08UeGJD?my zm0jZ6u~jNoPbHOwCUqjmwXwo7Rp6^wDxpl~<-?|kXIy1Iw<HjajPRC3Qv%u0kZAeX zf?(l}k?;XhQ7g5UsUd2b<T77v+uVv@X`U(0SHX}~;brW0zET$EB!E}Cl7r1)GW!8e zb7xGR3H)HA!+bayB<vJT7LKX~VaC=Q`r<V+gjq4{IPsZ!=DI%s5r}YQE^~^b&lA|{ zQBm*+IG$I9R8R4qlYMHpfnL1rnZX+fcbtbq`(|Lpb*x%Y15YmD=6#ry@VO*Kzq8D* zWk-`5TtWVm!ZzTPKyH4h{_s?P*a2|-Fes}>n8AXn2d*0aMLy<~1!a{Riy^LXT~nEh z<C6W8%ax*a4hy@&8r$))mc2I-leoh9QuV$KpS<%u7Q|nv!=`_A)*(;&)2j&0XQxsi z{bkm6@*K)`smb``mNLB6AAU|oAhb6X^-7cT&4orX^P#asgp^@)b&g0{T5k!zvZP(V ziRx=me)74a5S_laihnRqa)IwpOT|hT&$gY-lN^3m`?CGz%i*?cNCdp=IIrm#4)HHp z_{H=&o%F}&uH2H3PVujU?C7s6(f$8ATyyt}&WrO4g8caZpQAIs455uZA)L<GYK)GR zF$*e*(Jo_<ZtYt3)*?%=olz*98GKy!8s^cfVydC2#w)qLf0Qt2V^AOlpuEXe+m6h* zC2g=2u)u<(k+`W;G^7Tf*jb7P?`kUAdj6Sq7;e*Mw!EHxhV89p@%ZF=x&pX4I6d=1 zz6WD3s~`?eX_8yg@jA0Fxdo#!*uXh6y}1b5wwq|*+iC-i=c6hb1d$*HhsLPI1VtJc z<MDc(-q7If{?A|k`^TUhK5d@efB*g8cHE)a{f~pE=1v@vG;>XM69eY1u-<}peww$P zRt>)ACK}E!Bmut?e8~%r=)qm3+X=;8n;yME)2O~(_JpGU270a6AD{0#UH4>W#^Pbc zJ&E~PMsc3^ip-rNI^iTR`C){h;}h|?8LN0Bh#O$j2zR_*#mR|zx$x=Y+L{S`pkWR2 z=|%g(BU~#U>$6%b5!WV`^Xup9=>QTeG+L`^^~SN%dsZ<wF4ck|2erw=?uQJr)p>b> zi{J6IIBrJ4Ohi!K^e*sdi`>?411C>l`^<(k72J%5WbnAz&D*=aGFKj8Ty9gpc1521 z+P3rcLoPE8ho{SYDhn+tw{jPJ!ypO!%&FsLj`ryp#R=TIe(%K~ki8dP+xS>R4f55+ zI(>FiuKM_sP|D%rdXF4cicxo0nd2MVB3tDdxdNY#3!%tZT%vkIL9Zb>stXM|X6gXJ z)w6g<4aB|>#&O5OL}bqe!;rLv@DfG~0ygraQ+M3C9Xl!$7ObQ+oN17dE(i<x5u$;E z88#vG(iR%%L$HewBx?wbSFlFN+j%*(YVS&;kuF+m)~T*|8^)<@$(E90br@xcuG9pT zLLe-vVDX}qZA(dCSx1;tM8RS0V-O#WJM^j!x3M6qx@rNew<<EQ=%Q2&o%KrBj-fte zHVQ~Z+zp(t0Q<ok`e3epEbSdHxU1JRiW&RLP}vb;=wwI<AWW9%PL<#kYXbp)nWoch zN}XE!>@`8hdkih!jG}TOT>Pj9>|#yaeH?9#-F+Br9}KIW_u&D#R90C~D8!m!C`}6W zOtt4UPFASn#7MV6OF`QUhog;<7f}qfg>v*77J89(qN2+&Sfo}p9}>JGRRmXa+0@Q= zw22{b02Y@hudMLmy_!cHBJ9CTGe(yr_R378;-E}MJzULh$xb^(2KU2J_GHjR`7u$T zJ%ZNSxge*@yh8OgoIYa;wHRQWZ-tnI3Jed&j0U}i1H`QmaV5)AKxI6MtZEFvKng`u zHSTy`ywa)(aku<g6RLq8keU!+lapy;!1Y3_vvP}pE)lhW6<c<=*s!)Bf?C`UeN_<` z(Z#LKxLa^x<&^xiS$>Z56OtfNhcKEs+0FW~*r8za9mW*#>R<qvk3)E%hGbHaxEbI; zJDJI1!_eYjA{tYv(n}F(EHjJ>$pl`~v#!GyJkSbnSZwOI(QB{<>R=d@gk#?tG$rRG zVJSk^b&yh)QJi&-oPsM{kV|%`OU=73COtZI0Ug*TqyTnvC@q|xT+x^8F{Mi3)K`ds zi_=uVX}iiHtxew~HCsyVFj~vT6F1KNHalkAlCSG~Z-j475p?`(vy4@7>T9p+=F<gF z)bqsh|FB#Cy|2F)wKThVep~%2SGi*RyoK}DuSih&rX(u6=p}4~6f13C04VFLORg$x zO=l2|I)?|8q972M;z9*OD7CKX2J~Xr8d|@Gl1_=VTVD6db+cE`;L1<@4P4{IDpXpk z>e3D_F8U~M+LU~O9QjBGqyZ}~N?a$rp-)1qC`$+n8%^UbIxg5Do#3ibER%8s>N436 z37yNM#`~lc6N)^{tyZECXrpP4^d3t(ddf+YgzEs@^z_nv{0^o49Iqf|vC`o!(&4a0 zCp(TKp-&if0hSPxYmXtdUW4*EtY$zQ41XDoQF>2c3w?B~&bU(AW02GB+9|XOti`-F zH)++8`l?CIhCMgnsvbaPS%oj@y5)J!&@^o;YhWJ`{#imtOCiBAN9l7l#5oyR%YWbv z7P*O{O)ZOuC`~LU9h~i$x@VSo+N@w-PS;h86WmxwG@NiW#?G&o3OON-ub6XM_qyU+ zc?!y2chsi}GR0`jT7S=<{f~%GiRE>d^`UduZ`jAE{BiL5+I?A5l)AS4hXoz`VGe|( z+8?xNwFF61;Z0lu6oj1|Y)koY>?=Ujc9$6@T&;E_C8fb|4#x40nNp4dmLf*ET<pG& z#TwwMQJYDcu6~}QS4uL;4#aCm016Nxm_>HDcHWrWq*C@Ht*DJtlybu@sl9z5meGtN zLA<PSgNf!+s&K?HzoAqX%vqLD)@bQWV@n#gsTn|lER584$Dx%$9+F=yh&h%E%-uzx z4V$yvjN1IMPSEi_Qx=aPj>#(Pqn##W9QPPe&Ldny>d((RUD_Ms`8H96kGe@{#@3C? zE+lZ+H9OV-;%!5fF~Z5%*v2Klet1tc(K{R60;7rdYGPF;@^?Te{iS64IEX@-&05}S zF<z-P4vNy`Jk3RlQKxs7t61bw@M<7Xi(x3b3K&b$LNL~ewQ(lrgV}3P#<k|r^K0<` zm3zp!0`pEWT}h8WfBolc@q+#V>f;*&Fn0fXf81t^5t^oK@RXpkE!(60r+B9S-=fM} zKKDArJ2~%Az7ou~((&~5=MB2Q1p6;k?%L~*UVG)L7R~9p8dOQtI?76Gu2x|c6iABb zgq$u~bP<CLhaE6@#nz&^)+rICuVPBl39Q6jNz)w{OsB+n_b6CFItv@6>2b!ywlao= ztMW4JgzZUJq{dN<l%j-7FcvLI+(i3wgzS7eev*-%M=Xh;p_DPJ<OUYgSjz>FzBQEQ zfEFA#=~8b495WOGt>0P2>Pg3pdPUVhC#Sm}ZD&Xaf4EzLTg2hUIh&}(7H(&h?i<c- z>c_c4jNfUuUiKXX0Jj9~rRL*YXQyE80O-tcVD1<rR5FWWn8EasC$NkMxG~>R^)<XN zOR3mU9;%f%E2wbjQSa6x6r7ys^sqQnYeWruJ;gNjmA)bvrnvY5i<CjBxGZ+m8RA(X zhyb=pfx#jb=2bD>P#(>Dv1{yenLwy&qhZu&B~dpTU)I|GNND_lxX=V9!q|XDS9osA z;ZlE?UnJK`jKq~0a;4#0eUjSH%*-r|gw?aTiF>b2YyfN9=`1l$H{yt~X~j*fW!yL# zcMp*PLa(>;x>F3=p7PtE3z(!N`X`zT_c)*YtjNpnpX_C4dDq|vD1H~<oMo=x`+PXw zC*DEgJZ>RBS$?r$nPvfQza;Y9e$HeOxgF!r?vd}7#u2}Gp)AMqyO%bHMQ?^3zkUh4 zt=ywpT;)RI*`<FRif{iLMcZswb5=T)kzuq!2MuL6h1pnb;AF6pQHuO0CqdB0NM34< zof!Bj$$}AzLWeA)#-&HiTTJW=us)5QD)uH=z#G|7PYlp1vJ>mP6xam;lMXtTv(6l# z+U6q+PBL%LC-i$7hkZ`aXGPG*efvGy0?i8Do>aW%#4H_ezk$xK&MiO#vSW${)T2A- z*7X6E3qqBh43V&4zzQxi&Dqdn$y9Y{jTPC}@fpW=E|U#lL}2GR<;-cm*uel;XDdfK z*(>_+;(!dwMz(Z-*bSZr$3PW5--5k;%y1EjC)LJ8&GZ5o)<_*wA2}Ds7-qa=&HMBk zq@}B;#s$j?sW@b)>8(YH!7LA3V4q1av&nFri|NMxY%ZO)tS|WrFsGmy|41FOk2j^L zhVP-WPBLoyy?n9jTTY^4Oe@l2$%ibfNDyZ|nB&dpA-FaF#I=k0==icm;ei6jR(0wg zGm~ry=FINTui{1(^&!<Md^rZ2C*5;VSr4I6WD^y)z}O8IqWWsX6c0z0X|~^>XbO{l zf#VW4nAocfkR{vbSA;Uam`DsDqT*pDv+4j^hn8>&17W=YEui1o)^($!>*+CSz2=@j zynp}85RJ^$V>fgNtLOLnm;LK#F}&_FKiut=?O)HA|Nm~&K4$}_$2VqRiP}~9*PCs( z7@);2A3Qbv$|W`4>hRf(qm@+4A8Z=V7u#9>aQs`oCEH7e)A{1$5gDgRhp$9{;dH=S zZlh@uJ4{7)VMf3mavyCpm|KNp6=1#uIt$J?K|$RBIfK!<+_$;T919@X4of77hAD8{ zg%F8jzJ(9PRMu@r=zT`bwy%!IVW2|`F4=)N$R(Re$VsCyzQv8DR_lQZ+(ZU;Zi8Fk zAVyA@Vy8i;AMSjHTtE>J<(-DKvUas_{n>~((qgH=I2|xDNGsE&+{QNV0!ll|M3EM2 z*@YU{wfGK`UY9A12mmG$lI~}&bzKv**x;dPwMTir!kdzaGe?bY5L9;zb2%5BkNL_m zc0n+x=tV=);+-|Te%ec{yPd}C%peV3cZ>}#6#I?cH5bJ&aR|d&cwpd*akbI!p(Jm8 zrebuw1T;~u5-hL)GD7IsX8rB7@f9{sK&37i;y&YMmq#wOco|x59|okS=qY8R5bjhn zu-B}d%=5P;^G0Kw!%ZjSElH4Sgx7XD>?TWHcjlYuV5@;hYYZVPN{iXLMiK5M4dubn z6z+&y0+?f(b~h{xcx!fTYO~_5Wgs^RUX`NcG~WjwnH&=E02v09W>_K()_n++$oZC- zt1$tKbQ+wb=q!7HsrnGxrt!PvpK&(?a~JN)O}otDlA$ZSYhJ}}o+gPD$}4jM?_oar z{<q7&tX62SXZd06_msWrz%Yo;ef@*o&C84DkDoc?SeHVG`|X0_+Rx5<b%|?}W)IH} zk>Pj<%4Ef|qv}M?3f;hhdlH5)Vqa0RfP30<p4S}JdiA>^?=RcUe3k&Lqdwm<mC#@G zfDw*mJ>=xw+#1Q=ph2A^kK4YEZ1t%m59Chc<<-smXQp^GuZL@8!7l={^K$#nM!1ab z2CV~+%4D47PiT2N=s1*Zh|-e65rbrRCIZMvs(i$%(oIF<Qpc<t^)oTl7~paa3@L!( zU<9p93+2BZT!L2SUI{D07+IIJ&ER<0Mx9bPbhsS9;L_T>bNJ2=emw8_;_uyy!6G8E zS005OysnM$&e~%q;OjHw=<(xt!in>jc7j-H@j3OiCdy@Y^Y}9L${3tx*Gu1;JMyw` z;0P{f{H$I|7YU5OOCXnzDi)B$uFV$(^+-KkCi_QxoN`W=sF>}r&3-`p3p--E8+<^9 zx0iM5ja&yq2JF_z&!U(JQdofkhsc247=wsibRsGlqbtqTF72%jD@6$A+$SwNQxk<o zBG3l-3DjhR6()d@Uh^F}qpT|CAMhXyOXAX<Xnh`rB6vT+%M>+li!gm~77>~rx-6OX z&}zVNbU;rCaF>St7@kiR!M%i~MIb;^s*O!n2ZjSX2*R0%(==pvoghl!w<&&w5CEmC zCfJg6I8;(dBO1P02CrRFEClgZ`e-FR=7_k7^+PhO1>+eBwRunS$C-|vIaCBd$7D4! zK`mX^2gem~(=^jSHyc@5K+T|YnSPa{Ze))<Bzt!}lPK&)VLA|*X7h1N2K%jAW-n>3 zkcG%3<k+6seY~Od;`MR>le<hQ$q%Mu3BG+H-ei7=%`dzSm<FUfkkL#4M7KNa3!IEB zG*^zSQQ1Vnxn5l9Ic0jsrHe)H<bloxbz^O)HsaGD(yMI((vNQX<z34WURMvl!}b4( z;NWad5XAwic?#2>M%$Yc35iUaC`Quaq~6i3#N606>2}P+_uJVHIF&rK8(d<~ulW1X zPi>xZQ@_w*@s^^R59hZ-zj)8^B6%~me%#7aST26t<rgjo&mSd*7<w48xA$9LoxcwQ zH+26z7+UxmuvG;IpSt0c?k;Y1I!Dj2WI?Q2!Y@#{Ie^zLdOtQ0(zX##IkQ7$M&RRL zAUgI{J6AWIF3ryx*(ij+mM;mf5JnjBLGf^GFYK2K0<E(>*3%S*5tioNU3yO1m&gow zw0>s*XuKN2yiE%1weGh<bqZsF6K(v1*`yv1F{lApiubB$uKSA2J9?$^CJ78(&?=Zt zkj@`tB$BYutlIwOyRN2Z=NFynjIRCZjtQciDmu3{>uL~j{J`=csdo1@y2`QN27$C& zv5iDTrK5leW`&|Tkrho#_NmJh+vqjxU@P8TWp-<<-c70NrF0E9{ab7JQn)1Wh#+ZQ zs0>}vb}NsMUe90?&=aW%t-x4r1v)(+M)8`1eH^i*58HLVzVU^#UrgvJA|H+<<1?~R zCS)jGmn|yG%gh^>%S*+-A3eBulTU{ATW=ax*=ytHv%5~M*0^TlH16R-G2K5rcq3p$ z{0W<X8d3q45z>FSGDh2gO6yvzS7B~1icrouAMs=m)pc32-Yv95fCL|LIv??aUgRS! zON@Br_|pt(NRRH&7Xy<jsn?}SJDURW^?M&32P_eYs@RwfGi%ZQK(R|bcg>c4##pnE zWSpyh&Mp6v^`LDQ)+9m4xDC{3ff5`IF3t((BCiZ(3R}%cC<ESI*wEOwPa1*JDWUMz z!aHUj1WCJ!^vC%)YO<>sv9z9l@2pa<G<47AC$gg91sANRJ7EtxaucbTm&ClpoQx73 z(q_mLr)28Fi^MRb1I*AeAx=1{>FwDBnb^f^$xNk03kWMT2l@otS-7^k)ly+*5ejfT zF-OaZ9O$<dI%w{C;iYfLRx}Tk?)+53SFJn@MMZ0_=QWasOxvTv9HZ8l5^Y0^YcRs$ zd?VK$GMOG@e~QkqQRgb@avk~BP0O@*_6O@%7He#&4^k>ItB~HLwBXi@H_NM-*gf0Z zr>3Dtxvf~-Qey>jJE2^TIzR(jT9($M)zVnRH_^bj+UNw%i#A-rE0h{(vY*O8Qu{pg z5Ha2pG-KWzJFr;X3Y+XTkV;{Pa$_pLTu>(ih8D;yl8n%ArPY_Nin?MR6k9k?=T|HF zeoRfFg{vbD4BQusZwJwDzt$i_Rfg;7@p(=LjlV?&mE{ggF*h@VbleK9YKbudPOz@{ zTpRn~f!eB;9fOj-k7;*(HPm@cA`CiWA<2f-r^+^qGLR5Ur<1E3|CV6>wE_5OpBb$z zD`iV!Z?u@@7Mu@@Fq_v}ab<1j%fFx}JX;pL!>H^;q@7GZ&5Lp#c=;Y!9WX^z+S{|6 zkD1qe<$tVJZB8yLR}4HKkCVD|fWEr#7k)<r483M_L<2N!XLxeVn6|w<`<)Lc5_rGF z$bc1yMi|I`up?TJUEMyF`vmxO-*@f%%3sl}&npEKfo^Ela-X%^V}3tyd<{)ISIOmG z_PzK1#n|VdWdBF09dGv&;*5YQv~>KG3ti#b>jiy9uiSh03x18A-M^e(aJ#w1Z#WeO z?GIT9K&%QT84r$q=RVIcoc30%jJU}J<76v7lnHlu1P{{LoCmD=tS6m-Q$g2vLn=6< zxW5#hWMupNGwiatd1EoWH>Mt&*U`;0Y;TgGr<3iYEHlq;qxS6S?)%;G)7~BweUrYH zR8lz9wPh+wD>ezwbclmIr|~Lz-<<Ez(eDBv+#xTN`%cE<8pR5pq(pr7UEts&>69_- z-l~$u=5oRy`6CH}gLh#b81er69%K}H<coYSxp;iYdb#>~H6ryaJkl9Yn7t5blmwe0 zCT1bosx<}{N;j3IU>?H9e&i>GtfIsy&eF_Nw5E9)ZA|?ci^a#jvQ$!R`RP1857YBx z7~We{3MV&-tU*Jh5t@#XZ-f?2n5a>+H72=hqUn6OXo^j=Sza{HKt^Gr)m(6Vc8#&g zPSR3hdYY7l=7<th$AMRZHn-h_2rh@gB_sO_XY+HC>SH^e4nUzX()0a%8s=IQX4H;% zd`PfmFD+}0z%ob{x=^8$Ijp(L_|*P8&wXXCEZ7_xkuf4k;Cnq*9#64}TOUtla8Z`@ zl4hc}9#9yNe&mE?v6#a+3@n*7Tty7&=FvSs)t<6k2L}8C(GM`+I)VIxXjR4W;^ayR zUQMB|5j8eCFy>~xY#d%s*Aowh*U9R^rpY$Ksod=O=o!Zq5^qnoxP@>iy4zSfT*R=3 zhGR(?fiv7WM2k3Zvldi%Tt!u!K#j>@G~~?Icl&6Z#Ugt8Rf2|e_9x)?jbpUAME9_w zqV2OBUEBA@rSQkYa2j4Stke1E$iRj|zG}=jy2AMcYQ`^_H}~OTeKHA?qzhSxh$ds& za!9MB!k7g2f!i-SI=Qr?fWBn^7|&m#HB!J&I~OA()=EHDHGf|w=wf9%5%K8S!xl|P zCUy@sfGKF8+gS5*MRh8xgvW{F)s&4rlLcpzzNS|`cnA?o<jk5@k{lhSek?g+l|B&q z=%@u#f4q6-s(*O!tED9R^xGs`D}!nNLCJPi@9T-j{j6xN%mK3Exv9{TJ7Wa9#j<nk zSD9K;#e~yq`D&0Fo0Z6$*4H>_>y)1M0LEHoZt5z`wK)Y3wxyVDkYxse8Eic^&hIg* z%%nF~+cfb9x`Fg=paw)Xs2(D7Fc_0V-3+`;TI<y+HI6w>ri#Z58uVOyi4vtX5Q~wH z4~GHm1`_#Z{a=c1nQ5#IS#HB#ltxUl(hoSQof>jB*VTNu-q@OBqo`15FUA_Bv&cSB ziHAw?NV;^+yj_O&*C??D_fo~Tzozq_^-X=!BI{aNv}d*?8<xXUTXdnV8bNyHC<j?V z>F34>@g+PYh4@<Np8*)g;^jmNq11(wpH{O;c$sU7S$Q<rCS_w}*<>RpZOF7fJCLhC z4Mw1nmuf1@C{oT@EKD+I>wpQ=QmS>3_|(^nM5?Q)Wm%u=$h+qX+istqq1&UD!)g`A z?R{HLMR9YuWemv*`YEXSqdBqGiU+g<oU}oGCO^qmBe1OQfbXs;ZmR;X8AXhmy3FX~ z*2G@YjFZwKN&Y^}5i%y$Qn#ybgV>rRD*lMpyhYXpx7gsV@#Rkk*jzkr#8RcQXE|f& zNdgFADtH*KB71hEyX?1NriI~HS`U}d_!8FIxcE>@WYyQzPO|Xa<0>!s^x@Hdrq^Az zhjIFkCp<>wPn=hQ-7cizp;)$#lKjZ8(Z|xp698HGUjC+hiyukU00M|HcYbmH2y;H{ zZ+x}~T=t2aYyO4*uS`y@FqrJ;-2TG{pttqEbfCSX3;$OfoX!FLx&9^n!2`%Y0OBt| znlCKZNG*pHi#>X?3tKO;NieCYG7ipZ{ep%q<D^xQBIzduenuM4TqS}U6-_HbQiz4{ zrdHOBxU`PeD|8EU8+h|Mk7@|0<BXOa5w$I=CIE_7O+SQHJ7q(z3x{!+z<Q`vAU4Wn zZV}~r#ud72QRP&8$<`&^<qM$iTA&UAlve;zRh3Zl^{QO?ma7#m?0Hi6XH8*HYEjDr zb@`A(INzb9<kDBNZH|YR|J5Zs#k0_5+o|11T^oy*oHD`H>iAZUs#S0142d#sT~Vlj z=0-xr8|Q8+KTRtsB8qB^Ma`yn#dfk&^NG&YAkg5;xjfEC*G?SGHmr0=xeW8E?R5TN z`EGYo6AqbYlu6U=V_t=-E58L<or|*WacSBi9nr3xY{n^4iILmrTfP|N+f{%uun|b8 z^=4v!Vx?PJQ0)fw@0gOxBWQ~GVlOGvF*G0pGOj}PQ)l^N5jVeBTq6aD{c0Pc0y+x) zrS-}PniBPww6wYc11ex#G~e^x#*1f|J?!;tfOa@whjaiCZv$c>w(&C{P5>N2>U|mS zA>U=w*7rm=u?I`qu-SuH_%m#iCagwH9EwzqeimlcaeQU=XZ1>cVFGpmHz$LM0s`m& z%;#4_JplnKeE=>1b`eDI#)AQ4mu(=3iVc*6bps>jlYtWtxM9;3NW)Gpt{E=6@xgFo zCNw-H>4q0QJu<gQGS4Zqa>)a8+fQTX@32&3!QQ`$=f9pXg%&S51682@2yj1mN(Pq* z{y{QQ(jD>5_Ouu<^wW0JA<%sqmBGqMZ5O_mu)O(K^1v27)$yHkJ1Q?HBFXqz9B{kf z#%;#0;wGl0(wVt>knB)899t6=EmI4Y#ZMJdu?k44`*KQ`yD06Ohke5aSLLE(gy*EE z!l)$MgSt^VaG;`*^4Yk?Y1Fz7AgDMgxRpWOoMPD-Y<Hsz`YBc<Q_=mQ1gz}flO{H= z<0flH_0u@Fq{=-Vp7olL%e&636QwSE?^myn3B8yU+W~g)gA@3~P8=zjyQMTAk<o<S zw`P(f_nAtXjl2EDcGVGw)kiuREjqM&##81k^F89NKP~|&85J41RafCNqxs%;8+dhe zd#}1{AUV1XU9Hj+ozC?<yxaL2uWNomBY;S8B??#zVc^)X<2W7h4+=LPy!h}FAV`QX z5u#2JbDFp_Bp^sS3rPx!G&C6)vgF89ph$@_6{@PgkQy{;IY*lgU3&Bxz``+P#Fz<F zX7C7z%r6=RS#^<+Rof|Jhx&x*sy!gbj58NNuK!I~+<634r))VE)i{)^RFP)=x&o%q zzATjik5);r%Xih2h}B}ivG0E9Fl@z5BRqLI&)Xe7Zn^D&yY9K~Engc}tr_L#i*nmG zZSnWsM+E`}2=e5@P;J6Q2=~+%Hb%5qao&lSC_$1G$!4@mlPX<?4?dZ*>#@C)KYus$ zj{z|-2F2hI2*D5v;SdSYIOT$ircAqL!ldg4L(G!pI341O<4ogsDk0oooh{}}fLe@R zKBuiFA9@`P5Hy8zoSv%jE*XThkP)&%PRI)dp(vCTsYu&Pr(nl))c3ewOr(#uN0k4| zfy|&fKY$W0jSR!V@BYkY;@_?Rf=XCF)}!nh576y<$G2QTNafh9ll9ne>U#6B6Jo5U zc)$@D%gD`hJH<_74RZ5^{4Z^LsGid}qH>^OMnPjO7kX{yuwCB)Y2M>0@v<4$=Mwgq Pv4zvva76~%b;B<Mx=ls~ literal 0 HcmV?d00001 diff --git a/ui/arduino/media/opensans-regular.woff2 b/ui/arduino/media/opensans-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..8ceeab50e1b88b45a509967019375651e61d100a GIT binary patch literal 18168 zcmV)AK*YayPew8T0RR9107m!#6951J0I4_t07i=d0U4SA00000000000000000000 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 literal 0 HcmV?d00001 diff --git a/ui/arduino/media/roboto-mono-latin-ext-400-normal.woff b/ui/arduino/media/roboto-mono-latin-ext-400-normal.woff deleted file mode 100644 index 50943d5cc9fb1533331266fa67b7b5535204dd01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12228 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 RrF^dGM$O+qkc+He{~rvJWB~vG diff --git a/ui/arduino/media/roboto-mono-latin-ext-400-normal.woff2 b/ui/arduino/media/roboto-mono-latin-ext-400-normal.woff2 deleted file mode 100644 index cb00b8b5be81aaf4ecb3c93dbcc0c2a8a2f17601..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9556 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 diff --git a/ui/arduino/media/roboto-regular.woff2 b/ui/arduino/media/roboto-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..c0b2dd6b16f34661e3e51efcf1770ad45a28870a GIT binary patch literal 18996 zcmV(?K-a%_Pew8T0RR9107^6f6951J0I?JR07=FG0ssI200000000000000000000 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 literal 0 HcmV?d00001 diff --git a/ui/arduino/views/components/elements/button.js b/ui/arduino/views/components/elements/button.js index b1d1f55..4ed37b9 100644 --- a/ui/arduino/views/components/elements/button.js +++ b/ui/arduino/views/components/elements/button.js @@ -19,11 +19,12 @@ function Button(args) { } tooltipEl = html`` let activeClass = active ? 'active' : '' + let labelSelectedClass = active ? 'selected' : '' let backgroundClass = background ? 'inverted' : '' let buttonFirstClass = first ? 'first' : '' let squareClass = square ? 'square' : '' let labelActiveClass = disabled ? 'inactive' : 'active' - let labelItem = size === 'small' ? '' : html`<div class="label ${labelActiveClass}">${label}</div>` + let labelItem = size === 'small' ? '' : html`<div class="label ${labelActiveClass} ${labelSelectedClass}">${label}</div>` return html` <div class="button ${buttonFirstClass}"> From a8a9307e0df190e32b5fdef1f4906aef8a84f59a Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Mon, 3 Mar 2025 18:26:23 +0100 Subject: [PATCH 36/65] WIP: migration of actions v3 to v4. Signed-off-by: ubi de feo <me@ubidefeo.com> --- .github/workflows/build.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f7c6d53..2ad5575 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -92,7 +92,7 @@ jobs: npm run build - name: Upload [GitHub Actions] - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: ${{ env.JOB_TRANSFER_ARTIFACT }} path: dist @@ -121,13 +121,13 @@ jobs: steps: - name: Download job transfer artifact - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: ${{ env.JOB_TRANSFER_ARTIFACT }} path: ${{ env.JOB_TRANSFER_ARTIFACT }} - name: Upload tester build artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: ${{ matrix.artifact.name }} path: ${{ env.JOB_TRANSFER_ARTIFACT }}/${{ matrix.artifact.path }} @@ -138,7 +138,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Download [GitHub Actions] - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: ${{ env.JOB_TRANSFER_ARTIFACT }} path: ${{ env.JOB_TRANSFER_ARTIFACT }} From 37100c8746e96e91433feb9287590592496f9481 Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Mon, 3 Mar 2025 18:41:12 +0100 Subject: [PATCH 37/65] WIP: artifacts v4 upgrade. Signed-off-by: ubi de feo <me@ubidefeo.com> --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2ad5575..856bacd 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -129,7 +129,7 @@ jobs: - name: Upload tester build artifact uses: actions/upload-artifact@v4 with: - name: ${{ matrix.artifact.name }} + name: ${{ matrix.artifact.name }}-${{ github.run_id }} path: ${{ env.JOB_TRANSFER_ARTIFACT }}/${{ matrix.artifact.path }} release: From 7483819b8b5239336692a20ac48da0eda0cc60ce Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Mon, 3 Mar 2025 18:46:36 +0100 Subject: [PATCH 38/65] WIP: artifacts v4 upgrade. Signed-off-by: ubi de feo <me@ubidefeo.com> --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 856bacd..e3c512a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -123,8 +123,8 @@ jobs: - name: Download job transfer artifact uses: actions/download-artifact@v4 with: - name: ${{ env.JOB_TRANSFER_ARTIFACT }} - path: ${{ env.JOB_TRANSFER_ARTIFACT }} + name: ${{ matrix.artifact.name }}-${{ github.run_id }} + path: ${{ env.JOB_TRANSFER_ARTIFACT }}/${{ matrix.artifact.path }} - name: Upload tester build artifact uses: actions/upload-artifact@v4 From 8eaf5845e656714b640ab3a776617d2306906b93 Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Mon, 3 Mar 2025 18:52:42 +0100 Subject: [PATCH 39/65] WIP: artifacts v4 upgrade. Signed-off-by: ubi de feo <me@ubidefeo.com> --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e3c512a..ea5ba8c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -123,8 +123,8 @@ jobs: - name: Download job transfer artifact uses: actions/download-artifact@v4 with: - name: ${{ matrix.artifact.name }}-${{ github.run_id }} - path: ${{ env.JOB_TRANSFER_ARTIFACT }}/${{ matrix.artifact.path }} + name: ${{ env.JOB_TRANSFER_ARTIFACT }} # Keep this as is + path: ${{ env.JOB_TRANSFER_ARTIFACT }} - name: Upload tester build artifact uses: actions/upload-artifact@v4 From f68c83590e7c1571662dbf8662acf174e84c3e8f Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Mon, 3 Mar 2025 19:01:23 +0100 Subject: [PATCH 40/65] WIP: artifacts v4 upgrade. Signed-off-by: ubi de feo <me@ubidefeo.com> --- .github/workflows/build.yml | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ea5ba8c..c1bd415 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -24,9 +24,13 @@ jobs: matrix: config: - os: [self-hosted, windows-sign-pc] + id: windows - os: ubuntu-latest + id: linux - os: macos-13 + id: macos-x64 - os: macos-14 + id: macos-arm64 runs-on: ${{ matrix.config.os }} timeout-minutes: 90 @@ -94,7 +98,7 @@ jobs: - name: Upload [GitHub Actions] uses: actions/upload-artifact@v4 with: - name: ${{ env.JOB_TRANSFER_ARTIFACT }} + name: ${{ env.JOB_TRANSFER_ARTIFACT }}-${{ matrix.config.id }} path: dist artifacts: @@ -108,28 +112,34 @@ jobs: artifact: - path: "*-linux_x64.zip" name: Arduino-Lab-for-MicroPython_Linux_X86-64 + id: linux - path: "*-mac_x64.zip" name: Arduino-Lab-for-MicroPython_macOS_X86-64 + id: macos-x64 - path: "*-mac_arm64.zip" name: Arduino-Lab-for-MicroPython_macOS_arm-64 + id: macos-arm64 # - path: "*Windows_64bit.exe" # name: Windows_X86-64_interactive_installer + # id: windows # - path: "*Windows_64bit.msi" # name: Windows_X86-64_MSI + # id: windows - path: "*-win_x64.zip" name: Arduino-Lab-for-MicroPython_Windows_X86-64 + id: windows steps: - name: Download job transfer artifact uses: actions/download-artifact@v4 with: - name: ${{ env.JOB_TRANSFER_ARTIFACT }} # Keep this as is + name: ${{ env.JOB_TRANSFER_ARTIFACT }}-${{ matrix.artifact.id }} path: ${{ env.JOB_TRANSFER_ARTIFACT }} - name: Upload tester build artifact uses: actions/upload-artifact@v4 with: - name: ${{ matrix.artifact.name }}-${{ github.run_id }} + name: ${{ matrix.artifact.name }} path: ${{ env.JOB_TRANSFER_ARTIFACT }}/${{ matrix.artifact.path }} release: @@ -137,23 +147,25 @@ jobs: if: github.repository == 'arduino/lab-micropython-editor' && startsWith(github.ref, 'refs/tags/') runs-on: ubuntu-latest steps: - - name: Download [GitHub Actions] + - name: Download all artifacts uses: actions/download-artifact@v4 with: - name: ${{ env.JOB_TRANSFER_ARTIFACT }} - path: ${{ env.JOB_TRANSFER_ARTIFACT }} + path: artifacts + + - name: List artifacts + run: ls -R artifacts - name: Get Tag id: tag_name run: | - echo ::set-output name=TAG_NAME::${GITHUB_REF#refs/tags/} + echo "TAG_NAME=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT - name: Publish Release [GitHub] uses: svenstaro/upload-release-action@2.2.0 with: repo_token: ${{ secrets.GITHUB_TOKEN }} release_name: ${{ steps.tag_name.outputs.TAG_NAME }} - file: ${{ env.JOB_TRANSFER_ARTIFACT }}/* + file: artifacts/**/* tag: ${{ github.ref }} file_glob: true @@ -167,7 +179,11 @@ jobs: runs-on: ubuntu-latest steps: - - name: Remove unneeded job transfer artifact + - name: Remove unneeded job transfer artifacts uses: geekyeggo/delete-artifact@v2 with: - name: ${{ env.JOB_TRANSFER_ARTIFACT }} + name: | + ${{ env.JOB_TRANSFER_ARTIFACT }}-windows + ${{ env.JOB_TRANSFER_ARTIFACT }}-linux + ${{ env.JOB_TRANSFER_ARTIFACT }}-macos-x64 + ${{ env.JOB_TRANSFER_ARTIFACT }}-macos-arm64 \ No newline at end of file From 2fc901a189eed845db650cb7aa606b868594f636 Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Mon, 3 Mar 2025 21:08:08 +0100 Subject: [PATCH 41/65] WIP: migrating actions v3 to v4 - universal mac build. Signed-off-by: ubi de feo <me@ubidefeo.com> --- .github/workflows/build.yml | 15 +++++---------- package.json | 5 ++++- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c1bd415..318b18a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -27,10 +27,8 @@ jobs: id: windows - os: ubuntu-latest id: linux - - os: macos-13 - id: macos-x64 - - os: macos-14 - id: macos-arm64 + - os: macos-latest + id: macos-universal runs-on: ${{ matrix.config.os }} timeout-minutes: 90 @@ -113,12 +111,9 @@ jobs: - path: "*-linux_x64.zip" name: Arduino-Lab-for-MicroPython_Linux_X86-64 id: linux - - path: "*-mac_x64.zip" - name: Arduino-Lab-for-MicroPython_macOS_X86-64 - id: macos-x64 - - path: "*-mac_arm64.zip" - name: Arduino-Lab-for-MicroPython_macOS_arm-64 - id: macos-arm64 + - path: "*-mac_universal.zip" + name: Arduino-Lab-for-MicroPython_macOS_Universal + id: macos-universal # - path: "*Windows_64bit.exe" # name: Windows_X86-64_interactive_installer # id: windows diff --git a/package.json b/package.json index b3f5abb..751e1db 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,10 @@ "artifactName": "${productName}-${os}_${arch}.${ext}", "extraResources": "./ui/arduino/helpers.py", "mac": { - "target": "zip", + "target": [{ + "target": "zip", + "arch": ["universal"] + }], "icon": "build_resources/icon.icns" }, "win": { From 6602bf50b18782477b31ff354938085da635af65 Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Tue, 4 Mar 2025 15:49:15 +0100 Subject: [PATCH 42/65] Fixed Roboto Mono font for editor view. Signed-off-by: ubi de feo <me@ubidefeo.com> --- ui/arduino/main.css | 21 ++++++++++++------ .../media/Roboto-Mono-Bold-webfont.woff | Bin 0 -> 26840 bytes .../media/Roboto-Mono-Regular-webfont.woff | Bin 0 -> 26792 bytes 3 files changed, 14 insertions(+), 7 deletions(-) create mode 100644 ui/arduino/media/Roboto-Mono-Bold-webfont.woff create mode 100644 ui/arduino/media/Roboto-Mono-Regular-webfont.woff diff --git a/ui/arduino/main.css b/ui/arduino/main.css index c7f3e8c..84d1095 100644 --- a/ui/arduino/main.css +++ b/ui/arduino/main.css @@ -4,13 +4,20 @@ */ @font-face { - font-family: "RobotoMono"; + font-family: "CodeFont"; src: - url("media/roboto-regular.woff2") format("woff2"); + url("media/Roboto-Mono-Regular-webfont.woff") format("woff"); font-weight: normal; font-style: normal; } +@font-face { + font-family: "CodeFont"; + src: + url("media/Roboto-Mono-Bold-webfont.woff") format("woff"); + font-weight: bold; + font-style: normal; +} @font-face { font-family: "OpenSans"; @@ -151,7 +158,7 @@ button.small .icon { height: 100%; justify-content: center; align-items: center; - font-family: "RobotoMono", monospace; + font-family: "CodeFont", monospace; overflow: hidden; } @@ -312,7 +319,7 @@ button.small .icon { } #code-editor * { - font-family: "RobotoMono", monospace; + font-family: "CodeFont", monospace; } #code-editor .cm-editor { width: 100%; @@ -506,7 +513,7 @@ button.small .icon { .dialog .dialog-content #file-name { font-size: 1.3em; width:100%; - font-family: "RobotoMono", monospace; + font-family: "CodeFont", monospace; } .dialog .dialog-content input:focus { @@ -623,7 +630,7 @@ button.small .icon { position: relative; cursor: pointer; color: #000; - font-family: "RobotoMono", monospace; + font-family: "CodeFont", monospace; font-size: 14px; font-style: normal; font-weight: 400; @@ -709,7 +716,7 @@ button.small .icon { } .file-list .item .text { color: #000; - font-family: "RobotoMono", monospace; + font-family: "CodeFont", monospace; font-size: 14px; font-style: normal; font-weight: 400; diff --git a/ui/arduino/media/Roboto-Mono-Bold-webfont.woff b/ui/arduino/media/Roboto-Mono-Bold-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..f0ca0655cec3193b5eef15967d5a45baa8f47d57 GIT binary patch literal 26840 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 literal 0 HcmV?d00001 diff --git a/ui/arduino/media/Roboto-Mono-Regular-webfont.woff b/ui/arduino/media/Roboto-Mono-Regular-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..f6a50fcf591ccf1959300773576dbca8bc11e3e6 GIT binary patch literal 26792 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 literal 0 HcmV?d00001 From a00649cfdcf8327effc7d5233603e9042484db75 Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Wed, 5 Mar 2025 10:33:30 +0100 Subject: [PATCH 43/65] Loading files displays overlay and locks UI. Enter enabled in dialogs. Signed-off-by: ubi de feo <me@ubidefeo.com> --- ui/arduino/store.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/ui/arduino/store.js b/ui/arduino/store.js index b40a1c8..6fdf059 100644 --- a/ui/arduino/store.js +++ b/ui/arduino/store.js @@ -14,12 +14,14 @@ async function confirmDialog(msg, cancelMsg, confirmMsg) { // cancelMsg = cancelMsg || 'Cancel' // confirmMsg = confirmMsg || 'Yes' let buttons = [] - if (cancelMsg) buttons.push(cancelMsg) if (confirmMsg) buttons.push(confirmMsg) + if (cancelMsg) buttons.push(cancelMsg) + let response = await win.openDialog({ type: 'question', - buttons: [cancelMsg, confirmMsg], - cancelId: 0, + buttons: buttons, + defaultId: 0, + cancelId: 1, message: msg }) console.log('confirm', response) @@ -1172,6 +1174,9 @@ async function store(state, emitter) { log('open-selected-files') let filesToOpen = [] let filesAlreadyOpen = [] + if (state.isLoadingFiles) return + state.isLoadingFiles = true + emitter.emit('render') for (let i in state.selectedFiles) { let selectedFile = state.selectedFiles[i] if (selectedFile.type == 'folder') { @@ -1251,6 +1256,7 @@ async function store(state, emitter) { state.selectedFiles = [] state.view = 'editor' updateMenu() + state.isLoadingFiles = false emitter.emit('render') }) emitter.on('open-file', (source, file) => { From 6497fc915df69faed2ab29d2abc037ba80190a90 Mon Sep 17 00:00:00 2001 From: Sebastian Romero <s.romero@arduino.cc> Date: Wed, 18 Dec 2024 16:00:22 +0100 Subject: [PATCH 44/65] Add IPC handlers for opening an app and a URL --- backend/ipc.js | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/backend/ipc.js b/backend/ipc.js index 62a404f..1e0ee53 100644 --- a/backend/ipc.js +++ b/backend/ipc.js @@ -1,6 +1,7 @@ const fs = require('fs') const registerMenu = require('./menu.js') const serial = require('./serial/serial.js').sharedInstance +const { shell } = require('electron'); const { openFolderDialog, @@ -138,6 +139,25 @@ module.exports = function registerIPCHandlers(win, ipcMain, app, dialog) { registerMenu(win, state) }) + ipcMain.handle('launch-app', async (event, urlScheme) => { + // Launch an external app with a custom protocol + return new Promise((resolve, reject) => { + try { + shell.openExternal(urlScheme).then(() => { + resolve(true); // App opened successfully + }).catch(() => { + resolve(false); // App not installed + }); + } catch (err) { + reject(err); + } + }); + }); + + ipcMain.handle('open-url', async (event, url) => { + shell.openExternal(url); + }); + win.on('close', (event) => { console.log('BrowserWindow', 'close') event.preventDefault() From 10f9bf5a5bf43b20f688494c6ca5865b8ec56d8b Mon Sep 17 00:00:00 2001 From: Sebastian Romero <s.romero@arduino.cc> Date: Wed, 5 Mar 2025 10:55:54 +0100 Subject: [PATCH 45/65] Expose function to launch app in main world --- preload.js | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/preload.js b/preload.js index fbc1579..daef453 100644 --- a/preload.js +++ b/preload.js @@ -2,7 +2,7 @@ console.log('preload') const { contextBridge, ipcRenderer } = require('electron') const path = require('path') const shortcuts = require('./backend/shortcuts.js').shortcuts.global -const { emit, platform } = require('process') +const { platform } = require('process') const SerialBridge = require('./backend/serial/serial-bridge.js') const Disk = { @@ -85,6 +85,21 @@ const Window = { getShortcuts: () => shortcuts } +/** + * Launches an app using the provided URL scheme (e.g. myapp://). If the app is not installed, it will + * fallback to open the provided fallback URL. + * @param {string} url The URL scheme to use to launch the app + * @param {string} fallbackUrl The URL to open if the app is not installed + */ +async function launchApp(url, fallbackUrl) { + const success = await ipcRenderer.invoke('launch-app', url); + + if (!success) { + await ipcRenderer.invoke('open-url', fallbackUrl); // Fallback to open a URL in the default browser + } +} + +contextBridge.exposeInMainWorld('launchApp', launchApp) contextBridge.exposeInMainWorld('BridgeSerial', SerialBridge) contextBridge.exposeInMainWorld('BridgeDisk', Disk) contextBridge.exposeInMainWorld('BridgeWindow', Window) \ No newline at end of file From 3ccc7234271b47eac746b1c6d4621139dfba70ff Mon Sep 17 00:00:00 2001 From: Sebastian Romero <s.romero@arduino.cc> Date: Wed, 18 Dec 2024 16:04:57 +0100 Subject: [PATCH 46/65] Add event handler for launching an app --- ui/arduino/store.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ui/arduino/store.js b/ui/arduino/store.js index 6fdf059..5b8e45d 100644 --- a/ui/arduino/store.js +++ b/ui/arduino/store.js @@ -116,6 +116,10 @@ async function store(state, emitter) { updateMenu() }) + emitter.on('launch-app', async (url, fallbackUrl) => { + window.launchApp(url, fallbackUrl) + }) + // CONNECTION DIALOG emitter.on('open-connection-dialog', async () => { log('open-connection-dialog') From f5b23e4d3c919d0039f8e64ade6dc56becce8f80 Mon Sep 17 00:00:00 2001 From: Sebastian Romero <s.romero@arduino.cc> Date: Wed, 5 Mar 2025 10:58:20 +0100 Subject: [PATCH 47/65] Add button to launch package installer --- ui/arduino/media/install-package.svg | 33 ++++++++++++++++++++++++++ ui/arduino/views/components/toolbar.js | 12 ++++++++++ 2 files changed, 45 insertions(+) create mode 100644 ui/arduino/media/install-package.svg diff --git a/ui/arduino/media/install-package.svg b/ui/arduino/media/install-package.svg new file mode 100644 index 0000000..f26feff --- /dev/null +++ b/ui/arduino/media/install-package.svg @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 50 50"> + <defs> + <style> + .cls-1 { + fill: none; + stroke: #000; + stroke-linecap: round; + stroke-linejoin: round; + stroke-width: 3.2px; + } + </style> + </defs> + <!-- Generator: Adobe Illustrator 28.7.1, SVG Export Plug-In . SVG Version: 1.2.0 Build 142) --> + <g> + <g id="Layer_1"> + <g> + <g> + <line class="cls-1" x1="25" y1="3.2" x2="25" y2="14.2"/> + <polyline class="cls-1" points="19.8 8.4 25 3.2 30.2 8.4"/> + </g> + <g> + <polyline class="cls-1" points="8.8 29.6 8.8 46.8 28.3 46.8 28.3 20.7 8.8 20.7"/> + <polyline class="cls-1" points="41.2 29.6 41.2 46.8 28.3 46.8 28.3 20.7 41.2 20.7"/> + </g> + <polygon class="cls-1" points="28.3 20.7 33.5 29.6 46.4 29.6 41.2 20.7 28.3 20.7"/> + <polygon class="cls-1" points="28.3 20.7 23.1 29.6 3.6 29.6 8.8 20.7 28.3 20.7"/> + <line class="cls-1" x1="13.1" y1="42.2" x2="21.4" y2="42.2"/> + <line class="cls-1" x1="13.1" y1="37.9" x2="16.6" y2="37.9"/> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/ui/arduino/views/components/toolbar.js b/ui/arduino/views/components/toolbar.js index a0b8a45..0f3c4d1 100644 --- a/ui/arduino/views/components/toolbar.js +++ b/ui/arduino/views/components/toolbar.js @@ -90,6 +90,18 @@ function Toolbar(state, emit) { })} </div> + + <div> + ${!window.BridgeWindow.isLinux() ? Button({ + icon: 'install-package.svg', + tooltip: `Install Package`, + active: true, + onClick: () => { + if(state.isConnected) emit('disconnect') // Package installer requires exclusive access to the serial port + emit('launch-app', 'micropython-package-installer://', 'https://github.com/arduino/lab-micropython-package-installer/releases/latest') + } + }) : '' } + </div> </div> ` } From 3f2636ed2ae308785647b998e8ea4d8792387f79 Mon Sep 17 00:00:00 2001 From: Sebastian Romero <s.romero@arduino.cc> Date: Wed, 5 Mar 2025 11:11:29 +0100 Subject: [PATCH 48/65] Add label --- ui/arduino/views/components/toolbar.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/arduino/views/components/toolbar.js b/ui/arduino/views/components/toolbar.js index 0f3c4d1..c559bc3 100644 --- a/ui/arduino/views/components/toolbar.js +++ b/ui/arduino/views/components/toolbar.js @@ -94,7 +94,7 @@ function Toolbar(state, emit) { <div> ${!window.BridgeWindow.isLinux() ? Button({ icon: 'install-package.svg', - tooltip: `Install Package`, + label: `Install Package`, active: true, onClick: () => { if(state.isConnected) emit('disconnect') // Package installer requires exclusive access to the serial port From 851b10e250facc3d2c9d9578b5f1a09d2971a6f9 Mon Sep 17 00:00:00 2001 From: Sebastian Romero <s.romero@arduino.cc> Date: Wed, 5 Mar 2025 11:18:16 +0100 Subject: [PATCH 49/65] Move button to primary toolbar actions --- ui/arduino/views/components/toolbar.js | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/ui/arduino/views/components/toolbar.js b/ui/arduino/views/components/toolbar.js index c559bc3..c6bcb89 100644 --- a/ui/arduino/views/components/toolbar.js +++ b/ui/arduino/views/components/toolbar.js @@ -69,6 +69,17 @@ function Toolbar(state, emit) { disabled: !_canSave, onClick: () => emit('save') })} + + <div class="separator"></div> + + ${!window.BridgeWindow.isLinux() ? Button({ + icon: 'install-package.svg', + label: `Add Package`, + onClick: () => { + if(state.isConnected) emit('disconnect') // Package installer requires exclusive access to the serial port + emit('launch-app', 'micropython-package-installer://', 'https://github.com/arduino/lab-micropython-package-installer/releases/latest') + } + }) : '' } </div> <div id="app-views"> @@ -88,19 +99,6 @@ function Toolbar(state, emit) { square: true, onClick: () => emit('change-view', 'file-manager') })} - - </div> - - <div> - ${!window.BridgeWindow.isLinux() ? Button({ - icon: 'install-package.svg', - label: `Install Package`, - active: true, - onClick: () => { - if(state.isConnected) emit('disconnect') // Package installer requires exclusive access to the serial port - emit('launch-app', 'micropython-package-installer://', 'https://github.com/arduino/lab-micropython-package-installer/releases/latest') - } - }) : '' } </div> </div> ` From b81a84d3a82594a7fce0a0333ec894bbe8d0cbd9 Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Wed, 5 Mar 2025 11:56:52 +0100 Subject: [PATCH 50/65] Hiding separator on Linux. Signed-off-by: ubi de feo <me@ubidefeo.com> --- ui/arduino/views/components/toolbar.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/arduino/views/components/toolbar.js b/ui/arduino/views/components/toolbar.js index c6bcb89..ad72a4f 100644 --- a/ui/arduino/views/components/toolbar.js +++ b/ui/arduino/views/components/toolbar.js @@ -70,7 +70,7 @@ function Toolbar(state, emit) { onClick: () => emit('save') })} - <div class="separator"></div> + ${!window.BridgeWindow.isLinux() ? html`<div class="separator"></div>` : ''} ${!window.BridgeWindow.isLinux() ? Button({ icon: 'install-package.svg', From 5e8abf8765831a2bde96ffc4c5107b4184fcbee8 Mon Sep 17 00:00:00 2001 From: Sebastian Romero <s.romero@arduino.cc> Date: Wed, 12 Mar 2025 12:09:35 +0100 Subject: [PATCH 51/65] Add explicit check for registered application --- backend/ipc.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/backend/ipc.js b/backend/ipc.js index 1e0ee53..0716d17 100644 --- a/backend/ipc.js +++ b/backend/ipc.js @@ -142,6 +142,11 @@ module.exports = function registerIPCHandlers(win, ipcMain, app, dialog) { ipcMain.handle('launch-app', async (event, urlScheme) => { // Launch an external app with a custom protocol return new Promise((resolve, reject) => { + if(app.getApplicationNameForProtocol(urlScheme) === '') { + resolve(false); // App not installed + return; + } + try { shell.openExternal(urlScheme).then(() => { resolve(true); // App opened successfully From 380b6bd9852442ee0b9db43d798efda69578c351 Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Wed, 9 Apr 2025 10:51:57 +0200 Subject: [PATCH 52/65] Forcing stop when switching to File Manager. Signed-off-by: ubi de feo <me@ubidefeo.com> --- ui/arduino/store.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ui/arduino/store.js b/ui/arduino/store.js index 5b8e45d..29aa556 100644 --- a/ui/arduino/store.js +++ b/ui/arduino/store.js @@ -111,6 +111,9 @@ async function store(state, emitter) { } emitter.emit('refresh-files') } + if(view === 'file-manager') { + emitter.emit('stop') + } state.view = view emitter.emit('render') updateMenu() From 03cc8934deac6d389ff558737af569b3adfcaab6 Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Wed, 9 Apr 2025 10:55:48 +0200 Subject: [PATCH 53/65] Comments and logging cleanup. Signed-off-by: ubi de feo <me@ubidefeo.com> --- index.js | 4 ++-- ui/arduino/store.js | 11 +++-------- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/index.js b/index.js index a5658cd..a16ea09 100644 --- a/index.js +++ b/index.js @@ -65,11 +65,11 @@ app.on('ready', () => { createWindow() win.on('focus', () => { - console.log("win focus") + // console.log("win focus") }) win.on('blur', () => { - console.log("win blur") + // console.log("win blur") }) }) diff --git a/ui/arduino/store.js b/ui/arduino/store.js index 29aa556..95ea087 100644 --- a/ui/arduino/store.js +++ b/ui/arduino/store.js @@ -24,7 +24,6 @@ async function confirmDialog(msg, cancelMsg, confirmMsg) { cancelId: 1, message: msg }) - console.log('confirm', response) return Promise.resolve(response) } @@ -103,8 +102,8 @@ async function store(state, emitter) { } emitter.emit('render') }) + emitter.on('change-view', (view) => { - if (state.view === 'file-manager') { if (view != state.view) { state.selectedFiles = [] @@ -161,7 +160,7 @@ async function store(state, emitter) { cancelId: 0, message: "Could not connect to the board. Reset it and try again." }) - console.log('Reset request acknowledged', response) + // console.log('Reset request acknowledged', response) emitter.emit('connection-timeout') }, 3500) try { @@ -1197,7 +1196,7 @@ async function store(state, emitter) { && f.source == selectedFile.source && f.parentFolder == selectedFile.parentFolder }) - console.log('already open', alreadyOpen) + // console.log('already open', alreadyOpen) if (!alreadyOpen) { // This file is not open yet, @@ -1547,19 +1546,16 @@ async function store(state, emitter) { function filterDoubleRun(onlySelected = false) { if (preventDoubleRun) return - console.log('>>> RUN CODE ACTUAL <<<') emitter.emit('run', onlySelected) timedReset() } function runCode() { - console.log('>>> RUN CODE REQUEST <<<') if (canExecute({ view: state.view, isConnected: state.isConnected })) { filterDoubleRun() } } function runCodeSelection() { - console.log('>>> RUN CODE REQUEST <<<') if (canExecute({ view: state.view, isConnected: state.isConnected })) { filterDoubleRun(true) } @@ -1638,7 +1634,6 @@ async function store(state, emitter) { // LEAK > listeners keep getting added and not removed when tabs are closed // additionally I found that closing a tab has actually added an extra listener newFile.editor.onChange = function() { - console.log('editor has changes') newFile.hasChanges = true emitter.emit('render') } From 78afa75062b9e4f4d61d3fb38235d49048ff389d Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Wed, 9 Apr 2025 16:14:49 +0200 Subject: [PATCH 54/65] Addressed review feedback. Signed-off-by: ubi de feo <me@ubidefeo.com> --- index.js | 2 -- ui/arduino/store.js | 8 ++++---- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/index.js b/index.js index a16ea09..3b3a0fd 100644 --- a/index.js +++ b/index.js @@ -65,11 +65,9 @@ app.on('ready', () => { createWindow() win.on('focus', () => { - // console.log("win focus") }) win.on('blur', () => { - // console.log("win blur") }) }) diff --git a/ui/arduino/store.js b/ui/arduino/store.js index 95ea087..e463685 100644 --- a/ui/arduino/store.js +++ b/ui/arduino/store.js @@ -160,7 +160,6 @@ async function store(state, emitter) { cancelId: 0, message: "Could not connect to the board. Reset it and try again." }) - // console.log('Reset request acknowledged', response) emitter.emit('connection-timeout') }, 3500) try { @@ -1196,7 +1195,6 @@ async function store(state, emitter) { && f.source == selectedFile.source && f.parentFolder == selectedFile.parentFolder }) - // console.log('already open', alreadyOpen) if (!alreadyOpen) { // This file is not open yet, @@ -1628,8 +1626,10 @@ async function store(state, emitter) { } const tabExists = state.openFiles.find(f => f.parentFolder === newFile.parentFolder && f.fileName === newFile.fileName && f.source === newFile.source) if (tabExists || fullPathExists) { - const confirmation = confirmDialog(`File ${newFile.fileName} already exists on ${source}. Please choose another name.`, 'OK') - return false + const confirmation = await confirmDialog(`File ${newFile.fileName} already exists on ${source}. Please choose another name.`, 'OK') + if (!confirmation) { + return false + } } // LEAK > listeners keep getting added and not removed when tabs are closed // additionally I found that closing a tab has actually added an extra listener From 110193a32e1b03e81b4c2b5eafe62e6f48ef9270 Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Wed, 9 Apr 2025 18:56:57 +0200 Subject: [PATCH 55/65] Amended return false on duplicate tab alert. Signed-off-by: ubi de feo <me@ubidefeo.com> --- ui/arduino/store.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/ui/arduino/store.js b/ui/arduino/store.js index e463685..04889b4 100644 --- a/ui/arduino/store.js +++ b/ui/arduino/store.js @@ -1627,9 +1627,7 @@ async function store(state, emitter) { const tabExists = state.openFiles.find(f => f.parentFolder === newFile.parentFolder && f.fileName === newFile.fileName && f.source === newFile.source) if (tabExists || fullPathExists) { const confirmation = await confirmDialog(`File ${newFile.fileName} already exists on ${source}. Please choose another name.`, 'OK') - if (!confirmation) { - return false - } + return false } // LEAK > listeners keep getting added and not removed when tabs are closed // additionally I found that closing a tab has actually added an extra listener From 9b0285a6b5e731fc50fbcb2e515b422f9e61dae6 Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Fri, 11 Apr 2025 16:16:58 +0200 Subject: [PATCH 56/65] File Manager view triggers file-list on switch. Signed-off-by: ubi de feo <me@ubidefeo.com> --- .gitignore | 3 ++- ui/arduino/store.js | 16 ++++++++++------ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index c4b0f7e..ea7bad6 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,5 @@ dist/ .vscode .npmrc Resources -temp \ No newline at end of file +temp +claude \ No newline at end of file diff --git a/ui/arduino/store.js b/ui/arduino/store.js index 04889b4..9029a12 100644 --- a/ui/arduino/store.js +++ b/ui/arduino/store.js @@ -9,6 +9,9 @@ const newFileContent = `# This program was created in Arduino Lab for MicroPytho print('Hello, MicroPython!') ` +async function sleep(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); +} async function confirmDialog(msg, cancelMsg, confirmMsg) { // cancelMsg = cancelMsg || 'Cancel' @@ -103,15 +106,16 @@ async function store(state, emitter) { emitter.emit('render') }) - emitter.on('change-view', (view) => { - if (state.view === 'file-manager') { - if (view != state.view) { - state.selectedFiles = [] - } - emitter.emit('refresh-files') + emitter.on('change-view', async (view) => { + if (state.view === view) { + return + } else { + state.selectedFiles = [] } if(view === 'file-manager') { emitter.emit('stop') + await sleep(500) + emitter.emit('refresh-files') } state.view = view emitter.emit('render') From c039ea59c2fe8d8922f6e50bd1e29e3c019cf6d4 Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Sat, 12 Apr 2025 22:44:06 +0200 Subject: [PATCH 57/65] Implemented board root detection (/ or /flash). Signed-off-by: ubi de feo <me@ubidefeo.com> --- ui/arduino/helpers.py | 8 ++++++++ ui/arduino/store.js | 18 ++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/ui/arduino/helpers.py b/ui/arduino/helpers.py index cb7b757..2731091 100644 --- a/ui/arduino/helpers.py +++ b/ui/arduino/helpers.py @@ -1,6 +1,14 @@ import os import json +import sys os.chdir('/') + +def get_root(has_flash_mount = True): + if '/flash' in sys.path: + print('/flash', end = '') + else: + print('/', end = '') + def is_directory(path): return True if os.stat(path)[0] == 0x4000 else False diff --git a/ui/arduino/store.js b/ui/arduino/store.js index 04889b4..c69e5e7 100644 --- a/ui/arduino/store.js +++ b/ui/arduino/store.js @@ -175,6 +175,7 @@ async function store(state, emitter) { // Connected and ready state.isConnecting = false state.isConnected = true + state.boardNavigationRoot = await getBoardRoot() updateMenu() if (state.view === 'editor' && state.panelHeight <= PANEL_CLOSED) { state.panelHeight = state.savedPanelHeight @@ -1691,6 +1692,23 @@ async function getAvailablePorts() { return await serialBridge.loadPorts() } +async function getBoardRoot() { + let output = await serialBridge.execFile(await getHelperFullPath()) + output = await serialBridge.run(`get_root()`) + let boardRoot = '' + try { + // Extracting the json output from serial response + output = output.substring( + output.indexOf('OK')+2, + output.indexOf('\x04') + ) + boardRoot = output + } catch (e) { + log('error', output) + } + return boardRoot +} + async function getBoardFiles(path) { await serialBridge.getPrompt() let files = await serialBridge.ilistFiles(path) From 80e37a3692234314f3ee400141e0961549f9eec6 Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Sun, 13 Apr 2025 00:04:12 +0200 Subject: [PATCH 58/65] Refactored getRoot with interface for consumer. Signed-off-by: ubi de feo <me@ubidefeo.com> --- ui/arduino/helpers.py | 10 +++++++--- ui/arduino/store.js | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/ui/arduino/helpers.py b/ui/arduino/helpers.py index 2731091..ac4ec34 100644 --- a/ui/arduino/helpers.py +++ b/ui/arduino/helpers.py @@ -1,13 +1,12 @@ import os import json import sys -os.chdir('/') def get_root(has_flash_mount = True): if '/flash' in sys.path: - print('/flash', end = '') + return '/flash' else: - print('/', end = '') + return '/' def is_directory(path): return True if os.stat(path)[0] == 0x4000 else False @@ -26,6 +25,9 @@ def get_all_files(path, array_of_files = []): return array_of_files +def iget_root(): + print(get_root(), end='') + def ilist_all(path): print(json.dumps(get_all_files(path))) @@ -38,3 +40,5 @@ def delete_folder(path): if file['type'] == 'folder': os.rmdir(file['path']) os.rmdir(path) + +os.chdir(get_root()) \ No newline at end of file diff --git a/ui/arduino/store.js b/ui/arduino/store.js index c69e5e7..bd03a2a 100644 --- a/ui/arduino/store.js +++ b/ui/arduino/store.js @@ -1694,7 +1694,7 @@ async function getAvailablePorts() { async function getBoardRoot() { let output = await serialBridge.execFile(await getHelperFullPath()) - output = await serialBridge.run(`get_root()`) + output = await serialBridge.run(`iget_root()`) let boardRoot = '' try { // Extracting the json output from serial response From 06de27a8908bf1a826d9fc60f98f2aa0f874b55e Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Sun, 13 Apr 2025 11:56:18 +0200 Subject: [PATCH 59/65] Working implementation of Board Root detection. Signed-off-by: ubi de feo <me@ubidefeo.com> --- ui/arduino/store.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/ui/arduino/store.js b/ui/arduino/store.js index bd03a2a..373c816 100644 --- a/ui/arduino/store.js +++ b/ui/arduino/store.js @@ -285,7 +285,10 @@ async function store(state, emitter) { } emitter.emit('open-panel') emitter.emit('render') - await serialBridge.getPrompt() + if (state.isConnected) { + await serialBridge.getPrompt() + } + }) emitter.on('reset', async () => { log('reset') @@ -603,7 +606,7 @@ async function store(state, emitter) { } await serialBridge.saveFileContent( serialBridge.getFullPath( - '/', + state.boardNavigationRoot, state.boardNavigationPath, fileNameParameter ), @@ -782,7 +785,7 @@ async function store(state, emitter) { if (file.source === 'board') { await serialBridge.removeFile( serialBridge.getFullPath( - '/', + state.boardNavigationRoot, state.boardNavigationPath, file.fileName ) From 0ddffa7c33349cf158d6c6c2c5091d6c4ba7f2f6 Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Mon, 14 Apr 2025 09:10:22 +0200 Subject: [PATCH 60/65] Fixed query selector typo. Signed-off-by: ubi de feo <me@ubidefeo.com> --- ui/arduino/views/components/new-file-dialog.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/arduino/views/components/new-file-dialog.js b/ui/arduino/views/components/new-file-dialog.js index 83ace3f..8e00d9e 100644 --- a/ui/arduino/views/components/new-file-dialog.js +++ b/ui/arduino/views/components/new-file-dialog.js @@ -65,7 +65,7 @@ function NewFileDialog(state, emit) { ` if (state.isNewFileDialogOpen) { - const el = newFileDialog.querySelector('#dialog-new-file .dialog-contents > input') + const el = newFileDialog.querySelector('#dialog-new-file .dialog-content > input') if (el) { el.focus() } From efd83500917a128ac9488340f91ec04a6426630f Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Mon, 14 Apr 2025 09:11:24 +0200 Subject: [PATCH 61/65] Removed .gitignore entry in favour of local personal configuration. Signed-off-by: ubi de feo <me@ubidefeo.com> --- .gitignore | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index ea7bad6..c4b0f7e 100644 --- a/.gitignore +++ b/.gitignore @@ -7,5 +7,4 @@ dist/ .vscode .npmrc Resources -temp -claude \ No newline at end of file +temp \ No newline at end of file From 46dcd656415caae44349d0268c4e882f8de849ee Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Mon, 14 Apr 2025 17:44:31 +0200 Subject: [PATCH 62/65] Amended ununsed signature parameter in get_root(). Signed-off-by: ubi de feo <me@ubidefeo.com> --- ui/arduino/helpers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/arduino/helpers.py b/ui/arduino/helpers.py index ac4ec34..15ab644 100644 --- a/ui/arduino/helpers.py +++ b/ui/arduino/helpers.py @@ -2,7 +2,7 @@ import json import sys -def get_root(has_flash_mount = True): +def get_root(): if '/flash' in sys.path: return '/flash' else: From f057b1547caeee38876a86a27be4515623d4475e Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Tue, 15 Apr 2025 10:51:26 +0200 Subject: [PATCH 63/65] Amended sleep with comment from Sebastian's feedback. Signed-off-by: ubi de feo <me@ubidefeo.com> --- ui/arduino/store.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/arduino/store.js b/ui/arduino/store.js index 9029a12..f82c992 100644 --- a/ui/arduino/store.js +++ b/ui/arduino/store.js @@ -114,7 +114,7 @@ async function store(state, emitter) { } if(view === 'file-manager') { emitter.emit('stop') - await sleep(500) + await sleep(250) // Give the board time to stop the program and return to the prompt emitter.emit('refresh-files') } state.view = view From 3915443fbc5642b42109eca15d15cd9a44a3277c Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Tue, 15 Apr 2025 12:53:51 +0200 Subject: [PATCH 64/65] Pointing BoardNavigationPath to /flash when it's the default writable mount-point. Signed-off-by: ubi de feo <me@ubidefeo.com> --- ui/arduino/store.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/arduino/store.js b/ui/arduino/store.js index 6526f99..966e906 100644 --- a/ui/arduino/store.js +++ b/ui/arduino/store.js @@ -179,7 +179,7 @@ async function store(state, emitter) { // Connected and ready state.isConnecting = false state.isConnected = true - state.boardNavigationRoot = await getBoardRoot() + state.boardNavigationPath = await getBoardNavigationPath() updateMenu() if (state.view === 'editor' && state.panelHeight <= PANEL_CLOSED) { state.panelHeight = state.savedPanelHeight @@ -1699,7 +1699,7 @@ async function getAvailablePorts() { return await serialBridge.loadPorts() } -async function getBoardRoot() { +async function getBoardNavigationPath() { let output = await serialBridge.execFile(await getHelperFullPath()) output = await serialBridge.run(`iget_root()`) let boardRoot = '' From 65273aa90262e603642c0b5d2e1fa67a3bfde720 Mon Sep 17 00:00:00 2001 From: ubi de feo <me@ubidefeo.com> Date: Wed, 30 Apr 2025 20:27:24 +0200 Subject: [PATCH 65/65] Bumped version to 0.20.0 Signed-off-by: ubi de feo <me@ubidefeo.com> --- package-lock.json | 262 +++++++++++++++++++++++++++++----------------- package.json | 2 +- 2 files changed, 169 insertions(+), 95 deletions(-) diff --git a/package-lock.json b/package-lock.json index c40dfba..0ad9236 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "arduino-lab-micropython-ide", - "version": "0.11.1", + "version": "0.20.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "arduino-lab-micropython-ide", - "version": "0.11.1", + "version": "0.20.0", "hasInstallScript": true, "license": "MIT", "dependencies": { @@ -210,9 +210,9 @@ } }, "node_modules/@npmcli/fs/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -510,15 +510,15 @@ "optional": true }, "node_modules/@types/ms": { - "version": "0.7.34", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", "dev": true }, "node_modules/@types/node": { - "version": "16.18.119", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.119.tgz", - "integrity": "sha512-ia7V9a2FnhUFfetng4/sRPBMTwHZUkPFY736rb1cg9AgG7MZdR97q7/nLR9om+sq5f1la9C857E0l/nrI0RiFQ==", + "version": "16.18.126", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.126.tgz", + "integrity": "sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==", "dev": true }, "node_modules/@types/plist": { @@ -542,9 +542,9 @@ } }, "node_modules/@types/verror": { - "version": "1.10.10", - "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.10.tgz", - "integrity": "sha512-l4MM0Jppn18hb9xmM6wwD1uTdShpf9Pn80aXTStnK1C94gtPvJcV2FrDmbOQUAQfJ1cKZHktkQUDwEqaAKXMMg==", + "version": "1.10.11", + "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.11.tgz", + "integrity": "sha512-RlDm9K7+o5stv0Co8i8ZRGxDbrTxhJtgjqjFyVh/tXQyl/rYtTKlnTvZ88oSTeYREWurwx20Js4kTuKCsFkUtg==", "dev": true, "optional": true }, @@ -602,9 +602,9 @@ } }, "node_modules/agentkeepalive": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", - "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", + "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", "dev": true, "dependencies": { "humanize-ms": "^1.2.1" @@ -745,9 +745,9 @@ } }, "node_modules/app-builder-lib/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -1246,6 +1246,19 @@ "node": ">=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, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -1498,9 +1511,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.5.tgz", - "integrity": "sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "dependencies": { "path-key": "^3.1.0", @@ -1512,9 +1525,9 @@ } }, "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dependencies": { "ms": "^2.1.3" }, @@ -1609,9 +1622,9 @@ "dev": true }, "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", "dev": true, "engines": { "node": ">=8" @@ -1756,6 +1769,20 @@ "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", "dev": true }, + "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, + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/duplexer3": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", @@ -2259,9 +2286,9 @@ } }, "node_modules/electron-rebuild/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -2330,14 +2357,10 @@ "dev": true }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "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, - "optional": true, - "dependencies": { - "get-intrinsic": "^1.2.4" - }, "engines": { "node": ">= 0.4" } @@ -2347,7 +2370,33 @@ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, - "optional": true, + "engines": { + "node": ">= 0.4" + } + }, + "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, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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, + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, "engines": { "node": ">= 0.4" } @@ -2382,9 +2431,9 @@ } }, "node_modules/exponential-backoff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", - "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz", + "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==", "dev": true }, "node_modules/extract-zip": { @@ -2479,13 +2528,14 @@ } }, "node_modules/form-data": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", - "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", "dev": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", "mime-types": "^2.1.12" }, "engines": { @@ -2529,7 +2579,6 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, - "optional": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -2564,17 +2613,21 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, - "optional": true, "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -2583,6 +2636,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "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, + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -2635,9 +2701,9 @@ } }, "node_modules/global-agent/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "dev": true, "optional": true, "bin": { @@ -2681,13 +2747,12 @@ } }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, - "optional": true, - "dependencies": { - "get-intrinsic": "^1.1.3" + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2749,12 +2814,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "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, - "optional": true, "engines": { "node": ">= 0.4" }, @@ -2762,12 +2826,14 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "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, - "optional": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, "engines": { "node": ">= 0.4" }, @@ -2786,7 +2852,6 @@ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, - "optional": true, "dependencies": { "function-bind": "^1.1.2" }, @@ -3264,9 +3329,18 @@ "node": ">=10" } }, + "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, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/micropython.js": { - "version": "1.5.0", - "resolved": "git+ssh://git@github.com/arduino/micropython.js.git#7657256c7f7c37d9f3b3112deb98d64665c68c65", + "version": "1.5.1", + "resolved": "git+ssh://git@github.com/arduino/micropython.js.git#62696afbf4c3eb2d520eebbcb676cf7b88c1d1d6", "dependencies": { "serialport": "^10.4.0" }, @@ -3463,9 +3537,9 @@ } }, "node_modules/node-abi": { - "version": "3.71.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.71.0.tgz", - "integrity": "sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw==", + "version": "3.74.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.74.0.tgz", + "integrity": "sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==", "dev": true, "dependencies": { "semver": "^7.3.5" @@ -3475,9 +3549,9 @@ } }, "node_modules/node-abi/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -3503,9 +3577,9 @@ } }, "node_modules/node-api-version/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -3540,9 +3614,9 @@ } }, "node_modules/node-gyp-build": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.3.tgz", - "integrity": "sha512-EMS95CMJzdoSKoIiXo8pxKoL8DYxwIZXYlLmgPb8KUv794abpnLK6ynsCAWNliOjREKruYKdzbh76HHYUHX7nw==", + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", @@ -3550,9 +3624,9 @@ } }, "node_modules/node-gyp/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -4102,9 +4176,9 @@ } }, "node_modules/socks": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", - "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", + "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", "dev": true, "dependencies": { "ip-address": "^9.0.5", diff --git a/package.json b/package.json index 751e1db..2074bb4 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "arduino-lab-micropython-ide", "productName": "Arduino Lab for MicroPython", - "version": "0.11.1", + "version": "0.20.0", "description": "Arduino Lab for MicroPython is a project sponsored by Arduino, based on original work by Murilo Polese.\nThis is an experimental pre-release software, please direct any questions exclusively to Github issues.", "main": "index.js", "scripts": {