iobroker.mywebui 1.162.8 → 1.170.0

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 (262) hide show
  1. package/README.md +574 -0
  2. package/default-controls/controls/ReportSelector.control +1 -1
  3. package/default-controls/controls/analog_points/scada_point_panel.control +1 -1
  4. package/default-controls/controls/navigation/app-bar.control +1 -1
  5. package/default-controls/controls/navigation/menu-item.control +1 -1
  6. package/default-controls/controls/navigation/sidebar.control +1 -1
  7. package/default-controls/controls/txtviewer/ReportSelector.control +1 -1
  8. package/dist/backend/3d-editor-integration.js +1 -1
  9. package/dist/backend/main.js +1 -1
  10. package/dist/backend/reportCsv.js +1 -1
  11. package/dist/backend/reportGenerate.js +1 -1
  12. package/dist/backend/reportOutput.js +1 -1
  13. package/dist/backend/reportPdf.js +1 -1
  14. package/dist/backend/reportRenderer.js +1 -1
  15. package/dist/backend/reportSandbox.js +1 -1
  16. package/dist/backend/reportSandboxWorker.js +1 -1
  17. package/docs/README.md +1 -0
  18. package/docs/bindings.md +106 -1
  19. package/docs/npm-widgets.md +31 -0
  20. package/docs/permissions.md +2 -0
  21. package/docs/screens.md +45 -0
  22. package/docs/status-indicators.az.md +80 -0
  23. package/docs/status-indicators.md +80 -0
  24. package/docs/translations.md +11 -0
  25. package/io-package.json +1 -1
  26. package/native/mywebui_scada_engine.darwin-arm64.node +0 -0
  27. package/native/mywebui_scada_engine.darwin-x64.node +0 -0
  28. package/native/mywebui_scada_engine.linux-arm-gnueabihf.node +0 -0
  29. package/native/mywebui_scada_engine.linux-arm64-gnu.node +0 -0
  30. package/native/mywebui_scada_engine.linux-arm64-musl.node +0 -0
  31. package/native/mywebui_scada_engine.linux-x64-gnu.node +0 -0
  32. package/native/mywebui_scada_engine.linux-x64-musl.node +0 -0
  33. package/native/mywebui_scada_engine.win32-x64-msvc.node +0 -0
  34. package/package.json +1 -1
  35. package/www/3d-editor/js/Animation.js +1 -1
  36. package/www/3d-editor/js/AnimationResizer.js +1 -1
  37. package/www/3d-editor/js/Command.js +1 -1
  38. package/www/3d-editor/js/Config.js +1 -1
  39. package/www/3d-editor/js/Editor.js +1 -1
  40. package/www/3d-editor/js/EditorControls.js +1 -1
  41. package/www/3d-editor/js/GLTFImportDialog.js +1 -1
  42. package/www/3d-editor/js/History.js +1 -1
  43. package/www/3d-editor/js/Loader.js +1 -1
  44. package/www/3d-editor/js/LoaderUtils.js +1 -1
  45. package/www/3d-editor/js/Menubar.Add.js +1 -1
  46. package/www/3d-editor/js/Menubar.Edit.js +1 -1
  47. package/www/3d-editor/js/Menubar.File.js +1 -1
  48. package/www/3d-editor/js/Menubar.Help.js +1 -1
  49. package/www/3d-editor/js/Menubar.Render.js +1 -1
  50. package/www/3d-editor/js/Menubar.Status.js +1 -1
  51. package/www/3d-editor/js/Menubar.View.js +1 -1
  52. package/www/3d-editor/js/Menubar.js +1 -1
  53. package/www/3d-editor/js/Player.js +1 -1
  54. package/www/3d-editor/js/Resizer.js +1 -1
  55. package/www/3d-editor/js/Script.js +1 -1
  56. package/www/3d-editor/js/Selector.js +1 -1
  57. package/www/3d-editor/js/Sidebar.Geometry.BoxGeometry.js +1 -1
  58. package/www/3d-editor/js/Sidebar.Geometry.BufferGeometry.js +1 -1
  59. package/www/3d-editor/js/Sidebar.Geometry.CapsuleGeometry.js +1 -1
  60. package/www/3d-editor/js/Sidebar.Geometry.CircleGeometry.js +1 -1
  61. package/www/3d-editor/js/Sidebar.Geometry.CylinderGeometry.js +1 -1
  62. package/www/3d-editor/js/Sidebar.Geometry.DodecahedronGeometry.js +1 -1
  63. package/www/3d-editor/js/Sidebar.Geometry.ExtrudeGeometry.js +1 -1
  64. package/www/3d-editor/js/Sidebar.Geometry.IcosahedronGeometry.js +1 -1
  65. package/www/3d-editor/js/Sidebar.Geometry.LatheGeometry.js +1 -1
  66. package/www/3d-editor/js/Sidebar.Geometry.Modifiers.js +1 -1
  67. package/www/3d-editor/js/Sidebar.Geometry.OctahedronGeometry.js +1 -1
  68. package/www/3d-editor/js/Sidebar.Geometry.PlaneGeometry.js +1 -1
  69. package/www/3d-editor/js/Sidebar.Geometry.RingGeometry.js +1 -1
  70. package/www/3d-editor/js/Sidebar.Geometry.ShapeGeometry.js +1 -1
  71. package/www/3d-editor/js/Sidebar.Geometry.SphereGeometry.js +1 -1
  72. package/www/3d-editor/js/Sidebar.Geometry.TetrahedronGeometry.js +1 -1
  73. package/www/3d-editor/js/Sidebar.Geometry.TextGeometry.js +1 -1
  74. package/www/3d-editor/js/Sidebar.Geometry.TorusGeometry.js +1 -1
  75. package/www/3d-editor/js/Sidebar.Geometry.TorusKnotGeometry.js +1 -1
  76. package/www/3d-editor/js/Sidebar.Geometry.TubeGeometry.js +1 -1
  77. package/www/3d-editor/js/Sidebar.Geometry.js +1 -1
  78. package/www/3d-editor/js/Sidebar.Material.BooleanProperty.js +1 -1
  79. package/www/3d-editor/js/Sidebar.Material.ColorProperty.js +1 -1
  80. package/www/3d-editor/js/Sidebar.Material.ConstantProperty.js +1 -1
  81. package/www/3d-editor/js/Sidebar.Material.MapProperty.js +1 -1
  82. package/www/3d-editor/js/Sidebar.Material.NumberProperty.js +1 -1
  83. package/www/3d-editor/js/Sidebar.Material.Program.js +1 -1
  84. package/www/3d-editor/js/Sidebar.Material.RangeValueProperty.js +1 -1
  85. package/www/3d-editor/js/Sidebar.Material.js +1 -1
  86. package/www/3d-editor/js/Sidebar.Object.js +1 -1
  87. package/www/3d-editor/js/Sidebar.Project.App.js +1 -1
  88. package/www/3d-editor/js/Sidebar.Project.Materials.js +1 -1
  89. package/www/3d-editor/js/Sidebar.Project.Renderer.js +1 -1
  90. package/www/3d-editor/js/Sidebar.Project.Resources.js +1 -1
  91. package/www/3d-editor/js/Sidebar.Project.js +1 -1
  92. package/www/3d-editor/js/Sidebar.Properties.js +1 -1
  93. package/www/3d-editor/js/Sidebar.Scene.js +1 -1
  94. package/www/3d-editor/js/Sidebar.Script.js +1 -1
  95. package/www/3d-editor/js/Sidebar.Settings.History.js +1 -1
  96. package/www/3d-editor/js/Sidebar.Settings.Shortcuts.js +1 -1
  97. package/www/3d-editor/js/Sidebar.Settings.js +1 -1
  98. package/www/3d-editor/js/Sidebar.js +1 -1
  99. package/www/3d-editor/js/Storage.js +1 -1
  100. package/www/3d-editor/js/Strings.js +1 -1
  101. package/www/3d-editor/js/TextureParametersDialog.js +1 -1
  102. package/www/3d-editor/js/Toolbar.js +1 -1
  103. package/www/3d-editor/js/Viewport.Controls.js +1 -1
  104. package/www/3d-editor/js/Viewport.Info.js +1 -1
  105. package/www/3d-editor/js/Viewport.Pathtracer.js +1 -1
  106. package/www/3d-editor/js/Viewport.ViewHelper.js +1 -1
  107. package/www/3d-editor/js/Viewport.XR.js +1 -1
  108. package/www/3d-editor/js/Viewport.js +1 -1
  109. package/www/3d-editor/js/commands/AddObjectCommand.js +1 -1
  110. package/www/3d-editor/js/commands/AddScriptCommand.js +1 -1
  111. package/www/3d-editor/js/commands/Commands.js +1 -1
  112. package/www/3d-editor/js/commands/MoveObjectCommand.js +1 -1
  113. package/www/3d-editor/js/commands/MultiCmdsCommand.js +1 -1
  114. package/www/3d-editor/js/commands/RemoveObjectCommand.js +1 -1
  115. package/www/3d-editor/js/commands/RemoveScriptCommand.js +1 -1
  116. package/www/3d-editor/js/commands/SetColorCommand.js +1 -1
  117. package/www/3d-editor/js/commands/SetGeometryCommand.js +1 -1
  118. package/www/3d-editor/js/commands/SetGeometryValueCommand.js +1 -1
  119. package/www/3d-editor/js/commands/SetMaterialColorCommand.js +1 -1
  120. package/www/3d-editor/js/commands/SetMaterialCommand.js +1 -1
  121. package/www/3d-editor/js/commands/SetMaterialMapCommand.js +1 -1
  122. package/www/3d-editor/js/commands/SetMaterialRangeCommand.js +1 -1
  123. package/www/3d-editor/js/commands/SetMaterialValueCommand.js +1 -1
  124. package/www/3d-editor/js/commands/SetMaterialVectorCommand.js +1 -1
  125. package/www/3d-editor/js/commands/SetPositionCommand.js +1 -1
  126. package/www/3d-editor/js/commands/SetRotationCommand.js +1 -1
  127. package/www/3d-editor/js/commands/SetScaleCommand.js +1 -1
  128. package/www/3d-editor/js/commands/SetSceneCommand.js +1 -1
  129. package/www/3d-editor/js/commands/SetScriptValueCommand.js +1 -1
  130. package/www/3d-editor/js/commands/SetShadowValueCommand.js +1 -1
  131. package/www/3d-editor/js/commands/SetTextureParametersCommand.js +1 -1
  132. package/www/3d-editor/js/commands/SetUuidCommand.js +1 -1
  133. package/www/3d-editor/js/commands/SetValueCommand.js +1 -1
  134. package/www/assets/icons/layout/backward.svg +1 -0
  135. package/www/assets/icons/layout/forward.svg +1 -0
  136. package/www/assets/icons/layout/mirrorHorizontal.svg +1 -0
  137. package/www/assets/icons/layout/mirrorVertical.svg +1 -0
  138. package/www/assets/icons/layout/toBack.svg +1 -0
  139. package/www/assets/icons/layout/toFront.svg +1 -0
  140. package/www/assets/icons/layout/unifyHeight.svg +1 -0
  141. package/www/assets/icons/layout/unifyWidth.svg +1 -0
  142. package/www/dist/frontend/bundle/HistoryDirectives-SZNC2EXZ.js +1 -0
  143. package/www/dist/frontend/bundle/ReportViewer-BDBHZVT7.js +197 -0
  144. package/www/dist/frontend/bundle/Sha256-BSH7CIPW.js +1 -1
  145. package/www/dist/frontend/bundle/chunk-G2T4KGPO.js +21 -0
  146. package/www/dist/frontend/bundle/chunk-KVPT4J7H.js +1 -1
  147. package/www/dist/frontend/bundle/chunk-TDFN5CKC.js +1 -0
  148. package/www/dist/frontend/bundle/common/IobrokerHandler.js +1 -1
  149. package/www/dist/frontend/bundle/runtime/CustomControls.js +1 -1
  150. package/www/dist/frontend/bundle/runtime/ScreenViewer.js +1 -1
  151. package/www/dist/frontend/bundle/runtime/controls.js +3 -3
  152. package/www/dist/frontend/bundle/runtime/init.js +3 -3
  153. package/www/dist/frontend/common/BindingExpression.js +1 -1
  154. package/www/dist/frontend/common/BuiltinTranslations.js +1 -0
  155. package/www/dist/frontend/common/Common.globals.js +1 -1
  156. package/www/dist/frontend/common/EChartsOption.js +1 -1
  157. package/www/dist/frontend/common/HistoryDirective.js +1 -1
  158. package/www/dist/frontend/common/HistoryOptions.js +1 -1
  159. package/www/dist/frontend/common/HistoryQuery.js +1 -1
  160. package/www/dist/frontend/common/HistoryQueryViews.js +1 -1
  161. package/www/dist/frontend/common/IobrokerHandler.js +1 -1
  162. package/www/dist/frontend/common/PlantPaxResolve.js +1 -1
  163. package/www/dist/frontend/common/ReadQuality.js +1 -0
  164. package/www/dist/frontend/common/ReportAllowlist.js +1 -1
  165. package/www/dist/frontend/common/ReportSchedule.js +1 -1
  166. package/www/dist/frontend/common/ReportTheme.js +1 -1
  167. package/www/dist/frontend/common/Runtime.js +1 -1
  168. package/www/dist/frontend/common/Sha256.js +1 -1
  169. package/www/dist/frontend/common/StateDiagnostics.js +1 -0
  170. package/www/dist/frontend/common/StateQuality.js +1 -0
  171. package/www/dist/frontend/common/WriteFeedback.js +1 -0
  172. package/www/dist/frontend/config/CommandHandling.js +1 -1
  173. package/www/dist/frontend/config/ConfigureWebcomponentDesigner.js +1 -1
  174. package/www/dist/frontend/config/DockHelper.js +1 -1
  175. package/www/dist/frontend/config/HistoryQueryWindow.js +1 -1
  176. package/www/dist/frontend/config/IobrokerWebui3DDriveEngine.js +1 -1
  177. package/www/dist/frontend/config/IobrokerWebui3DScreenEditor.js +3 -3
  178. package/www/dist/frontend/config/IobrokerWebui3DScreenPropertiesPanel.js +3 -3
  179. package/www/dist/frontend/config/IobrokerWebui3DScreenViewer.js +3 -3
  180. package/www/dist/frontend/config/IobrokerWebuiAppShell.js +3 -3
  181. package/www/dist/frontend/config/IobrokerWebuiBindingsEditor.js +1 -1
  182. package/www/dist/frontend/config/IobrokerWebuiConfirmationWrapper.js +2 -2
  183. package/www/dist/frontend/config/IobrokerWebuiControlPropertiesEditor.js +3 -3
  184. package/www/dist/frontend/config/IobrokerWebuiDynamicPropsEditor.js +1 -1
  185. package/www/dist/frontend/config/IobrokerWebuiEventAssignment.js +1 -1
  186. package/www/dist/frontend/config/IobrokerWebuiIconsView.js +3 -3
  187. package/www/dist/frontend/config/IobrokerWebuiMonacoEditor.js +3 -3
  188. package/www/dist/frontend/config/IobrokerWebuiPlantPaxTypesEditor.js +1 -1
  189. package/www/dist/frontend/config/IobrokerWebuiPropertyGrid.js +1 -1
  190. package/www/dist/frontend/config/IobrokerWebuiScreenEditor.js +1 -1
  191. package/www/dist/frontend/config/IobrokerWebuiScreensView.js +3 -3
  192. package/www/dist/frontend/config/IobrokerWebuiSecurityEditor.js +1 -1
  193. package/www/dist/frontend/config/IobrokerWebuiSignalPropertyEditor.js +1 -1
  194. package/www/dist/frontend/config/IobrokerWebuiSolutionExplorer.js +3 -3
  195. package/www/dist/frontend/config/IobrokerWebuiTranslationEditor.js +1 -1
  196. package/www/dist/frontend/config/IobrokerWebuiWidgetGallery.js +3 -3
  197. package/www/dist/frontend/config/RightDockStrip.js +1 -1
  198. package/www/dist/frontend/config/UprightOverlays.js +1 -0
  199. package/www/dist/frontend/helper/DialogHelper.js +2 -2
  200. package/www/dist/frontend/helper/EditorOfDesignItem.js +1 -1
  201. package/www/dist/frontend/helper/EsprimaHelper.js +1 -1
  202. package/www/dist/frontend/helper/Helper.js +1 -1
  203. package/www/dist/frontend/helper/LayoutHelper.js +1 -1
  204. package/www/dist/frontend/helper/XmlHelper.js +1 -1
  205. package/www/dist/frontend/helper/ZipHelper.js +1 -1
  206. package/www/dist/frontend/runtime/AnimationService.js +1 -1
  207. package/www/dist/frontend/runtime/CustomControls.js +1 -1
  208. package/www/dist/frontend/runtime/DynamicElementProperties.js +1 -1
  209. package/www/dist/frontend/runtime/EChart.js +1 -1
  210. package/www/dist/frontend/runtime/HabPanelLikeMenu.js +2 -2
  211. package/www/dist/frontend/runtime/HistoryDirectives.js +1 -1
  212. package/www/dist/frontend/runtime/NavigationShell.js +1 -1
  213. package/www/dist/frontend/runtime/ReportViewer.js +3 -3
  214. package/www/dist/frontend/runtime/RuntimeTheme.js +1 -1
  215. package/www/dist/frontend/runtime/ScreenViewer.js +3 -3
  216. package/www/dist/frontend/runtime/TranslateableText.js +2 -2
  217. package/www/dist/frontend/runtime/VisibilityService.js +1 -1
  218. package/www/dist/frontend/runtime/controls.js +1 -1
  219. package/www/dist/frontend/runtime/init.js +1 -1
  220. package/www/dist/frontend/scripting/IobrokerWebuiScriptSystem.js +1 -1
  221. package/www/dist/frontend/scripting/blockly/OpenScreen.js +1 -1
  222. package/www/dist/frontend/scripting/blockly/webuiBlocklyToolbox.js +1 -1
  223. package/www/dist/frontend/services/DynamicPropertiesHelper.js +1 -1
  224. package/www/dist/frontend/services/IobrokerWebuiBindableLocalObjectsService.js +1 -1
  225. package/www/dist/frontend/services/IobrokerWebuiBindableObjectDragDropService.js +1 -1
  226. package/www/dist/frontend/services/IobrokerWebuiBindableObjectsForPropertiesService.js +1 -1
  227. package/www/dist/frontend/services/IobrokerWebuiBindableObjectsService.js +1 -1
  228. package/www/dist/frontend/services/IobrokerWebuiConfigButtonProvider.js +1 -1
  229. package/www/dist/frontend/services/IobrokerWebuiCopyPasteService.js +1 -1
  230. package/www/dist/frontend/services/IobrokerWebuiCustomControlEventsService.js +1 -1
  231. package/www/dist/frontend/services/IobrokerWebuiCustomElementContextMenu.js +1 -1
  232. package/www/dist/frontend/services/IobrokerWebuiDemoProviderService.js +1 -1
  233. package/www/dist/frontend/services/IobrokerWebuiDynamicPropertiesService.js +1 -1
  234. package/www/dist/frontend/services/IobrokerWebuiEChartPropertiesService.js +1 -1
  235. package/www/dist/frontend/services/IobrokerWebuiEventsService.js +1 -1
  236. package/www/dist/frontend/services/IobrokerWebuiExternalDragDropService.js +1 -1
  237. package/www/dist/frontend/services/IobrokerWebuiLitPropertiesService.js +1 -1
  238. package/www/dist/frontend/services/IobrokerWebuiModelCommandService.js +1 -0
  239. package/www/dist/frontend/services/IobrokerWebuiPropertiesService.js +1 -1
  240. package/www/dist/frontend/services/IobrokerWebuiPropertyGroupsService.js +1 -1
  241. package/www/dist/frontend/services/IobrokerWebuiRefactorService.js +1 -1
  242. package/www/dist/frontend/services/IobrokerWebuiReportContextMenu.js +1 -1
  243. package/www/dist/frontend/services/IobrokerWebuiScreenContextMenu.js +1 -1
  244. package/www/dist/frontend/services/IobrokerWebuiSpecialPropertiesService.js +1 -1
  245. package/www/dist/frontend/services/IobrokerWebuiSpectrumEditorService.js +1 -1
  246. package/www/dist/frontend/services/IobrokerWebuiVisibilityPropertiesService.js +1 -1
  247. package/www/dist/frontend/services/LayoutComponentsPropertiesService.js +1 -1
  248. package/www/dist/frontend/widgets/OrthoFlowLineTool.js +1 -1
  249. package/www/dist/frontend/widgets/ReportToolbox.js +3 -3
  250. package/www/dist/frontend/widgets/customElementsObserver.js +1 -1
  251. package/www/dist/frontend/widgets/importWidgetFiles.js +1 -1
  252. package/www/dist/frontend/widgets/importWidgetFilesRuntime.js +1 -1
  253. package/www/dist/frontend/widgets/layout-components.js +1 -1
  254. package/www/dist/frontend/widgets/layout-placement-services.js +1 -1
  255. package/www/dist/frontend/widgets/testElement.js +1 -1
  256. package/www/index.html +37 -0
  257. package/www/libs/@gokturk413/web-component-designer-visualization-addons/dist/helpers/BindingsHelper.js +9 -1
  258. package/www/libs/@gokturk413/web-component-designer-visualization-addons/dist/scripting/ScriptSystem.js +7 -2
  259. package/www/dist/frontend/bundle/HistoryDirectives-RFNWGNZD.js +0 -1
  260. package/www/dist/frontend/bundle/ReportViewer-4ZI6KOQN.js +0 -197
  261. package/www/dist/frontend/bundle/chunk-FBQ2Z2FQ.js +0 -1
  262. package/www/dist/frontend/bundle/chunk-R2IYVC73.js +0 -21
