iobroker.eos-admin 7.9.67 → 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 -2
  2. package/adminWww/assets/bootstrap-COulQZax-v55.js +1 -2
  3. package/adminWww/assets/bootstrap-COulQZax-v56.js +1 -2
  4. package/adminWww/assets/bootstrap-COulQZax-v57.js +1 -2
  5. package/adminWww/assets/bootstrap-COulQZax-v58.js +1 -2
  6. package/adminWww/assets/bootstrap-COulQZax-v59.js +1 -2
  7. package/adminWww/assets/bootstrap-COulQZax-v60.js +1 -2
  8. package/adminWww/assets/bootstrap-COulQZax-v61.js +1 -1
  9. package/adminWww/assets/bootstrap-COulQZax-v67.js +1 -317
  10. package/adminWww/assets/bootstrap-COulQZax-v68.js +1 -0
  11. package/adminWww/assets/bootstrap-COulQZax-v69.js +317 -0
  12. package/adminWww/assets/bootstrap-COulQZax.js +1 -2
  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 -2
  21. package/adminWww/assets/index-CQZugZ1z-v68.js +1 -0
  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 -114
  25. package/adminWww/index.html +11 -10
  26. package/adminWww/js/eos-branding.js +114 -157
  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 +15 -17
@@ -1,2 +1 @@
1
- import "./bootstrap-COulQZax-v60.js";
2
- export * from "./bootstrap-COulQZax-v60.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,2 +1 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./bootstrap-COulQZax-v67.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-v67.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 @@
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,33 +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 {
3825
- display: none !important;
3826
- visibility: hidden !important;
3827
- opacity: 0 !important;
3828
- pointer-events: none !important;
3829
- width: 0 !important;
3830
- min-width: 0 !important;
3831
- max-width: 0 !important;
3832
- height: 0 !important;
3833
- min-height: 0 !important;
3834
- max-height: 0 !important;
3835
- margin: 0 !important;
3836
- padding: 0 !important;
3837
- overflow: hidden !important;
3838
- flex: 0 0 0 !important;
3839
- border: 0 !important;
3840
- 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 {
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 {
3847
3823
  display: none !important;
3848
3824
  visibility: hidden !important;
3849
3825
  opacity: 0 !important;
@@ -3860,91 +3836,4 @@ html.eos-app .eos-native-drawer-header-hidden {
3860
3836
  flex: 0 0 0 !important;
3861
3837
  border: 0 !important;
3862
3838
  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
3839
  }
@@ -4,8 +4,8 @@
4
4
  translate="no"
5
5
  >
6
6
  <head>
7
- <script src="./js/eos-console-quiet.js?v=67"></script>
8
- <script type="module" src="./assets/hostInit-v61.js?v=67"></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=67" />
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-v67.js?v=67"></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=67"></script>
162
- <script defer src="./js/eos-adapter-surface-cleanup.js?v=67"></script>
163
- <script defer src="./js/eos-security-ui.js?v=67"></script>
164
- <script defer src="./js/eos-role-ui.js?v=67"></script>
165
- <script defer src="./js/eos-assistant.js?v=67"></script>
166
- <script defer src="./js/eos-objects-state-tools.js?v=67"></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 = 'v67-primary-logo-restore-native-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,81 +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
- // Source 1: upstream Drawer.getHeader() identity + chevron block.
848
- document.querySelectorAll('.MuiDrawer-paper, .MuiSwipeableDrawer-paper').forEach(drawer => {
849
- Array.from(drawer.children || []).forEach(child => {
850
- if (!child?.querySelector) return;
851
- const text = normalize(child.textContent || '');
852
- const hasIdentity = !!child.querySelector('a[href*="#easy"], img, .MuiAvatar-root') || /nexowatt|iobroker/.test(text);
853
- const hasToggle = !!child.querySelector('button, .MuiIconButton-root, [role="button"]');
854
- const isNavigationList = child.classList?.contains('MuiList-root') || !!child.querySelector('.MuiListItemButton-root');
855
- if (hasIdentity && hasToggle && !isNavigationList) hideNativeTopLeftGhost(child);
856
- });
857
- });
858
-
859
- // Source 2: stale native compact identity rendered as a small top-left
860
- // AppBar child. Use geometry + short label, and explicitly protect the
861
- // large primary EOS badge.
862
- document.querySelectorAll('.MuiAppBar-root .MuiToolbar-root > *, .eos-top-toolbar > *').forEach(child => {
863
- if (!child?.querySelector || child.matches?.('.eos-brand-badge, .eos-primary-brand')) return;
864
- if (child.querySelector('.eos-brand-badge, .eos-primary-brand')) return;
865
- const text = normalize(child.textContent || '');
866
- const hasShortIdentity = text === 'nexowatt' || text === 'iobroker' || /^nexowatt\s*$/.test(text);
867
- const hasEasyLink = !!child.querySelector('a[href*="#easy"]');
868
- const hasToggle = !!child.querySelector('button, .MuiIconButton-root, svg');
869
- const rect = child.getBoundingClientRect?.();
870
- const isTopLeft = rect && rect.top < 105 && rect.left < 220 && rect.width < 230 && rect.height < 100;
871
- if (isTopLeft && (hasShortIdentity || hasEasyLink) && hasToggle) hideNativeTopLeftGhost(child);
872
- });
873
-
874
- // Restore/verify the correct large EOS identity after cleanup.
875
- const toolbar = document.querySelector('#root > .MuiPaper-root > .MuiAppBar-root .MuiToolbar-root, header .MuiToolbar-root, .MuiAppBar-root .MuiToolbar-root');
876
- if (toolbar) ensureBrandBadge(toolbar);
877
- });
878
-
879
789
  const ensureLogoutButton = () => {
880
790
  // v14: the custom EOS logout button remains disabled/removed.
881
791
  // The visible native logout menu item is hidden too because it caused broken redirects.
@@ -910,39 +820,6 @@
910
820
  });
