iobroker.eos-admin 7.9.68 → 7.9.69

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/adminWww/assets/bootstrap-COulQZax-v54.js +1 -1
  2. package/adminWww/assets/bootstrap-COulQZax-v55.js +1 -1
  3. package/adminWww/assets/bootstrap-COulQZax-v56.js +1 -1
  4. package/adminWww/assets/bootstrap-COulQZax-v57.js +1 -1
  5. package/adminWww/assets/bootstrap-COulQZax-v58.js +1 -1
  6. package/adminWww/assets/bootstrap-COulQZax-v59.js +1 -1
  7. package/adminWww/assets/bootstrap-COulQZax-v60.js +1 -1
  8. package/adminWww/assets/bootstrap-COulQZax-v61.js +1 -1
  9. package/adminWww/assets/bootstrap-COulQZax-v67.js +1 -1
  10. package/adminWww/assets/bootstrap-COulQZax-v68.js +1 -317
  11. package/adminWww/assets/bootstrap-COulQZax-v69.js +317 -0
  12. package/adminWww/assets/bootstrap-COulQZax.js +1 -1
  13. package/adminWww/assets/index-CQZugZ1z-v55.js +1 -1
  14. package/adminWww/assets/index-CQZugZ1z-v56.js +1 -1
  15. package/adminWww/assets/index-CQZugZ1z-v57.js +1 -1
  16. package/adminWww/assets/index-CQZugZ1z-v58.js +1 -1
  17. package/adminWww/assets/index-CQZugZ1z-v59.js +1 -1
  18. package/adminWww/assets/index-CQZugZ1z-v60.js +1 -2
  19. package/adminWww/assets/index-CQZugZ1z-v61.js +1 -2
  20. package/adminWww/assets/index-CQZugZ1z-v67.js +1 -1
  21. package/adminWww/assets/index-CQZugZ1z-v68.js +1 -2
  22. package/adminWww/assets/index-CQZugZ1z-v69.js +2 -0
  23. package/adminWww/assets/index-CQZugZ1z.js +1 -1
  24. package/adminWww/css/eos-branding.css +3 -141
  25. package/adminWww/index.html +11 -10
  26. package/adminWww/js/eos-branding.js +114 -172
  27. package/adminWww/js/eos-toolbar-ghost-cleanup.js +102 -0
  28. package/io-package.json +5 -5
  29. package/package.json +1 -1
  30. package/tools/nexowatt-validate-package.cjs +14 -19