package/README.md CHANGED
@@ -302,6 +302,580 @@ runtime.html?screenName=screen2
302
302
  Placeholder for next versions:
303
303
  ### __WORK IN PROGRESS__
304
304
  -->
305
+ ### 1.170.0 (2026-10-01)
306
+ * (gokturk413) feat(runtime): state details panel for administrators (click a badge / Alt+click a control: every bound state with read and write status); runtime texts (write feedback, read quality, quality codes, the panel) in az/en/ru/de/tr, overridable by project translations
307
+
308
+ ### 1.169.0 (2026-10-01)
309
+ * (gokturk413) feat(navigation): Start as — the menu opens full, icons only, hidden, or as this browser left it last time
310
+
311
+ ### 1.168.2 (2026-10-01)
312
+ * (gokturk413) fix(navigation): with the sidebar on the right the ☰ sits in the app bar's right corner, and the app bar keeps room for it there
313
+
314
+ ### 1.168.1 (2026-10-01)
315
+ * (gokturk413) fix(designer): Settings splits Navigation into "this screen" and "all screens" (position, layout, theme… are global); a rebuilt sidebar lets go of its listeners and badge subscriptions
316
+
317
+ ### 1.168.0 (2026-10-01)
318
+ * (gokturk413) feat(navigation): position left/right/top/bottom (top/bottom as a bar with drop-down groups), layout push/overlay, a badge per entry from a state (summed on groups); fix: a control updated live no longer throws in disconnectedCallback
319
+
320
+ ### 1.167.1 (2026-10-01)
321
+ * (gokturk413) fix(designer): Settings → Navigation → Groups follows Group items at once
322
+
323
+ ### 1.167.0 (2026-10-01)
324
+ * (gokturk413) feat(navigation): menu groups get their own title (translatable), icon and order (Settings → Navigation → Groups); with icons only, a group opens its entries in a panel beside the sidebar; read-quality and write-feedback layers sit under the navigation
325
+
326
+ ### 1.166.0 (2026-10-01)
327
+ * (gokturk413) feat(navigation): menu groups by folder or by a group per screen (open/close, nested), SVG menu icons in the theme colour, the screen moves and scales with the sidebar (easing, no jump)
328
+
329
+ ### 1.165.1 (2026-10-01)
330
+ * (gokturk413) fix(runtime): read quality frames the whole control (content bigger than the host) and watches custom-control properties of type signal (input_with_button); scada_point_panel and ReportSelector no longer overflow their own box
331
+
332
+ ### 1.165.0 (2026-10-01)
333
+ * (gokturk413) feat(runtime): read quality — every bound control shows when its value cannot be trusted (quality code, driver down, stale, missing); write feedback names the quality code and no longer counts substitute values as errors; docs/status-indicators.md (en + az)
334
+
335
+ ### 1.164.0 (2026-10-01)
336
+ * (gokturk413) feat(designer): layout toolbar, upright overlays on rotated controls; incremental npm upload
337
+
338
+ ### 1.163.1 (2026-09-30)
339
+ * (gokturk413) fix(runtime): pending write drawn at once; @click="[[…]]" on a screen threw
340
+
341
+ ### 1.163.0 (2026-09-30)
342
+ * (gokturk413) feat(runtime): write feedback — every operator write shows whether the driver confirmed it
343
+
344
+ ### 1.162.8 (2026-09-30)
345
+ * (gokturk413) fix(designer): the right tool-window strip lost its names on a short window
346
+
347
+ ### 1.162.7 (2026-09-30)
348
+ * (gokturk413) fix(designer): the obfuscated release designer did not load — ReportToolbox
349
+
350
+ ### 1.162.6 (2026-09-30)
351
+ * (gokturk413) fix(controls): valve_faceplate buttons carried an empty "bind-attr:"
352
+
353
+ ### 1.162.5 (2026-09-30)
354
+ * (gokturk413) fix(licence): a machine id that stops answering is no longer a tamper
355
+
356
+ ### 1.162.4 (2026-09-30)
357
+ * (gokturk413) fix(designer): report canvas styles, Report toolbox click, translation key actions
358
+
359
+ ### 1.162.3 (2026-09-30)
360
+ * (gokturk413) fix(controls): property defaults set before the first binding pass
361
+
362
+ ### 1.162.2 (2026-09-30)
363
+ * (gokturk413) fix(runtime): two-way bindings write numbers to number states; directive test heading
364
+
365
+ ### 1.162.1 (2026-09-30)
366
+ * (gokturk413) perf(runtime): the navigation menu appears with the screen
367
+
368
+ ### 1.162.0 (2026-09-29)
369
+ * (gokturk413) feat(charts): `<iobroker-webui-echart>` — live ECharts in viewer and designer, the same chart in HTML/PDF
370
+
371
+ ### 1.161.0 (2026-09-29)
372
+ * (gokturk413) feat(designer): History Query builder + Report toolbox; docs/reports.md
373
+
374
+ ### 1.160.0 (2026-09-28)
375
+ * (gokturk413) feat(reports): report theme, full web platform in the sandbox; app bar steady and responsive
376
+
377
+ ### 1.159.0 (2026-09-28)
378
+ * (gokturk413) fix(reports): pictures in generated reports — SVG/PNG in HTML and PDF
379
+
380
+ ### 1.158.0 (2026-09-28)
381
+ * (gokturk413) feat(reports): Output → Languages — one server file per language, {lang} in path or name
382
+
383
+ ### 1.157.0 (2026-09-28)
384
+ * (gokturk413) feat: engine in the fork; translations in reports; live toolbox; quiet connection monitor
385
+
386
+ ### 1.156.0 (2026-09-28)
387
+ * (gokturk413) fix(directives): every template directive tested in control, screen and report; 9 bugs fixed
388
+
389
+ ### 1.155.0 (2026-09-27)
390
+ * (gokturk413) feat(reports): template directives on screen and report pages; history options demo
391
+
392
+ ### 1.154.0 (2026-09-27)
393
+ * (gokturk413) feat(reports): reports rendered for a user, report scripts in the sandbox, history: directive
394
+
395
+ ### 1.153.0 (2026-09-27)
396
+ * (gokturk413) feat(reports): the fonts the author picks reach the PDF; toolbox rights set in the designer
397
+
398
+ ### 1.152.0 (2026-09-27)
399
+ * (gokturk413) feat(reports): history on the backend, five languages in PDF, the dialog's dates applied
400
+
401
+ ### 1.151.0 (2026-09-27)
402
+ * (gokturk413) feat(reports): PDF painted as the report looks — Takumi replaces pdfmake
403
+
404
+ ### 1.150.0 (2026-09-27)
405
+ * (gokturk413) feat(reports): live reports, range from states, reports embeddable in screens
406
+
407
+ ### 1.149.0 (2026-09-27)
408
+ * (gokturk413) fix(reports): print in colour; show the date boxes only for a custom range; icons in the toolbox
409
+
410
+ ### 1.148.0 (2026-09-27)
411
+ * (gokturk413) feat(reports): the browser's printed date, title, URL and page number are optional
412
+
413
+ ### 1.147.0 (2026-09-27)
414
+ * (gokturk413) fix(reports): a browser saves on the server through the trigger state, not sendTo
415
+
416
+ ### 1.146.1 (2026-09-27)
417
+ * (gokturk413) fix(reports): print the report alone, not the whole application
418
+
419
+ ### 1.146.0 (2026-09-27)
420
+ * (gokturk413) feat(reports): PDF and CSV output, a time range in the viewer, reports in the menu
421
+
422
+ ### 1.145.0 (2026-09-26)
423
+ * (gokturk413) feat(reports): a bound state starts a server run; theme the Report window
424
+
425
+ ### 1.144.0 (2026-09-26)
426
+ * (gokturk413) feat(reports): schedule + trigger (task 9), VS-style tool windows (task 10)
427
+
428
+ ### 1.143.0 (2026-09-26)
429
+ * (gokturk413) feat(reports): generate on the server, download in the browser (task 8)
430
+
431
+ ### 1.142.0 (2026-09-26)
432
+ * (gokturk413) feat(reports): run control scripts on a DOM inside the sandbox (task 6)
433
+
434
+ ### 1.141.0 (2026-09-26)
435
+ * (gokturk413) feat(designer): events on the screen / report root, in the Events panel
436
+
437
+ ### 1.140.0 (2026-09-26)
438
+ * (gokturk413) feat(reports): backend renderer, expression sandbox, report events, screen-only (task 5)
439
+
440
+ ### 1.139.0 (2026-09-26)
441
+ * (gokturk413) feat(reports): open a report in the browser, with the full screen chrome (task 4)
442
+
443
+ ### 1.138.0 (2026-09-26)
444
+ * (gokturk413) feat(reports): the page canvas — paper, rulers, bands and page breaks (task 3)
445
+
446
+ ### 1.137.0 (2026-09-26)
447
+ * (gokturk413) feat(reports): Reports in the solution tree, with its own icons (task 2)
448
+
449
+ ### 1.136.1 (2026-09-26)
450
+ * (gokturk413) fix(reports): a report keeps every screen setting; only its size comes from the page
451
+
452
+ ### 1.136.0 (2026-09-26)
453
+ * (gokturk413) feat(reports): the .report object type (task 1 of the report plan)
454
+
455
+ ### 1.133.0 (2026-09-25)
456
+ * (gokturk413) feat(licence): move mywebui to the scada-core state machine (RFC-005 L3)
457
+ * (gokturk413) feat(licence): a host ledger per licence in every candidate directory
458
+ * (gokturk413) fix(licence): a key no longer erases the trial history in the adapter's slot
459
+ * (gokturk413) fix(licence): a stopped install no longer opens a usage-grace window
460
+ * (gokturk413) fix(licence): do not log 'unlocked' for a stopped install
461
+ * (gokturk413) feat(admin): explain the trial, the two hardware ids and the per-VM licence
462
+
463
+ ### 1.132.0 (2026-09-15)
464
+ * (gokturk413) fix(designer): Properties dock tabs wrap onto rows instead of truncating
465
+ * (gokturk413) fix(ci): pin Rust to a newer stable broke both aarch64 cross-builds
466
+
467
+ ### 1.130.0 (2026-08-04)
468
+ * (gokturk413) fix(dist): the public release would have shipped a broken adapter — three ways
469
+ * (gokturk413) fix(ci)!: the release workflow would have force-pushed over this repo's own history
470
+ * (gokturk413) fix(ci): expect the triple names napi actually produces, and cross-check them
471
+
472
+ ### 1.129.0 (2026-08-04)
473
+ * (gokturk413) feat(native): main.js permission handlers call the engine
474
+ * (gokturk413) fix(dist): ship the engine and its bridge; guard against an engine-less tarball
475
+ * (gokturk413) feat(dist): allow-list staging script for the public artifact tree
476
+ * (gokturk413) fix(dist): stop shipping scripts/ — it is the build process, not the product
477
+ * (gokturk413) feat(dist): independent pre-push audit of the staged public tree
478
+ * (gokturk413) fix(dist): stop publishing TypeScript sources and vendored package internals
479
+ * (gokturk413) feat(ci): public release workflow — allow-list staging, pre-push audit, dry-run default
480
+ * (gokturk413) fix(ci): deliver the cross-built engines into the package
481
+ * (gokturk413) fix(ci): publish builds every engine itself, and demands all 8 before shipping
482
+
483
+ ### 1.128.0 (2026-08-03)
484
+ * (gokturk413) fix(license): gate every deploying command, not just two of them
485
+ * (gokturk413) feat(native): group resolution + checkVisibility allow-list
486
+ * (gokturk413) feat(native): screen ACL — write allow-rule, read blacklist, new/legacy arbitration
487
+ * (gokturk413) fix(native): a non-string in a blocked list denies, matching the JS
488
+ * (gokturk413) feat(native): PlantPAx write permission model (action codes + area levels)
489
+ * (gokturk413) fix(native): an explicit null area level falls through to the '*' fallback
490
+ * (gokturk413) fix(native): model JS falsiness — non-string codes and empty-string levels no longer fail open
491
+ * (gokturk413) fix(native): prototype-inherited action keys no longer bypass the permission model
492
+ * (gokturk413) feat(native): resolve_screen_access/visibility/sec_write napi entries + parity test
493
+
494
+ ### 1.127.0 (2026-08-02)
495
+ * (gokturk413) feat(license): surface tag usage + grace/violation state in the designer console
496
+ * (gokturk413) fix(license): keep the grace high-water-mark alive when an audit fails
497
+
498
+ ### 1.126.0 (2026-08-01)
499
+ * (gokturk413) feat(native): run/cache the usage audit and enforce the locked verdict
500
+
501
+ ### 1.125.0 (2026-08-01)
502
+ * (gokturk413) feat: (deep-fidelity) — P_Gate faceplate rebuilt faithful to real .gfx single-page flow (Inputs→Gate Delay→On/Off Delay→Output); fixes faceplate numeric inputs never populating
503
+ * (gokturk413) feat(native): scaffold mywebui_scada_engine crate with version()/ping()
504
+ * (gokturk413) feat(native): engineBridge loader as the single engine import point
505
+ * (gokturk413) feat(native): load mywebui_scada_engine in adapter main() and log its version
506
+ * (gokturk413) feat(native): cross-platform hardware-id (whid2- machine-id/UUID/MachineGuid)
507
+ * (gokturk413) feat(native): Ed25519 license verify + payload parse (embedded public key)
508
+ * (gokturk413) feat(native): clock-tamper-resistant 30-day trial anchor (monotonic + HMAC + hwid-bound)
509
+ * (gokturk413) feat(native): validate_license/hardware_id napi entry points + edition/trial resolution
510
+ * (gokturk413) feat(native): main.js uses the engine for license/hardware-id; no-stop trial->free; delete JS validators
511
+ * (gokturk413) fix(license): designer allows trial/free editions (was locking them out)
512
+ * (gokturk413) fix(build): rebuild committed dist/backend from src-original (Phase 1) + drop orphan validator
513
+ * (gokturk413) feat(native): bridge Effect protocol + pure demo handler
514
+ * (gokturk413) feat(native): handle_demo napi export + JS effectApplier + mock-host B test
515
+ * (gokturk413) feat(native): async host-callback PoC (napi ThreadsafeFunction + awaited JS Promise)
516
+ * (gokturk413) feat(native): importmap scaffold — ImportmapBuilder + path helpers + embedded hacks
517
+ * (gokturk413) fix(native): importmap uses posix pjoin (not native path join) for web-path parity
518
+ * (gokturk413) feat(native): importmap add_to_importmap (exports/main/module resolution)
519
+ * (gokturk413) fix(native): pjoin normalizes leading ./ like path.posix.join (once, not per call site)
520
+ * (gokturk413) fix(native): add_to_importmap uses plain concat at JS:282/285/293 (not pjoin)
521
+ * (gokturk413) feat(native): importmap load_dependency (recursive, deduped, native fs)
522
+ * (gokturk413) feat(native): importmap parse_npm_package (custom-elements + esbuild bundle integration)
523
+ * (gokturk413) feat(native): importmap build_importmap top-level + writes 5 loader files
524
+ * (gokturk413) fix(native): serde_json preserve_order so generated importmap.js matches JS key order
525
+ * (gokturk413) feat(native): create_importmap napi async wrapper + Node integration test
526
+ * (gokturk413) feat(native): main.js uses engine.create_importmap; delete JS ImportmapCreator
527
+ * (gokturk413) fix(native): live-parity fixes — bundle host must resolve a string; JS:86 error text
528
+ * (gokturk413) fix(build): rebuild dist/backend after the port + correct the host-callback contract docs
529
+ * (gokturk413) feat(native): upload walk + ignore list + progress throttling (pure, tested)
530
+ * (gokturk413) feat(native): upload collect_existing_files_to_delete (DB-driven recursion)
531
+ * (gokturk413) feat(native): upload erase/upload_internal/driver with effect logging
532
+ * (gokturk413) fix(native): normalize source_dir in the upload driver (backslash paths skipped every file)
533
+ * (gokturk413) feat(native): upload_widgets napi wrapper + Node integration test
534
+ * (gokturk413) feat(native): main.js uses engine.upload_widgets; delete JS UploadHelper
535
+ * (gokturk413) feat(native): tag extraction — distinct ioBroker state IDs from screens/controls
536
+ * (gokturk413) feat(native): usage counting, limit checking and deterministic allowed-screen selection
537
+ * (gokturk413) fix(native): dedupe project names by set, stabilize counted_tags order, document unchecked limits
538
+ * (gokturk413) feat(native): 2-day grace anchor — HMAC-signed, hardware-bound, rollback-proof
539
+ * (gokturk413) fix(native): saturating arithmetic in grace/trial anchors + explicit blob-persistence contract
540
+ * (gokturk413) feat(native): audit_usage napi entry — usage, violations, locked verdict and grace state
541
+ * (gokturk413) fix(native): corrupt licence falls back to free tier; degraded audits never unlock or clear the grace anchor
542
+ * (gokturk413) fix(native): licence needs a positive marker; a hard lock only clears via a verified licence
543
+ * (gokturk413) fix(native)!: audit_usage verifies the licence KEY itself, not a caller-supplied verdict
544
+
545
+ ### 1.124.0 (2026-07-07)
546
+ * (gokturk413) feat: (deep-fidelity) — P_Motor faceplate audited vs real .gfx: adds Stopped/NotRdy lamps, PermOK/NBPerm/Sim/MaintByp flags, Bypass+OvldNotify maint rows (all adapter-gated)
547
+
548
+ ### 1.123.0 (2026-07-07)
549
+ * (gokturk413) feat: (deep-fidelity) — PlantPAx-faithful SVG device symbols + adapter-data-gating
550
+
551
+ ### 1.122.0 (2026-07-07)
552
+ * (gokturk413) feat: (deep-fidelity) — P_AIn alarm-bar uses real Rockwell command-button PNGs (Cmd_AlmAck / Cmd_AlmAckAllReset / Cmd_Reset) instead of text buttons. Verified live: 3 real PNG command buttons
553
+
554
+ ### 1.121.0 (2026-07-07)
555
+ * (gokturk413) feat: (deep-fidelity) — alarm-row uses REAL Rockwell PNG icons (data-URI)
556
+
557
+ ### 1.120.0 (2026-07-07)
558
+ * (gokturk413) feat: (wave B) — +8 device types (P_ValveMO/ValveMP/nPos/Motor2Spd/Dose/HiLoSel/DBC/Logic) via data-driven _dev_faceplate + real AOI members extracted from L5X; typeToTag/slug/seeds. Generic-convention faceplates (deep .gfx fidelity to follow)
559
+
560
+ ### 1.119.0 (2026-07-07)
561
+ * (gokturk413) feat: (wave B start) — new types P_DIn + P_DOut (Discrete I/O)
562
+
563
+ ### 1.118.0 (2026-07-07)
564
+ * (gokturk413) feat: (wave A COMPLETE) — Valves/PIDE/Infra verified on real tab model + members
565
+
566
+ ### 1.115.0 (2026-07-07)
567
+ * (gokturk413) feat: (wave A) — Motors group (P_Motor/P_MotorRev/P_VSD): labeled Home/Maint/Alarm tabs + real members (Sts_Running, OCmd_Start...). Shared _dev_faceplate tab-strip now Home+labeled, positioning Valves/PIDE/Infra for Tasks 8-10.
568
+
569
+ ### 1.114.4 (2026-07-07)
570
+ * (gokturk413) feat: (wave A) — P_AIn Engineering (Advanced) matches the mockup: PV Source & Quality checkboxes + Substitute PV value + Filtering & Thresholds (Fail Hi/Lo, PV decimals) all with real member labels; _cfg_row helper + cfgmem styling; pvDecPlcs seed/meta
571
+
572
+ ### 1.114.3 (2026-07-07)
573
+ * (gokturk413) feat: (wave A) — alarm-row shows real member labels (HiHi.Alm · HiHi.Ack) + severity-tier colours (HiHi/LoLo/Fail red, Hi/Lo amber) matching the mockup
574
+
575
+ ### 1.114.2 (2026-07-06)
576
+ * (gokturk413) feat: (wave A) — P_AIn real device-state flags: Sim (Inp_Sim), Maint Byp (Sts_MaintByp), Substitute, Input Fail on Home tab; seed+meta for sim/simPvSet/maintByp/oos
577
+
578
+ ### 1.114.1 (2026-07-06)
579
+ * (gokturk413) fix: (wave A) — P_AIn faceplate visual fidelity to mockup: labeled tabs (Home/Maint/Diag/Alarm/Trend), description line, Range/Substitute rows, clean card styling (header/tab-underline/kv-rows/flag-pills)
580
+
581
+ ### 1.114.0 (2026-07-06)
582
+ * (gokturk413) feat: (wave A) — P_AIn symbol colours by threshold-status (Sts_*) to match the MAI + alarm objects; unacked badge tracks real alarm objects. P_AIn REFERENCE COMPLETE (acceptance gate passed vs live P_AIn_01)
583
+
584
+ ### 1.113.0 (2026-07-06)
585
+ * (gokturk413) feat: (wave A) — P_AIn faceplate rebuilt to real model: Home tab (vertical MAI + PV block + status-flags), Alarm tab composes alarm-row components, Engineering uses scaling-widget; tabs Home/Maintenance/Diagnostics/Alarm/Trend + Advanced
586
+
587
+ ### 1.112.0 (2026-07-06)
588
+ * (gokturk413) feat: (wave A) - scaling-widget (raw->EU config) + status-flag components
589
+
590
+ ### 1.111.0 (2026-07-06)
591
+ * (gokturk413) feat: (wave A) — alarm-row component: severity + UNACK/ACK'D/SHELVED/SUPPRESSED/DISABLED chip + ack/shelve buttons
592
+
593
+ ### 1.110.0 (2026-07-06)
594
+ * (gokturk413) feat: (wave A) — Moving Analog Indicator: vertical scale, PV fill + pointer with value, HiHi/Hi/Lo/LoLo flags with EU value labels, threshold colour
595
+
596
+ ### 1.109.0 (2026-07-06)
597
+ * (gokturk413) feat: (wave A) — hybrid canonical+member labels in PlantPAx Types editor; P_AIn seed verified vs real AOI members
598
+ * (gokturk413) fix: (wave A task1) — alarm meta labels match resolver (HiHi.Alm/.Ack nested); add threshold-status keys hiHiSts/hiSts/loSts/loLoSts -> Sts_* for MAI flags
599
+
600
+ ### 1.108.1 (2026-07-06)
601
+ * (gokturk413) fix: PlantPAx faceplate/symbol button wiring (imperative ppWireSymbol/ppWireHeader; remove broken @click=[[...]] which no-oped)
602
+
603
+ ### 1.108.0 (2026-07-06)
604
+ * (gokturk413) feat: (wave3 COMPLETE) — P_MotorRev/CmdSrc/Gate/Intlk/Perm/Alarm/Meta faceplates; all 13 PlantPAx types now shipped (symbol+faceplate each), all composed from 8 reusable wave-1 components; dual-adapter seeds for every type
605
+
606
+ ### 1.107.0 (2026-07-06)
607
+ * (gokturk413) feat: (wave3) — P_ValveC/P_ValveSO/P_PIDE/P_VSD faceplates via generic _dev_faceplate composing wave-1 components (level-bar+slider+lamps+buttons+sparkline); rich dual-adapter seeds
608
+
609
+ ### 1.106.0 (2026-07-06)
610
+ * (gokturk413) feat: (wave3 start) — P_Motor symbol + faceplate composed from wave-1 components (4 status-lamp + 2 command-button), P_Motor seed both adapters (15 members)
611
+
612
+ ### 1.105.0 (2026-07-06)
613
+ * (gokturk413) feat: (wave2) — PlantPAx Types editor as Ignition tag-browser tree (9 collapsible member categories: Process Value/Alarm Limits/Deadbands/Status/Ack/Commands/Scaling/Quality/Identity + counts + per-member test)
614
+
615
+ ### 1.104.1 (2026-07-06)
616
+ * (gokturk413) feat: enlarge faceplate popup (min-width 320->480, settings 520x600, roomier padding/font)
617
+
618
+ ### 1.104.0 (2026-07-06)
619
+ * (gokturk413) feat: enriched Alarms tab (unacked count + Ack All/Reset & Ack/Reset via OCmd_ResetAckAll/OCmd_Reset) + 3 alarm-cmd seed fields
620
+ * (gokturk413) feat: wave1 primitives — plantpax/components/{status-lamp,command-button} (reusable boolean indicator + secWriteState command button)
621
+ * (gokturk413) feat: wave1 input primitives — plantpax/components/{toggle-switch,radio-toggle,std-slider} (read+write via secWriteState, secCan-gated)
622
+ * (gokturk413) feat: wave1 tank BlockStyle symbol (fill level = PV%, alarm color, click->faceplate) — 8 reusable plantpax components total
623
+
624
+ ### 1.103.0 (2026-07-06)
625
+ * (gokturk413) feat: Flintium-style icon tab-strip (Main: Operator/Maintenance/Trends/Diagnostics/Alarms + gear->Advanced: Engineering/HMI/Faults) with Trends/Diagnostics/HMI/Faults panes
626
+
627
+ ### 1.102.0 (2026-07-06)
628
+ * (gokturk413) feat: real Flintium-style P_AIn faceplate (level-bar component, EU-scaled Moving Analog Indicator, Raw Input Scaling + PV Source/Quality Engineering tab, expanded seed 37 fields)
629
+ * (gokturk413) feat: add plantpax/components/sparkline (live mini-trend) + embed in P_AIn Operator
630
+
631
+ ### 1.100.0 (2026-07-05)
632
+ * (gokturk413) feat: PlantPAx faceplate popup host on IOB (mount/unmount, no display:none leak) + typeToTag
633
+ * (gokturk413) feat: PlantPAx generator + P_AIn symbol & 4-tab faceplate controls
634
+
635
+ ### 1.99.1 (2026-07-05)
636
+ * (gokturk413) fix: Security editor dock had no background (showed white/host-default)
637
+ * (gokturk413) feat: add PlantPAx type-mapping resolver with full AOI catalog seed data
638
+ * (gokturk413) feat: wire PlantPAx type resolver into IobrokerHandler (IOB) singleton
639
+ * (gokturk413) feat: add PlantPAx Types dock editor custom element
640
+ * (gokturk413) feat: register PlantPAx Types dock tab in AppShell + rebuild runtime bundle
641
+
642
+ ### 1.99.0 (2026-07-04)
643
+ * (gokturk413) feat: Area & Permissions dock (assign data-area/data-action per element)
644
+
645
+ ### 1.98.0 (2026-07-04)
646
+ * (gokturk413) feat: server-enforced permission writes (secWriteState), phase 2
647
+
648
+ ### 1.97.0 (2026-07-04)
649
+ * (gokturk413) feat: Security editor dock (Users / Areas / Actions matrix / Codes)
650
+
651
+ ### 1.96.0 (2026-07-04)
652
+ * (gokturk413) feat: PlantPAx-style permission system (codes/actions/areas), phase 1
653
+
654
+ ### 1.95.1 (2026-07-04)
655
+ * (gokturk413) fix: multi-view injected elements now honor visibility conditions
656
+
657
+ ### 1.95.0 (2026-07-04)
658
+ * (gokturk413) fix: Monaco drag crash guard + all npm packages editable in Translations dock
659
+
660
+ ### 1.94.3 (2026-07-04)
661
+ * (gokturk413) fix: multi-view selections were not persisted (raw element writes)
662
+
663
+ ### 1.94.2 (2026-07-04)
664
+ * (gokturk413) fix: alarm viewers: designer instance also lacks _getDomElements + null-safe template exprs
665
+
666
+ ### 1.94.1 (2026-07-03)
667
+ * (gokturk413) fix: designer script errors in control editor (missing control APIs)
668
+
669
+ ### 1.94.0 (2026-07-03)
670
+ * (gokturk413) feat: alarm-history-viewer control (declarative, native datetime range)
671
+
672
+ ### 1.93.0 (2026-07-03)
673
+ * (gokturk413) feat: alarm-viewer control (Tabulator-free, declarative) + scoped-t fix
674
+
675
+ ### 1.92.0 (2026-07-03)
676
+ * (gokturk413) fix: translation modal keeps scope + migrate control groups to control-own dicts
677
+
678
+ ### 1.91.0 (2026-07-03)
679
+ * (gokturk413) feat: scoped translation system (control-own / npm-widget / project)
680
+
681
+ ### 1.90.0 (2026-07-03)
682
+ * (gokturk413) feat: Glass (glassmorphism) runtime theme + --ui-backdrop token
683
+
684
+ ### 1.89.0 (2026-07-03)
685
+ * (gokturk413) feat: modern themed logout control (pairs with user-badge)
686
+
687
+ ### 1.88.0 (2026-07-03)
688
+ * (gokturk413) feat: user-badge control: modern themed user chip for the app bar
689
+
690
+ ### 1.87.0 (2026-07-02)
691
+ * (gokturk413) feat: nav 'Auto (runtime theme)' preset + level_bar theme tokens
692
+
693
+ ### 1.86.0 (2026-07-02)
694
+ * (gokturk413) feat: theme-toggle control: segmented icon pill (Auto | Light | Dark)
695
+
696
+ ### 1.85.0 (2026-07-02)
697
+ * (gokturk413) fix: theme tokens in inline-style/script controls (scada_point_panel, input_with_button, TextViewer)
698
+
699
+ ### 1.84.0 (2026-07-02)
700
+ * (gokturk413) feat: linear-gauge rebuilt fully declarative (colored scale + pointer, zero render-JS)
701
+
702
+ ### 1.83.0 (2026-07-02)
703
+ * (gokturk413) feat: semantic theme tokens (--ui-ok/warn/error/info) + map control chrome/status colors to theme tokens
704
+
705
+ ### 1.82.0 (2026-07-02)
706
+ * (gokturk413) feat: user-definable themes via Global Style (CSS data-attribute model)
707
+
708
+ ### 1.81.0 (2026-07-02)
709
+ * (gokturk413) fix: linear-gauge reactivity + enum dropdowns + vertical min-tick
710
+
711
+ ### 1.80.0 (2026-07-02)
712
+ * (gokturk413) feat: runtime theme system + theme-selector control
713
+
714
+ ### 1.79.0 (2026-07-02)
715
+ * (gokturk413) feat: new mywebui adapter logo (gradient tech mark + wordmark)
716
+
717
+ ### 1.78.0 (2026-07-02)
718
+ * (gokturk413) fix: setpoint-gauge dark-runtime theming fallbacks
719
+
720
+ ### 1.77.0 (2026-07-02)
721
+ * (gokturk413) feat: setpoint-gauge control (thermostat-style, declarative bindings)
722
+
723
+ ### 1.76.0 (2026-07-02)
724
+ * (gokturk413) fix: theme the gauge controls via --ui-* tokens
725
+
726
+ ### 1.75.0 (2026-07-02)
727
+ * (gokturk413) feat: free linear-gauge + gauge-table controls (MODES-style)
728
+
729
+ ### 1.74.0 (2026-07-01)
730
+ * (gokturk413) fix: theme the designer context menu (was white/unreadable in dark themes)
731
+
732
+ ### 1.73.0 (2026-07-01)
733
+ * (gokturk413) feat: dedicated App Bar / Sidebar content editor
734
+
735
+ ### 1.72.0 (2026-07-01)
736
+ * (gokturk413) fix: settings-tab collapse arrows — right-aligned + bigger
737
+
738
+ ### 1.71.0 (2026-07-01)
739
+ * (gokturk413) feat: settings-tab menus — Layout collapsible, bigger arrows, collapsed by default
740
+
741
+ ### 1.70.0 (2026-07-01)
742
+ * (gokturk413) fix: theme the Multi-View dock like the other side panels
743
+
744
+ ### 1.69.0 (2026-07-01)
745
+ * (gokturk413) fix: multi-view panel — no duplicate + robust home-screen detection
746
+
747
+ ### 1.68.0 (2026-07-01)
748
+ * (gokturk413) feat: multi-view Stage 3 — ghost preview on target screens in the designer
749
+
750
+ ### 1.67.0 (2026-07-01)
751
+ * (gokturk413) feat: multi-view — show one element on multiple screens (vis-style)
752
+
753
+ ### 1.65.0 (2026-07-01)
754
+ * (gokturk413) feat: per-screen transition + fix screen-access disable sync + collapsible settings menus
755
+
756
+ ### 1.64.0 (2026-07-01)
757
+ * (gokturk413) fix: guard adoptedStyleSheets when control uses global style but none exists
758
+
759
+ ### 1.63.0 (2026-07-01)
760
+ * (gokturk413) feat: whenScreenReady() + screen-ready event + configurable screen transition
761
+
762
+ ### 1.62.0 (2026-06-30)
763
+ * (gokturk413) feat: delete slot items in nav app-bar/sidebar from the designer
764
+
765
+ ### 1.61.0 (2026-06-30)
766
+ * (gokturk413) feat: navigation/app-bar theme system + smooth hide-until-ready screen transitions
767
+
768
+ ### 1.60.0 (2026-06-30)
769
+ * (gokturk413) feat: navigation named slots for arbitrary controls (#3)
770
+
771
+ ### 1.59.0 (2026-06-30)
772
+ * (gokturk413) feat: navigation designer preview chrome (#2)
773
+
774
+ ### 1.58.0 (2026-06-30)
775
+ * (gokturk413) feat: modern-sidebar look for nav controls (#4)
776
+
777
+ ### 1.57.0 (2026-06-30)
778
+ * (gokturk413) feat: navigation live re-render on save (#1)
779
+
780
+ ### 1.56.1 (2026-06-30)
781
+ * (gokturk413) feat: nav menu-item/app-bar icons resolve relative project image paths
782
+
783
+ ### 1.56.0 (2026-06-30)
784
+ * (gokturk413) feat: Navigation Phase 2 — editable nav/app-bar custom controls + runtime mounter
785
+
786
+ ### 1.55.0 (2026-06-30)
787
+ * (gokturk413) feat: Navigation + Application Bar settings (Phase 1 — config UI + data model)
788
+
789
+ ### 1.54.1 (2026-06-30)
790
+ * (gokturk413) fix: Global Script editor threw 'IobrokerWebuiMonacoEditor is not defined'
791
+
792
+ ### 1.54.0 (2026-06-29)
793
+ * (gokturk413) feat: enable Global Script node (startup init() module) in the tree
794
+
795
+ ### 1.53.3 (2026-06-29)
796
+ * (gokturk413) fix: prover control drops at a normal size and scales on resize
797
+
798
+ ### 1.53.2 (2026-06-28)
799
+ * (gokturk413) fix: flow-line tool draws straight orthogonal segments (no freehand wavy)
800
+
801
+ ### 1.53.1 (2026-06-28)
802
+ * (gokturk413) fix: tee — thin centered bands (white space) + pipesize property so it snaps to pipes
803
+
804
+ ### 1.53.0 (2026-06-28)
805
+ * (gokturk413) feat: SCADA flow-line tool — dedicated toolbar button for orthogonal multi-segment polylines
806
+
807
+ ### 1.52.3 (2026-06-28)
808
+ * (gokturk413) feat: use the real tee artwork (4 teeTypes) in the tee control, not combined H+V pipes
809
+
810
+ ### 1.52.2 (2026-06-28)
811
+ * (gokturk413) fix: tee pipe square-tile geometry (generated in its script) so it tiles too
812
+
813
+ ### 1.52.1 (2026-06-28)
814
+ * (gokturk413) fix: smooth pipe gradient (linear straights + radial curves) instead of layered strokes
815
+
816
+ ### 1.52.0 (2026-06-28)
817
+ * (gokturk413) feat: pipe magnet-snap in the designer (edge snap + green indicator)
818
+
819
+ ### 1.51.0 (2026-06-28)
820
+ * (gokturk413) feat: normalize pipe controls to a unified square-tile model (vis-style mouth-to-mouth tiling)
821
+
822
+ ### 1.50.1 (2026-06-28)
823
+ * (gokturk413) fix: add VisibilityService.applyVisibility — custom controls threw on connect
824
+
825
+ ### 1.50.0 (2026-06-28)
826
+ * (gokturk413) feat: embedded (elementless) screen-layout tabs — flex-like, no webui-tab-container in code
827
+
828
+ ### 1.49.3 (2026-06-27)
829
+ * (gokturk413) feat: drop controls into the active tab pane (TabContainerPlacementService)
830
+
831
+ ### 1.49.2 (2026-06-26)
832
+ * (gokturk413) feat: rich Tabs editor inside the Properties tab (Tabs Layout group), revert broken dock mount
833
+
834
+ ### 1.49.1 (2026-06-26)
835
+ * (gokturk413) feat: show Layout/Tabs UI in the Properties dock too (split/tabs screens + controls)
836
+
837
+ ### 1.49.0 (2026-06-26)
838
+ * (gokturk413) feat: tabs designer rework — embedded (non-deletable/movable) container, tab add/remove/active UI, tab-position
839
+
840
+ ### 1.48.0 (2026-06-26)
841
+ * (gokturk413) fix(layout): strip stale generated split/tab container when type switched to flex/grid/none (save + runtime defensive) - fixes flex/grid props doing nothing after split->flex
842
+
843
+ ### 1.47.0 (2026-06-26)
844
+ * (gokturk413) feat(layout): alignment guides - red helper lines when a dragged element's edges/center align with siblings (designer + control editor)
845
+
846
+ ### 1.46.0 (2026-06-26)
847
+ * (gokturk413) feat(layout): penpot-style canvas grid overlay - track lines + draggable resize handles (live, writes settings.layout)
848
+ * (gokturk413) feat(layout): flex layout guides overlay (direction arrow + align/justify label)
849
+
850
+ ### 1.45.0 (2026-06-26)
851
+ * (gokturk413) feat: BroadcastChannel cross-tab command delivery (sync source with shipped bundle)
852
+ * (gokturk413) feat(layout): Phase 3 runtime - generate split/tabs container from settings.layout (saved html = panes only)
853
+ * (gokturk413) feat(layout): Layout panel uses the visual button-group UI (flex direction/align/justify/wrap icons, split orientation, type) like the webui-flex-container 'Flex Layout' editor
854
+ * (gokturk413) feat(layout): Phase 3 designer - split/tabs wrap-on-load + unwrap-on-save (panes-only html + metadata, container never saved/deletable; stable round-trip)
855
+
856
+ ### 1.44.2 (2026-06-26)
857
+ * (gokturk413) fix: guard disconnectedCallback dispose + resilient for:/repeat: cleanup
858
+ * (gokturk413) feat(layout): add layoutToStyle/applyLayoutStyle mapper
859
+ * (gokturk413) feat(layout): runtime applies settings.layout to ScreenViewer root host
860
+ * (gokturk413) feat(layout): designer applies settings.layout to canvas root host
861
+ * (gokturk413) feat(layout): picker returns metadata; new screen/control/global seed settings.layout
862
+ * (gokturk413) feat(layout): Layout panel in Settings tab (live edit, type/flex/grid)
863
+ * (gokturk413) feat(layout): Convert-to-layout for legacy flex-container roots (project + global)
864
+ * (gokturk413) feat(layout): custom controls apply their settings.layout to host at runtime
865
+ * (gokturk413) feat: add 'Remove HabPanel Style' action + dedupe Add; broadcast refresh on global style change
866
+ * (gokturk413) feat(layout): Phase 2 - interactive grid track editor (per-track value+unit fr/px/%/auto, add/remove) in Layout panel
867
+
868
+ ### 1.44.1 (2026-06-25)
869
+ * (gokturk413) fix: for: loop never rendered elements due to shared oldValuesSymbol conflict
870
+
871
+ ### 1.44.0 (2026-06-25)
872
+ * (gokturk413) feat: advanced template directives, eval→new Function, repeat binding fix
873
+
874
+ ### 1.43.1 (2026-06-25)
875
+ * (gokturk413) perf: 3D gallery renders single control only, never folders/screens
876
+ * (gokturk413) feat: for:/repeat: loop var as element prop, new directives, npm fixes
877
+ * (gokturk413) fix: revert www/node_modules/ npm exclusion (needed for runtime - GSAP/Monaco/Three)
878
+
305
879
  ### 1.43.0 (2026-06-25)
306
880
  * (gokturk413) fix: screen access control now syncs in **real time** across all surfaces — unchecking a group in the global Permissions dialog instantly clears "Access Denied" on open runtime windows (`uiRefresh` broadcast)
307
881
  * (gokturk413) fix: backend honours `visibilityEnabled` / `accessibility.enabled` — a disabled restriction with a stale group list no longer keeps blocking
@@ -1 +1 @@
1
- {"html":"<div id=\"reportSelectorContainer\" style=\"width:100%;height:100%;display:flex;align-items:center;gap:12px;padding:16px;border-radius:8px;\">\n <button id=\"btn1\" class=\"report-btn\" style=\"flex:1;cursor:pointer;border-radius:8px;font-size:15px;font-weight:600;box-shadow:0 2px 4px rgba(0,0,0,0.1);transition:0.3s;border:2px solid;padding:14px 20px;\">SnapShot Report</button>\n <button id=\"btn2\" class=\"report-btn\" style=\"flex:1;cursor:pointer;border-radius:8px;font-size:15px;font-weight:600;box-shadow:0 2px 4px rgba(0,0,0,0.1);transition:0.3s;border:2px solid;padding:14px 20px;\">Daily Report</button>\n <button id=\"btn3\" class=\"report-btn\" style=\"flex:1;cursor:pointer;border-radius:8px;font-size:15px;font-weight:600;box-shadow:0 2px 4px rgba(0,0,0,0.1);transition:0.3s;border:2px solid;padding:14px 20px;\">Hourly Report</button>\n <button id=\"btn4\" class=\"report-btn\" style=\"flex:1;cursor:pointer;border-radius:8px;font-size:15px;font-weight:600;box-shadow:0 2px 4px rgba(0,0,0,0.1);transition:0.3s;border:2px solid;padding:14px 20px;\">Prover Report</button>\n</div>\n","style":":host {\n display: block;\n width: 100%;\n}\n\n.report-btn:hover:not(.active) {\n transform: translateY(-2px);\n box-shadow: 0 4px 12px rgba(0,0,0,0.15);\n}\n\n.report-btn:active {\n transform: scale(0.98);\n}\n\n.report-btn.active {\n transform: translateY(-2px) scale(1.02);\n box-shadow: 0 6px 20px rgba(0,0,0,0.25);\n font-weight: 700;\n}\n","script":"/**\n * @param {BaseScreenViewerAndControl} instance\n */\nexport function init(instance) {\n const btn1 = instance._getDomElement('btn1');\n const btn2 = instance._getDomElement('btn2');\n const btn3 = instance._getDomElement('btn3');\n const btn4 = instance._getDomElement('btn4');\n const container = instance._getDomElement('reportSelectorContainer');\n\n const buttons = [btn1, btn2, btn3, btn4];\n let currentIndex = parseInt(instance.activeButton) || 1;\n let currentTheme = instance.theme || 'default';\n\n // Button mətnlərini yeniləyirik\n if (instance.button1Text) btn1.textContent = instance.button1Text;\n if (instance.button2Text) btn2.textContent = instance.button2Text;\n if (instance.button3Text) btn3.textContent = instance.button3Text;\n if (instance.button4Text) btn4.textContent = instance.button4Text;\n\n // İlk theming və active button\n applyTheming(instance, currentTheme);\n setActiveButton(currentIndex);\n loadReport(currentIndex);\n\n // Button click event-ləri\n buttons.forEach((btn, index) => {\n btn.addEventListener('click', () => {\n const btnIndex = index + 1;\n setActiveButton(btnIndex);\n loadReport(btnIndex);\n });\n });\n\n function applyTheming(inst, theme) {\n const themes = {\n 'default': {\n containerBg: '#f5f5f5',\n btnBg: '#ffffff',\n btnText: '#2d3436',\n btnBorder: '#dfe6e9',\n activeBg: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',\n activeText: '#ffffff',\n activeBorder: '#667eea'\n },\n 'dark': {\n containerBg: '#2d3436',\n btnBg: '#636e72',\n btnText: '#dfe6e9',\n btnBorder: '#000000',\n activeBg: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',\n activeText: '#ffffff',\n activeBorder: '#667eea'\n },\n 'light': {\n containerBg: '#ffffff',\n btnBg: '#f8f9fa',\n btnText: '#212529',\n btnBorder: '#dee2e6',\n activeBg: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',\n activeText: '#ffffff',\n activeBorder: '#667eea'\n },\n 'blue': {\n containerBg: '#dfe6e9',\n btnBg: '#ffffff',\n btnText: '#0984e3',\n btnBorder: '#74b9ff',\n activeBg: 'linear-gradient(135deg, #0984e3 0%, #0652DD 100%)',\n activeText: '#ffffff',\n activeBorder: '#0984e3'\n },\n 'green': {\n containerBg: '#d4f1e8',\n btnBg: '#ffffff',\n btnText: '#00b894',\n btnBorder: '#55efc4',\n activeBg: 'linear-gradient(135deg, #00b894 0%, #00a878 100%)',\n activeText: '#ffffff',\n activeBorder: '#00b894'\n },\n 'red': {\n containerBg: '#ffcccc',\n btnBg: '#ffffff',\n btnText: '#d63031',\n btnBorder: '#ff7675',\n activeBg: 'linear-gradient(135deg, #d63031 0%, #c0392b 100%)',\n activeText: '#ffffff',\n activeBorder: '#d63031'\n },\n 'purple': {\n containerBg: '#e5dbff',\n btnBg: '#ffffff',\n btnText: '#6c5ce7',\n btnBorder: '#a29bfe',\n activeBg: 'linear-gradient(135deg, #6c5ce7 0%, #5f27cd 100%)',\n activeText: '#ffffff',\n activeBorder: '#6c5ce7'\n }\n };\n\n const colors = themes[theme] || themes['default'];\n\n // Container\n if (container) {\n container.style.background = colors.containerBg;\n }\n\n // Buttons - inactive state\n buttons.forEach(btn => {\n if (btn && !btn.classList.contains('active')) {\n btn.style.background = colors.btnBg;\n btn.style.color = colors.btnText;\n btn.style.borderColor = colors.btnBorder;\n }\n });\n\n // Store colors for active state\n inst._themeColors = colors;\n\n // Re-apply active button styling\n setActiveButton(currentIndex);\n }\n\n function setActiveButton(index) {\n currentIndex = index;\n const colors = instance._themeColors || {\n btnBg: '#ffffff',\n btnText: '#2d3436',\n btnBorder: '#dfe6e9',\n activeBg: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',\n activeText: '#ffffff',\n activeBorder: '#667eea'\n };\n\n buttons.forEach((btn, i) => {\n if (i + 1 === index) {\n btn.classList.add('active');\n btn.style.background = colors.activeBg;\n btn.style.color = colors.activeText;\n btn.style.borderColor = colors.activeBorder;\n } else {\n btn.classList.remove('active');\n btn.style.background = colors.btnBg;\n btn.style.color = colors.btnText;\n btn.style.borderColor = colors.btnBorder;\n }\n });\n }\n\n function loadReport(index) {\n const reportStates = [instance.reportState1, instance.reportState2, instance.reportState3, instance.reportState4];\n const outputStates = [instance.btn1Output, instance.btn2Output, instance.btn3Output, instance.btn4Output];\n const sourceState = reportStates[index - 1];\n const targetState = outputStates[index - 1];\n if (!sourceState || !targetState) {\n console.warn('ReportSelector: Source or target state not configured');\n return;\n }\n window.IOB.getState(sourceState).then(state => {\n if (state && state.val !== null && state.val !== undefined) {\n window.IOB.setState(targetState, state.val); console.log('ReportSelector: Written to', targetState);\n }\n else {\n console.warn('ReportSelector: No data in source state:', sourceState);\n window.IOB.setState(targetState, 'No report data available');\n }\n }).catch(err => {\n console.error('ReportSelector: Error loading report:', err);\n window.IOB.setState(targetState, 'Error: ' + err.message);\n });\n }\n\n // Source state-dən məlumatı oxuyuruq\n window.IOB.getState(sourceState).then(state => {\n if (state && state.val !== null && state.val !== undefined) {\n const data = state.val;\n\n // Hər 4 target state-ə yazırıq\n targetStates.forEach((targetState, i) => {\n if (targetState) {\n window.IOB.setState(targetState, data);\n console.log(`ReportSelector: Written to output ${i + 1}:`, targetState);\n }\n });\n\n // Əgər outputState (legacy) varsa ona da yazırıq\n if (instance.outputState) {\n window.IOB.setState(instance.outputState, data);\n }\n } else {\n console.warn('ReportSelector: No data in source state:', sourceState);\n // Boş məlumat da yazırıq\n targetStates.forEach(targetState => {\n if (targetState) {\n window.IOB.setState(targetState, 'No report data available');\n }\n });\n }\n }).catch(err => {\n console.error('ReportSelector: Error loading report:', err);\n targetStates.forEach(targetState => {\n if (targetState) {\n window.IOB.setState(targetState, 'Error loading report: ' + err.message);\n }\n });\n });\n\n // Property dəyişiklikləri üçün event-lər\ninstance._assignEvent('button1-text-changed', () => {\n if (btn1) btn1.textContent = instance.button1Text || 'Report 1';\n});\n\ninstance._assignEvent('button2-text-changed', () => {\n if (btn2) btn2.textContent = instance.button2Text || 'Report 2';\n});\n\ninstance._assignEvent('button3-text-changed', () => {\n if (btn3) btn3.textContent = instance.button3Text || 'Report 3';\n});\n\ninstance._assignEvent('button4-text-changed', () => {\n if (btn4) btn4.textContent = instance.button4Text || 'Report 4';\n});\n\ninstance._assignEvent('active-button-changed', () => {\n const newIndex = parseInt(instance.activeButton) || 1;\n setActiveButton(newIndex);\n loadReport(newIndex);\n});\n\ninstance._assignEvent('theme-changed', () => {\n currentTheme = instance.theme || 'default';\n applyTheming(instance, currentTheme);\n});\n}\n\n\n/**\n * @param {BaseScreenViewerAndControl} instance\n */\nexport function disconnectedCallback(instance) {\n // Cleanup if needed\n}\n","properties":{"reportState1":{"type":"ioBrokerObject"},"reportState2":{"type":"ioBrokerObject"},"reportState3":{"type":"ioBrokerObject"},"reportState4":{"type":"ioBrokerObject"},"btn1Output":{"type":"ioBrokerObject"},"btn2Output":{"type":"ioBrokerObject"},"btn3Output":{"type":"ioBrokerObject"},"btn4Output":{"type":"ioBrokerObject"},"button1Text":{"type":"string","default":"SnapShot Report"},"button2Text":{"type":"string","default":"Daily Report"},"button3Text":{"type":"string","default":"Hourly Report"},"button4Text":{"type":"string","default":"Prover Report"},"activeButton":{"type":"string","default":"1"},"theme":{"type":"enum","default":"default","values":["default","dark","light","blue","green","red","purple"]}},"settings":{"width":"auto","height":"60px","visibilityEnabled":"false","visibilityGroups":"","visibilityAction":"hide","visibilityRedirectScreen":""}}
1
+ {"html":"<div id=\"reportSelectorContainer\" style=\"box-sizing:border-box;width:100%;height:100%;display:flex;align-items:center;gap:12px;padding:16px;border-radius:8px;\">\n <button id=\"btn1\" class=\"report-btn\" style=\"flex:1;cursor:pointer;border-radius:8px;font-size:15px;font-weight:600;box-shadow:0 2px 4px rgba(0,0,0,0.1);transition:0.3s;border:2px solid;padding:14px 20px;\">SnapShot Report</button>\n <button id=\"btn2\" class=\"report-btn\" style=\"flex:1;cursor:pointer;border-radius:8px;font-size:15px;font-weight:600;box-shadow:0 2px 4px rgba(0,0,0,0.1);transition:0.3s;border:2px solid;padding:14px 20px;\">Daily Report</button>\n <button id=\"btn3\" class=\"report-btn\" style=\"flex:1;cursor:pointer;border-radius:8px;font-size:15px;font-weight:600;box-shadow:0 2px 4px rgba(0,0,0,0.1);transition:0.3s;border:2px solid;padding:14px 20px;\">Hourly Report</button>\n <button id=\"btn4\" class=\"report-btn\" style=\"flex:1;cursor:pointer;border-radius:8px;font-size:15px;font-weight:600;box-shadow:0 2px 4px rgba(0,0,0,0.1);transition:0.3s;border:2px solid;padding:14px 20px;\">Prover Report</button>\n</div>\n","style":":host {\n display: block;\n width: 100%;\n}\n\n.report-btn:hover:not(.active) {\n transform: translateY(-2px);\n box-shadow: 0 4px 12px rgba(0,0,0,0.15);\n}\n\n.report-btn:active {\n transform: scale(0.98);\n}\n\n.report-btn.active {\n transform: translateY(-2px) scale(1.02);\n box-shadow: 0 6px 20px rgba(0,0,0,0.25);\n font-weight: 700;\n}\n","script":"/**\n * @param {BaseScreenViewerAndControl} instance\n */\nexport function init(instance) {\n const btn1 = instance._getDomElement('btn1');\n const btn2 = instance._getDomElement('btn2');\n const btn3 = instance._getDomElement('btn3');\n const btn4 = instance._getDomElement('btn4');\n const container = instance._getDomElement('reportSelectorContainer');\n\n const buttons = [btn1, btn2, btn3, btn4];\n let currentIndex = parseInt(instance.activeButton) || 1;\n let currentTheme = instance.theme || 'default';\n\n // Button mətnlərini yeniləyirik\n if (instance.button1Text) btn1.textContent = instance.button1Text;\n if (instance.button2Text) btn2.textContent = instance.button2Text;\n if (instance.button3Text) btn3.textContent = instance.button3Text;\n if (instance.button4Text) btn4.textContent = instance.button4Text;\n\n // İlk theming və active button\n applyTheming(instance, currentTheme);\n setActiveButton(currentIndex);\n loadReport(currentIndex);\n\n // Button click event-ləri\n buttons.forEach((btn, index) => {\n btn.addEventListener('click', () => {\n const btnIndex = index + 1;\n setActiveButton(btnIndex);\n loadReport(btnIndex);\n });\n });\n\n function applyTheming(inst, theme) {\n const themes = {\n 'default': {\n containerBg: '#f5f5f5',\n btnBg: '#ffffff',\n btnText: '#2d3436',\n btnBorder: '#dfe6e9',\n activeBg: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',\n activeText: '#ffffff',\n activeBorder: '#667eea'\n },\n 'dark': {\n containerBg: '#2d3436',\n btnBg: '#636e72',\n btnText: '#dfe6e9',\n btnBorder: '#000000',\n activeBg: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',\n activeText: '#ffffff',\n activeBorder: '#667eea'\n },\n 'light': {\n containerBg: '#ffffff',\n btnBg: '#f8f9fa',\n btnText: '#212529',\n btnBorder: '#dee2e6',\n activeBg: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',\n activeText: '#ffffff',\n activeBorder: '#667eea'\n },\n 'blue': {\n containerBg: '#dfe6e9',\n btnBg: '#ffffff',\n btnText: '#0984e3',\n btnBorder: '#74b9ff',\n activeBg: 'linear-gradient(135deg, #0984e3 0%, #0652DD 100%)',\n activeText: '#ffffff',\n activeBorder: '#0984e3'\n },\n 'green': {\n containerBg: '#d4f1e8',\n btnBg: '#ffffff',\n btnText: '#00b894',\n btnBorder: '#55efc4',\n activeBg: 'linear-gradient(135deg, #00b894 0%, #00a878 100%)',\n activeText: '#ffffff',\n activeBorder: '#00b894'\n },\n 'red': {\n containerBg: '#ffcccc',\n btnBg: '#ffffff',\n btnText: '#d63031',\n btnBorder: '#ff7675',\n activeBg: 'linear-gradient(135deg, #d63031 0%, #c0392b 100%)',\n activeText: '#ffffff',\n activeBorder: '#d63031'\n },\n 'purple': {\n containerBg: '#e5dbff',\n btnBg: '#ffffff',\n btnText: '#6c5ce7',\n btnBorder: '#a29bfe',\n activeBg: 'linear-gradient(135deg, #6c5ce7 0%, #5f27cd 100%)',\n activeText: '#ffffff',\n activeBorder: '#6c5ce7'\n }\n };\n\n const colors = themes[theme] || themes['default'];\n\n // Container\n if (container) {\n container.style.background = colors.containerBg;\n }\n\n // Buttons - inactive state\n buttons.forEach(btn => {\n if (btn && !btn.classList.contains('active')) {\n btn.style.background = colors.btnBg;\n btn.style.color = colors.btnText;\n btn.style.borderColor = colors.btnBorder;\n }\n });\n\n // Store colors for active state\n inst._themeColors = colors;\n\n // Re-apply active button styling\n setActiveButton(currentIndex);\n }\n\n function setActiveButton(index) {\n currentIndex = index;\n const colors = instance._themeColors || {\n btnBg: '#ffffff',\n btnText: '#2d3436',\n btnBorder: '#dfe6e9',\n activeBg: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',\n activeText: '#ffffff',\n activeBorder: '#667eea'\n };\n\n buttons.forEach((btn, i) => {\n if (i + 1 === index) {\n btn.classList.add('active');\n btn.style.background = colors.activeBg;\n btn.style.color = colors.activeText;\n btn.style.borderColor = colors.activeBorder;\n } else {\n btn.classList.remove('active');\n btn.style.background = colors.btnBg;\n btn.style.color = colors.btnText;\n btn.style.borderColor = colors.btnBorder;\n }\n });\n }\n\n function loadReport(index) {\n const reportStates = [instance.reportState1, instance.reportState2, instance.reportState3, instance.reportState4];\n const outputStates = [instance.btn1Output, instance.btn2Output, instance.btn3Output, instance.btn4Output];\n const sourceState = reportStates[index - 1];\n const targetState = outputStates[index - 1];\n if (!sourceState || !targetState) {\n console.warn('ReportSelector: Source or target state not configured');\n return;\n }\n window.IOB.getState(sourceState).then(state => {\n if (state && state.val !== null && state.val !== undefined) {\n window.IOB.setState(targetState, state.val); console.log('ReportSelector: Written to', targetState);\n }\n else {\n console.warn('ReportSelector: No data in source state:', sourceState);\n window.IOB.setState(targetState, 'No report data available');\n }\n }).catch(err => {\n console.error('ReportSelector: Error loading report:', err);\n window.IOB.setState(targetState, 'Error: ' + err.message);\n });\n }\n\n // Source state-dən məlumatı oxuyuruq\n window.IOB.getState(sourceState).then(state => {\n if (state && state.val !== null && state.val !== undefined) {\n const data = state.val;\n\n // Hər 4 target state-ə yazırıq\n targetStates.forEach((targetState, i) => {\n if (targetState) {\n window.IOB.setState(targetState, data);\n console.log(`ReportSelector: Written to output ${i + 1}:`, targetState);\n }\n });\n\n // Əgər outputState (legacy) varsa ona da yazırıq\n if (instance.outputState) {\n window.IOB.setState(instance.outputState, data);\n }\n } else {\n console.warn('ReportSelector: No data in source state:', sourceState);\n // Boş məlumat da yazırıq\n targetStates.forEach(targetState => {\n if (targetState) {\n window.IOB.setState(targetState, 'No report data available');\n }\n });\n }\n }).catch(err => {\n console.error('ReportSelector: Error loading report:', err);\n targetStates.forEach(targetState => {\n if (targetState) {\n window.IOB.setState(targetState, 'Error loading report: ' + err.message);\n }\n });\n });\n\n // Property dəyişiklikləri üçün event-lər\ninstance._assignEvent('button1-text-changed', () => {\n if (btn1) btn1.textContent = instance.button1Text || 'Report 1';\n});\n\ninstance._assignEvent('button2-text-changed', () => {\n if (btn2) btn2.textContent = instance.button2Text || 'Report 2';\n});\n\ninstance._assignEvent('button3-text-changed', () => {\n if (btn3) btn3.textContent = instance.button3Text || 'Report 3';\n});\n\ninstance._assignEvent('button4-text-changed', () => {\n if (btn4) btn4.textContent = instance.button4Text || 'Report 4';\n});\n\ninstance._assignEvent('active-button-changed', () => {\n const newIndex = parseInt(instance.activeButton) || 1;\n setActiveButton(newIndex);\n loadReport(newIndex);\n});\n\ninstance._assignEvent('theme-changed', () => {\n currentTheme = instance.theme || 'default';\n applyTheming(instance, currentTheme);\n});\n}\n\n\n/**\n * @param {BaseScreenViewerAndControl} instance\n */\nexport function disconnectedCallback(instance) {\n // Cleanup if needed\n}\n","properties":{"reportState1":{"type":"ioBrokerObject"},"reportState2":{"type":"ioBrokerObject"},"reportState3":{"type":"ioBrokerObject"},"reportState4":{"type":"ioBrokerObject"},"btn1Output":{"type":"ioBrokerObject"},"btn2Output":{"type":"ioBrokerObject"},"btn3Output":{"type":"ioBrokerObject"},"btn4Output":{"type":"ioBrokerObject"},"button1Text":{"type":"string","default":"SnapShot Report"},"button2Text":{"type":"string","default":"Daily Report"},"button3Text":{"type":"string","default":"Hourly Report"},"button4Text":{"type":"string","default":"Prover Report"},"activeButton":{"type":"string","default":"1"},"theme":{"type":"enum","default":"default","values":["default","dark","light","blue","green","red","purple"]}},"settings":{"width":"auto","height":"60px","visibilityEnabled":"false","visibilityGroups":"","visibilityAction":"hide","visibilityRedirectScreen":""}}