|
44 | 44 | <span class="brand-subtitle">OpenCollar Edge BLE Web Connect</span> |
45 | 45 | </div> |
46 | 46 | </div> |
47 | | - <div class="app-menu"> |
| 47 | + <div class="app-menu hidden"> |
48 | 48 | <button id="app-menu-toggle" class="menu-toggle" aria-expanded="false" aria-controls="app-menu-panel" aria-label="Open menu"> |
49 | | - <span class="icon bars" aria-hidden="true"></span> |
| 49 | + <svg class="menu-toggle-icon" viewBox="0 0 448 512" aria-hidden="true" focusable="false"> |
| 50 | + <path fill="currentColor" d="M0 80C0 62.3 14.3 48 32 48l384 0c17.7 0 32 14.3 32 32s-14.3 32-32 32L32 112C14.3 112 0 97.7 0 80zM0 240c0-17.7 14.3-32 32-32l384 0c17.7 0 32 14.3 32 32s-14.3 32-32 32L32 272c-17.7 0-32-14.3-32-32zM448 400c0 17.7-14.3 32-32 32L32 432c-17.7 0-32-14.3-32-32s14.3-32 32-32l384 0c17.7 0 32 14.3 32 32z"/> |
| 51 | + </svg> |
50 | 52 | </button> |
51 | 53 | <div id="app-menu-panel" class="menu-panel" role="menu" aria-label="App menu"> |
52 | | - <a href="#header-section" role="menuitem"><span class="icon square-caret-up" aria-hidden="true"></span><span>Top</span></a> |
53 | | - <a href="#status-area" class="hidden-when-disconnected" role="menuitem"><span class="icon square-poll-horizontal" aria-hidden="true"></span><span>Status</span></a> |
54 | | - <a href="#actions-area" class="hidden-when-disconnected" role="menuitem"><span class="icon power-off" aria-hidden="true"></span><span>Actions</span></a> |
55 | | - <a href="#settings-area" class="hidden-when-disconnected lr-update-hide" role="menuitem"><span class="icon hw-version" aria-hidden="true"></span><span>Settings</span></a> |
56 | | - <a href="#other-commands" class="hidden-when-disconnected lr-update-hide" role="menuitem"><span class="icon messages" aria-hidden="true"></span><span>Commands</span></a> |
57 | | - <a href="#logs-area" class="hidden-when-disconnected" role="menuitem"><span class="icon bug" aria-hidden="true"></span><span>Logs</span></a> |
58 | | - <a href="#map-area" class="hidden-when-disconnected lr-update-hide" role="menuitem"><span class="icon ublox-location" aria-hidden="true"></span><span>Map</span></a> |
59 | | - <button type="button" class="hidden-when-disconnected dfu-hide" role="menuitem" onclick="openDfuPage()"><span class="icon screwdriver-wrench" aria-hidden="true"></span><span>DFU</span></button> |
60 | | - <button type="button" class="hidden-when-disconnected" role="menuitem" onclick="toggleLog()"><span class="icon toggle-log" aria-hidden="true"></span><span>Debug Log</span></button> |
| 54 | + <a href="#header-section" role="menuitem"><span class="icon house" aria-hidden="true"></span><span>Home</span></a> |
61 | 55 | <a href="composer.html" role="menuitem"><span class="icon keyboard" aria-hidden="true"></span><span>Composer</span></a> |
| 56 | + <button type="button" id="menu-debug-toggle" class="hidden-when-disconnected menu-debug-toggle" role="menuitem" onclick="toggleLog()"> |
| 57 | + <span class="icon toggle-log" aria-hidden="true"></span><span>Debug</span> |
| 58 | + </button> |
62 | 59 | </div> |
63 | 60 | </div> |
64 | 61 | </div> |
@@ -322,6 +319,10 @@ <h3 id="import-preview-title">Import preview</h3> |
322 | 319 |
|
323 | 320 | <div id="toast"></div> |
324 | 321 |
|
| 322 | + <button id="debug-toggle-fab" class="debug-toggle-fab hidden hidden-when-disconnected dfu-keep-visible" type="button" onclick="toggleLog()" aria-label="Toggle debug log"> |
| 323 | + <span class="icon toggle-log" aria-hidden="true"></span> |
| 324 | + </button> |
| 325 | + |
325 | 326 | <div id="map-tracks-overlay" class="dfu-waiting-overlay hidden" role="dialog" aria-modal="true"> |
326 | 327 | <div class="dfu-waiting-card"> |
327 | 328 | <div id="map-tracks-spinner" class="dfu-spinner hidden"></div> |
@@ -646,13 +647,36 @@ <h3 id="import-preview-title">Import preview</h3> |
646 | 647 | let flashLogCountTotal = null; |
647 | 648 |
|
648 | 649 | const logFooter = document.getElementById('logFooter'); |
| 650 | + const menuDebugToggle = document.getElementById('menu-debug-toggle'); |
| 651 | + const debugFab = document.getElementById('debug-toggle-fab'); |
| 652 | + |
| 653 | + function updateMenuDebugState() { |
| 654 | + if (!menuDebugToggle || !logFooter) { |
| 655 | + return; |
| 656 | + } |
| 657 | + const enabled = logFooter.classList.contains('open'); |
| 658 | + menuDebugToggle.classList.toggle('debug-enabled', enabled); |
| 659 | + menuDebugToggle.classList.toggle('debug-disabled', !enabled); |
| 660 | + } |
| 661 | + |
| 662 | + function updateDebugFabState() { |
| 663 | + if (!debugFab || !logFooter) { |
| 664 | + return; |
| 665 | + } |
| 666 | + const enabled = logFooter.classList.contains('open'); |
| 667 | + debugFab.classList.toggle('debug-enabled', enabled); |
| 668 | + debugFab.classList.toggle('debug-disabled', !enabled); |
| 669 | + debugFab.classList.toggle('hidden', !document.body.classList.contains('connected')); |
| 670 | + } |
649 | 671 |
|
650 | 672 | function toggleLog() { |
651 | 673 | const basePadding = getComputedStyle(document.documentElement).getPropertyValue('--body-bottom-padding').trim() || '50px'; |
652 | 674 | logFooter.classList.toggle('open'); |
653 | 675 | document.body.style.paddingBottom = logFooter.classList.contains('open') ? logFooter.clientHeight + "px" : basePadding; |
654 | 676 | const logElement = document.getElementById('log'); |
655 | 677 | logElement.scrollTop = logElement.scrollHeight; |
| 678 | + updateMenuDebugState(); |
| 679 | + updateDebugFabState(); |
656 | 680 | } |
657 | 681 | window.toggleLog = toggleLog; |
658 | 682 |
|
@@ -2993,6 +3017,7 @@ <h4>${setting.display_name} <small>${key} (${setting.id})</small></h4> |
2993 | 3017 | mapInstance.removeLayer(mapMarker); |
2994 | 3018 | } |
2995 | 3019 | mapMarker = null; |
| 3020 | + updateDebugFabState(); |
2996 | 3021 | } |
2997 | 3022 |
|
2998 | 3023 | const connectButton = document.getElementById('connect-button'); |
@@ -3078,6 +3103,7 @@ <h4>${setting.display_name} <small>${key} (${setting.id})</small></h4> |
3078 | 3103 | document.body.classList.add('connected'); |
3079 | 3104 | log(`Connected to device: ${device.name}`); |
3080 | 3105 | lastConnectedDeviceName = device && device.name ? device.name : null; |
| 3106 | + updateDebugFabState(); |
3081 | 3107 |
|
3082 | 3108 | loadAvailableSettings(); |
3083 | 3109 | await checkPin(document.getElementById('pincode').value); |
@@ -4064,6 +4090,9 @@ <h4>${setting.display_name} <small>${key} (${setting.id})</small></h4> |
4064 | 4090 |
|
4065 | 4091 | initAppMenu(); |
4066 | 4092 |
|
| 4093 | + updateMenuDebugState(); |
| 4094 | + updateDebugFabState(); |
| 4095 | + |
4067 | 4096 | const flashLogOkButton = document.getElementById('flash-log-ok'); |
4068 | 4097 | if (flashLogOkButton) { |
4069 | 4098 | flashLogOkButton.addEventListener('click', () => { |
|
0 commit comments