@@ -1 +1 @@
1
- export * from "./bootstrap-COulQZax-v68.js";
1
+ export * from "./bootstrap-COulQZax-v69.js";
@@ -1 +1 @@
1
- import "./index-CQZugZ1z-v60.js";
1
+ import "./index-CQZugZ1z-v69.js";
@@ -1 +1 @@
1
- import "./index-CQZugZ1z-v60.js";
1
+ import "./index-CQZugZ1z-v69.js";
@@ -1 +1 @@
1
- import "./index-CQZugZ1z-v60.js";
1
+ import "./index-CQZugZ1z-v69.js";
@@ -1 +1 @@
1
- import "./index-CQZugZ1z-v60.js";
1
+ import "./index-CQZugZ1z-v69.js";
@@ -1 +1 @@
1
- import "./index-CQZugZ1z-v60.js";
1
+ import "./index-CQZugZ1z-v69.js";
@@ -1,2 +1 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./bootstrap-COulQZax-v60.js","./DefaultPropsProvider-BiXBMQYQ.js","./_commonjsHelpers-CE1G-McA.js","./iobroker_admin__mf_v__runtimeInit__mf_v__-g2X2zhAf.js","./emotion-serialize.esm-Q4o_CgeF.js","./iobroker_admin__loadShare___mf_0_emotion_mf_1_react__loadShare__-BywLg1Xe.js","./iobroker_admin__loadShare__react__loadShare__-LM7uyL45.js","./ace-DEUjyTIn.js","./iobroker_admin__loadShare___mf_0_iobroker_mf_1_adapter_mf_2_react_mf_2_v5__loadShare__-LFZoiUTt.js","./iobroker_admin__loadShare___mf_0_iobroker_mf_1_json_mf_2_config__loadShare__-CpA7pnS5.js","./iobroker_admin__loadShare__leaflet__loadShare__-CNUAG3AH.js","./ext-language_tools-ylAoucDh.js","./iobroker_admin__loadShare__react_mf_2_dropzone__loadShare__-CwjnV48g.js","./iobroker_admin__loadShare__react_mf_2_dom__loadShare__-CVeAXnkk.js","./preload-helper-BDBacUwf.js","./iobroker_admin__loadShare___mf_0_mui_mf_1_icons_mf_2_material__loadShare__-CJO5yP3h.js","./sdk-C-e-e2gd.js","./extends-CF3RwP-h.js","./assertThisInitialized-B0aQ9eG_.js","./useTheme-Bl-M1DYp.js","./createTheme-DFX8CY6F.js","./blue-CagzI6CQ.js","./index-DcK0RDrH.js","./ThemeProvider-BOFFjWAF.js","./emotion-cache.browser.esm-BgJfNZJN.js","./setYear-3ufv5yRD.js","./en-US-DBFJNIH6.js","./bootstrap-D57bMhRi.css"])))=>i.map(i=>d[i]);
2
- import{_ as c}from"./preload-helper-BDBacUwf.js";import"./iobroker_admin__mf_v__runtimeInit__mf_v__-g2X2zhAf.js";(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const e of document.querySelectorAll('link[rel="modulepreload"]'))s(e);new MutationObserver(e=>{for(const r of e)if(r.type==="childList")for(const o of r.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&s(o)}).observe(document,{childList:!0,subtree:!0});function n(e){const r={};return e.integrity&&(r.integrity=e.integrity),e.referrerPolicy&&(r.referrerPolicy=e.referrerPolicy),e.crossOrigin==="use-credentials"?r.credentials="include":e.crossOrigin==="anonymous"?r.credentials="omit":r.credentials="same-origin",r}function s(e){if(e.ep)return;e.ep=!0;const r=n(e);fetch(e.href,r)}})();c(()=>import("./bootstrap-COulQZax-v60.js").then(i=>i.o),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27]),import.meta.url);
1
+ import "./index-CQZugZ1z-v69.js";
@@ -1,2 +1 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./bootstrap-COulQZax-v61.js","./DefaultPropsProvider-BiXBMQYQ.js","./_commonjsHelpers-CE1G-McA.js","./iobroker_admin__mf_v__runtimeInit__mf_v__-g2X2zhAf.js","./emotion-serialize.esm-Q4o_CgeF.js","./iobroker_admin__loadShare___mf_0_emotion_mf_1_react__loadShare__-BywLg1Xe.js","./iobroker_admin__loadShare__react__loadShare__-LM7uyL45.js","./ace-DEUjyTIn.js","./iobroker_admin__loadShare___mf_0_iobroker_mf_1_adapter_mf_2_react_mf_2_v5__loadShare__-LFZoiUTt.js","./iobroker_admin__loadShare___mf_0_iobroker_mf_1_json_mf_2_config__loadShare__-CpA7pnS5.js","./iobroker_admin__loadShare__leaflet__loadShare__-CNUAG3AH.js","./ext-language_tools-ylAoucDh.js","./iobroker_admin__loadShare__react_mf_2_dropzone__loadShare__-CwjnV48g.js","./iobroker_admin__loadShare__react_mf_2_dom__loadShare__-CVeAXnkk.js","./preload-helper-BDBacUwf.js","./iobroker_admin__loadShare___mf_0_mui_mf_1_icons_mf_2_material__loadShare__-CJO5yP3h.js","./sdk-C-e-e2gd.js","./extends-CF3RwP-h.js","./assertThisInitialized-B0aQ9eG_.js","./useTheme-Bl-M1DYp.js","./createTheme-DFX8CY6F.js","./blue-CagzI6CQ.js","./index-DcK0RDrH.js","./ThemeProvider-BOFFjWAF.js","./emotion-cache.browser.esm-BgJfNZJN.js","./setYear-3ufv5yRD.js","./en-US-DBFJNIH6.js","./bootstrap-D57bMhRi.css"])))=>i.map(i=>d[i]);
2
- import{_ as c}from"./preload-helper-BDBacUwf.js";import"./iobroker_admin__mf_v__runtimeInit__mf_v__-g2X2zhAf.js";(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const e of document.querySelectorAll('link[rel="modulepreload"]'))s(e);new MutationObserver(e=>{for(const r of e)if(r.type==="childList")for(const o of r.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&s(o)}).observe(document,{childList:!0,subtree:!0});function n(e){const r={};return e.integrity&&(r.integrity=e.integrity),e.referrerPolicy&&(r.referrerPolicy=e.referrerPolicy),e.crossOrigin==="use-credentials"?r.credentials="include":e.crossOrigin==="anonymous"?r.credentials="omit":r.credentials="same-origin",r}function s(e){if(e.ep)return;e.ep=!0;const r=n(e);fetch(e.href,r)}})();c(()=>import("./bootstrap-COulQZax-v61.js").then(i=>i.o),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27]),import.meta.url);
1
+ import "./index-CQZugZ1z-v69.js";
@@ -1 +1 @@
1
- import "./index-CQZugZ1z-v68.js";
1
+ import "./index-CQZugZ1z-v69.js";
@@ -1,2 +1 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./bootstrap-COulQZax-v68.js","./DefaultPropsProvider-BiXBMQYQ.js","./_commonjsHelpers-CE1G-McA.js","./iobroker_admin__mf_v__runtimeInit__mf_v__-g2X2zhAf.js","./emotion-serialize.esm-Q4o_CgeF.js","./iobroker_admin__loadShare___mf_0_emotion_mf_1_react__loadShare__-BywLg1Xe.js","./iobroker_admin__loadShare__react__loadShare__-LM7uyL45.js","./ace-DEUjyTIn.js","./iobroker_admin__loadShare___mf_0_iobroker_mf_1_adapter_mf_2_react_mf_2_v5__loadShare__-LFZoiUTt.js","./iobroker_admin__loadShare___mf_0_iobroker_mf_1_json_mf_2_config__loadShare__-CpA7pnS5.js","./iobroker_admin__loadShare__leaflet__loadShare__-CNUAG3AH.js","./ext-language_tools-ylAoucDh.js","./iobroker_admin__loadShare__react_mf_2_dropzone__loadShare__-CwjnV48g.js","./iobroker_admin__loadShare__react_mf_2_dom__loadShare__-CVeAXnkk.js","./preload-helper-BDBacUwf.js","./iobroker_admin__loadShare___mf_0_mui_mf_1_icons_mf_2_material__loadShare__-CJO5yP3h.js","./sdk-C-e-e2gd.js","./extends-CF3RwP-h.js","./assertThisInitialized-B0aQ9eG_.js","./useTheme-Bl-M1DYp.js","./createTheme-DFX8CY6F.js","./blue-CagzI6CQ.js","./index-DcK0RDrH.js","./ThemeProvider-BOFFjWAF.js","./emotion-cache.browser.esm-BgJfNZJN.js","./setYear-3ufv5yRD.js","./en-US-DBFJNIH6.js","./bootstrap-D57bMhRi.css"])))=>i.map(i=>d[i]);
2
- import{_ as c}from"./preload-helper-BDBacUwf.js";import"./iobroker_admin__mf_v__runtimeInit__mf_v__-g2X2zhAf.js";(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const e of document.querySelectorAll('link[rel="modulepreload"]'))s(e);new MutationObserver(e=>{for(const r of e)if(r.type==="childList")for(const o of r.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&s(o)}).observe(document,{childList:!0,subtree:!0});function n(e){const r={};return e.integrity&&(r.integrity=e.integrity),e.referrerPolicy&&(r.referrerPolicy=e.referrerPolicy),e.crossOrigin==="use-credentials"?r.credentials="include":e.crossOrigin==="anonymous"?r.credentials="omit":r.credentials="same-origin",r}function s(e){if(e.ep)return;e.ep=!0;const r=n(e);fetch(e.href,r)}})();c(()=>import("./bootstrap-COulQZax-v68.js").then(i=>i.o),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27]),import.meta.url);
1
+ import "./index-CQZugZ1z-v69.js";
@@ -0,0 +1,2 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./bootstrap-COulQZax-v69.js","./DefaultPropsProvider-BiXBMQYQ.js","./_commonjsHelpers-CE1G-McA.js","./iobroker_admin__mf_v__runtimeInit__mf_v__-g2X2zhAf.js","./emotion-serialize.esm-Q4o_CgeF.js","./iobroker_admin__loadShare___mf_0_emotion_mf_1_react__loadShare__-BywLg1Xe.js","./iobroker_admin__loadShare__react__loadShare__-LM7uyL45.js","./ace-DEUjyTIn.js","./iobroker_admin__loadShare___mf_0_iobroker_mf_1_adapter_mf_2_react_mf_2_v5__loadShare__-LFZoiUTt.js","./iobroker_admin__loadShare___mf_0_iobroker_mf_1_json_mf_2_config__loadShare__-CpA7pnS5.js","./iobroker_admin__loadShare__leaflet__loadShare__-CNUAG3AH.js","./ext-language_tools-ylAoucDh.js","./iobroker_admin__loadShare__react_mf_2_dropzone__loadShare__-CwjnV48g.js","./iobroker_admin__loadShare__react_mf_2_dom__loadShare__-CVeAXnkk.js","./preload-helper-BDBacUwf.js","./iobroker_admin__loadShare___mf_0_mui_mf_1_icons_mf_2_material__loadShare__-CJO5yP3h.js","./sdk-C-e-e2gd.js","./extends-CF3RwP-h.js","./assertThisInitialized-B0aQ9eG_.js","./useTheme-Bl-M1DYp.js","./createTheme-DFX8CY6F.js","./blue-CagzI6CQ.js","./index-DcK0RDrH.js","./ThemeProvider-BOFFjWAF.js","./emotion-cache.browser.esm-BgJfNZJN.js","./setYear-3ufv5yRD.js","./en-US-DBFJNIH6.js","./bootstrap-D57bMhRi.css"])))=>i.map(i=>d[i]);
2
+ import{_ as c}from"./preload-helper-BDBacUwf.js";import"./iobroker_admin__mf_v__runtimeInit__mf_v__-g2X2zhAf.js";(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const e of document.querySelectorAll('link[rel="modulepreload"]'))s(e);new MutationObserver(e=>{for(const r of e)if(r.type==="childList")for(const o of r.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&s(o)}).observe(document,{childList:!0,subtree:!0});function n(e){const r={};return e.integrity&&(r.integrity=e.integrity),e.referrerPolicy&&(r.referrerPolicy=e.referrerPolicy),e.crossOrigin==="use-credentials"?r.credentials="include":e.crossOrigin==="anonymous"?r.credentials="omit":r.credentials="same-origin",r}function s(e){if(e.ep)return;e.ep=!0;const r=n(e);fetch(e.href,r)}})();c(()=>import("./bootstrap-COulQZax-v69.js").then(i=>i.o),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27]),import.meta.url);
@@ -1 +1 @@
1
- import "./index-CQZugZ1z-v60.js";
1
+ import "./index-CQZugZ1z-v69.js";
@@ -3817,11 +3817,9 @@ html.eos-route-adapters .MuiModal-root [role="listbox"] {
3817
3817
  }
