Floating Menu Alpha Development Thread

Hello.
The site I am viewing in web view is logging me out every so often, how to keep my login information?

Hey hey!

I saw a MacOS Concept on Youtube, and I got an idea.





I'm currently using a Notch Floating Menu that expands on hover.
Is there a possibility to trigger it on new notifications or something [Like the Dynamic Island on iPhone]
For example If I get a call, ongoing timers, Reminders,...

1 Like

There's some issue with Floating Menu not wanting to hide when clicking outside of it, even though I have everything enabled.

image

It randomly works.

So it works exactly after the first time I call my Floating Menu. When I first click outside, the menu disappears. When I switch away to a different app and show the menu, I cannot hide it by clicking outside anymore.

I can only reproduce this in one situation: When clicking another BTT window, but it doesn't sound like that's your issue.
Could you share a menu that reproduces this?

Yes, here it is:

[
  {
    "BTTLastUpdatedAt" : 1696016368.6083488,
    "BTTTriggerType" : 767,
    "BTTTriggerTypeDescription" : "Floating Menu",
    "BTTTriggerClass" : "BTTTriggerTypeFloatingMenu",
    "BTTUUID" : "19F2DD54-C7F1-4F18-BB9C-B89678744B25",
    "BTTEnabled" : 1,
    "BTTTriggerName" : "Floating Menu: Helpscreen",
    "BTTMenuItems" : [
      {
        "BTTLastUpdatedAt" : 1696016368.6083589,
        "BTTTriggerType" : 778,
        "BTTTriggerTypeDescription" : "Web View \/ HTML Item",
        "BTTTriggerClass" : "BTTTriggerTypeFloatingMenu",
        "BTTUUID" : "81727544-57EF-41DE-B7B2-A80101CA6E5A",
        "BTTEnabled" : 1,
        "BTTTriggerName" : "Webview Menu Item: Page",
        "BTTMenuConfig" : {
          "BTTMenuItemBorderColorDark" : "255.000000, 255.000000, 255.000000, 255.000000",
          "BTTMenuItemIconColor1" : "255.000000, 255.000000, 255.000000, 255.000000",
          "BTTMenuItemDisplayOrder" : 0,
          "BTTMenuScriptSettings" : {
            "BTTScriptType" : 3,
            "BTTAppleScriptString" : "(async () => {\n    \/\/ Fetch currently focused application\n    const bundleIdentifier = await get_string_variable({\n        variable_name: 'BTTActiveAppBundleIdentifier'\n    })\n\n    \/\/ Fetch keyboard shortcuts for the currently focused application\n    const allKeyboardShortcuts = await getAppKeyboardShortcuts(bundleIdentifier)\n\n    \/\/ const allKeyboardShortcuts = ['⇧⌘H','⌥]','⌥[','⌘H','⌘L','⌃⌘H','⌃O','⌥[','⌥]','⌘Y'];\n\n    BTTLog('?????????????????? start creating elements')\n    \/\/ Create the container and add it to the body\n    const container = document.createElement(\"div\");\n  \tBTTLog('createElement done')\n    container.className = \"container\";\n    container.id = \"shortcutsContainer\";\n    document.body.appendChild(container);\n    BTTLog('1314134134134 appendChild done')\n    \/\/ Add the shortcuts to the container\n\n    BTTLog('CALLING addShortcutsToContainer...')\n    addShortcutsToContainer(allKeyboardShortcuts);\n    BTTLog('addShortcutsToContainer DONE!!!')\n\n    BTTLog(\"drawing done ################\")\n\n    async function getAppKeyboardShortcuts(appId) {\n        BTTLog('getting keys for ' + appId)\n\n        const allKeyboardShortcutsJSONString = await get_triggers({\n            trigger_type: 'BTTTriggerTypeKeyboardShortcut',\n            trigger_app_bundle_identifier: appId\n        })\n\n        BTTLog('await get_triggers done! @!!!!!!#!$$!$$!!$')\n\n        allTriggersJSONArray = JSON.parse(allKeyboardShortcutsJSONString)\n        const allKeyboardShortcuts = []\n\n        for (const trigger of allTriggersJSONArray) {\n            if (!trigger.BTTShortcutModifierKeys || trigger.BTTShortcutModifierKeys === -1)\n                continue\n\n            const mod = getModifiersForBitmask(trigger.BTTShortcutModifierKeys, false)\n            const key = getKeycodeStringForKeycode(trigger.BTTShortcutKeyCode)\n\n            allKeyboardShortcuts.push(mod + key)\n        }\n\n        BTTLog('allKeyboardShortcuts ready: ' + allKeyboardShortcuts)\n        return allKeyboardShortcuts\n    }\n\n    function createShortcutElement(shortcut) {\n        const shortcutElement = document.createElement(\"p\");\n        shortcutElement.textContent = shortcut;\n        shortcutElement.style.margin = \"0\";\n        shortcutElement.style.padding = \"0\";\n        return shortcutElement;\n    }\n\n    function addShortcutsToContainer(shortcuts) {\n        const container = document.getElementById(\"shortcutsContainer\");\n\n        let totalHeight = 0;\n\n        for (const shortcut of shortcuts) {\n            const shortcutElement = createShortcutElement(shortcut);\n            container.appendChild(shortcutElement);\n            totalHeight += shortcutElement.clientHeight;\n        }\n\n        if (totalHeight > container.clientHeight) {\n            container.style.columnCount = 2; \/\/ If content exceeds height, use two columns\n        }\n    }\n\n    function getKeycodeStringForKeycode(keycode) {\n        switch (keycode) {\n            case 0x00: {\n                return \"A\";\n            }\n            case 0x01: {\n                return \"S\";\n            }\n            case 0x02: {\n                return \"D\";\n            }\n            case 0x03: {\n                return \"F\";\n            }\n            case 0x04: {\n                return \"H\";\n            }\n            case 0x05: {\n                return \"G\";\n            }\n            case 0x06: {\n                return \"Z\";\n            }\n            case 0x07: {\n                return \"X\";\n            }\n            case 0x08: {\n                return \"C\";\n            }\n            case 0x09: {\n                return \"V\";\n            }\n            case 0x0b: {\n                return \"B\";\n            }\n            case 0x0c: {\n                return \"Q\";\n            }\n            case 0x0d: {\n                return \"W\";\n            }\n            case 0x0e: {\n                return \"E\";\n            }\n            case 0x0f: {\n                return \"R\";\n            }\n            case 0x10: {\n                return \"Y\";\n            }\n            case 0x11: {\n                return \"T\";\n            }\n            case 0x12: {\n                return \"1\";\n            }\n            case 0x13: {\n                return \"2\";\n            }\n            case 0x14: {\n                return \"3\";\n            }\n            case 0x15: {\n                return \"4\";\n            }\n            case 0x16: {\n                return \"6\";\n            }\n            case 0x17: {\n                return \"5\";\n            }\n            case 0x18: {\n                return \"=\";\n            }\n            case 0x19: {\n                return \"9\";\n            }\n            case 0x1a: {\n                return \"7\";\n            }\n            case 0x1b: {\n                return \"-\";\n            }\n            case 0x1c: {\n                return \"8\";\n            }\n            case 0x1d: {\n                return \"0\";\n            }\n            case 0x1e: {\n                return \"]\";\n            }\n            case 0x1f: {\n                return \"O\";\n            }\n            case 0x20: {\n                return \"U\";\n            }\n            case 0x21: {\n                return \"[\";\n            }\n            case 0x22: {\n                return \"I\";\n            }\n            case 0x23: {\n                return \"P\";\n            }\n            case 0x25: {\n                return \"L\";\n            }\n            case 0x26: {\n                return \"J\";\n            }\n            case 0x27: {\n                return '\"';\n            }\n            case 0x28: {\n                return \"K\";\n            }\n            case 0x29: {\n                return \";\";\n            }\n            case 0x2a: {\n                return \"\\\\\";\n            }\n            case 0x2b: {\n                return \",\";\n            }\n            case 0x2c: {\n                return \"\/\";\n            }\n            case 0x2d: {\n                return \"N\";\n            }\n            case 0x2e: {\n                return \"M\";\n            }\n            case 0x2f: {\n                return \".\";\n            }\n            case 0x32: {\n                return \"?\";\n            }\n            case 0x41: {\n                return \".\";\n            }\n            case 0x43: {\n                return \"*\";\n            }\n            case 0x45: {\n                return \"+\";\n            }\n            case 0x47: {\n                return \"?\";\n            }\n            case 0x4b: {\n                return \"%\";\n            }\n            case 0x4c: {\n                return \"return\";\n            }\n            case 0x4e: {\n                return \"-\";\n            }\n            case 0x51: {\n                return \"=\";\n            }\n            case 0x52: {\n                return \"0\";\n            }\n            case 0x53: {\n                return \"1\";\n            }\n            case 0x54: {\n                return \"2\";\n            }\n            case 0x55: {\n                return \"3\";\n            }\n            case 0x56: {\n                return \"4\";\n            }\n            case 0x57: {\n                return \"5\";\n            }\n            case 0x58: {\n                return \"6\";\n            }\n            case 0x59: {\n                return \"7\";\n            }\n            case 0x5b: {\n                return \"8\";\n            }\n            case 0x5c: {\n                return \"9\";\n            }\n            case 0x24: {\n                return \"Return\";\n            }\n            case 0x30: {\n                return \"Tab\";\n            }\n            case 0x31: {\n                return \"Space\";\n            }\n            case 0x33: {\n                return \"Delete\";\n            }\n            case 0x35: {\n                return \"Escape\";\n            }\n            case 0x37: {\n                return \"Command\";\n            }\n            case 0x38: {\n                return \"Shift\";\n            }\n            case 0x39: {\n                return \"CapsLock\";\n            }\n            case 0x3a: {\n                return \"Option\";\n            }\n            case 0x3b: {\n                return \"Control\";\n            }\n            case 0x3c: {\n                return \"RightShift\";\n            }\n            case 0x3d: {\n                return \"RightOption\";\n            }\n            case 0x3e: {\n                return \"RightControl\";\n            }\n            case 0x3f: {\n                return \"Function\";\n            }\n            case 0x40: {\n                return \"F17\";\n            }\n            case 0x48: {\n                return \"VolumeUp\";\n            }\n            case 0x49: {\n                return \"VolumeDown\";\n            }\n            case 0x4a: {\n                return \"Mute\";\n            }\n            case 0x4f: {\n                return \"F18\";\n            }\n            case 0x50: {\n                return \"F19\";\n            }\n            case 0x5a: {\n                return \"F20\";\n            }\n            case 0x60: {\n                return \"F5\";\n            }\n            case 0x61: {\n                return \"F6\";\n            }\n            case 0x62: {\n                return \"F7\";\n            }\n            case 0x63: {\n                return \"F3\";\n            }\n            case 0x64: {\n                return \"F8\";\n            }\n            case 0x65: {\n                return \"F9\";\n            }\n            case 0x67: {\n                return \"F11\";\n            }\n            case 0x69: {\n                return \"F13\";\n            }\n            case 0x6a: {\n                return \"F16\";\n            }\n            case 0x6b: {\n                return \"F14\";\n            }\n            case 0x6d: {\n                return \"F10\";\n            }\n            case 0x6f: {\n                return \"F12\";\n            }\n            case 0x71: {\n                return \"F15\";\n            }\n            case 0x72: {\n                return \"Help\";\n            }\n            case 0x73: {\n                return \"Home\";\n            }\n            case 0x74: {\n                return \"PageUp\";\n            }\n            case 0x75: {\n                return \"ForwardDelete\";\n            }\n            case 0x76: {\n                return \"F4\";\n            }\n            case 0x77: {\n                return \"End\";\n            }\n            case 0x78: {\n                return \"F2\";\n            }\n            case 0x79: {\n                return \"PageDown\";\n            }\n            case 0x7a: {\n                return \"F1\";\n            }\n            case 0x7b: {\n                return \"LeftArrow\";\n            }\n            case 0x7c: {\n                return \"RightArrow\";\n            }\n            case 0x7d: {\n                return \"DownArrow\";\n            }\n            case 0x7e: {\n                return \"UpArrow\";\n            }\n            default: {\n                return \"??\";\n            }\n        }\n    }\n\n    function getModifiersForBitmask(bitMask, leftRight) {\n        console.log(\"modifier\", bitMask);\n\n        if (bitMask === 0 || bitMask === -1) {\n            return \"\";\n        }\n        var modifierString = \"\";\n\n        if (leftRight && (bitMask & 0x00000001 || bitMask & 0x00002000)) {\n            if (bitMask & 0x00000001) {\n                modifierString += \"⌃(L)\";\n            }\n            if (bitMask & 0x00002000) {\n                modifierString += \"⌃(R)\";\n            }\n        } else {\n            if (bitMask & (1 << 18)) {\n                modifierString += \"⌃\";\n            }\n        }\n\n        if (leftRight && (bitMask & 0x00000002 || bitMask & 0x00000004)) {\n            if (bitMask & 0x00000002) {\n                modifierString += \"⇧(L)\";\n            }\n            if (bitMask & 0x00000004) {\n                modifierString += \"⇧(R)\";\n            }\n        } else {\n            if (bitMask & (1 << 17)) {\n                modifierString += \"⇧\";\n            }\n        }\n\n        if (leftRight && (bitMask & 0x00000010 || bitMask & 0x00000008)) {\n            if (bitMask & 0x00000010) {\n                modifierString += \"⌘(R)\";\n            }\n            if (bitMask & 0x00000008) {\n                modifierString += \"⌘(L)\";\n            }\n        } else {\n            if (bitMask & (1 << 20)) {\n                modifierString += \"⌘\";\n            }\n        }\n\n        if (leftRight && (bitMask & 0x00000020 || bitMask & 0x00000040)) {\n            if (bitMask & 0x00000020) {\n                modifierString += \"⌥(L)\";\n            }\n            if (bitMask & 0x00000040) {\n                modifierString += \"⌥(R)\";\n            }\n        } else {\n            if (bitMask & (1 << 19)) {\n                modifierString += \"⌥\";\n            }\n        }\n\n        if (bitMask & (1 << 23)) {\n            modifierString += \"fn\";\n        }\n\n        console.log(\"modifierstring\", modifierString);\n        return modifierString;\n    }\n\n    returnToBTT('done');\n})()",
            "BTTAppleScriptUsePath" : false
          },
          "BTTMenuItemBackgroundColor" : "108.442, 96.000, 190.435, 166.991",
          "BTTMenuCategoryItemVisibility" : 0,
          "BTTMenuScriptAlwaysRunOnFirstLoad" : 0,
          "BTTMenuItemBackgroundType" : 0,
          "BTTMenuItemBlurredBackground" : 1,
          "BTTMenuSelectedTab" : 0,
          "BTTMenuItemMaxHeight" : 360,
          "BTTMenuHoverEndAnimationDuration" : 0.14999999999999999,
          "BTTMenuItemMaxWidth" : 700,
          "BTTMenuItemBorderWidth" : 0,
          "BTTMenuCategoryItemSpacing" : 0,
          "BTTMenuItemCornerRadius" : 16,
          "BTTLastChangeUUID" : "A7CBD14D-6FE7-4BDF-B4BB-3051C0C305CF",
          "BTTMenuItemBorderColorHover" : "255.000000, 255.000000, 255.000000, 0.000000",
          "BTTMenuItemBorderColor" : "255.000000, 255.000000, 255.000000, 0.000000",
          "BTTMenuItemMinHeight" : 20,
          "BTTMenuItemBackgroundColorDark" : "108.442, 96.000, 190.435, 166.991",
          "BTTMenuItemVisibleWhileActive" : 1,
          "BTTMenuElementIdentifier" : "Page",
          "BTTMenuItemVisibleWhileInactive" : 1,
          "BTTMenuItemMinWidth" : 500,
          "BTTMenuItemBackgroundTypeDark" : 4,
          "BTTMenuItemKeepActiveInBackground" : 0,
          "BTTMenuAttributedText" : "[\"Test\",{\"NSColor\":\"YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMSAAGGoF8QD05TS2V5ZWRBcmNoaXZlctEICVRyb290gAGmCwwXHyAnVSRudWxs1Q0ODxAREhMUFRZXTlNXaGl0ZVxOU0NvbXBvbmVudHNcTlNDb2xvclNwYWNlXxASTlNDdXN0b21Db2xvclNwYWNlViRjbGFzc0IxAEMxIDEQA4ACgAXUGBkaERscHR5UTlNJRFVOU0lDQ1dOU01vZGVsEAmAAxAAgARPERGcAAARnGFwcGwCAAAAbW50ckdSQVlYWVogB9wACAAXAA8ALgAPYWNzcEFQUEwAAAAAbm9uZQAAAAAAAAAAAAAAAAAAAAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFZGVzYwAAAMAAAAB5ZHNjbQAAATwAAAgaY3BydAAACVgAAAAjd3RwdAAACXwAAAAUa1RSQwAACZAAAAgMZGVzYwAAAAAAAAAfR2VuZXJpYyBHcmF5IEdhbW1hIDIuMiBQcm9maWxlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG1sdWMAAAAAAAAAHwAAAAxza1NLAAAALgAAAYRkYURLAAAAOgAAAbJjYUVTAAAAOAAAAex2aVZOAAAAQAAAAiRwdEJSAAAASgAAAmR1a1VBAAAALAAAAq5mckZVAAAAPgAAAtpodUhVAAAANAAAAxh6aFRXAAAAGgAAA0xrb0tSAAAAIgAAA2ZuYk5PAAAAOgAAA4hjc0NaAAAAKAAAA8JoZUlMAAAAJAAAA+pyb1JPAAAAKgAABA5kZURFAAAATgAABDhpdElUAAAATgAABIZzdlNFAAAAOAAABNR6aENOAAAAGgAABQxqYUpQAAAAJgAABSZlbEdSAAAAKgAABUxwdFBPAAAAUgAABXZubE5MAAAAQAAABchlc0VTAAAATAAABgh0aFRIAAAAMgAABlR0clRSAAAAJAAABoZmaUZJAAAARgAABqpockhSAAAAPgAABvBwbFBMAAAASgAABy5hckVHAAAALAAAB3hydVJVAAAAOgAAB6RlblVTAAAAPAAAB94AVgFhAGUAbwBiAGUAYwBuAOEAIABzAGkAdgDhACAAZwBhAG0AYQAgADIALAAyAEcAZQBuAGUAcgBpAHMAawAgAGcAcgDlACAAMgAsADIAIABnAGEAbQBtAGEALQBwAHIAbwBmAGkAbABHAGEAbQBtAGEAIABkAGUAIABnAHIAaQBzAG8AcwAgAGcAZQBuAOgAcgBpAGMAYQAgADIALgAyAEMepQB1ACAAaADsAG4AaAAgAE0A4AB1ACAAeADhAG0AIABDAGgAdQBuAGcAIABHAGEAbQBtAGEAIAAyAC4AMgBQAGUAcgBmAGkAbAAgAEcAZQBuAOkAcgBpAGMAbwAgAGQAYQAgAEcAYQBtAGEAIABkAGUAIABDAGkAbgB6AGEAcwAgADIALAAyBBcEMAQzBDAEOwRMBD0EMAAgAEcAcgBhAHkALQQzBDAEPAQwACAAMgAuADIAUAByAG8AZgBpAGwAIABnAOkAbgDpAHIAaQBxAHUAZQAgAGcAcgBpAHMAIABnAGEAbQBtAGEAIAAyACwAMgDBAGwAdABhAGwA4QBuAG8AcwAgAHMAegD8AHIAawBlACAAZwBhAG0AbQBhACAAMgAuADKQGnUocHCWjlFJXqYAMgAuADKCcl9pY8+P8Md8vBgAINaMwMkAIKwQucgAIAAyAC4AMgAg1QS4XNMMx3wARwBlAG4AZQByAGkAcwBrACAAZwByAOUAIABnAGEAbQBtAGEAIAAyACwAMgAtAHAAcgBvAGYAaQBsAE8AYgBlAGMAbgDhACABYQBlAGQA4QAgAGcAYQBtAGEAIAAyAC4AMgXSBdAF3gXUACAF0AXkBdUF6AAgBdsF3AXcBdkAIAAyAC4AMgBHAGEAbQBhACAAZwByAGkAIABnAGUAbgBlAHIAaQBjAQMAIAAyACwAMgBBAGwAbABnAGUAbQBlAGkAbgBlAHMAIABHAHIAYQB1AHMAdAB1AGYAZQBuAC0AUAByAG8AZgBpAGwAIABHAGEAbQBtAGEAIAAyACwAMgBQAHIAbwBmAGkAbABvACAAZwByAGkAZwBpAG8AIABnAGUAbgBlAHIAaQBjAG8AIABkAGUAbABsAGEAIABnAGEAbQBtAGEAIAAyACwAMgBHAGUAbgBlAHIAaQBzAGsAIABnAHIA5QAgADIALAAyACAAZwBhAG0AbQBhAHAAcgBvAGYAaQBsZm6QGnBwXqZ8+2VwADIALgAyY8+P8GWHTvZOAIIsMLAw7DCkMKww8zDeACAAMgAuADIAIDDXMO0w1TChMKQw6wOTA7UDvQO5A7oDzAAgA5MDugPBA7kAIAOTA6wDvAO8A7EAIAAyAC4AMgBQAGUAcgBmAGkAbAAgAGcAZQBuAOkAcgBpAGMAbwAgAGQAZQAgAGMAaQBuAHoAZQBuAHQAbwBzACAAZABhACAARwBhAG0AbQBhACAAMgAsADIAQQBsAGcAZQBtAGUAZQBuACAAZwByAGkAagBzACAAZwBhAG0AbQBhACAAMgAsADIALQBwAHIAbwBmAGkAZQBsAFAAZQByAGYAaQBsACAAZwBlAG4A6QByAGkAYwBvACAAZABlACAAZwBhAG0AbQBhACAAZABlACAAZwByAGkAcwBlAHMAIAAyACwAMg4jDjEOBw4qDjUOQQ4BDiEOIQ4yDkAOAQ4jDiIOTA4XDjEOSA4nDkQOGwAgADIALgAyAEcAZQBuAGUAbAAgAEcAcgBpACAARwBhAG0AYQAgADIALAAyAFkAbABlAGkAbgBlAG4AIABoAGEAcgBtAGEAYQBuACAAZwBhAG0AbQBhACAAMgAsADIAIAAtAHAAcgBvAGYAaQBpAGwAaQBHAGUAbgBlAHIAaQENAGsAaQAgAEcAcgBhAHkAIABHAGEAbQBtAGEAIAAyAC4AMgAgAHAAcgBvAGYAaQBsAFUAbgBpAHcAZQByAHMAYQBsAG4AeQAgAHAAcgBvAGYAaQBsACAAcwB6AGEAcgBvAVsAYwBpACAAZwBhAG0AbQBhACAAMgAsADIGOgYnBkUGJwAgADIALgAyACAGRAZIBkYAIAYxBkUGJwYvBkoAIAY5BicGRQQeBDEESQQwBE8AIARBBDUEQAQwBE8AIAQzBDAEPAQ8BDAAIAAyACwAMgAtBD8EQAQ+BEQEOAQ7BEwARwBlAG4AZQByAGkAYwAgAEcAcgBhAHkAIABHAGEAbQBtAGEAIAAyAC4AMgAgAFAAcgBvAGYAaQBsAGUAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIEluYy4sIDIwMTIAAFhZWiAAAAAAAADzUQABAAAAARbMY3VydgAAAAAAAAQAAAAABQAKAA8AFAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQAJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMBGQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwCtgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPTA+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbRBuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB\\\/gICwgfCDIIRghaCG4IggiWCKoIvgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrcCvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUANWg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQaKhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4WHkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUigiKvIt0jCiM4I2YjlCPCI\\\/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcYJ0kneierJ9woDSg\\\/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv\\\/jA1MGwwpDDbMRIxSjGCMbox8jIqMmMymzLUMw0zRjN\\\/M7gz8TQrNGU0njTYNRM1TTWHNcI1\\\/TY3NnI2rjbpNyQ3YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1hPaE94D4gPmA+oD7gPyE\\\/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BEA0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrESwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0\\\/dUCdQcVC7UQZRUFGbUeZSMVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg\\\/GFPYaJh9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg\\\/aJZo7GlDaZpp8WpIap9q92tPa6dr\\\/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyBfOF9QX2hfgF+Yn7CfyN\\\/hH\\\/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuHn4gEiGmIzokziZmJ\\\/opkisqLMIuWi\\\/yMY4zKjTGNmI3\\\/jmaOzo82j56QBpBukNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ\\\/JpomtWbQpuvnByciZz3nWSd0p5Anq6fHZ+Ln\\\/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYapoum\\\/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2Pvgq+hL7\\\/v3q\\\/9cBwwOzBZ8Hjwl\\\/C28NYw9TEUcTOxUvFyMZGxsPHQce\\\/yD3IvMk6ybnKOMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI\\\/0sHTRNPG1EnUy9VO1dHWVdbY11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vkc+T85YTmDeaW5x\\\/nqegy6LzpRunQ6lvq5etw6\\\/vshu0R7ZzuKO6070DvzPBY8OXxcvH\\\/8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x\\\/pX+uf7d\\\/wH\\\/Jj9Kf26\\\/kv+3P9t\\\/\\\/\\\/SISIjJFokY2xhc3NuYW1lWCRjbGFzc2VzXE5TQ29sb3JTcGFjZaIlJlxOU0NvbG9yU3BhY2VYTlNPYmplY3TSISIoKVdOU0NvbG9yoigmAAgAEQAaACQAKQAyADcASQBMAFEAUwBaAGAAawBzAIAAjQCiAKkArACwALIAtAC2AL8AxADKANIA1ADWANgA2hJ6En8SihKTEqASoxKwErkSvhLGAAAAAAAAAgEAAAAAAAAAKgAAAAAAAAAAAAAAAAAAEsk=\",\"NSParagraphStyle\":\"YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMSAAGGoF8QD05TS2V5ZWRBcmNoaXZlctEICVRyb290gAGjCwwVVSRudWxs1A0ODxAREhMUWk5TVGFiU3RvcHNbTlNBbGlnbm1lbnRfEB9OU0FsbG93c1RpZ2h0ZW5pbmdGb3JUcnVuY2F0aW9uViRjbGFzc4AAEAIQAYAC0hYXGBlaJGNsYXNzbmFtZVgkY2xhc3Nlc18QF05TTXV0YWJsZVBhcmFncmFwaFN0eWxloxgaG18QEE5TUGFyYWdyYXBoU3R5bGVYTlNPYmplY3QACAARABoAJAApADIANwBJAEwAUQBTAFcAXQBmAHEAfQCfAKYAqACqAKwArgCzAL4AxwDhAOUA+AAAAAAAAAIBAAAAAAAAABwAAAAAAAAAAAAAAAAAAAEB\",\"NSFont\":\"YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMSAAGGoF8QD05TS2V5ZWRBcmNoaXZlctEICVRyb290gAGkCwwVFlUkbnVsbNQNDg8QERITFFZOU1NpemVYTlNmRmxhZ3NWTlNOYW1lViRjbGFzcyNAOQAAAAAAABAQgAKAA11TRlByby1SZWd1bGFy0hcYGRpaJGNsYXNzbmFtZVgkY2xhc3Nlc1ZOU0ZvbnSiGRtYTlNPYmplY3QIERokKTI3SUxRU1heZ253foWOkJKUoqeyu8LFAAAAAAAAAQEAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAM4=\"}]",
          "BTTMenuScriptUpdateInterval" : 0,
          "BTTMenuItemBorderColorHoverDark" : "255.000000, 255.000000, 255.000000, 255.000000",
          "BTTMenuItemText" : "localfile:\/\/\/opt\/dev\/github.com\/mkozjak\/bettertouchtool\/helpscreen.html",
          "BTTMenuAppearanceStyle" : 0,
          "BTTMenuItemBackgroundColorHover" : "90, 90.000, 180, 166.991",
          "BTTMenuAlwaysUseLightMode" : 1,
          "BTTMenuCategoryBackground" : 1,
          "BTTMenuCategoryItemSizing" : 1,
          "BTTMenuScriptAlwaysRunOnAppear" : 1,
          "BTTMenuItemScriptActive" : 0,
          "BTTMenuHoverStartAnimationDuration" : 0.14999999999999999,
          "BTTMenuItemBackgroundColorHoverDark" : "90, 90.000, 180, 166.991",
          "BTTMenuCategoryBorder" : 1
        }
      }
    ],
    "BTTMenuConfig" : {
      "BTTMenuVerticalSpacing" : 0,
      "BTTMenuItemToggleVisibilityNow" : null,
      "BTTMenuHorizontalSpacing" : 0,
      "BTTMenuItemBackgroundColor" : "168.212997, 183.731003, 225.311005, 255.000000",
      "BTTMenuFrameHeight" : 20,
      "BTTMenuWindowLevel" : 3,
      "BTTMenuItemBackgroundType" : 0,
      "BTTMenuFrameWidth" : 450,
      "BTTMenuAnchorRelation" : 4,
      "BTTMenuItemBlurredBackground" : 0,
      "BTTMenuItemPaddingLeft" : 0,
      "BTTMenuAnchorMenu" : 4,
      "BTTMenuCategoryMenuVisibility" : 0,
      "BTTMenuItemPaddingTop" : 0,
      "BTTMenuItemBorderWidth" : 0,
      "BTTMenuCategoryShadow" : 0,
      "BTTMenuCategoryOnlyShowIf" : 0,
      "BTTMenuItemCornerRadius" : 16,
      "BTTLastChangeUUID" : "2F3CA960-A826-4DA5-991C-5A5325E6990D",
      "BTTMenuItemBorderColorHover" : "0.000, 0.000, 0.000, 0.000",
      "BTTMenuCategoryModifiers" : 0,
      "BTTMenuShowIfWindowLevelEqualsEnabled" : 0,
      "BTTMenuItemBorderColor" : "0.000, 0.000, 0.000, 0.000",
      "BTTMenuPositionRelativeTo" : 8,
      "BTTMenuCategorySize" : 1,
      "BTTMenuPositioningType" : 1,
      "BTTMenuItemsUseModifierModes" : false,
      "BTTMenuElementIdentifier" : "Helpscreen",
      "BTTMenuItemPaddingRight" : 0,
      "BTTMenuCloseOnOutsideClick" : 1,
      "BTTMenuCategorySpacing" : 1,
      "BTTMenuItemShadowEnabled" : 0,
      "BTTMenuLayoutDirection" : 0,
      "BTTMenuAppearanceStyle" : 0,
      "BTTMenuItemPaddingBottom" : 0,
      "BTTMenuAlwaysUseLightMode" : 1,
      "BTTMenuCategoryBackground" : 1,
      "BTTMenuVisibility" : 1,
      "BTTMenuWindowResizable" : 0,
      "BTTMenuCategoryBorder" : 1,
      "BTTMenuCategoryPosition" : 0,
      "BTTMenuCategoryZIndex" : 0,
      "BTTMenuCloseAfterAction" : 1,
      "BTTMenuItemSaveCurrentSize" : null
    }
  }
]
1 Like