911
821
  });
912
822
 
913
- const hideNativeDrawerHeaderElement = header => safe(() => {
914
- if (!header || header.closest?.('.eos-brand-badge, .eos-top-toolbar')) return;
915
- header.classList.add(
916
- 'eos-native-drawer-header',
917
- 'eos-nav-toggle-shell',
918
- 'eos-native-drawer-header-hidden',
919
- );
920
- header.dataset.eosNativeDrawerHeaderHidden = 'true';
921
- header.setAttribute('aria-hidden', 'true');
922
- header.setAttribute('inert', '');
923
- header.querySelectorAll('button, a, [role="button"], input, select, textarea').forEach(control => {
924
- control.setAttribute('tabindex', '-1');
925
- control.setAttribute('aria-hidden', 'true');
926
- });
927
- if (header.style) {
928
- header.style.setProperty('display', 'none', 'important');
929
- header.style.setProperty('visibility', 'hidden', 'important');
930
- header.style.setProperty('opacity', '0', 'important');
931
- header.style.setProperty('pointer-events', 'none', 'important');
932
- header.style.setProperty('width', '0', 'important');
933
- header.style.setProperty('height', '0', 'important');
934
- header.style.setProperty('overflow', 'hidden', 'important');
935
- header.style.setProperty('margin', '0', 'important');
936
- header.style.setProperty('padding', '0', 'important');
937
- }
938
- });
939
-
940
- const getDirectDrawerChild = (drawer, node) => {
941
- let current = node;
942
- while (current?.parentElement && current.parentElement !== drawer) current = current.parentElement;
943
- return current?.parentElement === drawer ? current : null;
944
- };
945
-
946
823
  const patchDrawerHeader = drawer => safe(() => {
947
824
  if (!drawer) return;
948
825
  drawer.classList.add('eos-drawer');
@@ -950,27 +827,50 @@
950
827
 
951
828
  const directChildren = Array.from(drawer.children).filter(el => el.nodeType === 1);
952
829
  const isListLike = el => el.classList?.contains('MuiList-root') || el.querySelector?.('.MuiListItemButton-root');
953
-
954
- // Exact upstream Drawer.getHeader() fingerprint: its identity link points to /#easy
955
- // and the same direct drawer child contains the native chevron IconButton.
956
- const easyLink = drawer.querySelector('a[href="/#easy"], a[href$="#easy"], a[href*="/#easy"]');
957
- let header = getDirectDrawerChild(drawer, easyLink);
958
-
959
- if (!header || !header.querySelector?.('button, .MuiIconButton-root, [role="button"]')) {
960
- header = drawer.querySelector(':scope > .eos-native-drawer-header');
961
- }
830
+ let header = drawer.querySelector(':scope > .eos-native-drawer-header');
962
831
  if (!header) {
963
- header = directChildren.find(el => {
964
- if (isListLike(el) || !el.querySelector) return false;
965
- const hasToggle = !!el.querySelector('button, .MuiIconButton-root, [role="button"]');
966
- const hasEasyLink = !!el.querySelector('a[href="/#easy"], a[href$="#easy"], a[href*="/#easy"]');
967
- const hasIdentity = !!el.querySelector('img, .MuiAvatar-root, a')
968
- || /nexowatt|iobroker|energy operation system/i.test(String(el.textContent || ''));
969
- 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');
970
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
+ }
971
873
  }
972
- if (header) hideNativeDrawerHeaderElement(header);
973
-
974
874
  const list = drawer.querySelector('.MuiList-root');
975
875
  if (list) {
976
876
  list.classList.add('eos-scroll-nav');
@@ -978,15 +878,72 @@
978
878
  }
979
879
  });
980
880
 
981
- const removeStrayNativeDrawerHeaders = () => safe(() => {
982
- document.querySelectorAll('.MuiDrawer-paper, .MuiSwipeableDrawer-paper').forEach(drawer => {
983
- patchDrawerHeader(drawer);
984
- drawer.querySelectorAll('a[href="/#easy"], a[href$="#easy"], a[href*="/#easy"]').forEach(link => {
985
- const directChild = getDirectDrawerChild(drawer, link);
986
- if (directChild?.querySelector?.('button, .MuiIconButton-root, [role="button"]')) {
987
- hideNativeDrawerHeaderElement(directChild);
988
- }
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');
989
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);
990
947
  });
991
948
  });
992
949
 
@@ -1005,8 +962,8 @@
1005
962
  toolbar.classList.add('eos-top-toolbar');
1006
963
  ensureBrandBadge(toolbar);
1007
964
  }
1008
- removeNativeTopLeftGhost();
1009
- removeStrayNativeDrawerHeaders();
965
+ document.querySelectorAll('.MuiDrawer-paper, .MuiSwipeableDrawer-paper').forEach(patchDrawerHeader);
966
+ removeSmallTopLeftNativeNexoWattTab();
1010
967
  hideNativeLogoutNav();
1011
968
  releaseNotificationControls();
1012
969
  ensurePopupCompatibility();