3818
3818
 
3819
3819
 
3820
- /* === NexoWatt EOS v7.9.64: remove stray top-left ghost toggle =====
3821
- The floating compact-nav tile in the top-left corner must not be shown.
3822
- Keep the main EOS header and the regular round back/collapse control only. */
3823
- html.eos-app .eos-native-drawer-header,
3824
- html.eos-app .eos-native-drawer-header > div:first-child {
3820
+ /* === NexoWatt EOS v7.9.69: exact v57 header baseline + narrow fallback === */
3821
+ html.eos-app .eos-small-top-left-native-tab-hidden,
3822
+ html.eos-app [aria-hidden="true"].eos-small-top-left-native-tab-hidden {
3825
3823
  display: none !important;
3826
3824
  visibility: hidden !important;
3827
3825
  opacity: 0 !important;
@@ -3838,140 +3836,4 @@ html.eos-app .eos-native-drawer-header > div:first-child {
3838
3836
  flex: 0 0 0 !important;
3839
3837
  border: 0 !important;
3840
3838
  box-shadow: none !important;
3841
- background: transparent !important;
3842
- }
3843
-
3844
-
3845
- /* === NexoWatt EOS v7.9.64: final native drawer header guard ============== */
3846
- html.eos-app .eos-native-drawer-header-hidden {
3847
- display: none !important;
3848
- visibility: hidden !important;
3849
- opacity: 0 !important;
3850
- pointer-events: none !important;
3851
- width: 0 !important;
3852
- min-width: 0 !important;
3853
- max-width: 0 !important;
3854
- height: 0 !important;
3855
- min-height: 0 !important;
3856
- max-height: 0 !important;
3857
- margin: 0 !important;
3858
- padding: 0 !important;
3859
- overflow: hidden !important;
3860
- flex: 0 0 0 !important;
3861
- border: 0 !important;
3862
- box-shadow: none !important;
3863
- background: transparent !important;
3864
- }
3865
-
3866
-
3867
- /* === NexoWatt EOS v7.9.65: native desktop drawer-header hard remove ======
3868
- The upstream drawer identity block contains a /#easy link plus the chevron
3869
- button. It is redundant in the EOS horizontal shell and caused the small
3870
- floating NexoWatt tab above the real header. Target the actual structure,
3871
- not only a class that JavaScript may assign too late. */
3872
- body:has(#app-paper) .MuiDrawer-paper > *:has(a[href="/#easy"]):has(button),
3873
- body:has(#app-paper) .MuiDrawer-paper > *:has(a[href$="#easy"]):has(.MuiIconButton-root),
3874
- body:has(#app-paper) .MuiSwipeableDrawer-paper > *:has(a[href="/#easy"]):has(button),
3875
- html.eos-app [data-eos-native-drawer-header-hidden="true"] {
3876
- display: none !important;
3877
- visibility: hidden !important;
3878
- opacity: 0 !important;
3879
- pointer-events: none !important;
3880
- width: 0 !important;
3881
- min-width: 0 !important;
3882
- max-width: 0 !important;
3883
- height: 0 !important;
3884
- min-height: 0 !important;
3885
- max-height: 0 !important;
3886
- margin: 0 !important;
3887
- padding: 0 !important;
3888
- overflow: hidden !important;
3889
- flex: 0 0 0 !important;
3890
- border: 0 !important;
3891
- box-shadow: none !important;
3892
- background: transparent !important;
3893
- }
3894
-
3895
-
3896
- /* === NexoWatt EOS v7.9.67: restore primary brand, remove only ghost tab ===
3897
- Keep the large NexoWatt EOS / Energy Operation System card. Hide only the
3898
- short native NexoWatt+arrow block that is redundant in the EOS shell. */
3899
- html.eos-app .eos-top-toolbar > .eos-brand-badge,
3900
- html.eos-app .eos-top-toolbar > .eos-primary-brand,
3901
- html.eos-app [data-eos-primary-brand="true"] {
3902
- display: grid !important;
3903
- visibility: visible !important;
3904
- opacity: 1 !important;
3905
- pointer-events: auto !important;
3906
- overflow: visible !important;
3907
- flex: 0 0 auto !important;
3908
- }
3909
-
3910
- html.eos-app .eos-native-top-left-ghost-hidden,
3911
- html.eos-app [data-eos-native-top-left-ghost="true"] {
3912
- display: none !important;
3913
- visibility: hidden !important;
3914
- opacity: 0 !important;
3915
- pointer-events: none !important;
3916
- width: 0 !important;
3917
- min-width: 0 !important;
3918
- max-width: 0 !important;
3919
- height: 0 !important;
3920
- min-height: 0 !important;
3921
- max-height: 0 !important;
3922
- margin: 0 !important;
3923
- padding: 0 !important;
3924
- overflow: hidden !important;
3925
- flex: 0 0 0 !important;
3926
- border: 0 !important;
3927
- box-shadow: none !important;
3928
- }
3929
-
3930
- @media (min-width: 901px) {
3931
- /* Exact upstream Drawer.getHeader fingerprint. This rule never targets the
3932
- primary .eos-brand-badge in the AppBar. */
3933
- html.eos-app .MuiDrawer-paper > *:not(.MuiList-root):has(a[href*="#easy"]):has(button),
3934
- html.eos-app .MuiSwipeableDrawer-paper > *:not(.MuiList-root):has(a[href*="#easy"]):has(.MuiIconButton-root) {
3935
- display: none !important;
3936
- visibility: hidden !important;
3937
- opacity: 0 !important;
3938
- pointer-events: none !important;
3939
- width: 0 !important;
3940
- min-width: 0 !important;
3941
- max-width: 0 !important;
3942
- height: 0 !important;
3943
- min-height: 0 !important;
3944
- max-height: 0 !important;
3945
- margin: 0 !important;
3946
- padding: 0 !important;
3947
- overflow: hidden !important;
3948
- flex: 0 0 0 !important;
3949
- }
3950
- }
3951
-
3952
-
3953
- /* === NexoWatt EOS v7.9.68: exact native desktop toolbar ghost removal ===
3954
- The unwanted pill consists of two independent App.renderToolbar siblings:
3955
- the native MenuIcon button and the compact /#easy identity block. The large
3956
- .eos-primary-brand is deliberately excluded and remains visible. */
3957
- @media (min-width: 901px) {
3958
- html.eos-app .eos-top-toolbar > button:has(svg[data-testid="MenuIcon"]),
3959
- html.eos-app .eos-top-toolbar > .MuiIconButton-root:has(svg[data-testid="MenuIcon"]),
3960
- html.eos-app .eos-top-toolbar > *:not(.eos-brand-badge):not(.eos-primary-brand):has(a[href="/#easy"]),
3961
- html.eos-app .eos-top-toolbar > *:not(.eos-brand-badge):not(.eos-primary-brand):has(a[href$="#easy"]) {
3962
- display: none !important;
3963
- visibility: hidden !important;
3964
- opacity: 0 !important;
3965
- pointer-events: none !important;
3966
- width: 0 !important;
3967
- min-width: 0 !important;
3968
- max-width: 0 !important;
3969
- height: 0 !important;
3970
- min-height: 0 !important;
3971
- max-height: 0 !important;
3972
- flex: 0 0 0 !important;
3973
- margin: 0 !important;
3974
- padding: 0 !important;
3975
- overflow: hidden !important;
3976
- }
3977
3839
  }
@@ -4,8 +4,8 @@
4
4
  translate="no"
5
5
  >
6
6
  <head>
7
- <script src="./js/eos-console-quiet.js?v=68"></script>
8
- <script type="module" src="./assets/hostInit-v61.js?v=68"></script>
7
+ <script src="./js/eos-console-quiet.js?v=69"></script>
8
+ <script type="module" src="./assets/hostInit-v61.js?v=69"></script>
9
9
 
10
10
  <meta charset="utf-8" />
11
11
  <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
@@ -35,7 +35,7 @@
35
35
  rel="stylesheet"
36
36
  href="css/leaflet.css"
37
37
  />
38
- <link rel="stylesheet" href="./css/eos-branding.css?v=68" />
38
+ <link rel="stylesheet" href="./css/eos-branding.css?v=69" />
39
39
  <link
40
40
  rel="manifest"
41
41
  href="manifest.json"
@@ -155,15 +155,16 @@
155
155
  false,
156
156
  );
157
157
  </script>
158
- <script type="module" crossorigin src="./assets/index-CQZugZ1z-v68.js?v=68"></script>
158
+ <script type="module" crossorigin src="./assets/index-CQZugZ1z-v69.js?v=69"></script>
159
159
  <link rel="modulepreload" crossorigin href="./assets/preload-helper-BDBacUwf.js">
160
160
  <link rel="modulepreload" crossorigin href="./assets/iobroker_admin__mf_v__runtimeInit__mf_v__-g2X2zhAf.js">
161
- <script defer src="./js/eos-branding.js?v=68"></script>
162
- <script defer src="./js/eos-adapter-surface-cleanup.js?v=68"></script>
163
- <script defer src="./js/eos-security-ui.js?v=68"></script>
164
- <script defer src="./js/eos-role-ui.js?v=68"></script>
165
- <script defer src="./js/eos-assistant.js?v=68"></script>
166
- <script defer src="./js/eos-objects-state-tools.js?v=68"></script>
161
+ <script defer src="./js/eos-branding.js?v=69"></script>
162
+ <script defer src="./js/eos-toolbar-ghost-cleanup.js?v=69"></script>
163
+ <script defer src="./js/eos-adapter-surface-cleanup.js?v=69"></script>
164
+ <script defer src="./js/eos-security-ui.js?v=69"></script>
165
+ <script defer src="./js/eos-role-ui.js?v=69"></script>
166
+ <script defer src="./js/eos-assistant.js?v=69"></script>
167
+ <script defer src="./js/eos-objects-state-tools.js?v=69"></script>
167
168
  </head>
168
169
  <body>
169
170
  <noscript>You need to enable JavaScript to run this app.</noscript>
@@ -1,7 +1,7 @@
1
1
  (() => {
2
2
  'use strict';
3
3
 
4
- window.NEXOWATT_EOS_UI_VERSION = 'v68-exact-native-toolbar-ghost-remove';
4
+ window.NEXOWATT_EOS_UI_VERSION = 'v69-v57-header-baseline-restore';
5
5
 
6
6
  const BRAND = 'NexoWatt EOS';
7
7
  const EOS_MEANING = 'Energy Operation System';
@@ -771,29 +771,14 @@
771
771
  document.querySelectorAll('.eos-brand-badge').forEach(existing => {
772
772
  if (!toolbar.contains(existing)) existing.remove();
773
773
  });
774
-
775
- let badge = toolbar.querySelector(':scope > .eos-brand-badge') || toolbar.querySelector('.eos-brand-badge');
774
+ let badge = toolbar.querySelector('.eos-brand-badge');
776
775
  if (!badge) {
777
776
  badge = document.createElement('span');
778
- badge.className = 'eos-brand-badge eos-system-brand eos-primary-brand';
779
- }
780
-
781
- // Never use a nested button as insertBefore reference. App.renderToolbar()
782
- // can omit the desktop MenuIcon, in which case querySelector('button')
783
- // points into a child wrapper and insertBefore throws a NotFoundError.
784
- if (badge.parentElement !== toolbar || toolbar.firstElementChild !== badge) {
785
- toolbar.insertBefore(badge, toolbar.firstElementChild || null);
777
+ badge.className = 'eos-brand-badge eos-system-brand';
778
+ const firstButton = toolbar.querySelector('button');
779
+ toolbar.insertBefore(badge, firstButton || toolbar.firstChild || null);
786
780
  }
787
-
788
- badge.classList.add('eos-system-brand', 'eos-primary-brand');
789
- badge.dataset.eosPrimaryBrand = 'true';
790
- badge.removeAttribute('hidden');
791
- badge.removeAttribute('aria-hidden');
792
- badge.removeAttribute('inert');
793
- badge.style.removeProperty('display');
794
- badge.style.removeProperty('visibility');
795
- badge.style.removeProperty('opacity');
796
- badge.style.removeProperty('pointer-events');
781
+ badge.classList.add('eos-system-brand');
797
782
  badge.innerHTML = `
798
783
  <span class="eos-brand-badge-mark"><img class="eos-brand-badge-logo" src="${LOGO}" alt="${BRAND}" /></span>
799
784
  <span class="eos-brand-badge-copy"><strong>${BRAND}</strong><small>${EOS_MEANING}</small></span>
@@ -801,96 +786,6 @@
801
786
  `;
802
787
  };
803
788
 
804
- const hideNativeTopLeftGhost = element => safe(() => {
805
- if (!element) return;
806
- if (
807
- element.matches?.('.eos-brand-badge, .eos-primary-brand') ||
808
- element.closest?.('.eos-brand-badge, .eos-primary-brand') ||
809
- element.querySelector?.('.eos-brand-badge, .eos-primary-brand')
810
- ) return;
811
-
812
- const text = normalize(element.textContent || '');
813
- // The wanted primary card contains the full product name and subtitle.
814
- // The unwanted native tab contains only the short NexoWatt identity.
815
- if (/energy operation system|nexowatt eos/.test(text)) return;
816
-
817
- element.classList.add('eos-native-top-left-ghost-hidden');
818
- element.dataset.eosNativeTopLeftGhost = 'true';
819
- element.setAttribute('aria-hidden', 'true');
820
- element.setAttribute('inert', '');
821
- element.querySelectorAll?.('button, a, [role="button"], input, select, textarea').forEach(control => {
822
- control.setAttribute('tabindex', '-1');
823
- control.setAttribute('aria-hidden', 'true');
824
- });
825
- if (element.style) {
826
- for (const name of [
827
- 'display', 'visibility', 'opacity', 'pointer-events',
828
- 'width', 'min-width', 'max-width', 'height', 'min-height', 'max-height',
829
- 'margin', 'padding', 'overflow', 'flex', 'border', 'box-shadow',
830
- ]) {
831
- const value = name === 'display' ? 'none'
832
- : name === 'visibility' ? 'hidden'
833
- : name === 'opacity' ? '0'
834
- : name === 'pointer-events' ? 'none'
835
- : name === 'overflow' ? 'hidden'
836
- : name === 'flex' ? '0 0 0'
837
- : name === 'border' || name === 'box-shadow' ? 'none'
838
- : '0';
839
- element.style.setProperty(name, value, 'important');
840
- }
841
- }
842
- });
843
-
844
- const removeNativeTopLeftGhost = () => safe(() => {
845
- if (!window.matchMedia('(min-width: 901px)').matches) return;
846
-
847
- // Exact source of the unwanted pill in App.renderToolbar(): two sibling
848
- // controls are visually combined by the EOS header CSS. Remove them
849
- // independently; never touch the primary .eos-brand-badge.
850
- const toolbar = document.querySelector(
851
- '#root > .MuiPaper-root > .MuiAppBar-root .MuiToolbar-root, header .MuiToolbar-root, .MuiAppBar-root .MuiToolbar-root',
852
- );
853
- if (toolbar) {
854
- Array.from(toolbar.children || []).forEach(child => {
855
- if (!child?.querySelector) return;
856
- if (
857
- child.matches?.('.eos-brand-badge, .eos-primary-brand') ||
858
- child.querySelector?.('.eos-brand-badge, .eos-primary-brand')
859
- ) return;
860
-
861
- // Native compact identity block: contains /#easy and the short
862
- // NexoWatt image. It is a separate sibling from the menu button.
863
- if (child.querySelector('a[href="/#easy"], a[href$="#easy"], a[href*="/#easy"]')) {
864
- hideNativeTopLeftGhost(child);
865
- return;
866
- }
867
-
868
- // Native desktop MenuIcon button. MUI exposes data-testid in
869
- // normal builds; the SVG path check is a fallback for stripped builds.
870
- const menuIcon = child.querySelector('svg[data-testid="MenuIcon"]');
871
- const menuPath = child.querySelector('svg path')?.getAttribute?.('d') || '';
872
- const isMenuPath = /M3\s*18h18v-?2H3v2|M3\s*6h18v2H3z/.test(menuPath.replace(/,/g, ' '));
873
- if ((child.matches('button, .MuiIconButton-root') || child.querySelector('button, .MuiIconButton-root')) && (menuIcon || isMenuPath)) {
874
- hideNativeTopLeftGhost(child);
875
- }
876
- });
877
- }
878
-
879
- // Compatibility fallback for an old cached Drawer.getHeader() DOM.
880
- document.querySelectorAll('.MuiDrawer-paper, .MuiSwipeableDrawer-paper').forEach(drawer => {
881
- Array.from(drawer.children || []).forEach(child => {
882
- if (!child?.querySelector) return;
883
- const hasEasyLink = !!child.querySelector('a[href="/#easy"], a[href$="#easy"], a[href*="/#easy"]');
884
- const hasChevron = !!child.querySelector('svg[data-testid="ChevronLeftIcon"], svg[data-testid="ChevronRightIcon"]');
885
- const isNavigationList = child.classList?.contains('MuiList-root') || !!child.querySelector('.MuiListItemButton-root');
886
- if (hasEasyLink && hasChevron && !isNavigationList) hideNativeTopLeftGhost(child);
887
- });
888
- });
889
-
890
- // Restore/verify the wanted large EOS identity after cleanup.
891
- if (toolbar) ensureBrandBadge(toolbar);
892
- });
893
-
894
789
  const ensureLogoutButton = () => {
895
790
  // v14: the custom EOS logout button remains disabled/removed.
896
791
  // The visible native logout menu item is hidden too because it caused broken redirects.
@@ -925,39 +820,6 @@
925
820
  });
926
821
  });
927
822
 
928
- const hideNativeDrawerHeaderElement = header => safe(() => {
929
- if (!header || header.closest?.('.eos-brand-badge, .eos-top-toolbar')) return;
930
- header.classList.add(
931
- 'eos-native-drawer-header',
932
- 'eos-nav-toggle-shell',
933
- 'eos-native-drawer-header-hidden',
934
- );
935
- header.dataset.eosNativeDrawerHeaderHidden = 'true';
936
- header.setAttribute('aria-hidden', 'true');
937
- header.setAttribute('inert', '');
938
- header.querySelectorAll('button, a, [role="button"], input, select, textarea').forEach(control => {
939
- control.setAttribute('tabindex', '-1');
940
- control.setAttribute('aria-hidden', 'true');
941
- });
942
- if (header.style) {
943
- header.style.setProperty('display', 'none', 'important');
944
- header.style.setProperty('visibility', 'hidden', 'important');
945
- header.style.setProperty('opacity', '0', 'important');
946
- header.style.setProperty('pointer-events', 'none', 'important');
947
- header.style.setProperty('width', '0', 'important');
948
- header.style.setProperty('height', '0', 'important');
949
- header.style.setProperty('overflow', 'hidden', 'important');
950
- header.style.setProperty('margin', '0', 'important');
951
- header.style.setProperty('padding', '0', 'important');
952
- }
953
- });
954
-
955
- const getDirectDrawerChild = (drawer, node) => {
956
- let current = node;
957
- while (current?.parentElement && current.parentElement !== drawer) current = current.parentElement;
958
- return current?.parentElement === drawer ? current : null;
959
- };
960
-
961
823
  const patchDrawerHeader = drawer => safe(() => {
962
824
  if (!drawer) return;
963
825
  drawer.classList.add('eos-drawer');
@@ -965,27 +827,50 @@
965
827
 
966
828
  const directChildren = Array.from(drawer.children).filter(el => el.nodeType === 1);
967
829
  const isListLike = el => el.classList?.contains('MuiList-root') || el.querySelector?.('.MuiListItemButton-root');
968
-
969
- // Exact upstream Drawer.getHeader() fingerprint: its identity link points to /#easy
970
- // and the same direct drawer child contains the native chevron IconButton.
971
- const easyLink = drawer.querySelector('a[href="/#easy"], a[href$="#easy"], a[href*="/#easy"]');
972
- let header = getDirectDrawerChild(drawer, easyLink);
973
-
974
- if (!header || !header.querySelector?.('button, .MuiIconButton-root, [role="button"]')) {
975
- header = drawer.querySelector(':scope > .eos-native-drawer-header');
976
- }
830
+ let header = drawer.querySelector(':scope > .eos-native-drawer-header');
977
831
  if (!header) {
978
- header = directChildren.find(el => {
979
- if (isListLike(el) || !el.querySelector) return false;
980
- const hasToggle = !!el.querySelector('button, .MuiIconButton-root, [role="button"]');
981
- const hasEasyLink = !!el.querySelector('a[href="/#easy"], a[href$="#easy"], a[href*="/#easy"]');
982
- const hasIdentity = !!el.querySelector('img, .MuiAvatar-root, a')
983
- || /nexowatt|iobroker|energy operation system/i.test(String(el.textContent || ''));
984
- return hasToggle && (hasEasyLink || hasIdentity);
832
+ header = directChildren.find(el => !isListLike(el) && el.querySelector && el.querySelector('button') && (el.querySelector('img') || el.querySelector('.MuiAvatar-root') || el.querySelector('a')))
833
+ || directChildren.find(el => !isListLike(el) && el.querySelector && (el.querySelector('button') || el.querySelector('img') || el.querySelector('.MuiAvatar-root')));
834
+ }
835
+ if (header) {
836
+ header.classList.add('eos-native-drawer-header', 'eos-nav-toggle-shell');
837
+ const toggleButton = header.querySelector('button, .MuiIconButton-root, [role="button"]');
838
+ if (toggleButton && !toggleButton.dataset.eosNavCompactToggle) {
839
+ toggleButton.dataset.eosNavCompactToggle = 'true';
840
+ toggleButton.classList.add('eos-nav-compact-toggle');
841
+ toggleButton.setAttribute('title', 'Navigation kompakt/normal umschalten');
842
+ toggleButton.setAttribute('aria-label', 'Navigation kompakt/normal umschalten');
843
+ const toggleCompact = event => {
844
+ event.preventDefault();
845
+ event.stopPropagation();
846
+ if (event.stopImmediatePropagation) event.stopImmediatePropagation();
847
+ const compact = !document.documentElement.classList.contains('eos-nav-compact');
848
+ document.documentElement.classList.toggle('eos-nav-compact', compact);
849
+ safe(() => localStorage.setItem('nexowatt:eosNavCompact', compact ? '1' : '0'));
850
+ toggleButton.setAttribute('aria-pressed', compact ? 'true' : 'false');
851
+ };
852
+ toggleButton.addEventListener('click', toggleCompact, true);
853
+ toggleButton.addEventListener('keydown', event => {
854
+ if (event.key === 'Enter' || event.key === ' ') toggleCompact(event);
855
+ }, true);
856
+ }
857
+ header.querySelectorAll('a,img,.MuiAvatar-root,.MuiAvatar-img,.eos-native-title').forEach(el => {
858
+ if (!el.closest?.('button')) el.classList.add('eos-nav-toggle-decor-hidden');
985
859
  });
860
+ const img = header.querySelector('img');
861
+ if (img) patchImage(img);
862
+ const avatarImg = header.querySelector('.MuiAvatar-img');
863
+ if (avatarImg) patchImage(avatarImg);
864
+ const logoArea = header.querySelector('a')?.parentElement || header.firstElementChild || header;
865
+ if (logoArea && !logoArea.querySelector('.eos-native-title')) {
866
+ const title = document.createElement('span');
867
+ title.className = 'eos-native-title';
868
+ title.innerHTML = `<strong>${BRAND}</strong><small>${EOS_MEANING}</small>`;
869
+ const link = logoArea.querySelector('a');
870
+ if (link && link.nextSibling) logoArea.insertBefore(title, link.nextSibling);
871
+ else logoArea.appendChild(title);
872
+ }
986
873
  }
987
- if (header) hideNativeDrawerHeaderElement(header);
988
-
989
874
  const list = drawer.querySelector('.MuiList-root');
990
875
  if (list) {
991
876
  list.classList.add('eos-scroll-nav');
@@ -993,15 +878,72 @@
993
878
  }
994
879
  });
995
880
 
996
- const removeStrayNativeDrawerHeaders = () => safe(() => {
997
- document.querySelectorAll('.MuiDrawer-paper, .MuiSwipeableDrawer-paper').forEach(drawer => {
998
- patchDrawerHeader(drawer);
999
- drawer.querySelectorAll('a[href="/#easy"], a[href$="#easy"], a[href*="/#easy"]').forEach(link => {
1000
- const directChild = getDirectDrawerChild(drawer, link);
1001
- if (directChild?.querySelector?.('button, .MuiIconButton-root, [role="button"]')) {
1002
- hideNativeDrawerHeaderElement(directChild);
1003
- }
881
+
882
+ const removeSmallTopLeftNativeNexoWattTab = () => safe(() => {
883
+ if (!window.matchMedia?.('(min-width: 901px)').matches) return;
884
+
885
+ const primary = document.querySelector('.eos-brand-badge, .eos-primary-brand');
886
+ const isPrimary = element => !!element && (
887
+ element === primary ||
888
+ element.matches?.('.eos-brand-badge, .eos-primary-brand') ||
889
+ element.closest?.('.eos-brand-badge, .eos-primary-brand') ||
890
+ element.querySelector?.('.eos-brand-badge, .eos-primary-brand')
891
+ );
892
+ const hasShortNexoWattIdentity = element => {
893
+ if (!element || isPrimary(element)) return false;
894
+ const text = normalize(element.textContent || '');
895
+ if (/energy operation system|nexowatt eos/.test(text)) return false;
896
+ const image = element.querySelector?.('img, .MuiAvatar-img, .MuiAvatar-root');
897
+ const imageText = normalize(`${image?.getAttribute?.('alt') || ''} ${image?.getAttribute?.('src') || ''}`);
898
+ return /nexowatt/.test(text) || /nexowatt/.test(imageText);
899
+ };
900
+ const hide = element => {
901
+ if (!element || isPrimary(element)) return;
902
+ element.classList.add('eos-small-top-left-native-tab-hidden');
903
+ element.setAttribute('aria-hidden', 'true');
904
+ element.setAttribute('inert', '');
905
+ element.querySelectorAll?.('button, a, [role="button"]').forEach(control => {
906
+ control.setAttribute('tabindex', '-1');
907
+ control.setAttribute('aria-hidden', 'true');
1004
908
  });
909
+ if (element.style) {
910
+ for (const [name, value] of Object.entries({
911
+ display: 'none', visibility: 'hidden', opacity: '0', pointerEvents: 'none',
912
+ width: '0', minWidth: '0', maxWidth: '0', height: '0', minHeight: '0', maxHeight: '0',
913
+ margin: '0', padding: '0', overflow: 'hidden', flex: '0 0 0', border: '0', boxShadow: 'none',
914
+ })) element.style.setProperty(name.replace(/[A-Z]/g, char => `-${char.toLowerCase()}`), value, 'important');
915
+ }
916
+ };
917
+
918
+ const inspect = seed => {
919
+ if (!seed || isPrimary(seed)) return;
920
+ let element = seed.nodeType === 1 ? seed : seed.parentElement;
921
+ let best = null;
922
+ while (element && element !== document.body && element !== document.documentElement) {
923
+ if (isPrimary(element)) return;
924
+ const rect = element.getBoundingClientRect?.();
925
+ if (rect && rect.top >= -4 && rect.top <= 52 && rect.left >= -4 && rect.left <= 185 &&
926
+ rect.width >= 45 && rect.width <= 190 && rect.height >= 16 && rect.height <= 58 &&
927
+ hasShortNexoWattIdentity(element)) {
928
+ best = element;
929
+ }
930
+ if (rect && (rect.width > 220 || rect.height > 75 || rect.left > 200 || rect.top > 70)) break;
931
+ element = element.parentElement;
932
+ }
933
+ if (best) hide(best);
934
+ };
935
+
936
+ // Known native locations plus a coordinate fallback matching the compact tab.
937
+ document.querySelectorAll([
938
+ '.MuiDrawer-paper a[href*="#easy"]',
939
+ '.MuiSwipeableDrawer-paper a[href*="#easy"]',
940
+ '.MuiAppBar-root a[href*="#easy"]',
941
+ '.MuiToolbar-root a[href*="#easy"]',
942
+ 'img[alt*="NexoWatt" i]',
943
+ 'img[src*="nexowatt" i]',
944
+ ].join(',')).forEach(inspect);
945
+ [[8, 18], [45, 22], [90, 22], [135, 22], [80, 36]].forEach(([x, y]) => {
946
+ document.elementsFromPoint?.(x, y).forEach(inspect);
1005
947
  });
1006
948
  });
1007
949
 
@@ -1020,8 +962,8 @@
1020
962
  toolbar.classList.add('eos-top-toolbar');
1021
963
  ensureBrandBadge(toolbar);
1022
964
  }
1023
- removeNativeTopLeftGhost();
1024
- removeStrayNativeDrawerHeaders();
965
+ document.querySelectorAll('.MuiDrawer-paper, .MuiSwipeableDrawer-paper').forEach(patchDrawerHeader);
966
+ removeSmallTopLeftNativeNexoWattTab();
1025
967
  hideNativeLogoutNav();
1026
968
  releaseNotificationControls();
1027
969
  ensurePopupCompatibility();