iobroker.mywebui 1.114.4 → 1.115.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.
- package/default-controls/controls/plantpax/alarm-faceplate.control +2 -2
- package/default-controls/controls/plantpax/cmdsrc-faceplate.control +2 -2
- package/default-controls/controls/plantpax/gate-faceplate.control +2 -2
- package/default-controls/controls/plantpax/intlk-faceplate.control +2 -2
- package/default-controls/controls/plantpax/motor-faceplate.control +2 -2
- package/default-controls/controls/plantpax/motorrev-faceplate.control +2 -2
- package/default-controls/controls/plantpax/perm-faceplate.control +2 -2
- package/default-controls/controls/plantpax/pide-faceplate.control +2 -2
- package/default-controls/controls/plantpax/valvec-faceplate.control +2 -2
- package/default-controls/controls/plantpax/valveso-faceplate.control +2 -2
- package/default-controls/controls/plantpax/vsd-faceplate.control +2 -2
- package/dist/backend/3d-editor-integration.js +1 -1
- package/dist/backend/ImportmapCreator.js +1 -1
- package/dist/backend/UploadHelper.js +1 -1
- package/dist/backend/main.js +1 -1
- package/io-package.json +1 -1
- package/package.json +1 -1
- package/scripts/_build_plantpax.py +12 -12
- package/www/3d-editor/js/Animation.js +1 -1
- package/www/3d-editor/js/AnimationResizer.js +1 -1
- package/www/3d-editor/js/Command.js +1 -1
- package/www/3d-editor/js/Config.js +1 -1
- package/www/3d-editor/js/Editor.js +1 -1
- package/www/3d-editor/js/EditorControls.js +1 -1
- package/www/3d-editor/js/GLTFImportDialog.js +1 -1
- package/www/3d-editor/js/History.js +1 -1
- package/www/3d-editor/js/Loader.js +1 -1
- package/www/3d-editor/js/LoaderUtils.js +1 -1
- package/www/3d-editor/js/Menubar.Add.js +1 -1
- package/www/3d-editor/js/Menubar.Edit.js +1 -1
- package/www/3d-editor/js/Menubar.File.js +1 -1
- package/www/3d-editor/js/Menubar.Help.js +1 -1
- package/www/3d-editor/js/Menubar.Render.js +1 -1
- package/www/3d-editor/js/Menubar.Status.js +1 -1
- package/www/3d-editor/js/Menubar.View.js +1 -1
- package/www/3d-editor/js/Menubar.js +1 -1
- package/www/3d-editor/js/Player.js +1 -1
- package/www/3d-editor/js/Resizer.js +1 -1
- package/www/3d-editor/js/Script.js +1 -1
- package/www/3d-editor/js/Selector.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.BoxGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.BufferGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.CapsuleGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.CircleGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.CylinderGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.DodecahedronGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.ExtrudeGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.IcosahedronGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.LatheGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.Modifiers.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.OctahedronGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.PlaneGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.RingGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.ShapeGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.SphereGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.TetrahedronGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.TextGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.TorusGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.TorusKnotGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.TubeGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Material.BooleanProperty.js +1 -1
- package/www/3d-editor/js/Sidebar.Material.ColorProperty.js +1 -1
- package/www/3d-editor/js/Sidebar.Material.ConstantProperty.js +1 -1
- package/www/3d-editor/js/Sidebar.Material.MapProperty.js +1 -1
- package/www/3d-editor/js/Sidebar.Material.NumberProperty.js +1 -1
- package/www/3d-editor/js/Sidebar.Material.Program.js +1 -1
- package/www/3d-editor/js/Sidebar.Material.RangeValueProperty.js +1 -1
- package/www/3d-editor/js/Sidebar.Material.js +1 -1
- package/www/3d-editor/js/Sidebar.Object.js +1 -1
- package/www/3d-editor/js/Sidebar.Project.App.js +1 -1
- package/www/3d-editor/js/Sidebar.Project.Materials.js +1 -1
- package/www/3d-editor/js/Sidebar.Project.Renderer.js +1 -1
- package/www/3d-editor/js/Sidebar.Project.Resources.js +1 -1
- package/www/3d-editor/js/Sidebar.Project.js +1 -1
- package/www/3d-editor/js/Sidebar.Properties.js +1 -1
- package/www/3d-editor/js/Sidebar.Scene.js +1 -1
- package/www/3d-editor/js/Sidebar.Script.js +1 -1
- package/www/3d-editor/js/Sidebar.Settings.History.js +1 -1
- package/www/3d-editor/js/Sidebar.Settings.Shortcuts.js +1 -1
- package/www/3d-editor/js/Sidebar.Settings.js +1 -1
- package/www/3d-editor/js/Sidebar.js +1 -1
- package/www/3d-editor/js/Storage.js +1 -1
- package/www/3d-editor/js/Strings.js +1 -1
- package/www/3d-editor/js/TextureParametersDialog.js +1 -1
- package/www/3d-editor/js/Toolbar.js +1 -1
- package/www/3d-editor/js/Viewport.Controls.js +1 -1
- package/www/3d-editor/js/Viewport.Info.js +1 -1
- package/www/3d-editor/js/Viewport.Pathtracer.js +1 -1
- package/www/3d-editor/js/Viewport.ViewHelper.js +1 -1
- package/www/3d-editor/js/Viewport.XR.js +1 -1
- package/www/3d-editor/js/Viewport.js +1 -1
- package/www/3d-editor/js/commands/AddObjectCommand.js +1 -1
- package/www/3d-editor/js/commands/AddScriptCommand.js +1 -1
- package/www/3d-editor/js/commands/Commands.js +1 -1
- package/www/3d-editor/js/commands/MoveObjectCommand.js +1 -1
- package/www/3d-editor/js/commands/MultiCmdsCommand.js +1 -1
- package/www/3d-editor/js/commands/RemoveObjectCommand.js +1 -1
- package/www/3d-editor/js/commands/RemoveScriptCommand.js +1 -1
- package/www/3d-editor/js/commands/SetColorCommand.js +1 -1
- package/www/3d-editor/js/commands/SetGeometryCommand.js +1 -1
- package/www/3d-editor/js/commands/SetGeometryValueCommand.js +1 -1
- package/www/3d-editor/js/commands/SetMaterialColorCommand.js +1 -1
- package/www/3d-editor/js/commands/SetMaterialCommand.js +1 -1
- package/www/3d-editor/js/commands/SetMaterialMapCommand.js +1 -1
- package/www/3d-editor/js/commands/SetMaterialRangeCommand.js +1 -1
- package/www/3d-editor/js/commands/SetMaterialValueCommand.js +1 -1
- package/www/3d-editor/js/commands/SetMaterialVectorCommand.js +1 -1
- package/www/3d-editor/js/commands/SetPositionCommand.js +1 -1
- package/www/3d-editor/js/commands/SetRotationCommand.js +1 -1
- package/www/3d-editor/js/commands/SetScaleCommand.js +1 -1
- package/www/3d-editor/js/commands/SetSceneCommand.js +1 -1
- package/www/3d-editor/js/commands/SetScriptValueCommand.js +1 -1
- package/www/3d-editor/js/commands/SetShadowValueCommand.js +1 -1
- package/www/3d-editor/js/commands/SetTextureParametersCommand.js +1 -1
- package/www/3d-editor/js/commands/SetUuidCommand.js +1 -1
- package/www/3d-editor/js/commands/SetValueCommand.js +1 -1
- package/www/dist/frontend/bundle/chunk-34JJK367.js +3 -3
- package/www/dist/frontend/bundle/chunk-3AS7GRBW.js +3 -3
- package/www/dist/frontend/bundle/chunk-3C6XC7RW.js +1 -1
- package/www/dist/frontend/bundle/chunk-3R27DWVW.js +2 -2
- package/www/dist/frontend/bundle/chunk-3WGNLIWJ.js +2 -2
- package/www/dist/frontend/bundle/chunk-3YK3Y2SJ.js +1 -1
- package/www/dist/frontend/bundle/chunk-43HEBO5G.js +2 -2
- package/www/dist/frontend/bundle/chunk-5MUGMRXU.js +1 -1
- package/www/dist/frontend/bundle/chunk-5UBRCTRX.js +2 -2
- package/www/dist/frontend/bundle/chunk-65A3PNMG.js +1 -1
- package/www/dist/frontend/bundle/chunk-66EU64WD.js +1 -1
- package/www/dist/frontend/bundle/chunk-6BL3X2VD.js +3 -3
- package/www/dist/frontend/bundle/chunk-6L2YCGEX.js +1 -1
- package/www/dist/frontend/bundle/chunk-7CWDQGAG.js +3 -3
- package/www/dist/frontend/bundle/chunk-7PT7IGUJ.js +3 -3
- package/www/dist/frontend/bundle/chunk-AI5PDLDE.js +3 -3
- package/www/dist/frontend/bundle/chunk-AUTVRE23.js +1 -1
- package/www/dist/frontend/bundle/chunk-AWKVUUKN.js +3 -3
- package/www/dist/frontend/bundle/chunk-B6NXWGSB.js +1 -1
- package/www/dist/frontend/bundle/chunk-BHSHNRXW.js +1 -1
- package/www/dist/frontend/bundle/chunk-BVONDEOL.js +3 -3
- package/www/dist/frontend/bundle/chunk-C7OGVQZC.js +1 -1
- package/www/dist/frontend/bundle/chunk-CHDKROX5.js +2 -2
- package/www/dist/frontend/bundle/chunk-DNCD2F6X.js +2 -2
- package/www/dist/frontend/bundle/chunk-FFW7WOVM.js +1 -1
- package/www/dist/frontend/bundle/chunk-FHF6DL5U.js +1 -1
- package/www/dist/frontend/bundle/chunk-FO56TEZH.js +3 -3
- package/www/dist/frontend/bundle/chunk-FRCSTZQC.js +3 -3
- package/www/dist/frontend/bundle/chunk-FSHAYPVR.js +3 -3
- package/www/dist/frontend/bundle/chunk-FSRRPQMX.js +3 -3
- package/www/dist/frontend/bundle/chunk-GLQNGCFL.js +1 -1
- package/www/dist/frontend/bundle/chunk-HC7GL5JY.js +1 -1
- package/www/dist/frontend/bundle/chunk-HXNIU7FI.js +3 -3
- package/www/dist/frontend/bundle/chunk-JBDSDK2C.js +3 -3
- package/www/dist/frontend/bundle/chunk-JSC66ZLQ.js +1 -1
- package/www/dist/frontend/bundle/chunk-JVPUFDR5.js +2 -2
- package/www/dist/frontend/bundle/chunk-K6IV7LKW.js +1 -1
- package/www/dist/frontend/bundle/chunk-KJU5I76S.js +3 -3
- package/www/dist/frontend/bundle/chunk-KY73TL6O.js +2 -2
- package/www/dist/frontend/bundle/chunk-LKS3S4WX.js +1 -1
- package/www/dist/frontend/bundle/chunk-M6VVTDVX.js +3 -3
- package/www/dist/frontend/bundle/chunk-MECWXZRN.js +1 -1
- package/www/dist/frontend/bundle/chunk-N2YIZTB2.js +1 -1
- package/www/dist/frontend/bundle/chunk-NQ7L7KNT.js +3 -3
- package/www/dist/frontend/bundle/chunk-O2AJL747.js +3 -3
- package/www/dist/frontend/bundle/chunk-P7EOR36H.js +1 -1
- package/www/dist/frontend/bundle/chunk-PJYK24KZ.js +1 -1
- package/www/dist/frontend/bundle/chunk-PYLAW6UA.js +2 -2
- package/www/dist/frontend/bundle/chunk-QJJGP23I.js +1 -1
- package/www/dist/frontend/bundle/chunk-QV4IBWXA.js +1 -1
- package/www/dist/frontend/bundle/chunk-R6IQDPAP.js +3 -3
- package/www/dist/frontend/bundle/chunk-RRFSEMFS.js +2 -2
- package/www/dist/frontend/bundle/chunk-RTTBZOQU.js +2 -2
- package/www/dist/frontend/bundle/chunk-S4TLNW5D.js +1 -1
- package/www/dist/frontend/bundle/chunk-S7P222YS.js +1 -1
- package/www/dist/frontend/bundle/chunk-SE6N4ZEN.js +1 -1
- package/www/dist/frontend/bundle/chunk-SQHXO2IT.js +3 -3
- package/www/dist/frontend/bundle/chunk-T4AIQBBH.js +2 -2
- package/www/dist/frontend/bundle/chunk-TWQQHCU7.js +3 -3
- package/www/dist/frontend/bundle/chunk-U5Q332OH.js +1 -1
- package/www/dist/frontend/bundle/chunk-UIP324PP.js +1 -1
- package/www/dist/frontend/bundle/chunk-V27IRYSL.js +1 -1
- package/www/dist/frontend/bundle/chunk-V4C5FGJL.js +3 -3
- package/www/dist/frontend/bundle/chunk-V5CHFTYG.js +2 -2
- package/www/dist/frontend/bundle/chunk-VHXWCBNP.js +1 -1
- package/www/dist/frontend/bundle/chunk-W2KWSW4M.js +1 -1
- package/www/dist/frontend/bundle/chunk-W5QV7JN5.js +1 -1
- package/www/dist/frontend/bundle/chunk-WED7CGWA.js +3 -3
- package/www/dist/frontend/bundle/chunk-WQ5H5LTG.js +2 -2
- package/www/dist/frontend/bundle/chunk-WU54NCEU.js +1 -1
- package/www/dist/frontend/bundle/chunk-XCRSZKUF.js +1 -1
- package/www/dist/frontend/bundle/chunk-XFO5FUCN.js +1 -1
- package/www/dist/frontend/bundle/chunk-XWAQ2BWM.js +3 -3
- package/www/dist/frontend/bundle/chunk-YTQCHNRQ.js +3 -3
- package/www/dist/frontend/bundle/chunk-YUSK4FN3.js +3 -3
- package/www/dist/frontend/bundle/chunk-Z34BSG5O.js +3 -3
- package/www/dist/frontend/bundle/common/IobrokerHandler.js +1 -1
- package/www/dist/frontend/bundle/runtime/CustomControls.js +1 -1
- package/www/dist/frontend/bundle/runtime/ScreenViewer.js +1 -1
- package/www/dist/frontend/bundle/runtime/controls.js +4 -4
- package/www/dist/frontend/bundle/runtime/init.js +3 -3
- package/www/dist/frontend/common/Common.globals.js +1 -1
- package/www/dist/frontend/common/IobrokerHandler.js +1 -1
- package/www/dist/frontend/common/PlantPaxResolve.js +1 -1
- package/www/dist/frontend/common/Runtime.js +1 -1
- package/www/dist/frontend/config/CommandHandling.js +1 -1
- package/www/dist/frontend/config/ConfigureWebcomponentDesigner.js +1 -1
- package/www/dist/frontend/config/DockHelper.js +1 -1
- package/www/dist/frontend/config/IobrokerWebui3DDriveEngine.js +1 -1
- package/www/dist/frontend/config/IobrokerWebui3DScreenEditor.js +2 -2
- package/www/dist/frontend/config/IobrokerWebui3DScreenPropertiesPanel.js +2 -2
- package/www/dist/frontend/config/IobrokerWebui3DScreenViewer.js +3 -3
- package/www/dist/frontend/config/IobrokerWebuiAppShell.js +3 -3
- package/www/dist/frontend/config/IobrokerWebuiBindingsEditor.js +1 -1
- package/www/dist/frontend/config/IobrokerWebuiConfirmationWrapper.js +3 -3
- package/www/dist/frontend/config/IobrokerWebuiControlPropertiesEditor.js +3 -3
- package/www/dist/frontend/config/IobrokerWebuiDynamicPropsEditor.js +1 -1
- package/www/dist/frontend/config/IobrokerWebuiEventAssignment.js +1 -1
- package/www/dist/frontend/config/IobrokerWebuiIconsView.js +2 -2
- package/www/dist/frontend/config/IobrokerWebuiMonacoEditor.js +3 -3
- package/www/dist/frontend/config/IobrokerWebuiPlantPaxTypesEditor.js +1 -1
- package/www/dist/frontend/config/IobrokerWebuiPropertyGrid.js +1 -1
- package/www/dist/frontend/config/IobrokerWebuiScreenEditor.js +1 -1
- package/www/dist/frontend/config/IobrokerWebuiScreensView.js +3 -3
- package/www/dist/frontend/config/IobrokerWebuiSecurityEditor.js +1 -1
- package/www/dist/frontend/config/IobrokerWebuiSignalPropertyEditor.js +1 -1
- package/www/dist/frontend/config/IobrokerWebuiSolutionExplorer.js +3 -3
- package/www/dist/frontend/config/IobrokerWebuiTranslationEditor.js +1 -1
- package/www/dist/frontend/config/IobrokerWebuiWidgetGallery.js +2 -2
- package/www/dist/frontend/helper/DialogHelper.js +2 -2
- package/www/dist/frontend/helper/EsprimaHelper.js +1 -1
- package/www/dist/frontend/helper/Helper.js +1 -1
- package/www/dist/frontend/helper/LayoutHelper.js +1 -1
- package/www/dist/frontend/helper/XmlHelper.js +1 -1
- package/www/dist/frontend/helper/ZipHelper.js +1 -1
- package/www/dist/frontend/runtime/AnimationService.js +1 -1
- package/www/dist/frontend/runtime/CustomControls.js +1 -1
- package/www/dist/frontend/runtime/DynamicElementProperties.js +1 -1
- package/www/dist/frontend/runtime/HabPanelLikeMenu.js +3 -3
- package/www/dist/frontend/runtime/NavigationShell.js +1 -1
- package/www/dist/frontend/runtime/RuntimeTheme.js +1 -1
- package/www/dist/frontend/runtime/ScreenViewer.js +2 -2
- package/www/dist/frontend/runtime/TranslateableText.js +2 -2
- package/www/dist/frontend/runtime/VisibilityService.js +1 -1
- package/www/dist/frontend/runtime/controls.js +1 -1
- package/www/dist/frontend/runtime/init.js +1 -1
- package/www/dist/frontend/scripting/IobrokerWebuiScriptSystem.js +1 -1
- package/www/dist/frontend/scripting/blockly/OpenScreen.js +1 -1
- package/www/dist/frontend/scripting/blockly/webuiBlocklyToolbox.js +1 -1
- package/www/dist/frontend/services/DynamicPropertiesHelper.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiBindableLocalObjectsService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiBindableObjectDragDropService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiBindableObjectsForPropertiesService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiBindableObjectsService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiConfigButtonProvider.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiCopyPasteService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiCustomControlEventsService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiCustomElementContextMenu.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiDemoProviderService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiDynamicPropertiesService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiEventsService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiExternalDragDropService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiLitPropertiesService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiPropertiesService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiPropertyGroupsService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiRefactorService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiScreenContextMenu.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiSpecialPropertiesService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiSpectrumEditorService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiVisibilityPropertiesService.js +1 -1
- package/www/dist/frontend/services/LayoutComponentsPropertiesService.js +1 -1
- package/www/dist/frontend/widgets/OrthoFlowLineTool.js +1 -1
- package/www/dist/frontend/widgets/customElementsObserver.js +1 -1
- package/www/dist/frontend/widgets/importWidgetFiles.js +1 -1
- package/www/dist/frontend/widgets/importWidgetFilesRuntime.js +1 -1
- package/www/dist/frontend/widgets/layout-components.js +1 -1
- package/www/dist/frontend/widgets/layout-placement-services.js +1 -1
- package/www/dist/frontend/widgets/testElement.js +1 -1
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"width": "440px",
|
|
18
18
|
"height": "460px"
|
|
19
19
|
},
|
|
20
|
-
"html": "<div class=\"fp\"><div class=\"fp-hdr\"><span class=\"fp-title\">[[this.root]]</span><button class=\"fp-x\">✕</button></div><div class=\"fp-tabs\" data-group=\"main\"><button class=\"fp-tab\" data-tab=\"
|
|
20
|
+
"html": "<div class=\"fp\"><div class=\"fp-hdr\"><span class=\"fp-title\">[[this.root]]</span><button class=\"fp-x\">✕</button></div><div class=\"fp-tabs\" data-group=\"main\"><button class=\"fp-tab\" data-tab=\"Home\" title=\"Home\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M3 11l9-8 9 8\"/><path d=\"M5 10v10h14V10\"/></svg><span class=\"fp-tab-cap\">Home</span></button><button class=\"fp-tab\" data-tab=\"Maintenance\" title=\"Maintenance\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M14 6a3.5 3.5 0 00-4.8 4.2l-5 5 1.4 1.4 5-5A3.5 3.5 0 0014 6z\"/><circle cx=\"16.5\" cy=\"7.5\" r=\"1.2\"/></svg><span class=\"fp-tab-cap\">Maint</span></button><button class=\"fp-tab\" data-tab=\"Alarms\" title=\"Alarms\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M18 8a6 6 0 10-12 0c0 7-3 9-3 9h18s-3-2-3-9\"/><path d=\"M13.7 21a2 2 0 01-3.4 0\"/></svg><span class=\"fp-tab-cap\">Alarm</span></button></div><div class=\"fp-body\"><div data-pane=\"Home\"><div class=\"mt-lamps\"><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"alarm\" label=\"In Alarm\" oncolor=\"var(--ui-error,#e5484d)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"ack\" label=\"Acked\" oncolor=\"var(--ui-ok,#30a46c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"shelved\" label=\"Shelved\" oncolor=\"var(--ui-warn,#f6b73c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"suppressed\" label=\"Suppressed\" oncolor=\"var(--ui-warn,#f6b73c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"disabled\" label=\"Disabled\" oncolor=\"var(--ui-dim,#9aa3b0)\"></webui-plantpax-components-status-lamp></div><div class=\"fp-row\"><span class=\"lbl\">Severity</span><span>[[this.severity==null?'--':this.severity]]</span></div><div class=\"mt-cmds\"><webui-plantpax-components-command-button data-pp=\"1\" field=\"cmdAck\" label=\"Ack\" value=\"1\" action=\"ackAlarm\"></webui-plantpax-components-command-button><webui-plantpax-components-command-button data-pp=\"1\" field=\"cmdShelve\" label=\"Shelve\" value=\"1\" action=\"ackAlarm\"></webui-plantpax-components-command-button><webui-plantpax-components-command-button data-pp=\"1\" field=\"cmdDisable\" label=\"Disable\" value=\"1\" action=\"disableAlarm\"></webui-plantpax-components-command-button></div></div><div data-pane=\"Maintenance\" class=\"hidden\"><div class=\"fp-row\"><span class=\"lbl\">Shelved</span><span>[[this.shelved?'YES':'no']]</span></div><button class=\"fp-btn\" data-cmd=\"resetAckAll\" style=\"margin-top:8px\">Reset & Ack All</button></div><div data-pane=\"Alarms\" class=\"hidden\"><button class=\"fp-btn\" data-cmd=\"resetAckAll\" style=\"margin-bottom:8px\">Reset & Ack All</button><div class=\"fp-alm\" bind-attr:class=\"[[this.alarm?'fp-alm active':'fp-alm']]\"><span class=\"fp-chip\"></span><span class=\"nm\">Alarm Active</span></div></div></div></div>",
|
|
21
21
|
"style": ":host{display:block;font-family:'Segoe UI',sans-serif;color:var(--ui-text,#e8e8ea);}.fp{display:flex;flex-direction:column;min-width:340px;font-size:13px;background:var(--ui-surface,#1a212b);border-radius:8px;overflow:hidden;}.fp-hdr{display:flex;align-items:center;gap:8px;padding:11px 13px;background:var(--ui-surface-2,#232e3d);}.fp-title{font-weight:640;flex:1;font-size:13px;font-family:monospace;letter-spacing:.01em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.fp-x{cursor:pointer;background:none;border:none;color:var(--ui-text,#e8e8ea);font-size:15px;opacity:.85;padding:2px 7px;border-radius:4px;}.fp-x:hover{background:rgba(255,255,255,.1);}.fp-adv-btn{cursor:pointer;background:none;border:none;color:var(--ui-text,#e8e8ea);opacity:.85;padding:3px;display:flex;border-radius:4px;}.fp-adv-btn:hover{background:rgba(255,255,255,.1);}.fp-desc{padding:6px 13px;font-size:11.5px;color:var(--ui-dim,#9aa4b2);border-bottom:1px solid var(--ui-border,#2b3542);}.fp-tabs{display:flex;background:var(--ui-surface-2,#1e2732);border-bottom:1px solid var(--ui-border,#2b3542);}.fp-tab{flex:1;position:relative;padding:8px 2px;cursor:pointer;background:none;border:none;color:var(--ui-dim,#9aa4b2);display:flex;flex-direction:column;align-items:center;gap:3px;border-right:1px solid var(--ui-border,#222b36);}.fp-tab:last-child{border-right:none;}.fp-tab:hover{color:var(--ui-text,#e8e8ea);}.fp-tab.sel{color:var(--accent,#5b9bff);background:var(--ui-surface,#1a212b);}.fp-tab.sel::after{content:'';position:absolute;bottom:-1px;left:0;right:0;height:2px;background:var(--accent,#5b9bff);}.fp-tab-cap{font-size:9px;letter-spacing:.02em;}.fp-ic{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;}.fp-tab-badge{position:absolute;top:5px;right:calc(50% - 15px);width:7px;height:7px;border-radius:50%;background:var(--ui-error,#e5484d);}.fp-body{padding:14px 15px;}.fp-row{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:6px 0;border-top:1px solid var(--ui-border,#222b36);font-size:12.5px;}.fp-row:first-child{border-top:none;}.fp-row .lbl{opacity:.7;}.fp-row input{width:90px;flex:none;text-align:right;padding:4px 8px;background:var(--ui-surface-2,#2f3545);color:var(--ui-text,#e8e8ea);border:1px solid var(--ui-border,#4a5570);border-radius:4px;font-family:monospace;}.fp-btn{padding:5px 11px;background:var(--accent,#2680eb);color:#fff;border:none;border-radius:5px;cursor:pointer;font-size:11px;}.fp-btn.ghost{background:none;border:1px solid var(--ui-border,#4a5570);color:var(--ui-text,#e8e8ea);}.fp-alm{display:flex;align-items:center;gap:8px;margin-bottom:6px;}.fp-chip{width:12px;height:12px;border-radius:50%;background:var(--ui-ok,#30a46c);}.fp-alm.active .fp-chip{background:var(--ui-error,#e5484d);}.fp-alm .nm{flex:1;font-size:12px;}.fp-mai{display:flex;gap:16px;align-items:stretch;}.fp-mai webui-plantpax-components-level-bar{flex:none;}.fp-pv{flex:1;display:flex;flex-direction:column;}.pv-big{font-size:36px;font-weight:710;letter-spacing:-.02em;line-height:1;}.pv-eu{font-size:12px;opacity:.7;margin:3px 0 8px;}.pv-mem{font-family:monospace;font-size:10px;color:var(--accent,#5b9bff);opacity:.8;}.fp-flags{display:flex;gap:8px;flex-wrap:wrap;margin-top:14px;}.fp-sec{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--ui-dim,#9aa4b2);margin:14px 0 8px;padding-bottom:5px;border-bottom:1px solid var(--ui-border,#222b36);}.fp-sec:first-child{margin-top:2px;}.fp-mrow{display:flex;align-items:center;gap:8px;margin-bottom:5px;}.fp-mrow .mnm{width:44px;font-size:12px;opacity:.8;}.fp-mrow .mh{flex:1;text-align:center;font-size:10px;opacity:.6;text-transform:uppercase;}.fp-mrow.head{margin-bottom:6px;}.fp-mrow input.mnum{flex:1;width:0;padding:4px;background:var(--ui-surface-2,#2f3545);color:var(--ui-text,#e8e8ea);border:1px solid var(--ui-border,#4a5570);border-radius:4px;font-size:12px;}.fp-chk{display:flex;align-items:center;gap:8px;font-size:12.5px;margin:8px 0;cursor:pointer;}.fp-chk .m{margin-left:auto;font-family:monospace;font-size:9.5px;color:var(--accent,#5b9bff);opacity:.75;}.fp-row .lbl.cfg{display:flex;flex-direction:column;gap:1px;opacity:1;}.fp-row .lbl.cfg b{font-weight:500;font-size:12.5px;}.cfgmem{font-family:monospace;font-size:9.5px;color:var(--accent,#5b9bff);opacity:.75;}.cfgunit{font-family:monospace;font-size:11px;color:var(--ui-dim,#9aa4b2);margin-left:6px;}.fp-almbar{display:flex;align-items:center;gap:8px;margin-bottom:12px;}.fp-grow{flex:1;}.fp-unack{font-size:12px;color:var(--ui-error,#e5484d);font-weight:600;}.qual{font-weight:600;font-size:12px;display:inline-flex;align-items:center;gap:6px;}.qual::after{content:'';width:8px;height:8px;border-radius:50%;background:currentColor;order:2;}.qual.good{color:var(--ui-ok,#30a46c);}.qual.unc{color:var(--ui-warn,#f6b73c);}.qual.bad{color:var(--ui-error,#e5484d);}.hidden{display:none!important;}.mt-lamps{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:14px;}.mt-cmds{display:flex;gap:10px;margin:10px 0;}.mt-cmds webui-plantpax-components-command-button{flex:1;}.mt-mode{display:flex;align-items:center;gap:8px;font-size:12px;margin-top:8px;}.mt-mode .badge{padding:3px 10px;border-radius:10px;font-weight:700;font-size:11px;background:var(--ui-surface-2,#2f3545);}",
|
|
22
|
-
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function' || typeof instance._getDomElements!=='function') return;\n const subs=[\"alarm\", \"ack\", \"shelved\", \"suppressed\", \"disabled\", \"severity\"];\n for(const f of subs){ (function(field){ ppSubscribe(instance,field,function(v){ instance[field]=v; try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }); })(f); }\n instance._tab=function(name){\n for(const p of instance._getDomElements('[data-pane]')) p.classList.toggle('hidden', p.getAttribute('data-pane')!==name);\n for(const t of instance._getDomElements('.fp-tab')) t.classList.toggle('sel', t.getAttribute('data-tab')===name);\n };\n ppWireHeader(instance);\n instance._tab('
|
|
22
|
+
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function' || typeof instance._getDomElements!=='function') return;\n const subs=[\"alarm\", \"ack\", \"shelved\", \"suppressed\", \"disabled\", \"severity\"];\n for(const f of subs){ (function(field){ ppSubscribe(instance,field,function(v){ instance[field]=v; try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }); })(f); }\n instance._tab=function(name){\n for(const p of instance._getDomElements('[data-pane]')) p.classList.toggle('hidden', p.getAttribute('data-pane')!==name);\n for(const t of instance._getDomElements('.fp-tab')) t.classList.toggle('sel', t.getAttribute('data-tab')===name);\n };\n ppWireHeader(instance);\n instance._tab('Home');\n for(const c of instance._getDomElements('[data-pp]')){ c.root=instance.root; c.type=instance.type;\n if(typeof c._ppReinit==='function'){ c._ppReinit(); } else { (function(cc){ setTimeout(function(){ cc._ppReinit&&cc._ppReinit(); },200); })(c); } }\n for(const b of instance._getDomElements('[data-cmd]')){ (function(btn){ btn.addEventListener('click',function(){ ppWrite(instance,btn.getAttribute('data-cmd'),1,'maintenance'); }); })(b); }\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
23
23
|
}
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"width": "440px",
|
|
18
18
|
"height": "460px"
|
|
19
19
|
},
|
|
20
|
-
"html": "<div class=\"fp\"><div class=\"fp-hdr\"><span class=\"fp-title\">[[this.root]]</span><button class=\"fp-x\">✕</button></div><div class=\"fp-tabs\" data-group=\"main\"><button class=\"fp-tab\" data-tab=\"
|
|
20
|
+
"html": "<div class=\"fp\"><div class=\"fp-hdr\"><span class=\"fp-title\">[[this.root]]</span><button class=\"fp-x\">✕</button></div><div class=\"fp-tabs\" data-group=\"main\"><button class=\"fp-tab\" data-tab=\"Home\" title=\"Home\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M3 11l9-8 9 8\"/><path d=\"M5 10v10h14V10\"/></svg><span class=\"fp-tab-cap\">Home</span></button><button class=\"fp-tab\" data-tab=\"Maintenance\" title=\"Maintenance\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M14 6a3.5 3.5 0 00-4.8 4.2l-5 5 1.4 1.4 5-5A3.5 3.5 0 0014 6z\"/><circle cx=\"16.5\" cy=\"7.5\" r=\"1.2\"/></svg><span class=\"fp-tab-cap\">Maint</span></button><button class=\"fp-tab\" data-tab=\"Alarms\" title=\"Alarms\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M18 8a6 6 0 10-12 0c0 7-3 9-3 9h18s-3-2-3-9\"/><path d=\"M13.7 21a2 2 0 01-3.4 0\"/></svg><span class=\"fp-tab-cap\">Alarm</span></button></div><div class=\"fp-body\"><div data-pane=\"Home\"><div class=\"mt-lamps\"><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"operator\" label=\"Operator\" oncolor=\"var(--ui-ok,#30a46c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"program\" label=\"Program\" oncolor=\"var(--accent,#2680eb)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"override\" label=\"Override\" oncolor=\"var(--ui-warn,#f6b73c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"maint\" label=\"Maintenance\" oncolor=\"var(--ui-warn,#f6b73c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"local\" label=\"Local\" oncolor=\"var(--ui-warn,#f6b73c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"extReq\" label=\"External\" oncolor=\"var(--ui-dim,#9aa3b0)\"></webui-plantpax-components-status-lamp></div><div class=\"mt-cmds\"><webui-plantpax-components-command-button data-pp=\"1\" field=\"cmdOper\" label=\"Take Operator\" value=\"1\" action=\"operate\"></webui-plantpax-components-command-button><webui-plantpax-components-command-button data-pp=\"1\" field=\"cmdProg\" label=\"Give Program\" value=\"1\" action=\"operate\"></webui-plantpax-components-command-button></div></div><div data-pane=\"Maintenance\" class=\"hidden\"><div class=\"fp-row\"><span class=\"lbl\">Owner</span><span>[[this.operator?'Operator':(this.program?'Program':'—')]]</span></div><button class=\"fp-btn\" data-cmd=\"resetAckAll\" style=\"margin-top:8px\">Reset & Ack All</button></div><div data-pane=\"Alarms\" class=\"hidden\"><button class=\"fp-btn\" data-cmd=\"resetAckAll\" style=\"margin-bottom:8px\">Reset & Ack All</button><div class=\"fp-alm\" bind-attr:class=\"[[this.override?'fp-alm active':'fp-alm']]\"><span class=\"fp-chip\"></span><span class=\"nm\">Override Active</span></div></div></div></div>",
|
|
21
21
|
"style": ":host{display:block;font-family:'Segoe UI',sans-serif;color:var(--ui-text,#e8e8ea);}.fp{display:flex;flex-direction:column;min-width:340px;font-size:13px;background:var(--ui-surface,#1a212b);border-radius:8px;overflow:hidden;}.fp-hdr{display:flex;align-items:center;gap:8px;padding:11px 13px;background:var(--ui-surface-2,#232e3d);}.fp-title{font-weight:640;flex:1;font-size:13px;font-family:monospace;letter-spacing:.01em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.fp-x{cursor:pointer;background:none;border:none;color:var(--ui-text,#e8e8ea);font-size:15px;opacity:.85;padding:2px 7px;border-radius:4px;}.fp-x:hover{background:rgba(255,255,255,.1);}.fp-adv-btn{cursor:pointer;background:none;border:none;color:var(--ui-text,#e8e8ea);opacity:.85;padding:3px;display:flex;border-radius:4px;}.fp-adv-btn:hover{background:rgba(255,255,255,.1);}.fp-desc{padding:6px 13px;font-size:11.5px;color:var(--ui-dim,#9aa4b2);border-bottom:1px solid var(--ui-border,#2b3542);}.fp-tabs{display:flex;background:var(--ui-surface-2,#1e2732);border-bottom:1px solid var(--ui-border,#2b3542);}.fp-tab{flex:1;position:relative;padding:8px 2px;cursor:pointer;background:none;border:none;color:var(--ui-dim,#9aa4b2);display:flex;flex-direction:column;align-items:center;gap:3px;border-right:1px solid var(--ui-border,#222b36);}.fp-tab:last-child{border-right:none;}.fp-tab:hover{color:var(--ui-text,#e8e8ea);}.fp-tab.sel{color:var(--accent,#5b9bff);background:var(--ui-surface,#1a212b);}.fp-tab.sel::after{content:'';position:absolute;bottom:-1px;left:0;right:0;height:2px;background:var(--accent,#5b9bff);}.fp-tab-cap{font-size:9px;letter-spacing:.02em;}.fp-ic{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;}.fp-tab-badge{position:absolute;top:5px;right:calc(50% - 15px);width:7px;height:7px;border-radius:50%;background:var(--ui-error,#e5484d);}.fp-body{padding:14px 15px;}.fp-row{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:6px 0;border-top:1px solid var(--ui-border,#222b36);font-size:12.5px;}.fp-row:first-child{border-top:none;}.fp-row .lbl{opacity:.7;}.fp-row input{width:90px;flex:none;text-align:right;padding:4px 8px;background:var(--ui-surface-2,#2f3545);color:var(--ui-text,#e8e8ea);border:1px solid var(--ui-border,#4a5570);border-radius:4px;font-family:monospace;}.fp-btn{padding:5px 11px;background:var(--accent,#2680eb);color:#fff;border:none;border-radius:5px;cursor:pointer;font-size:11px;}.fp-btn.ghost{background:none;border:1px solid var(--ui-border,#4a5570);color:var(--ui-text,#e8e8ea);}.fp-alm{display:flex;align-items:center;gap:8px;margin-bottom:6px;}.fp-chip{width:12px;height:12px;border-radius:50%;background:var(--ui-ok,#30a46c);}.fp-alm.active .fp-chip{background:var(--ui-error,#e5484d);}.fp-alm .nm{flex:1;font-size:12px;}.fp-mai{display:flex;gap:16px;align-items:stretch;}.fp-mai webui-plantpax-components-level-bar{flex:none;}.fp-pv{flex:1;display:flex;flex-direction:column;}.pv-big{font-size:36px;font-weight:710;letter-spacing:-.02em;line-height:1;}.pv-eu{font-size:12px;opacity:.7;margin:3px 0 8px;}.pv-mem{font-family:monospace;font-size:10px;color:var(--accent,#5b9bff);opacity:.8;}.fp-flags{display:flex;gap:8px;flex-wrap:wrap;margin-top:14px;}.fp-sec{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--ui-dim,#9aa4b2);margin:14px 0 8px;padding-bottom:5px;border-bottom:1px solid var(--ui-border,#222b36);}.fp-sec:first-child{margin-top:2px;}.fp-mrow{display:flex;align-items:center;gap:8px;margin-bottom:5px;}.fp-mrow .mnm{width:44px;font-size:12px;opacity:.8;}.fp-mrow .mh{flex:1;text-align:center;font-size:10px;opacity:.6;text-transform:uppercase;}.fp-mrow.head{margin-bottom:6px;}.fp-mrow input.mnum{flex:1;width:0;padding:4px;background:var(--ui-surface-2,#2f3545);color:var(--ui-text,#e8e8ea);border:1px solid var(--ui-border,#4a5570);border-radius:4px;font-size:12px;}.fp-chk{display:flex;align-items:center;gap:8px;font-size:12.5px;margin:8px 0;cursor:pointer;}.fp-chk .m{margin-left:auto;font-family:monospace;font-size:9.5px;color:var(--accent,#5b9bff);opacity:.75;}.fp-row .lbl.cfg{display:flex;flex-direction:column;gap:1px;opacity:1;}.fp-row .lbl.cfg b{font-weight:500;font-size:12.5px;}.cfgmem{font-family:monospace;font-size:9.5px;color:var(--accent,#5b9bff);opacity:.75;}.cfgunit{font-family:monospace;font-size:11px;color:var(--ui-dim,#9aa4b2);margin-left:6px;}.fp-almbar{display:flex;align-items:center;gap:8px;margin-bottom:12px;}.fp-grow{flex:1;}.fp-unack{font-size:12px;color:var(--ui-error,#e5484d);font-weight:600;}.qual{font-weight:600;font-size:12px;display:inline-flex;align-items:center;gap:6px;}.qual::after{content:'';width:8px;height:8px;border-radius:50%;background:currentColor;order:2;}.qual.good{color:var(--ui-ok,#30a46c);}.qual.unc{color:var(--ui-warn,#f6b73c);}.qual.bad{color:var(--ui-error,#e5484d);}.hidden{display:none!important;}.mt-lamps{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:14px;}.mt-cmds{display:flex;gap:10px;margin:10px 0;}.mt-cmds webui-plantpax-components-command-button{flex:1;}.mt-mode{display:flex;align-items:center;gap:8px;font-size:12px;margin-top:8px;}.mt-mode .badge{padding:3px 10px;border-radius:10px;font-weight:700;font-size:11px;background:var(--ui-surface-2,#2f3545);}",
|
|
22
|
-
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function' || typeof instance._getDomElements!=='function') return;\n const subs=[\"operator\", \"program\", \"override\", \"maint\", \"local\", \"extReq\"];\n for(const f of subs){ (function(field){ ppSubscribe(instance,field,function(v){ instance[field]=v; try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }); })(f); }\n instance._tab=function(name){\n for(const p of instance._getDomElements('[data-pane]')) p.classList.toggle('hidden', p.getAttribute('data-pane')!==name);\n for(const t of instance._getDomElements('.fp-tab')) t.classList.toggle('sel', t.getAttribute('data-tab')===name);\n };\n ppWireHeader(instance);\n instance._tab('
|
|
22
|
+
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function' || typeof instance._getDomElements!=='function') return;\n const subs=[\"operator\", \"program\", \"override\", \"maint\", \"local\", \"extReq\"];\n for(const f of subs){ (function(field){ ppSubscribe(instance,field,function(v){ instance[field]=v; try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }); })(f); }\n instance._tab=function(name){\n for(const p of instance._getDomElements('[data-pane]')) p.classList.toggle('hidden', p.getAttribute('data-pane')!==name);\n for(const t of instance._getDomElements('.fp-tab')) t.classList.toggle('sel', t.getAttribute('data-tab')===name);\n };\n ppWireHeader(instance);\n instance._tab('Home');\n for(const c of instance._getDomElements('[data-pp]')){ c.root=instance.root; c.type=instance.type;\n if(typeof c._ppReinit==='function'){ c._ppReinit(); } else { (function(cc){ setTimeout(function(){ cc._ppReinit&&cc._ppReinit(); },200); })(c); } }\n for(const b of instance._getDomElements('[data-cmd]')){ (function(btn){ btn.addEventListener('click',function(){ ppWrite(instance,btn.getAttribute('data-cmd'),1,'maintenance'); }); })(b); }\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
23
23
|
}
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"width": "440px",
|
|
18
18
|
"height": "460px"
|
|
19
19
|
},
|
|
20
|
-
"html": "<div class=\"fp\"><div class=\"fp-hdr\"><span class=\"fp-title\">[[this.root]]</span><button class=\"fp-x\">✕</button></div><div class=\"fp-tabs\" data-group=\"main\"><button class=\"fp-tab\" data-tab=\"
|
|
20
|
+
"html": "<div class=\"fp\"><div class=\"fp-hdr\"><span class=\"fp-title\">[[this.root]]</span><button class=\"fp-x\">✕</button></div><div class=\"fp-tabs\" data-group=\"main\"><button class=\"fp-tab\" data-tab=\"Home\" title=\"Home\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M3 11l9-8 9 8\"/><path d=\"M5 10v10h14V10\"/></svg><span class=\"fp-tab-cap\">Home</span></button><button class=\"fp-tab\" data-tab=\"Maintenance\" title=\"Maintenance\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M14 6a3.5 3.5 0 00-4.8 4.2l-5 5 1.4 1.4 5-5A3.5 3.5 0 0014 6z\"/><circle cx=\"16.5\" cy=\"7.5\" r=\"1.2\"/></svg><span class=\"fp-tab-cap\">Maint</span></button><button class=\"fp-tab\" data-tab=\"Alarms\" title=\"Alarms\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M18 8a6 6 0 10-12 0c0 7-3 9-3 9h18s-3-2-3-9\"/><path d=\"M13.7 21a2 2 0 01-3.4 0\"/></svg><span class=\"fp-tab-cap\">Alarm</span></button></div><div class=\"fp-body\"><div data-pane=\"Home\"><div class=\"mt-lamps\"><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"inp\" label=\"Input\" oncolor=\"var(--accent,#2680eb)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"out\" label=\"Output\" oncolor=\"var(--ui-ok,#30a46c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"gated\" label=\"Gated\" oncolor=\"var(--ui-warn,#f6b73c)\"></webui-plantpax-components-status-lamp></div><div class=\"mt-cmds\"><webui-plantpax-components-command-button data-pp=\"1\" field=\"cmdReset\" label=\"Reset\" value=\"1\" action=\"operate\"></webui-plantpax-components-command-button></div></div><div data-pane=\"Maintenance\" class=\"hidden\"><div class=\"fp-row\"><span class=\"lbl\">Gated</span><span>[[this.gated?'YES':'no']]</span></div><button class=\"fp-btn\" data-cmd=\"resetAckAll\" style=\"margin-top:8px\">Reset & Ack All</button></div><div data-pane=\"Alarms\" class=\"hidden\"><button class=\"fp-btn\" data-cmd=\"resetAckAll\" style=\"margin-bottom:8px\">Reset & Ack All</button><div class=\"fp-alm\" bind-attr:class=\"[[this.gated?'fp-alm active':'fp-alm']]\"><span class=\"fp-chip\"></span><span class=\"nm\">Gate Active</span></div></div></div></div>",
|
|
21
21
|
"style": ":host{display:block;font-family:'Segoe UI',sans-serif;color:var(--ui-text,#e8e8ea);}.fp{display:flex;flex-direction:column;min-width:340px;font-size:13px;background:var(--ui-surface,#1a212b);border-radius:8px;overflow:hidden;}.fp-hdr{display:flex;align-items:center;gap:8px;padding:11px 13px;background:var(--ui-surface-2,#232e3d);}.fp-title{font-weight:640;flex:1;font-size:13px;font-family:monospace;letter-spacing:.01em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.fp-x{cursor:pointer;background:none;border:none;color:var(--ui-text,#e8e8ea);font-size:15px;opacity:.85;padding:2px 7px;border-radius:4px;}.fp-x:hover{background:rgba(255,255,255,.1);}.fp-adv-btn{cursor:pointer;background:none;border:none;color:var(--ui-text,#e8e8ea);opacity:.85;padding:3px;display:flex;border-radius:4px;}.fp-adv-btn:hover{background:rgba(255,255,255,.1);}.fp-desc{padding:6px 13px;font-size:11.5px;color:var(--ui-dim,#9aa4b2);border-bottom:1px solid var(--ui-border,#2b3542);}.fp-tabs{display:flex;background:var(--ui-surface-2,#1e2732);border-bottom:1px solid var(--ui-border,#2b3542);}.fp-tab{flex:1;position:relative;padding:8px 2px;cursor:pointer;background:none;border:none;color:var(--ui-dim,#9aa4b2);display:flex;flex-direction:column;align-items:center;gap:3px;border-right:1px solid var(--ui-border,#222b36);}.fp-tab:last-child{border-right:none;}.fp-tab:hover{color:var(--ui-text,#e8e8ea);}.fp-tab.sel{color:var(--accent,#5b9bff);background:var(--ui-surface,#1a212b);}.fp-tab.sel::after{content:'';position:absolute;bottom:-1px;left:0;right:0;height:2px;background:var(--accent,#5b9bff);}.fp-tab-cap{font-size:9px;letter-spacing:.02em;}.fp-ic{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;}.fp-tab-badge{position:absolute;top:5px;right:calc(50% - 15px);width:7px;height:7px;border-radius:50%;background:var(--ui-error,#e5484d);}.fp-body{padding:14px 15px;}.fp-row{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:6px 0;border-top:1px solid var(--ui-border,#222b36);font-size:12.5px;}.fp-row:first-child{border-top:none;}.fp-row .lbl{opacity:.7;}.fp-row input{width:90px;flex:none;text-align:right;padding:4px 8px;background:var(--ui-surface-2,#2f3545);color:var(--ui-text,#e8e8ea);border:1px solid var(--ui-border,#4a5570);border-radius:4px;font-family:monospace;}.fp-btn{padding:5px 11px;background:var(--accent,#2680eb);color:#fff;border:none;border-radius:5px;cursor:pointer;font-size:11px;}.fp-btn.ghost{background:none;border:1px solid var(--ui-border,#4a5570);color:var(--ui-text,#e8e8ea);}.fp-alm{display:flex;align-items:center;gap:8px;margin-bottom:6px;}.fp-chip{width:12px;height:12px;border-radius:50%;background:var(--ui-ok,#30a46c);}.fp-alm.active .fp-chip{background:var(--ui-error,#e5484d);}.fp-alm .nm{flex:1;font-size:12px;}.fp-mai{display:flex;gap:16px;align-items:stretch;}.fp-mai webui-plantpax-components-level-bar{flex:none;}.fp-pv{flex:1;display:flex;flex-direction:column;}.pv-big{font-size:36px;font-weight:710;letter-spacing:-.02em;line-height:1;}.pv-eu{font-size:12px;opacity:.7;margin:3px 0 8px;}.pv-mem{font-family:monospace;font-size:10px;color:var(--accent,#5b9bff);opacity:.8;}.fp-flags{display:flex;gap:8px;flex-wrap:wrap;margin-top:14px;}.fp-sec{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--ui-dim,#9aa4b2);margin:14px 0 8px;padding-bottom:5px;border-bottom:1px solid var(--ui-border,#222b36);}.fp-sec:first-child{margin-top:2px;}.fp-mrow{display:flex;align-items:center;gap:8px;margin-bottom:5px;}.fp-mrow .mnm{width:44px;font-size:12px;opacity:.8;}.fp-mrow .mh{flex:1;text-align:center;font-size:10px;opacity:.6;text-transform:uppercase;}.fp-mrow.head{margin-bottom:6px;}.fp-mrow input.mnum{flex:1;width:0;padding:4px;background:var(--ui-surface-2,#2f3545);color:var(--ui-text,#e8e8ea);border:1px solid var(--ui-border,#4a5570);border-radius:4px;font-size:12px;}.fp-chk{display:flex;align-items:center;gap:8px;font-size:12.5px;margin:8px 0;cursor:pointer;}.fp-chk .m{margin-left:auto;font-family:monospace;font-size:9.5px;color:var(--accent,#5b9bff);opacity:.75;}.fp-row .lbl.cfg{display:flex;flex-direction:column;gap:1px;opacity:1;}.fp-row .lbl.cfg b{font-weight:500;font-size:12.5px;}.cfgmem{font-family:monospace;font-size:9.5px;color:var(--accent,#5b9bff);opacity:.75;}.cfgunit{font-family:monospace;font-size:11px;color:var(--ui-dim,#9aa4b2);margin-left:6px;}.fp-almbar{display:flex;align-items:center;gap:8px;margin-bottom:12px;}.fp-grow{flex:1;}.fp-unack{font-size:12px;color:var(--ui-error,#e5484d);font-weight:600;}.qual{font-weight:600;font-size:12px;display:inline-flex;align-items:center;gap:6px;}.qual::after{content:'';width:8px;height:8px;border-radius:50%;background:currentColor;order:2;}.qual.good{color:var(--ui-ok,#30a46c);}.qual.unc{color:var(--ui-warn,#f6b73c);}.qual.bad{color:var(--ui-error,#e5484d);}.hidden{display:none!important;}.mt-lamps{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:14px;}.mt-cmds{display:flex;gap:10px;margin:10px 0;}.mt-cmds webui-plantpax-components-command-button{flex:1;}.mt-mode{display:flex;align-items:center;gap:8px;font-size:12px;margin-top:8px;}.mt-mode .badge{padding:3px 10px;border-radius:10px;font-weight:700;font-size:11px;background:var(--ui-surface-2,#2f3545);}",
|
|
22
|
-
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function' || typeof instance._getDomElements!=='function') return;\n const subs=[\"inp\", \"out\", \"gated\"];\n for(const f of subs){ (function(field){ ppSubscribe(instance,field,function(v){ instance[field]=v; try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }); })(f); }\n instance._tab=function(name){\n for(const p of instance._getDomElements('[data-pane]')) p.classList.toggle('hidden', p.getAttribute('data-pane')!==name);\n for(const t of instance._getDomElements('.fp-tab')) t.classList.toggle('sel', t.getAttribute('data-tab')===name);\n };\n ppWireHeader(instance);\n instance._tab('
|
|
22
|
+
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function' || typeof instance._getDomElements!=='function') return;\n const subs=[\"inp\", \"out\", \"gated\"];\n for(const f of subs){ (function(field){ ppSubscribe(instance,field,function(v){ instance[field]=v; try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }); })(f); }\n instance._tab=function(name){\n for(const p of instance._getDomElements('[data-pane]')) p.classList.toggle('hidden', p.getAttribute('data-pane')!==name);\n for(const t of instance._getDomElements('.fp-tab')) t.classList.toggle('sel', t.getAttribute('data-tab')===name);\n };\n ppWireHeader(instance);\n instance._tab('Home');\n for(const c of instance._getDomElements('[data-pp]')){ c.root=instance.root; c.type=instance.type;\n if(typeof c._ppReinit==='function'){ c._ppReinit(); } else { (function(cc){ setTimeout(function(){ cc._ppReinit&&cc._ppReinit(); },200); })(c); } }\n for(const b of instance._getDomElements('[data-cmd]')){ (function(btn){ btn.addEventListener('click',function(){ ppWrite(instance,btn.getAttribute('data-cmd'),1,'maintenance'); }); })(b); }\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
23
23
|
}
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"width": "440px",
|
|
18
18
|
"height": "460px"
|
|
19
19
|
},
|
|
20
|
-
"html": "<div class=\"fp\"><div class=\"fp-hdr\"><span class=\"fp-title\">[[this.root]]</span><button class=\"fp-x\">✕</button></div><div class=\"fp-tabs\" data-group=\"main\"><button class=\"fp-tab\" data-tab=\"
|
|
20
|
+
"html": "<div class=\"fp\"><div class=\"fp-hdr\"><span class=\"fp-title\">[[this.root]]</span><button class=\"fp-x\">✕</button></div><div class=\"fp-tabs\" data-group=\"main\"><button class=\"fp-tab\" data-tab=\"Home\" title=\"Home\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M3 11l9-8 9 8\"/><path d=\"M5 10v10h14V10\"/></svg><span class=\"fp-tab-cap\">Home</span></button><button class=\"fp-tab\" data-tab=\"Maintenance\" title=\"Maintenance\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M14 6a3.5 3.5 0 00-4.8 4.2l-5 5 1.4 1.4 5-5A3.5 3.5 0 0014 6z\"/><circle cx=\"16.5\" cy=\"7.5\" r=\"1.2\"/></svg><span class=\"fp-tab-cap\">Maint</span></button><button class=\"fp-tab\" data-tab=\"Alarms\" title=\"Alarms\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M18 8a6 6 0 10-12 0c0 7-3 9-3 9h18s-3-2-3-9\"/><path d=\"M13.7 21a2 2 0 01-3.4 0\"/></svg><span class=\"fp-tab-cap\">Alarm</span></button></div><div class=\"fp-body\"><div data-pane=\"Home\"><div class=\"mt-lamps\"><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"ok\" label=\"OK\" oncolor=\"var(--ui-ok,#30a46c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"tripped\" label=\"Tripped\" oncolor=\"var(--ui-error,#e5484d)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"intlk1\" label=\"Intlk 1\" oncolor=\"var(--ui-error,#e5484d)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"intlk2\" label=\"Intlk 2\" oncolor=\"var(--ui-error,#e5484d)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"intlk3\" label=\"Intlk 3\" oncolor=\"var(--ui-error,#e5484d)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"bypActive\" label=\"Bypassed\" oncolor=\"var(--ui-warn,#f6b73c)\"></webui-plantpax-components-status-lamp></div><div class=\"mt-cmds\"><webui-plantpax-components-command-button data-pp=\"1\" field=\"cmdReset\" label=\"Reset\" value=\"1\" action=\"operate\"></webui-plantpax-components-command-button><webui-plantpax-components-command-button data-pp=\"1\" field=\"cmdByp\" label=\"Bypass\" value=\"1\" action=\"bypassInterlock\"></webui-plantpax-components-command-button></div></div><div data-pane=\"Maintenance\" class=\"hidden\"><div class=\"fp-row\"><span class=\"lbl\">Bypass</span><span>[[this.bypActive?'ACTIVE':'—']]</span></div><button class=\"fp-btn\" data-cmd=\"resetAckAll\" style=\"margin-top:8px\">Reset & Ack All</button></div><div data-pane=\"Alarms\" class=\"hidden\"><button class=\"fp-btn\" data-cmd=\"resetAckAll\" style=\"margin-bottom:8px\">Reset & Ack All</button><div class=\"fp-alm\" bind-attr:class=\"[[this.tripped?'fp-alm active':'fp-alm']]\"><span class=\"fp-chip\"></span><span class=\"nm\">Interlock Trip</span></div></div></div></div>",
|
|
21
21
|
"style": ":host{display:block;font-family:'Segoe UI',sans-serif;color:var(--ui-text,#e8e8ea);}.fp{display:flex;flex-direction:column;min-width:340px;font-size:13px;background:var(--ui-surface,#1a212b);border-radius:8px;overflow:hidden;}.fp-hdr{display:flex;align-items:center;gap:8px;padding:11px 13px;background:var(--ui-surface-2,#232e3d);}.fp-title{font-weight:640;flex:1;font-size:13px;font-family:monospace;letter-spacing:.01em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.fp-x{cursor:pointer;background:none;border:none;color:var(--ui-text,#e8e8ea);font-size:15px;opacity:.85;padding:2px 7px;border-radius:4px;}.fp-x:hover{background:rgba(255,255,255,.1);}.fp-adv-btn{cursor:pointer;background:none;border:none;color:var(--ui-text,#e8e8ea);opacity:.85;padding:3px;display:flex;border-radius:4px;}.fp-adv-btn:hover{background:rgba(255,255,255,.1);}.fp-desc{padding:6px 13px;font-size:11.5px;color:var(--ui-dim,#9aa4b2);border-bottom:1px solid var(--ui-border,#2b3542);}.fp-tabs{display:flex;background:var(--ui-surface-2,#1e2732);border-bottom:1px solid var(--ui-border,#2b3542);}.fp-tab{flex:1;position:relative;padding:8px 2px;cursor:pointer;background:none;border:none;color:var(--ui-dim,#9aa4b2);display:flex;flex-direction:column;align-items:center;gap:3px;border-right:1px solid var(--ui-border,#222b36);}.fp-tab:last-child{border-right:none;}.fp-tab:hover{color:var(--ui-text,#e8e8ea);}.fp-tab.sel{color:var(--accent,#5b9bff);background:var(--ui-surface,#1a212b);}.fp-tab.sel::after{content:'';position:absolute;bottom:-1px;left:0;right:0;height:2px;background:var(--accent,#5b9bff);}.fp-tab-cap{font-size:9px;letter-spacing:.02em;}.fp-ic{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;}.fp-tab-badge{position:absolute;top:5px;right:calc(50% - 15px);width:7px;height:7px;border-radius:50%;background:var(--ui-error,#e5484d);}.fp-body{padding:14px 15px;}.fp-row{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:6px 0;border-top:1px solid var(--ui-border,#222b36);font-size:12.5px;}.fp-row:first-child{border-top:none;}.fp-row .lbl{opacity:.7;}.fp-row input{width:90px;flex:none;text-align:right;padding:4px 8px;background:var(--ui-surface-2,#2f3545);color:var(--ui-text,#e8e8ea);border:1px solid var(--ui-border,#4a5570);border-radius:4px;font-family:monospace;}.fp-btn{padding:5px 11px;background:var(--accent,#2680eb);color:#fff;border:none;border-radius:5px;cursor:pointer;font-size:11px;}.fp-btn.ghost{background:none;border:1px solid var(--ui-border,#4a5570);color:var(--ui-text,#e8e8ea);}.fp-alm{display:flex;align-items:center;gap:8px;margin-bottom:6px;}.fp-chip{width:12px;height:12px;border-radius:50%;background:var(--ui-ok,#30a46c);}.fp-alm.active .fp-chip{background:var(--ui-error,#e5484d);}.fp-alm .nm{flex:1;font-size:12px;}.fp-mai{display:flex;gap:16px;align-items:stretch;}.fp-mai webui-plantpax-components-level-bar{flex:none;}.fp-pv{flex:1;display:flex;flex-direction:column;}.pv-big{font-size:36px;font-weight:710;letter-spacing:-.02em;line-height:1;}.pv-eu{font-size:12px;opacity:.7;margin:3px 0 8px;}.pv-mem{font-family:monospace;font-size:10px;color:var(--accent,#5b9bff);opacity:.8;}.fp-flags{display:flex;gap:8px;flex-wrap:wrap;margin-top:14px;}.fp-sec{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--ui-dim,#9aa4b2);margin:14px 0 8px;padding-bottom:5px;border-bottom:1px solid var(--ui-border,#222b36);}.fp-sec:first-child{margin-top:2px;}.fp-mrow{display:flex;align-items:center;gap:8px;margin-bottom:5px;}.fp-mrow .mnm{width:44px;font-size:12px;opacity:.8;}.fp-mrow .mh{flex:1;text-align:center;font-size:10px;opacity:.6;text-transform:uppercase;}.fp-mrow.head{margin-bottom:6px;}.fp-mrow input.mnum{flex:1;width:0;padding:4px;background:var(--ui-surface-2,#2f3545);color:var(--ui-text,#e8e8ea);border:1px solid var(--ui-border,#4a5570);border-radius:4px;font-size:12px;}.fp-chk{display:flex;align-items:center;gap:8px;font-size:12.5px;margin:8px 0;cursor:pointer;}.fp-chk .m{margin-left:auto;font-family:monospace;font-size:9.5px;color:var(--accent,#5b9bff);opacity:.75;}.fp-row .lbl.cfg{display:flex;flex-direction:column;gap:1px;opacity:1;}.fp-row .lbl.cfg b{font-weight:500;font-size:12.5px;}.cfgmem{font-family:monospace;font-size:9.5px;color:var(--accent,#5b9bff);opacity:.75;}.cfgunit{font-family:monospace;font-size:11px;color:var(--ui-dim,#9aa4b2);margin-left:6px;}.fp-almbar{display:flex;align-items:center;gap:8px;margin-bottom:12px;}.fp-grow{flex:1;}.fp-unack{font-size:12px;color:var(--ui-error,#e5484d);font-weight:600;}.qual{font-weight:600;font-size:12px;display:inline-flex;align-items:center;gap:6px;}.qual::after{content:'';width:8px;height:8px;border-radius:50%;background:currentColor;order:2;}.qual.good{color:var(--ui-ok,#30a46c);}.qual.unc{color:var(--ui-warn,#f6b73c);}.qual.bad{color:var(--ui-error,#e5484d);}.hidden{display:none!important;}.mt-lamps{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:14px;}.mt-cmds{display:flex;gap:10px;margin:10px 0;}.mt-cmds webui-plantpax-components-command-button{flex:1;}.mt-mode{display:flex;align-items:center;gap:8px;font-size:12px;margin-top:8px;}.mt-mode .badge{padding:3px 10px;border-radius:10px;font-weight:700;font-size:11px;background:var(--ui-surface-2,#2f3545);}",
|
|
22
|
-
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function' || typeof instance._getDomElements!=='function') return;\n const subs=[\"ok\", \"tripped\", \"intlk1\", \"intlk2\", \"intlk3\", \"bypActive\"];\n for(const f of subs){ (function(field){ ppSubscribe(instance,field,function(v){ instance[field]=v; try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }); })(f); }\n instance._tab=function(name){\n for(const p of instance._getDomElements('[data-pane]')) p.classList.toggle('hidden', p.getAttribute('data-pane')!==name);\n for(const t of instance._getDomElements('.fp-tab')) t.classList.toggle('sel', t.getAttribute('data-tab')===name);\n };\n ppWireHeader(instance);\n instance._tab('
|
|
22
|
+
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function' || typeof instance._getDomElements!=='function') return;\n const subs=[\"ok\", \"tripped\", \"intlk1\", \"intlk2\", \"intlk3\", \"bypActive\"];\n for(const f of subs){ (function(field){ ppSubscribe(instance,field,function(v){ instance[field]=v; try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }); })(f); }\n instance._tab=function(name){\n for(const p of instance._getDomElements('[data-pane]')) p.classList.toggle('hidden', p.getAttribute('data-pane')!==name);\n for(const t of instance._getDomElements('.fp-tab')) t.classList.toggle('sel', t.getAttribute('data-tab')===name);\n };\n ppWireHeader(instance);\n instance._tab('Home');\n for(const c of instance._getDomElements('[data-pp]')){ c.root=instance.root; c.type=instance.type;\n if(typeof c._ppReinit==='function'){ c._ppReinit(); } else { (function(cc){ setTimeout(function(){ cc._ppReinit&&cc._ppReinit(); },200); })(c); } }\n for(const b of instance._getDomElements('[data-cmd]')){ (function(btn){ btn.addEventListener('click',function(){ ppWrite(instance,btn.getAttribute('data-cmd'),1,'maintenance'); }); })(b); }\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
23
23
|
}
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"width": "420px",
|
|
14
14
|
"height": "440px"
|
|
15
15
|
},
|
|
16
|
-
"html": "<div class=\"fp\"><div class=\"fp-hdr\"><span class=\"fp-title\">[[this.root]]</span><button class=\"fp-x\">✕</button></div><div class=\"fp-tabs\" data-group=\"main\"><button class=\"fp-tab\" data-tab=\"
|
|
16
|
+
"html": "<div class=\"fp\"><div class=\"fp-hdr\"><span class=\"fp-title\">[[this.root]]</span><button class=\"fp-x\">✕</button></div><div class=\"fp-tabs\" data-group=\"main\"><button class=\"fp-tab\" data-tab=\"Home\" title=\"Home\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M3 11l9-8 9 8\"/><path d=\"M5 10v10h14V10\"/></svg><span class=\"fp-tab-cap\">Home</span></button><button class=\"fp-tab\" data-tab=\"Maintenance\" title=\"Maintenance\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M14 6a3.5 3.5 0 00-4.8 4.2l-5 5 1.4 1.4 5-5A3.5 3.5 0 0014 6z\"/><circle cx=\"16.5\" cy=\"7.5\" r=\"1.2\"/></svg><span class=\"fp-tab-cap\">Maint</span></button><button class=\"fp-tab\" data-tab=\"Alarms\" title=\"Alarms\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M18 8a6 6 0 10-12 0c0 7-3 9-3 9h18s-3-2-3-9\"/><path d=\"M13.7 21a2 2 0 01-3.4 0\"/></svg><span class=\"fp-tab-cap\">Alarm</span></button></div><div class=\"fp-body\"><div data-pane=\"Home\"><div class=\"mt-lamps\"><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"running\" label=\"Running\" oncolor=\"var(--ui-ok,#30a46c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"available\" label=\"Available\" oncolor=\"var(--ui-ok,#30a46c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"fault\" label=\"Faulted\" oncolor=\"var(--ui-error,#e5484d)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"tripped\" label=\"Intlk Trip\" oncolor=\"var(--ui-error,#e5484d)\"></webui-plantpax-components-status-lamp></div><div class=\"mt-cmds\"><webui-plantpax-components-command-button data-pp=\"1\" field=\"cmdStart\" label=\"▶ Start\" value=\"1\" action=\"operate\"></webui-plantpax-components-command-button><webui-plantpax-components-command-button data-pp=\"1\" field=\"cmdStop\" label=\"■ Stop\" value=\"1\" action=\"operate\"></webui-plantpax-components-command-button></div><div class=\"mt-mode\">Mode <span class=\"badge\">[[this.progOper?'Operator':'Program']]</span></div></div><div data-pane=\"Maintenance\" class=\"hidden\"><div class=\"fp-row\"><span class=\"lbl\">Maint Bypass</span><span>[[this.maintByp?'ACTIVE':'—']]</span></div><div class=\"fp-row\"><span class=\"lbl\">Available</span><span>[[this.available?'Yes':'No']]</span></div><button class=\"fp-btn\" data-cmd=\"resetAckAll\" style=\"margin-top:8px\">Reset & Ack All</button></div><div data-pane=\"Alarms\" class=\"hidden\"><button class=\"fp-btn\" data-cmd=\"resetAckAll\" style=\"margin-bottom:8px\">Reset & Ack All</button><div class=\"fp-alm\" bind-attr:class=\"[[this.failToStart?'fp-alm active':'fp-alm']]\"><span class=\"fp-chip\"></span><span class=\"nm\">Fail to Start</span></div><div class=\"fp-alm\" bind-attr:class=\"[[this.failToStop?'fp-alm active':'fp-alm']]\"><span class=\"fp-chip\"></span><span class=\"nm\">Fail to Stop</span></div><div class=\"fp-alm\" bind-attr:class=\"[[this.tripped?'fp-alm active':'fp-alm']]\"><span class=\"fp-chip\"></span><span class=\"nm\">Interlock Trip</span></div></div></div></div>",
|
|
17
17
|
"style": ":host{display:block;font-family:'Segoe UI',sans-serif;color:var(--ui-text,#e8e8ea);}.fp{display:flex;flex-direction:column;min-width:340px;font-size:13px;background:var(--ui-surface,#1a212b);border-radius:8px;overflow:hidden;}.fp-hdr{display:flex;align-items:center;gap:8px;padding:11px 13px;background:var(--ui-surface-2,#232e3d);}.fp-title{font-weight:640;flex:1;font-size:13px;font-family:monospace;letter-spacing:.01em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.fp-x{cursor:pointer;background:none;border:none;color:var(--ui-text,#e8e8ea);font-size:15px;opacity:.85;padding:2px 7px;border-radius:4px;}.fp-x:hover{background:rgba(255,255,255,.1);}.fp-adv-btn{cursor:pointer;background:none;border:none;color:var(--ui-text,#e8e8ea);opacity:.85;padding:3px;display:flex;border-radius:4px;}.fp-adv-btn:hover{background:rgba(255,255,255,.1);}.fp-desc{padding:6px 13px;font-size:11.5px;color:var(--ui-dim,#9aa4b2);border-bottom:1px solid var(--ui-border,#2b3542);}.fp-tabs{display:flex;background:var(--ui-surface-2,#1e2732);border-bottom:1px solid var(--ui-border,#2b3542);}.fp-tab{flex:1;position:relative;padding:8px 2px;cursor:pointer;background:none;border:none;color:var(--ui-dim,#9aa4b2);display:flex;flex-direction:column;align-items:center;gap:3px;border-right:1px solid var(--ui-border,#222b36);}.fp-tab:last-child{border-right:none;}.fp-tab:hover{color:var(--ui-text,#e8e8ea);}.fp-tab.sel{color:var(--accent,#5b9bff);background:var(--ui-surface,#1a212b);}.fp-tab.sel::after{content:'';position:absolute;bottom:-1px;left:0;right:0;height:2px;background:var(--accent,#5b9bff);}.fp-tab-cap{font-size:9px;letter-spacing:.02em;}.fp-ic{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;}.fp-tab-badge{position:absolute;top:5px;right:calc(50% - 15px);width:7px;height:7px;border-radius:50%;background:var(--ui-error,#e5484d);}.fp-body{padding:14px 15px;}.fp-row{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:6px 0;border-top:1px solid var(--ui-border,#222b36);font-size:12.5px;}.fp-row:first-child{border-top:none;}.fp-row .lbl{opacity:.7;}.fp-row input{width:90px;flex:none;text-align:right;padding:4px 8px;background:var(--ui-surface-2,#2f3545);color:var(--ui-text,#e8e8ea);border:1px solid var(--ui-border,#4a5570);border-radius:4px;font-family:monospace;}.fp-btn{padding:5px 11px;background:var(--accent,#2680eb);color:#fff;border:none;border-radius:5px;cursor:pointer;font-size:11px;}.fp-btn.ghost{background:none;border:1px solid var(--ui-border,#4a5570);color:var(--ui-text,#e8e8ea);}.fp-alm{display:flex;align-items:center;gap:8px;margin-bottom:6px;}.fp-chip{width:12px;height:12px;border-radius:50%;background:var(--ui-ok,#30a46c);}.fp-alm.active .fp-chip{background:var(--ui-error,#e5484d);}.fp-alm .nm{flex:1;font-size:12px;}.fp-mai{display:flex;gap:16px;align-items:stretch;}.fp-mai webui-plantpax-components-level-bar{flex:none;}.fp-pv{flex:1;display:flex;flex-direction:column;}.pv-big{font-size:36px;font-weight:710;letter-spacing:-.02em;line-height:1;}.pv-eu{font-size:12px;opacity:.7;margin:3px 0 8px;}.pv-mem{font-family:monospace;font-size:10px;color:var(--accent,#5b9bff);opacity:.8;}.fp-flags{display:flex;gap:8px;flex-wrap:wrap;margin-top:14px;}.fp-sec{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--ui-dim,#9aa4b2);margin:14px 0 8px;padding-bottom:5px;border-bottom:1px solid var(--ui-border,#222b36);}.fp-sec:first-child{margin-top:2px;}.fp-mrow{display:flex;align-items:center;gap:8px;margin-bottom:5px;}.fp-mrow .mnm{width:44px;font-size:12px;opacity:.8;}.fp-mrow .mh{flex:1;text-align:center;font-size:10px;opacity:.6;text-transform:uppercase;}.fp-mrow.head{margin-bottom:6px;}.fp-mrow input.mnum{flex:1;width:0;padding:4px;background:var(--ui-surface-2,#2f3545);color:var(--ui-text,#e8e8ea);border:1px solid var(--ui-border,#4a5570);border-radius:4px;font-size:12px;}.fp-chk{display:flex;align-items:center;gap:8px;font-size:12.5px;margin:8px 0;cursor:pointer;}.fp-chk .m{margin-left:auto;font-family:monospace;font-size:9.5px;color:var(--accent,#5b9bff);opacity:.75;}.fp-row .lbl.cfg{display:flex;flex-direction:column;gap:1px;opacity:1;}.fp-row .lbl.cfg b{font-weight:500;font-size:12.5px;}.cfgmem{font-family:monospace;font-size:9.5px;color:var(--accent,#5b9bff);opacity:.75;}.cfgunit{font-family:monospace;font-size:11px;color:var(--ui-dim,#9aa4b2);margin-left:6px;}.fp-almbar{display:flex;align-items:center;gap:8px;margin-bottom:12px;}.fp-grow{flex:1;}.fp-unack{font-size:12px;color:var(--ui-error,#e5484d);font-weight:600;}.qual{font-weight:600;font-size:12px;display:inline-flex;align-items:center;gap:6px;}.qual::after{content:'';width:8px;height:8px;border-radius:50%;background:currentColor;order:2;}.qual.good{color:var(--ui-ok,#30a46c);}.qual.unc{color:var(--ui-warn,#f6b73c);}.qual.bad{color:var(--ui-error,#e5484d);}.hidden{display:none!important;}.mt-lamps{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:14px;}.mt-cmds{display:flex;gap:10px;margin:10px 0;}.mt-cmds webui-plantpax-components-command-button{flex:1;}.mt-mode{display:flex;align-items:center;gap:8px;font-size:12px;margin-top:8px;}.mt-mode .badge{padding:3px 10px;border-radius:10px;font-weight:700;font-size:11px;background:var(--ui-surface-2,#2f3545);}",
|
|
18
|
-
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function' || typeof instance._getDomElements!=='function') return;\n const subs=['running','stopped','available','fault','tripped','maintByp','progOper','failToStart','failToStop'];\n for(const f of subs){ (function(field){ ppSubscribe(instance,field,function(v){ instance[field]=(v===true||v==='true'||v===1); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }); })(f); }\n instance._tab=function(name){\n for(const p of instance._getDomElements('[data-pane]')) p.classList.toggle('hidden', p.getAttribute('data-pane')!==name);\n for(const t of instance._getDomElements('.fp-tab')) t.classList.toggle('sel', t.getAttribute('data-tab')===name);\n };\n ppWireHeader(instance);\n instance._tab('
|
|
18
|
+
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function' || typeof instance._getDomElements!=='function') return;\n const subs=['running','stopped','available','fault','tripped','maintByp','progOper','failToStart','failToStop'];\n for(const f of subs){ (function(field){ ppSubscribe(instance,field,function(v){ instance[field]=(v===true||v==='true'||v===1); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }); })(f); }\n instance._tab=function(name){\n for(const p of instance._getDomElements('[data-pane]')) p.classList.toggle('hidden', p.getAttribute('data-pane')!==name);\n for(const t of instance._getDomElements('.fp-tab')) t.classList.toggle('sel', t.getAttribute('data-tab')===name);\n };\n ppWireHeader(instance);\n instance._tab('Home');\n // wire nested Wave-1 components (status-lamps + command-buttons): give each root/type + start\n for(const c of instance._getDomElements('[data-pp]')){ c.root=instance.root; c.type=instance.type;\n if(typeof c._ppReinit==='function'){ c._ppReinit(); } else { (function(cc){ setTimeout(function(){ cc._ppReinit&&cc._ppReinit(); },200); })(c); } }\n // reset/ack commands\n for(const b of instance._getDomElements('[data-cmd]')){ (function(btn){ btn.addEventListener('click',function(){ ppWrite(instance,btn.getAttribute('data-cmd'),1,'maintenance'); }); })(b); }\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
19
19
|
}
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"width": "440px",
|
|
18
18
|
"height": "460px"
|
|
19
19
|
},
|
|
20
|
-
"html": "<div class=\"fp\"><div class=\"fp-hdr\"><span class=\"fp-title\">[[this.root]]</span><button class=\"fp-x\">✕</button></div><div class=\"fp-tabs\" data-group=\"main\"><button class=\"fp-tab\" data-tab=\"
|
|
20
|
+
"html": "<div class=\"fp\"><div class=\"fp-hdr\"><span class=\"fp-title\">[[this.root]]</span><button class=\"fp-x\">✕</button></div><div class=\"fp-tabs\" data-group=\"main\"><button class=\"fp-tab\" data-tab=\"Home\" title=\"Home\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M3 11l9-8 9 8\"/><path d=\"M5 10v10h14V10\"/></svg><span class=\"fp-tab-cap\">Home</span></button><button class=\"fp-tab\" data-tab=\"Maintenance\" title=\"Maintenance\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M14 6a3.5 3.5 0 00-4.8 4.2l-5 5 1.4 1.4 5-5A3.5 3.5 0 0014 6z\"/><circle cx=\"16.5\" cy=\"7.5\" r=\"1.2\"/></svg><span class=\"fp-tab-cap\">Maint</span></button><button class=\"fp-tab\" data-tab=\"Alarms\" title=\"Alarms\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M18 8a6 6 0 10-12 0c0 7-3 9-3 9h18s-3-2-3-9\"/><path d=\"M13.7 21a2 2 0 01-3.4 0\"/></svg><span class=\"fp-tab-cap\">Alarm</span></button></div><div class=\"fp-body\"><div data-pane=\"Home\"><div class=\"mt-lamps\"><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"running\" label=\"Running\" oncolor=\"var(--ui-ok,#30a46c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"forward\" label=\"Forward\" oncolor=\"var(--accent,#2680eb)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"reverse\" label=\"Reverse\" oncolor=\"var(--accent,#2680eb)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"fault\" label=\"Faulted\" oncolor=\"var(--ui-error,#e5484d)\"></webui-plantpax-components-status-lamp></div><div class=\"mt-cmds\"><webui-plantpax-components-command-button data-pp=\"1\" field=\"cmdFwd\" label=\"◀ Fwd\" value=\"1\" action=\"operate\"></webui-plantpax-components-command-button><webui-plantpax-components-command-button data-pp=\"1\" field=\"cmdRev\" label=\"Rev ▶\" value=\"1\" action=\"operate\"></webui-plantpax-components-command-button><webui-plantpax-components-command-button data-pp=\"1\" field=\"cmdStop\" label=\"■ Stop\" value=\"1\" action=\"operate\"></webui-plantpax-components-command-button></div><div class=\"mt-mode\">Mode <span class=\"badge\">[[this.progOper?'Operator':'Program']]</span></div></div><div data-pane=\"Maintenance\" class=\"hidden\"><div class=\"fp-row\"><span class=\"lbl\">Maint Bypass</span><span>[[this.tripped?'Trip':'—']]</span></div><button class=\"fp-btn\" data-cmd=\"resetAckAll\" style=\"margin-top:8px\">Reset & Ack All</button></div><div data-pane=\"Alarms\" class=\"hidden\"><button class=\"fp-btn\" data-cmd=\"resetAckAll\" style=\"margin-bottom:8px\">Reset & Ack All</button><div class=\"fp-alm\" bind-attr:class=\"[[this.failToStart?'fp-alm active':'fp-alm']]\"><span class=\"fp-chip\"></span><span class=\"nm\">Fail to Start</span></div><div class=\"fp-alm\" bind-attr:class=\"[[this.tripped?'fp-alm active':'fp-alm']]\"><span class=\"fp-chip\"></span><span class=\"nm\">Interlock Trip</span></div></div></div></div>",
|
|
21
21
|
"style": ":host{display:block;font-family:'Segoe UI',sans-serif;color:var(--ui-text,#e8e8ea);}.fp{display:flex;flex-direction:column;min-width:340px;font-size:13px;background:var(--ui-surface,#1a212b);border-radius:8px;overflow:hidden;}.fp-hdr{display:flex;align-items:center;gap:8px;padding:11px 13px;background:var(--ui-surface-2,#232e3d);}.fp-title{font-weight:640;flex:1;font-size:13px;font-family:monospace;letter-spacing:.01em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.fp-x{cursor:pointer;background:none;border:none;color:var(--ui-text,#e8e8ea);font-size:15px;opacity:.85;padding:2px 7px;border-radius:4px;}.fp-x:hover{background:rgba(255,255,255,.1);}.fp-adv-btn{cursor:pointer;background:none;border:none;color:var(--ui-text,#e8e8ea);opacity:.85;padding:3px;display:flex;border-radius:4px;}.fp-adv-btn:hover{background:rgba(255,255,255,.1);}.fp-desc{padding:6px 13px;font-size:11.5px;color:var(--ui-dim,#9aa4b2);border-bottom:1px solid var(--ui-border,#2b3542);}.fp-tabs{display:flex;background:var(--ui-surface-2,#1e2732);border-bottom:1px solid var(--ui-border,#2b3542);}.fp-tab{flex:1;position:relative;padding:8px 2px;cursor:pointer;background:none;border:none;color:var(--ui-dim,#9aa4b2);display:flex;flex-direction:column;align-items:center;gap:3px;border-right:1px solid var(--ui-border,#222b36);}.fp-tab:last-child{border-right:none;}.fp-tab:hover{color:var(--ui-text,#e8e8ea);}.fp-tab.sel{color:var(--accent,#5b9bff);background:var(--ui-surface,#1a212b);}.fp-tab.sel::after{content:'';position:absolute;bottom:-1px;left:0;right:0;height:2px;background:var(--accent,#5b9bff);}.fp-tab-cap{font-size:9px;letter-spacing:.02em;}.fp-ic{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;}.fp-tab-badge{position:absolute;top:5px;right:calc(50% - 15px);width:7px;height:7px;border-radius:50%;background:var(--ui-error,#e5484d);}.fp-body{padding:14px 15px;}.fp-row{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:6px 0;border-top:1px solid var(--ui-border,#222b36);font-size:12.5px;}.fp-row:first-child{border-top:none;}.fp-row .lbl{opacity:.7;}.fp-row input{width:90px;flex:none;text-align:right;padding:4px 8px;background:var(--ui-surface-2,#2f3545);color:var(--ui-text,#e8e8ea);border:1px solid var(--ui-border,#4a5570);border-radius:4px;font-family:monospace;}.fp-btn{padding:5px 11px;background:var(--accent,#2680eb);color:#fff;border:none;border-radius:5px;cursor:pointer;font-size:11px;}.fp-btn.ghost{background:none;border:1px solid var(--ui-border,#4a5570);color:var(--ui-text,#e8e8ea);}.fp-alm{display:flex;align-items:center;gap:8px;margin-bottom:6px;}.fp-chip{width:12px;height:12px;border-radius:50%;background:var(--ui-ok,#30a46c);}.fp-alm.active .fp-chip{background:var(--ui-error,#e5484d);}.fp-alm .nm{flex:1;font-size:12px;}.fp-mai{display:flex;gap:16px;align-items:stretch;}.fp-mai webui-plantpax-components-level-bar{flex:none;}.fp-pv{flex:1;display:flex;flex-direction:column;}.pv-big{font-size:36px;font-weight:710;letter-spacing:-.02em;line-height:1;}.pv-eu{font-size:12px;opacity:.7;margin:3px 0 8px;}.pv-mem{font-family:monospace;font-size:10px;color:var(--accent,#5b9bff);opacity:.8;}.fp-flags{display:flex;gap:8px;flex-wrap:wrap;margin-top:14px;}.fp-sec{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--ui-dim,#9aa4b2);margin:14px 0 8px;padding-bottom:5px;border-bottom:1px solid var(--ui-border,#222b36);}.fp-sec:first-child{margin-top:2px;}.fp-mrow{display:flex;align-items:center;gap:8px;margin-bottom:5px;}.fp-mrow .mnm{width:44px;font-size:12px;opacity:.8;}.fp-mrow .mh{flex:1;text-align:center;font-size:10px;opacity:.6;text-transform:uppercase;}.fp-mrow.head{margin-bottom:6px;}.fp-mrow input.mnum{flex:1;width:0;padding:4px;background:var(--ui-surface-2,#2f3545);color:var(--ui-text,#e8e8ea);border:1px solid var(--ui-border,#4a5570);border-radius:4px;font-size:12px;}.fp-chk{display:flex;align-items:center;gap:8px;font-size:12.5px;margin:8px 0;cursor:pointer;}.fp-chk .m{margin-left:auto;font-family:monospace;font-size:9.5px;color:var(--accent,#5b9bff);opacity:.75;}.fp-row .lbl.cfg{display:flex;flex-direction:column;gap:1px;opacity:1;}.fp-row .lbl.cfg b{font-weight:500;font-size:12.5px;}.cfgmem{font-family:monospace;font-size:9.5px;color:var(--accent,#5b9bff);opacity:.75;}.cfgunit{font-family:monospace;font-size:11px;color:var(--ui-dim,#9aa4b2);margin-left:6px;}.fp-almbar{display:flex;align-items:center;gap:8px;margin-bottom:12px;}.fp-grow{flex:1;}.fp-unack{font-size:12px;color:var(--ui-error,#e5484d);font-weight:600;}.qual{font-weight:600;font-size:12px;display:inline-flex;align-items:center;gap:6px;}.qual::after{content:'';width:8px;height:8px;border-radius:50%;background:currentColor;order:2;}.qual.good{color:var(--ui-ok,#30a46c);}.qual.unc{color:var(--ui-warn,#f6b73c);}.qual.bad{color:var(--ui-error,#e5484d);}.hidden{display:none!important;}.mt-lamps{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:14px;}.mt-cmds{display:flex;gap:10px;margin:10px 0;}.mt-cmds webui-plantpax-components-command-button{flex:1;}.mt-mode{display:flex;align-items:center;gap:8px;font-size:12px;margin-top:8px;}.mt-mode .badge{padding:3px 10px;border-radius:10px;font-weight:700;font-size:11px;background:var(--ui-surface-2,#2f3545);}",
|
|
22
|
-
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function' || typeof instance._getDomElements!=='function') return;\n const subs=[\"running\", \"forward\", \"reverse\", \"stopped\", \"fault\", \"tripped\", \"progOper\", \"failToStart\"];\n for(const f of subs){ (function(field){ ppSubscribe(instance,field,function(v){ instance[field]=v; try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }); })(f); }\n instance._tab=function(name){\n for(const p of instance._getDomElements('[data-pane]')) p.classList.toggle('hidden', p.getAttribute('data-pane')!==name);\n for(const t of instance._getDomElements('.fp-tab')) t.classList.toggle('sel', t.getAttribute('data-tab')===name);\n };\n ppWireHeader(instance);\n instance._tab('
|
|
22
|
+
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function' || typeof instance._getDomElements!=='function') return;\n const subs=[\"running\", \"forward\", \"reverse\", \"stopped\", \"fault\", \"tripped\", \"progOper\", \"failToStart\"];\n for(const f of subs){ (function(field){ ppSubscribe(instance,field,function(v){ instance[field]=v; try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }); })(f); }\n instance._tab=function(name){\n for(const p of instance._getDomElements('[data-pane]')) p.classList.toggle('hidden', p.getAttribute('data-pane')!==name);\n for(const t of instance._getDomElements('.fp-tab')) t.classList.toggle('sel', t.getAttribute('data-tab')===name);\n };\n ppWireHeader(instance);\n instance._tab('Home');\n for(const c of instance._getDomElements('[data-pp]')){ c.root=instance.root; c.type=instance.type;\n if(typeof c._ppReinit==='function'){ c._ppReinit(); } else { (function(cc){ setTimeout(function(){ cc._ppReinit&&cc._ppReinit(); },200); })(c); } }\n for(const b of instance._getDomElements('[data-cmd]')){ (function(btn){ btn.addEventListener('click',function(){ ppWrite(instance,btn.getAttribute('data-cmd'),1,'maintenance'); }); })(b); }\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
23
23
|
}
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"width": "440px",
|
|
18
18
|
"height": "460px"
|
|
19
19
|
},
|
|
20
|
-
"html": "<div class=\"fp\"><div class=\"fp-hdr\"><span class=\"fp-title\">[[this.root]]</span><button class=\"fp-x\">✕</button></div><div class=\"fp-tabs\" data-group=\"main\"><button class=\"fp-tab\" data-tab=\"
|
|
20
|
+
"html": "<div class=\"fp\"><div class=\"fp-hdr\"><span class=\"fp-title\">[[this.root]]</span><button class=\"fp-x\">✕</button></div><div class=\"fp-tabs\" data-group=\"main\"><button class=\"fp-tab\" data-tab=\"Home\" title=\"Home\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M3 11l9-8 9 8\"/><path d=\"M5 10v10h14V10\"/></svg><span class=\"fp-tab-cap\">Home</span></button><button class=\"fp-tab\" data-tab=\"Maintenance\" title=\"Maintenance\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M14 6a3.5 3.5 0 00-4.8 4.2l-5 5 1.4 1.4 5-5A3.5 3.5 0 0014 6z\"/><circle cx=\"16.5\" cy=\"7.5\" r=\"1.2\"/></svg><span class=\"fp-tab-cap\">Maint</span></button><button class=\"fp-tab\" data-tab=\"Alarms\" title=\"Alarms\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M18 8a6 6 0 10-12 0c0 7-3 9-3 9h18s-3-2-3-9\"/><path d=\"M13.7 21a2 2 0 01-3.4 0\"/></svg><span class=\"fp-tab-cap\">Alarm</span></button></div><div class=\"fp-body\"><div data-pane=\"Home\"><div class=\"mt-lamps\"><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"ok\" label=\"Permit OK\" oncolor=\"var(--ui-ok,#30a46c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"perm1\" label=\"Perm 1\" oncolor=\"var(--ui-ok,#30a46c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"perm2\" label=\"Perm 2\" oncolor=\"var(--ui-ok,#30a46c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"perm3\" label=\"Perm 3\" oncolor=\"var(--ui-ok,#30a46c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"bypActive\" label=\"Bypassed\" oncolor=\"var(--ui-warn,#f6b73c)\"></webui-plantpax-components-status-lamp></div><div class=\"mt-cmds\"><webui-plantpax-components-command-button data-pp=\"1\" field=\"cmdByp\" label=\"Bypass\" value=\"1\" action=\"bypassInterlock\"></webui-plantpax-components-command-button></div></div><div data-pane=\"Maintenance\" class=\"hidden\"><div class=\"fp-row\"><span class=\"lbl\">Bypass</span><span>[[this.bypActive?'ACTIVE':'—']]</span></div><button class=\"fp-btn\" data-cmd=\"resetAckAll\" style=\"margin-top:8px\">Reset & Ack All</button></div><div data-pane=\"Alarms\" class=\"hidden\"><button class=\"fp-btn\" data-cmd=\"resetAckAll\" style=\"margin-bottom:8px\">Reset & Ack All</button><div class=\"fp-alm\" bind-attr:class=\"[[this.ok?'fp-alm active':'fp-alm']]\"><span class=\"fp-chip\"></span><span class=\"nm\">Not Permitted</span></div></div></div></div>",
|
|
21
21
|
"style": ":host{display:block;font-family:'Segoe UI',sans-serif;color:var(--ui-text,#e8e8ea);}.fp{display:flex;flex-direction:column;min-width:340px;font-size:13px;background:var(--ui-surface,#1a212b);border-radius:8px;overflow:hidden;}.fp-hdr{display:flex;align-items:center;gap:8px;padding:11px 13px;background:var(--ui-surface-2,#232e3d);}.fp-title{font-weight:640;flex:1;font-size:13px;font-family:monospace;letter-spacing:.01em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.fp-x{cursor:pointer;background:none;border:none;color:var(--ui-text,#e8e8ea);font-size:15px;opacity:.85;padding:2px 7px;border-radius:4px;}.fp-x:hover{background:rgba(255,255,255,.1);}.fp-adv-btn{cursor:pointer;background:none;border:none;color:var(--ui-text,#e8e8ea);opacity:.85;padding:3px;display:flex;border-radius:4px;}.fp-adv-btn:hover{background:rgba(255,255,255,.1);}.fp-desc{padding:6px 13px;font-size:11.5px;color:var(--ui-dim,#9aa4b2);border-bottom:1px solid var(--ui-border,#2b3542);}.fp-tabs{display:flex;background:var(--ui-surface-2,#1e2732);border-bottom:1px solid var(--ui-border,#2b3542);}.fp-tab{flex:1;position:relative;padding:8px 2px;cursor:pointer;background:none;border:none;color:var(--ui-dim,#9aa4b2);display:flex;flex-direction:column;align-items:center;gap:3px;border-right:1px solid var(--ui-border,#222b36);}.fp-tab:last-child{border-right:none;}.fp-tab:hover{color:var(--ui-text,#e8e8ea);}.fp-tab.sel{color:var(--accent,#5b9bff);background:var(--ui-surface,#1a212b);}.fp-tab.sel::after{content:'';position:absolute;bottom:-1px;left:0;right:0;height:2px;background:var(--accent,#5b9bff);}.fp-tab-cap{font-size:9px;letter-spacing:.02em;}.fp-ic{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;}.fp-tab-badge{position:absolute;top:5px;right:calc(50% - 15px);width:7px;height:7px;border-radius:50%;background:var(--ui-error,#e5484d);}.fp-body{padding:14px 15px;}.fp-row{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:6px 0;border-top:1px solid var(--ui-border,#222b36);font-size:12.5px;}.fp-row:first-child{border-top:none;}.fp-row .lbl{opacity:.7;}.fp-row input{width:90px;flex:none;text-align:right;padding:4px 8px;background:var(--ui-surface-2,#2f3545);color:var(--ui-text,#e8e8ea);border:1px solid var(--ui-border,#4a5570);border-radius:4px;font-family:monospace;}.fp-btn{padding:5px 11px;background:var(--accent,#2680eb);color:#fff;border:none;border-radius:5px;cursor:pointer;font-size:11px;}.fp-btn.ghost{background:none;border:1px solid var(--ui-border,#4a5570);color:var(--ui-text,#e8e8ea);}.fp-alm{display:flex;align-items:center;gap:8px;margin-bottom:6px;}.fp-chip{width:12px;height:12px;border-radius:50%;background:var(--ui-ok,#30a46c);}.fp-alm.active .fp-chip{background:var(--ui-error,#e5484d);}.fp-alm .nm{flex:1;font-size:12px;}.fp-mai{display:flex;gap:16px;align-items:stretch;}.fp-mai webui-plantpax-components-level-bar{flex:none;}.fp-pv{flex:1;display:flex;flex-direction:column;}.pv-big{font-size:36px;font-weight:710;letter-spacing:-.02em;line-height:1;}.pv-eu{font-size:12px;opacity:.7;margin:3px 0 8px;}.pv-mem{font-family:monospace;font-size:10px;color:var(--accent,#5b9bff);opacity:.8;}.fp-flags{display:flex;gap:8px;flex-wrap:wrap;margin-top:14px;}.fp-sec{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--ui-dim,#9aa4b2);margin:14px 0 8px;padding-bottom:5px;border-bottom:1px solid var(--ui-border,#222b36);}.fp-sec:first-child{margin-top:2px;}.fp-mrow{display:flex;align-items:center;gap:8px;margin-bottom:5px;}.fp-mrow .mnm{width:44px;font-size:12px;opacity:.8;}.fp-mrow .mh{flex:1;text-align:center;font-size:10px;opacity:.6;text-transform:uppercase;}.fp-mrow.head{margin-bottom:6px;}.fp-mrow input.mnum{flex:1;width:0;padding:4px;background:var(--ui-surface-2,#2f3545);color:var(--ui-text,#e8e8ea);border:1px solid var(--ui-border,#4a5570);border-radius:4px;font-size:12px;}.fp-chk{display:flex;align-items:center;gap:8px;font-size:12.5px;margin:8px 0;cursor:pointer;}.fp-chk .m{margin-left:auto;font-family:monospace;font-size:9.5px;color:var(--accent,#5b9bff);opacity:.75;}.fp-row .lbl.cfg{display:flex;flex-direction:column;gap:1px;opacity:1;}.fp-row .lbl.cfg b{font-weight:500;font-size:12.5px;}.cfgmem{font-family:monospace;font-size:9.5px;color:var(--accent,#5b9bff);opacity:.75;}.cfgunit{font-family:monospace;font-size:11px;color:var(--ui-dim,#9aa4b2);margin-left:6px;}.fp-almbar{display:flex;align-items:center;gap:8px;margin-bottom:12px;}.fp-grow{flex:1;}.fp-unack{font-size:12px;color:var(--ui-error,#e5484d);font-weight:600;}.qual{font-weight:600;font-size:12px;display:inline-flex;align-items:center;gap:6px;}.qual::after{content:'';width:8px;height:8px;border-radius:50%;background:currentColor;order:2;}.qual.good{color:var(--ui-ok,#30a46c);}.qual.unc{color:var(--ui-warn,#f6b73c);}.qual.bad{color:var(--ui-error,#e5484d);}.hidden{display:none!important;}.mt-lamps{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:14px;}.mt-cmds{display:flex;gap:10px;margin:10px 0;}.mt-cmds webui-plantpax-components-command-button{flex:1;}.mt-mode{display:flex;align-items:center;gap:8px;font-size:12px;margin-top:8px;}.mt-mode .badge{padding:3px 10px;border-radius:10px;font-weight:700;font-size:11px;background:var(--ui-surface-2,#2f3545);}",
|
|
22
|
-
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function' || typeof instance._getDomElements!=='function') return;\n const subs=[\"ok\", \"perm1\", \"perm2\", \"perm3\", \"bypActive\"];\n for(const f of subs){ (function(field){ ppSubscribe(instance,field,function(v){ instance[field]=v; try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }); })(f); }\n instance._tab=function(name){\n for(const p of instance._getDomElements('[data-pane]')) p.classList.toggle('hidden', p.getAttribute('data-pane')!==name);\n for(const t of instance._getDomElements('.fp-tab')) t.classList.toggle('sel', t.getAttribute('data-tab')===name);\n };\n ppWireHeader(instance);\n instance._tab('
|
|
22
|
+
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function' || typeof instance._getDomElements!=='function') return;\n const subs=[\"ok\", \"perm1\", \"perm2\", \"perm3\", \"bypActive\"];\n for(const f of subs){ (function(field){ ppSubscribe(instance,field,function(v){ instance[field]=v; try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }); })(f); }\n instance._tab=function(name){\n for(const p of instance._getDomElements('[data-pane]')) p.classList.toggle('hidden', p.getAttribute('data-pane')!==name);\n for(const t of instance._getDomElements('.fp-tab')) t.classList.toggle('sel', t.getAttribute('data-tab')===name);\n };\n ppWireHeader(instance);\n instance._tab('Home');\n for(const c of instance._getDomElements('[data-pp]')){ c.root=instance.root; c.type=instance.type;\n if(typeof c._ppReinit==='function'){ c._ppReinit(); } else { (function(cc){ setTimeout(function(){ cc._ppReinit&&cc._ppReinit(); },200); })(c); } }\n for(const b of instance._getDomElements('[data-cmd]')){ (function(btn){ btn.addEventListener('click',function(){ ppWrite(instance,btn.getAttribute('data-cmd'),1,'maintenance'); }); })(b); }\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
23
23
|
}
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"width": "460px",
|
|
18
18
|
"height": "520px"
|
|
19
19
|
},
|
|
20
|
-
"html": "<div class=\"fp\"><div class=\"fp-hdr\"><span class=\"fp-title\">[[this.root]]</span><button class=\"fp-x\">✕</button></div><div class=\"fp-tabs\" data-group=\"main\"><button class=\"fp-tab\" data-tab=\"
|
|
20
|
+
"html": "<div class=\"fp\"><div class=\"fp-hdr\"><span class=\"fp-title\">[[this.root]]</span><button class=\"fp-x\">✕</button></div><div class=\"fp-tabs\" data-group=\"main\"><button class=\"fp-tab\" data-tab=\"Home\" title=\"Home\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M3 11l9-8 9 8\"/><path d=\"M5 10v10h14V10\"/></svg><span class=\"fp-tab-cap\">Home</span></button><button class=\"fp-tab\" data-tab=\"Maintenance\" title=\"Maintenance\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M14 6a3.5 3.5 0 00-4.8 4.2l-5 5 1.4 1.4 5-5A3.5 3.5 0 0014 6z\"/><circle cx=\"16.5\" cy=\"7.5\" r=\"1.2\"/></svg><span class=\"fp-tab-cap\">Maint</span></button><button class=\"fp-tab\" data-tab=\"Alarms\" title=\"Alarms\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M18 8a6 6 0 10-12 0c0 7-3 9-3 9h18s-3-2-3-9\"/><path d=\"M13.7 21a2 2 0 01-3.4 0\"/></svg><span class=\"fp-tab-cap\">Alarm</span></button></div><div class=\"fp-body\"><div data-pane=\"Home\"><div style=\"margin-bottom:6px;\"><webui-plantpax-components-level-bar data-pp=\"1\" bind-prop:unit=\"[[this.unit]]\"></webui-plantpax-components-level-bar></div><div class=\"fp-row\"><span class=\"lbl\">SP</span><span>[[this.sp==null?'--':Number(this.sp).toFixed(1)]] [[this.unit||'']]</span></div><div class=\"fp-row\"><span class=\"lbl\">CV</span><span>[[this.cv==null?'--':Number(this.cv).toFixed(1)]] %</span></div><webui-plantpax-components-std-slider data-pp=\"1\" field=\"setSp\" label=\"SP\" action=\"setpointOverride\" min=\"0\" max=\"100\"></webui-plantpax-components-std-slider><div class=\"mt-mode\" style=\"margin-top:10px;\">Mode <span class=\"badge\">[[this.modeCascade?'Cascade':(this.modeAuto?'Auto':(this.modeManual?'Manual':(this.modeOverride?'Override':'—')))]]</span></div><div class=\"mt-cmds\" style=\"margin-top:8px;\"><webui-plantpax-components-command-button data-pp=\"1\" field=\"cmdManual\" label=\"Manual\" value=\"1\" action=\"operate\"></webui-plantpax-components-command-button><webui-plantpax-components-command-button data-pp=\"1\" field=\"cmdAuto\" label=\"Auto\" value=\"1\" action=\"operate\"></webui-plantpax-components-command-button><webui-plantpax-components-command-button data-pp=\"1\" field=\"cmdCascade\" label=\"Cascade\" value=\"1\" action=\"operate\"></webui-plantpax-components-command-button></div></div><div data-pane=\"Maintenance\" class=\"hidden\"><div class=\"fp-row\"><span class=\"lbl\">PV</span><span>[[this.pv==null?'--':Number(this.pv).toFixed(1)]]</span></div><div class=\"fp-row\"><span class=\"lbl\">Prog/Oper</span><span>[[this.progOper?'Operator':'Program']]</span></div><button class=\"fp-btn\" data-cmd=\"resetAckAll\" style=\"margin-top:8px\">Reset & Ack All</button></div><div data-pane=\"Alarms\" class=\"hidden\"><button class=\"fp-btn\" data-cmd=\"resetAckAll\" style=\"margin-bottom:8px\">Reset & Ack All</button><div class=\"fp-alm\" bind-attr:class=\"[[this.modeOverride?'fp-alm active':'fp-alm']]\"><span class=\"fp-chip\"></span><span class=\"nm\">Override Active</span></div></div></div></div>",
|
|
21
21
|
"style": ":host{display:block;font-family:'Segoe UI',sans-serif;color:var(--ui-text,#e8e8ea);}.fp{display:flex;flex-direction:column;min-width:340px;font-size:13px;background:var(--ui-surface,#1a212b);border-radius:8px;overflow:hidden;}.fp-hdr{display:flex;align-items:center;gap:8px;padding:11px 13px;background:var(--ui-surface-2,#232e3d);}.fp-title{font-weight:640;flex:1;font-size:13px;font-family:monospace;letter-spacing:.01em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.fp-x{cursor:pointer;background:none;border:none;color:var(--ui-text,#e8e8ea);font-size:15px;opacity:.85;padding:2px 7px;border-radius:4px;}.fp-x:hover{background:rgba(255,255,255,.1);}.fp-adv-btn{cursor:pointer;background:none;border:none;color:var(--ui-text,#e8e8ea);opacity:.85;padding:3px;display:flex;border-radius:4px;}.fp-adv-btn:hover{background:rgba(255,255,255,.1);}.fp-desc{padding:6px 13px;font-size:11.5px;color:var(--ui-dim,#9aa4b2);border-bottom:1px solid var(--ui-border,#2b3542);}.fp-tabs{display:flex;background:var(--ui-surface-2,#1e2732);border-bottom:1px solid var(--ui-border,#2b3542);}.fp-tab{flex:1;position:relative;padding:8px 2px;cursor:pointer;background:none;border:none;color:var(--ui-dim,#9aa4b2);display:flex;flex-direction:column;align-items:center;gap:3px;border-right:1px solid var(--ui-border,#222b36);}.fp-tab:last-child{border-right:none;}.fp-tab:hover{color:var(--ui-text,#e8e8ea);}.fp-tab.sel{color:var(--accent,#5b9bff);background:var(--ui-surface,#1a212b);}.fp-tab.sel::after{content:'';position:absolute;bottom:-1px;left:0;right:0;height:2px;background:var(--accent,#5b9bff);}.fp-tab-cap{font-size:9px;letter-spacing:.02em;}.fp-ic{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;}.fp-tab-badge{position:absolute;top:5px;right:calc(50% - 15px);width:7px;height:7px;border-radius:50%;background:var(--ui-error,#e5484d);}.fp-body{padding:14px 15px;}.fp-row{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:6px 0;border-top:1px solid var(--ui-border,#222b36);font-size:12.5px;}.fp-row:first-child{border-top:none;}.fp-row .lbl{opacity:.7;}.fp-row input{width:90px;flex:none;text-align:right;padding:4px 8px;background:var(--ui-surface-2,#2f3545);color:var(--ui-text,#e8e8ea);border:1px solid var(--ui-border,#4a5570);border-radius:4px;font-family:monospace;}.fp-btn{padding:5px 11px;background:var(--accent,#2680eb);color:#fff;border:none;border-radius:5px;cursor:pointer;font-size:11px;}.fp-btn.ghost{background:none;border:1px solid var(--ui-border,#4a5570);color:var(--ui-text,#e8e8ea);}.fp-alm{display:flex;align-items:center;gap:8px;margin-bottom:6px;}.fp-chip{width:12px;height:12px;border-radius:50%;background:var(--ui-ok,#30a46c);}.fp-alm.active .fp-chip{background:var(--ui-error,#e5484d);}.fp-alm .nm{flex:1;font-size:12px;}.fp-mai{display:flex;gap:16px;align-items:stretch;}.fp-mai webui-plantpax-components-level-bar{flex:none;}.fp-pv{flex:1;display:flex;flex-direction:column;}.pv-big{font-size:36px;font-weight:710;letter-spacing:-.02em;line-height:1;}.pv-eu{font-size:12px;opacity:.7;margin:3px 0 8px;}.pv-mem{font-family:monospace;font-size:10px;color:var(--accent,#5b9bff);opacity:.8;}.fp-flags{display:flex;gap:8px;flex-wrap:wrap;margin-top:14px;}.fp-sec{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--ui-dim,#9aa4b2);margin:14px 0 8px;padding-bottom:5px;border-bottom:1px solid var(--ui-border,#222b36);}.fp-sec:first-child{margin-top:2px;}.fp-mrow{display:flex;align-items:center;gap:8px;margin-bottom:5px;}.fp-mrow .mnm{width:44px;font-size:12px;opacity:.8;}.fp-mrow .mh{flex:1;text-align:center;font-size:10px;opacity:.6;text-transform:uppercase;}.fp-mrow.head{margin-bottom:6px;}.fp-mrow input.mnum{flex:1;width:0;padding:4px;background:var(--ui-surface-2,#2f3545);color:var(--ui-text,#e8e8ea);border:1px solid var(--ui-border,#4a5570);border-radius:4px;font-size:12px;}.fp-chk{display:flex;align-items:center;gap:8px;font-size:12.5px;margin:8px 0;cursor:pointer;}.fp-chk .m{margin-left:auto;font-family:monospace;font-size:9.5px;color:var(--accent,#5b9bff);opacity:.75;}.fp-row .lbl.cfg{display:flex;flex-direction:column;gap:1px;opacity:1;}.fp-row .lbl.cfg b{font-weight:500;font-size:12.5px;}.cfgmem{font-family:monospace;font-size:9.5px;color:var(--accent,#5b9bff);opacity:.75;}.cfgunit{font-family:monospace;font-size:11px;color:var(--ui-dim,#9aa4b2);margin-left:6px;}.fp-almbar{display:flex;align-items:center;gap:8px;margin-bottom:12px;}.fp-grow{flex:1;}.fp-unack{font-size:12px;color:var(--ui-error,#e5484d);font-weight:600;}.qual{font-weight:600;font-size:12px;display:inline-flex;align-items:center;gap:6px;}.qual::after{content:'';width:8px;height:8px;border-radius:50%;background:currentColor;order:2;}.qual.good{color:var(--ui-ok,#30a46c);}.qual.unc{color:var(--ui-warn,#f6b73c);}.qual.bad{color:var(--ui-error,#e5484d);}.hidden{display:none!important;}.mt-lamps{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:14px;}.mt-cmds{display:flex;gap:10px;margin:10px 0;}.mt-cmds webui-plantpax-components-command-button{flex:1;}.mt-mode{display:flex;align-items:center;gap:8px;font-size:12px;margin-top:8px;}.mt-mode .badge{padding:3px 10px;border-radius:10px;font-weight:700;font-size:11px;background:var(--ui-surface-2,#2f3545);}",
|
|
22
|
-
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function' || typeof instance._getDomElements!=='function') return;\n const subs=[\"pv\", \"sp\", \"cv\", \"pvEuMin\", \"pvEuMax\", \"progOper\", \"modeAuto\", \"modeManual\", \"modeCascade\", \"modeOverride\"];\n for(const f of subs){ (function(field){ ppSubscribe(instance,field,function(v){ instance[field]=v; try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }); })(f); }\n instance._tab=function(name){\n for(const p of instance._getDomElements('[data-pane]')) p.classList.toggle('hidden', p.getAttribute('data-pane')!==name);\n for(const t of instance._getDomElements('.fp-tab')) t.classList.toggle('sel', t.getAttribute('data-tab')===name);\n };\n ppWireHeader(instance);\n instance._tab('
|
|
22
|
+
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function' || typeof instance._getDomElements!=='function') return;\n const subs=[\"pv\", \"sp\", \"cv\", \"pvEuMin\", \"pvEuMax\", \"progOper\", \"modeAuto\", \"modeManual\", \"modeCascade\", \"modeOverride\"];\n for(const f of subs){ (function(field){ ppSubscribe(instance,field,function(v){ instance[field]=v; try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }); })(f); }\n instance._tab=function(name){\n for(const p of instance._getDomElements('[data-pane]')) p.classList.toggle('hidden', p.getAttribute('data-pane')!==name);\n for(const t of instance._getDomElements('.fp-tab')) t.classList.toggle('sel', t.getAttribute('data-tab')===name);\n };\n ppWireHeader(instance);\n instance._tab('Home');\n for(const c of instance._getDomElements('[data-pp]')){ c.root=instance.root; c.type=instance.type;\n if(typeof c._ppReinit==='function'){ c._ppReinit(); } else { (function(cc){ setTimeout(function(){ cc._ppReinit&&cc._ppReinit(); },200); })(c); } }\n for(const b of instance._getDomElements('[data-cmd]')){ (function(btn){ btn.addEventListener('click',function(){ ppWrite(instance,btn.getAttribute('data-cmd'),1,'maintenance'); }); })(b); }\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
23
23
|
}
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"width": "440px",
|
|
18
18
|
"height": "460px"
|
|
19
19
|
},
|
|
20
|
-
"html": "<div class=\"fp\"><div class=\"fp-hdr\"><span class=\"fp-title\">[[this.root]]</span><button class=\"fp-x\">✕</button></div><div class=\"fp-tabs\" data-group=\"main\"><button class=\"fp-tab\" data-tab=\"
|
|
20
|
+
"html": "<div class=\"fp\"><div class=\"fp-hdr\"><span class=\"fp-title\">[[this.root]]</span><button class=\"fp-x\">✕</button></div><div class=\"fp-tabs\" data-group=\"main\"><button class=\"fp-tab\" data-tab=\"Home\" title=\"Home\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M3 11l9-8 9 8\"/><path d=\"M5 10v10h14V10\"/></svg><span class=\"fp-tab-cap\">Home</span></button><button class=\"fp-tab\" data-tab=\"Maintenance\" title=\"Maintenance\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M14 6a3.5 3.5 0 00-4.8 4.2l-5 5 1.4 1.4 5-5A3.5 3.5 0 0014 6z\"/><circle cx=\"16.5\" cy=\"7.5\" r=\"1.2\"/></svg><span class=\"fp-tab-cap\">Maint</span></button><button class=\"fp-tab\" data-tab=\"Alarms\" title=\"Alarms\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M18 8a6 6 0 10-12 0c0 7-3 9-3 9h18s-3-2-3-9\"/><path d=\"M13.7 21a2 2 0 01-3.4 0\"/></svg><span class=\"fp-tab-cap\">Alarm</span></button></div><div class=\"fp-body\"><div data-pane=\"Home\"><div class=\"mt-lamps\"><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"opened\" label=\"Opened\" oncolor=\"var(--ui-ok,#30a46c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"closed\" label=\"Closed\" oncolor=\"var(--ui-dim,#9aa3b0)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"fault\" label=\"Faulted\" oncolor=\"var(--ui-error,#e5484d)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"tripped\" label=\"Intlk Trip\" oncolor=\"var(--ui-error,#e5484d)\"></webui-plantpax-components-status-lamp></div><div class=\"mt-cmds\"><webui-plantpax-components-command-button data-pp=\"1\" field=\"cmdOpen\" label=\"▲ Open\" value=\"1\" action=\"operate\"></webui-plantpax-components-command-button><webui-plantpax-components-command-button data-pp=\"1\" field=\"cmdClose\" label=\"▼ Close\" value=\"1\" action=\"operate\"></webui-plantpax-components-command-button></div><div class=\"mt-mode\">Mode <span class=\"badge\">[[this.progOper?'Operator':'Program']]</span></div></div><div data-pane=\"Maintenance\" class=\"hidden\"><div class=\"fp-row\"><span class=\"lbl\">Maint Bypass</span><span>[[this.maintByp?'ACTIVE':'—']]</span></div><div class=\"fp-row\"><span class=\"lbl\">Transition</span><span>[[this.opening?'Opening':(this.closing?'Closing':'—')]]</span></div><button class=\"fp-btn\" data-cmd=\"resetAckAll\" style=\"margin-top:8px\">Reset & Ack All</button></div><div data-pane=\"Alarms\" class=\"hidden\"><button class=\"fp-btn\" data-cmd=\"resetAckAll\" style=\"margin-bottom:8px\">Reset & Ack All</button><div class=\"fp-alm\" bind-attr:class=\"[[this.failToOpen?'fp-alm active':'fp-alm']]\"><span class=\"fp-chip\"></span><span class=\"nm\">Fail to Open</span></div><div class=\"fp-alm\" bind-attr:class=\"[[this.failToClose?'fp-alm active':'fp-alm']]\"><span class=\"fp-chip\"></span><span class=\"nm\">Fail to Close</span></div><div class=\"fp-alm\" bind-attr:class=\"[[this.tripped?'fp-alm active':'fp-alm']]\"><span class=\"fp-chip\"></span><span class=\"nm\">Interlock Trip</span></div></div></div></div>",
|
|
21
21
|
"style": ":host{display:block;font-family:'Segoe UI',sans-serif;color:var(--ui-text,#e8e8ea);}.fp{display:flex;flex-direction:column;min-width:340px;font-size:13px;background:var(--ui-surface,#1a212b);border-radius:8px;overflow:hidden;}.fp-hdr{display:flex;align-items:center;gap:8px;padding:11px 13px;background:var(--ui-surface-2,#232e3d);}.fp-title{font-weight:640;flex:1;font-size:13px;font-family:monospace;letter-spacing:.01em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.fp-x{cursor:pointer;background:none;border:none;color:var(--ui-text,#e8e8ea);font-size:15px;opacity:.85;padding:2px 7px;border-radius:4px;}.fp-x:hover{background:rgba(255,255,255,.1);}.fp-adv-btn{cursor:pointer;background:none;border:none;color:var(--ui-text,#e8e8ea);opacity:.85;padding:3px;display:flex;border-radius:4px;}.fp-adv-btn:hover{background:rgba(255,255,255,.1);}.fp-desc{padding:6px 13px;font-size:11.5px;color:var(--ui-dim,#9aa4b2);border-bottom:1px solid var(--ui-border,#2b3542);}.fp-tabs{display:flex;background:var(--ui-surface-2,#1e2732);border-bottom:1px solid var(--ui-border,#2b3542);}.fp-tab{flex:1;position:relative;padding:8px 2px;cursor:pointer;background:none;border:none;color:var(--ui-dim,#9aa4b2);display:flex;flex-direction:column;align-items:center;gap:3px;border-right:1px solid var(--ui-border,#222b36);}.fp-tab:last-child{border-right:none;}.fp-tab:hover{color:var(--ui-text,#e8e8ea);}.fp-tab.sel{color:var(--accent,#5b9bff);background:var(--ui-surface,#1a212b);}.fp-tab.sel::after{content:'';position:absolute;bottom:-1px;left:0;right:0;height:2px;background:var(--accent,#5b9bff);}.fp-tab-cap{font-size:9px;letter-spacing:.02em;}.fp-ic{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;}.fp-tab-badge{position:absolute;top:5px;right:calc(50% - 15px);width:7px;height:7px;border-radius:50%;background:var(--ui-error,#e5484d);}.fp-body{padding:14px 15px;}.fp-row{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:6px 0;border-top:1px solid var(--ui-border,#222b36);font-size:12.5px;}.fp-row:first-child{border-top:none;}.fp-row .lbl{opacity:.7;}.fp-row input{width:90px;flex:none;text-align:right;padding:4px 8px;background:var(--ui-surface-2,#2f3545);color:var(--ui-text,#e8e8ea);border:1px solid var(--ui-border,#4a5570);border-radius:4px;font-family:monospace;}.fp-btn{padding:5px 11px;background:var(--accent,#2680eb);color:#fff;border:none;border-radius:5px;cursor:pointer;font-size:11px;}.fp-btn.ghost{background:none;border:1px solid var(--ui-border,#4a5570);color:var(--ui-text,#e8e8ea);}.fp-alm{display:flex;align-items:center;gap:8px;margin-bottom:6px;}.fp-chip{width:12px;height:12px;border-radius:50%;background:var(--ui-ok,#30a46c);}.fp-alm.active .fp-chip{background:var(--ui-error,#e5484d);}.fp-alm .nm{flex:1;font-size:12px;}.fp-mai{display:flex;gap:16px;align-items:stretch;}.fp-mai webui-plantpax-components-level-bar{flex:none;}.fp-pv{flex:1;display:flex;flex-direction:column;}.pv-big{font-size:36px;font-weight:710;letter-spacing:-.02em;line-height:1;}.pv-eu{font-size:12px;opacity:.7;margin:3px 0 8px;}.pv-mem{font-family:monospace;font-size:10px;color:var(--accent,#5b9bff);opacity:.8;}.fp-flags{display:flex;gap:8px;flex-wrap:wrap;margin-top:14px;}.fp-sec{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--ui-dim,#9aa4b2);margin:14px 0 8px;padding-bottom:5px;border-bottom:1px solid var(--ui-border,#222b36);}.fp-sec:first-child{margin-top:2px;}.fp-mrow{display:flex;align-items:center;gap:8px;margin-bottom:5px;}.fp-mrow .mnm{width:44px;font-size:12px;opacity:.8;}.fp-mrow .mh{flex:1;text-align:center;font-size:10px;opacity:.6;text-transform:uppercase;}.fp-mrow.head{margin-bottom:6px;}.fp-mrow input.mnum{flex:1;width:0;padding:4px;background:var(--ui-surface-2,#2f3545);color:var(--ui-text,#e8e8ea);border:1px solid var(--ui-border,#4a5570);border-radius:4px;font-size:12px;}.fp-chk{display:flex;align-items:center;gap:8px;font-size:12.5px;margin:8px 0;cursor:pointer;}.fp-chk .m{margin-left:auto;font-family:monospace;font-size:9.5px;color:var(--accent,#5b9bff);opacity:.75;}.fp-row .lbl.cfg{display:flex;flex-direction:column;gap:1px;opacity:1;}.fp-row .lbl.cfg b{font-weight:500;font-size:12.5px;}.cfgmem{font-family:monospace;font-size:9.5px;color:var(--accent,#5b9bff);opacity:.75;}.cfgunit{font-family:monospace;font-size:11px;color:var(--ui-dim,#9aa4b2);margin-left:6px;}.fp-almbar{display:flex;align-items:center;gap:8px;margin-bottom:12px;}.fp-grow{flex:1;}.fp-unack{font-size:12px;color:var(--ui-error,#e5484d);font-weight:600;}.qual{font-weight:600;font-size:12px;display:inline-flex;align-items:center;gap:6px;}.qual::after{content:'';width:8px;height:8px;border-radius:50%;background:currentColor;order:2;}.qual.good{color:var(--ui-ok,#30a46c);}.qual.unc{color:var(--ui-warn,#f6b73c);}.qual.bad{color:var(--ui-error,#e5484d);}.hidden{display:none!important;}.mt-lamps{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:14px;}.mt-cmds{display:flex;gap:10px;margin:10px 0;}.mt-cmds webui-plantpax-components-command-button{flex:1;}.mt-mode{display:flex;align-items:center;gap:8px;font-size:12px;margin-top:8px;}.mt-mode .badge{padding:3px 10px;border-radius:10px;font-weight:700;font-size:11px;background:var(--ui-surface-2,#2f3545);}",
|
|
22
|
-
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function' || typeof instance._getDomElements!=='function') return;\n const subs=[\"opened\", \"closed\", \"opening\", \"closing\", \"fault\", \"tripped\", \"maintByp\", \"progOper\", \"failToOpen\", \"failToClose\"];\n for(const f of subs){ (function(field){ ppSubscribe(instance,field,function(v){ instance[field]=v; try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }); })(f); }\n instance._tab=function(name){\n for(const p of instance._getDomElements('[data-pane]')) p.classList.toggle('hidden', p.getAttribute('data-pane')!==name);\n for(const t of instance._getDomElements('.fp-tab')) t.classList.toggle('sel', t.getAttribute('data-tab')===name);\n };\n ppWireHeader(instance);\n instance._tab('
|
|
22
|
+
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function' || typeof instance._getDomElements!=='function') return;\n const subs=[\"opened\", \"closed\", \"opening\", \"closing\", \"fault\", \"tripped\", \"maintByp\", \"progOper\", \"failToOpen\", \"failToClose\"];\n for(const f of subs){ (function(field){ ppSubscribe(instance,field,function(v){ instance[field]=v; try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }); })(f); }\n instance._tab=function(name){\n for(const p of instance._getDomElements('[data-pane]')) p.classList.toggle('hidden', p.getAttribute('data-pane')!==name);\n for(const t of instance._getDomElements('.fp-tab')) t.classList.toggle('sel', t.getAttribute('data-tab')===name);\n };\n ppWireHeader(instance);\n instance._tab('Home');\n for(const c of instance._getDomElements('[data-pp]')){ c.root=instance.root; c.type=instance.type;\n if(typeof c._ppReinit==='function'){ c._ppReinit(); } else { (function(cc){ setTimeout(function(){ cc._ppReinit&&cc._ppReinit(); },200); })(c); } }\n for(const b of instance._getDomElements('[data-cmd]')){ (function(btn){ btn.addEventListener('click',function(){ ppWrite(instance,btn.getAttribute('data-cmd'),1,'maintenance'); }); })(b); }\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
23
23
|
}
|