HA menu fix

Fixes menus and dropdowns that are cut off or unclickable in Home Assistant Web GUI (Web Awesome components bugs).

Aby zainstalować ten skrypt, wymagana jest instalacje jednego z następujących rozszerzeń: Tampermonkey, Greasemonkey lub Violentmonkey.

You will need to install an extension such as Tampermonkey to install this script.

Aby zainstalować ten skrypt, wymagana jest instalacje jednego z następujących rozszerzeń: Tampermonkey, Violentmonkey.

Aby zainstalować ten skrypt, wymagana będzie instalacja rozszerzenia Tampermonkey lub Userscripts.

You will need to install an extension such as Tampermonkey to install this script.

Aby zainstalować ten skrypt, musisz zainstalować rozszerzenie menedżera skryptów użytkownika.

(Mam już menedżera skryptów użytkownika, pozwól mi to zainstalować!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

Będziesz musiał zainstalować rozszerzenie menedżera stylów użytkownika, aby zainstalować ten styl.

Będziesz musiał zainstalować rozszerzenie menedżera stylów użytkownika, aby zainstalować ten styl.

Musisz zainstalować rozszerzenie menedżera stylów użytkownika, aby zainstalować ten styl.

(Mam już menedżera stylów użytkownika, pozwól mi to zainstalować!)

// ==UserScript==
// @name         HA menu fix
// @namespace    http://tampermonkey.net/
// @version      1.0.1
// @description  Fixes menus and dropdowns that are cut off or unclickable in Home Assistant Web GUI (Web Awesome components bugs).
// @author       BluffingJohn
// @match        *://homeassistant.local/*
// @match        *://homeassistant/*
// @include      *://*:8123/*
// @grant        none
// @run-at       document-idle
// @noframes
// @icon         https://www.google.com/s2/favicons?sz=64&domain=home-assistant.io
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    const finalCSS = `
        /* ABSOLUTE PRIORITY FOR ALL TYPES OF MENUS */
        ha-dropdown[open], .mdc-menu-surface--open, 
        div#menu, [part="menu"], .ha-dropdown-menu, 
        wa-popup[active], ha-dropdown-item { 
            z-index: 2147483647 !important;
            pointer-events: all !important;
            visibility: visible !important;
            display: flex !important;
        }

        /* TABLE AND VIRTUALIZER - Breaking the barriers of cutting/intersecting */
        .mdc-data-table__row, 
        .mdc-data-table__cell, 
        lit-virtualizer {
            overflow: visible !important;
            contain: none !important;
        }

        /* Raise the active row above the others when you interact with it */
        .mdc-data-table__row:focus-within { 
            z-index: 1000 !important; 
        }
    `;

    const applyStyles = (root) => {
        if (!root) return;
        // Inject styles into each new Shadow DOM discovered to fix the 'menu' elements
        if (root instanceof ShadowRoot && !root.querySelector('#ha-fix-final')) {
            const s = document.createElement('style');
            s.id = 'ha-fix-final';
            s.textContent = finalCSS;
            root.appendChild(s);
        }
        const all = root.querySelectorAll?.('*') || [];
        all.forEach(el => { if (el.shadowRoot) applyStyles(el.shadowRoot); });
    };

    // Scan every 1.5 seconds to discover and fix new elements/menus
    setInterval(() => applyStyles(document.body), 1500);

    // Add global style to main elements of the document
    const mainS = document.createElement('style');
    mainS.textContent = finalCSS;
    document.head.appendChild(mainS);
})();