What kind of trigger are you using to show/hide this?

Named Trigger (Triggered via Keyboard Shortcut):

[
  {
    "BTTLastUpdatedAt" : 1695903219.2704279,
    "BTTTriggerType" : 643,
    "BTTTriggerTypeDescription" : "Named Trigger: Help Screen",
    "BTTTriggerClass" : "BTTTriggerTypeOtherTriggers",
    "BTTPredefinedActionType" : 388,
    "BTTPredefinedActionName" : "Toggle Floating Menu Hidden\/Shown",
    "BTTAdditionalActionData" : {
      "BTTMenuActionMenuID" : "19F2DD54-C7F1-4F18-BB9C-B89678744B25"
    },
    "BTTTriggerName" : "Help Screen",
    "BTTUUID" : "12AEC4C4-D933-41DD-968C-B7A8A1EC23A4",
    "BTTEnabled" : 1,
    "BTTEnabled2" : 1,
    "BTTOrder" : 9
  }
]

Ah interesting, when triggering the named trigger via a keyboard shortcut I can reproduce the issue. I'll check why that is different from directly showing/hiding the menu via a keyboard shortcut

1 Like

Is keyboard and/or trackpad navigation now possible? I’d like to use three finger swipes on my html to initiate some JavaScript code…

depends, can you explain what exactly you are trying to do?

That cheat sheet keyboard/trackpad screen I’ve been working on… I’d like to swipe between those pages.

In that case you can probably use the "Execute Java Script in Web View Menu Item" action and assign it to swipes. It would just need to trigger some Java Script that changes the page.
Maybe you can post your current version, then I can have a look sometime tomorrow.

1 Like

Here it is: Hot Key Cheat Sheet? - #42 by mkozjak

1 Like

Is this just promo for Floating menu?
Or can we use it in the future ?
image

yes you can use it soon! (will only support a subset of the functionality though if you use the native option, things like webviews are not possible there)

1 Like

Amazing!!
Looking forward to that.

In general just changing the window level will achieve almost the same though :wink:

https://docs.folivora.ai/docs/1605_desktop_widgets.html

But we can't place those in the notification center tho

that‘s true :slight_smile:

1 Like