@procaaso/alphinity-ui-components 1.9.0 → 1.10.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/dist/index.d.cts CHANGED
@@ -48,6 +48,38 @@ declare const Selector: react__default.FC<SelectorProps>;
48
48
  * Status levels for telemetry values
49
49
  */
50
50
  type TelemetryStatus$1 = 'normal' | 'warning' | 'alarm' | 'fault' | 'off';
51
+ /**
52
+ * Marks a value as a maintenance force rather than a measured reading
53
+ * (alphinity-tffi issue #3607, unit U11). A forced value is a deliberate
54
+ * substitution at the instrument, so a surface that shows it must show
55
+ * `active` and, when known, the real value beside it. Never render `active`
56
+ * as a `TelemetryStatus` color; forced and alarm/warning/fault are
57
+ * independent facts about the same reading.
58
+ */
59
+ interface ForcedState {
60
+ /** True while the tag carries an active maintenance force. Source: the control program's Sts_SimulationActive flag. */
61
+ active: boolean;
62
+ /**
63
+ * The real, unforced value, in the same unit as the primary value.
64
+ * Optional: the backend does not publish this yet for every tag kind
65
+ * (alphinity-tffi unit U3b). Render the forced mark alone when this is
66
+ * absent; never show a placeholder in its place.
67
+ *
68
+ * Covers both directions this feature forces, and the two read
69
+ * differently even though the field is the same:
70
+ * - Forced INPUT (a transmitter): the real, currently measured value.
71
+ * - Forced OUTPUT (a valve, a lamp, a commanded position): the value the
72
+ * control system would be commanding right now if the force were not
73
+ * active. Not the feedback tag. XV valve position feedback (ZSC/ZSO) is
74
+ * synthesized from the commanded position, not sensed by a physical
75
+ * limit switch (alphinity-tffi #774, a permanent design choice), and
76
+ * pump feedback reaches the bus but nothing consumes it as a position.
77
+ * Showing either as "real" would present a derived number as measured -
78
+ * the exact confidently-wrong display this feature exists to prevent.
79
+ * A commanded value, honestly labeled, is the only real answer here.
80
+ */
81
+ realValue?: number | string | boolean;
82
+ }
51
83
  /**
52
84
  * Live telemetry value with status
53
85
  */
@@ -98,6 +130,11 @@ interface TelemetryBinding {
98
130
  tag: string;
99
131
  /** Current telemetry value */
100
132
  value: TelemetryValue;
133
+ /**
134
+ * Maintenance force state (#3607, R19). Absent or `active: false` means
135
+ * the value is a real reading; render nothing extra. See `ForcedState`.
136
+ */
137
+ forced?: ForcedState;
101
138
  /**
102
139
  * Uniform scaling / EU metadata (units, range, precision). When present it is
103
140
  * the authoritative source for the displayed units, decimal precision, and
@@ -197,10 +234,34 @@ interface ControlPanelProps extends react__default.HTMLAttributes<HTMLDivElement
197
234
  modeOptions: SelectorOption[];
198
235
  /** Callback when mode changes */
199
236
  onModeChange: (mode: string) => void;
200
- /** Current setpoint value */
237
+ /** Typed/target setpoint value (editable) */
201
238
  setpointValue: number | string;
202
239
  /** Callback when setpoint changes */
203
240
  onSetpointChange: (value: number | string) => void;
241
+ /**
242
+ * The setpoint the control loop is currently running: read-only feedback
243
+ * from live telemetry, shown beside the typed setpoint above so an
244
+ * operator sees target and current separately (the typed field never
245
+ * "snaps back" to reflect the live value).
246
+ *
247
+ * Optional and hidden by default: the caller decides when a live-feedback
248
+ * row is worth showing, since always showing a normally-differing current
249
+ * value can read as a fault when none exists. When this tag carries a
250
+ * maintenance force, the caller MUST pass this prop at that time - a
251
+ * hidden value shows nothing, forced or not, but a shown value must carry
252
+ * its FORCED mark (#3607, R19).
253
+ */
254
+ currentSetpointValue?: number | string;
255
+ /**
256
+ * True when `currentSetpointValue` is a maintenance force, not a measured
257
+ * reading. Ignored when `currentSetpointValue` is not provided.
258
+ */
259
+ currentSetpointForced?: boolean;
260
+ /**
261
+ * The real, unforced value for `currentSetpointValue`. Optional; absent
262
+ * until the backend publishes it (alphinity-tffi unit U3b).
263
+ */
264
+ currentSetpointRealValue?: number | string;
204
265
  /** Current second setpoint value (for ramp mode, etc.) */
205
266
  secondSetpointValue?: number | string;
206
267
  /** Callback when second setpoint changes */
@@ -266,6 +327,22 @@ interface StatusIndicatorProps extends react__default.HTMLAttributes<HTMLDivElem
266
327
  shape?: 'circle' | 'square' | 'diamond';
267
328
  /** Whether the indicator should have a 3D LED effect */
268
329
  led?: boolean;
330
+ /**
331
+ * True when the underlying tag's state is a maintenance force, not a
332
+ * measured reading (#3607, R19). Renders a small glyph badge, never a
333
+ * color change: this indicator's whole signal is color plus a short
334
+ * label today, and color alone fails a colorblind operator.
335
+ */
336
+ forced?: boolean;
337
+ /**
338
+ * The real, unforced state, shown as text beside `label` when `forced`
339
+ * is true. For a forced discrete OUTPUT (a lamp, a valve OPEN/CLOSED
340
+ * indicator - R2), this is the state the system would command if the
341
+ * force were not active, not a second physical reading. Optional:
342
+ * absent until the backend publishes it. When absent, only the forced
343
+ * glyph badge renders.
344
+ */
345
+ realValue?: string;
269
346
  }
270
347
  declare const StatusIndicator: react__default.FC<StatusIndicatorProps>;
271
348
 
@@ -290,6 +367,19 @@ interface ValueEntryProps extends Omit<react__default.InputHTMLAttributes<HTMLIn
290
367
  label?: string;
291
368
  /** Whether the input is read-only */
292
369
  readOnly?: boolean;
370
+ /**
371
+ * True when `value` is a maintenance force, not a measured reading
372
+ * (#3607, R19). Source: the control program's Sts_SimulationActive flag.
373
+ * Renders a FORCED badge; never changes `status`, which stays an
374
+ * independent fact about the same reading.
375
+ */
376
+ forced?: boolean;
377
+ /**
378
+ * The real, unforced value, shown beside `value` when `forced` is true.
379
+ * Optional: the backend does not publish this for every tag kind yet
380
+ * (alphinity-tffi unit U3b). When absent, only the FORCED badge renders.
381
+ */
382
+ realValue?: number | string;
293
383
  }
294
384
  declare const ValueEntry: react__default.FC<ValueEntryProps>;
295
385
 
@@ -314,6 +404,16 @@ interface LegacyValueEntryProps extends Omit<react__default.InputHTMLAttributes<
314
404
  label?: string;
315
405
  /** Whether the input is read-only */
316
406
  readOnly?: boolean;
407
+ /**
408
+ * True when `value` is a maintenance force, not a measured reading
409
+ * (#3607, R19). Renders a FORCED badge; never changes `status`.
410
+ */
411
+ forced?: boolean;
412
+ /**
413
+ * The real, unforced value, shown beside `value` when `forced` is true.
414
+ * Optional; absent until the backend publishes it (unit U3b).
415
+ */
416
+ realValue?: number | string;
317
417
  }
318
418
  declare const LegacyValueEntry: react__default.FC<LegacyValueEntryProps>;
319
419
 
@@ -328,10 +428,16 @@ interface NodeControlConfig {
328
428
  currentMode: string;
329
429
  /** Callback when mode changes */
330
430
  onModeChange: (mode: string) => void;
331
- /** Current setpoint value */
431
+ /** Typed/target setpoint value (editable) */
332
432
  setpoint: number | string;
333
433
  /** Callback when setpoint changes */
334
434
  onSetpointChange: (value: number | string) => void;
435
+ /** Current setpoint: read-only feedback from live telemetry. See ControlPanelProps.currentSetpointValue. */
436
+ currentSetpoint?: number | string;
437
+ /** True when `currentSetpoint` is a maintenance force, not a measured reading. */
438
+ currentSetpointForced?: boolean;
439
+ /** The real, unforced value for `currentSetpoint`. Optional; absent until the backend publishes it. */
440
+ currentSetpointRealValue?: number | string;
335
441
  /** Optional second setpoint value */
336
442
  secondSetpoint?: number | string;
337
443
  /** Callback for second setpoint */
@@ -450,6 +556,11 @@ interface ControlParameter {
450
556
  precision?: number;
451
557
  /** Current value */
452
558
  value: number | string | boolean;
559
+ /**
560
+ * Maintenance force state for this parameter (#3607, R19). Absent or
561
+ * `active: false` means `value` is a real reading. See `ForcedState`.
562
+ */
563
+ forced?: ForcedState;
453
564
  /** Whether parameter is read-only */
454
565
  readOnly?: boolean;
455
566
  /** Parameter type */
@@ -758,6 +869,11 @@ interface TrendLineProps {
758
869
  color?: string;
759
870
  strokeWidth?: number;
760
871
  backgroundColor?: string;
872
+ /**
873
+ * True when `values` trends a maintenance force, not measured readings
874
+ * (#3607, R19). Renders a FORCED tag; the trend line itself is unchanged.
875
+ */
876
+ forced?: boolean;
761
877
  }
762
878
  interface CircularGaugeProps {
763
879
  value: number;
@@ -766,12 +882,27 @@ interface CircularGaugeProps {
766
882
  label: string;
767
883
  size?: number;
768
884
  color?: string;
885
+ /**
886
+ * True when `value` is a maintenance force, not a measured reading
887
+ * (#3607, R19). Source: the control program's Sts_SimulationActive flag.
888
+ */
889
+ forced?: boolean;
890
+ /**
891
+ * The real, unforced value, shown beside `value` when `forced` is true.
892
+ * Optional; absent until the backend publishes it (unit U3b).
893
+ */
894
+ realValue?: number;
769
895
  }
770
896
  interface SparklineProps {
771
897
  data: number[];
772
898
  width: number;
773
899
  height: number;
774
900
  color: string;
901
+ /**
902
+ * True when `data` trends a maintenance force, not measured readings
903
+ * (#3607, R19). Renders a FORCED tag; the trend line itself is unchanged.
904
+ */
905
+ forced?: boolean;
775
906
  }
776
907
  interface EquipmentIndicatorWithSparklineProps {
777
908
  svgX: number;
@@ -784,6 +915,13 @@ interface EquipmentIndicatorWithSparklineProps {
784
915
  x: number;
785
916
  y: number;
786
917
  };
918
+ /**
919
+ * True when this equipment's state is a maintenance force, not a measured
920
+ * reading (#3607, R19). Renders a small glyph badge, never a color
921
+ * change: this indicator's whole signal is color plus a short label
922
+ * today, and color alone fails a colorblind operator.
923
+ */
924
+ forced?: boolean;
787
925
  }
788
926
  interface EquipmentIndicatorProps {
789
927
  svgX: number;
@@ -793,6 +931,12 @@ interface EquipmentIndicatorProps {
793
931
  size?: number;
794
932
  style?: react__default.CSSProperties;
795
933
  className?: string;
934
+ /**
935
+ * True when this equipment's state is a maintenance force, not a measured
936
+ * reading (#3607, R19). Renders a small glyph badge, never a color
937
+ * change. See EquipmentIndicatorWithSparklineProps.forced.
938
+ */
939
+ forced?: boolean;
796
940
  }
797
941
  interface FullscreenWorkspaceTab {
798
942
  label: string;
@@ -954,11 +1098,11 @@ declare const CardUnit: _emotion_styled.StyledComponent<{
954
1098
  as?: React.ElementType;
955
1099
  }, react.DetailedHTMLProps<react.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
956
1100
 
957
- declare const TrendLine: ({ values, width, height, color, strokeWidth, backgroundColor, }: TrendLineProps) => react.JSX.Element;
958
- declare const CircularGauge: ({ value, max, unit, label, size, color, }: CircularGaugeProps) => react.JSX.Element;
959
- declare const Sparkline: ({ data, width, height, color }: SparklineProps) => react.JSX.Element | null;
960
- declare const EquipmentIndicatorWithSparkline: ({ svgX, svgY, color, label, size, sparklineData, sparklineOffset, }: EquipmentIndicatorWithSparklineProps) => react.JSX.Element;
961
- declare const EquipmentIndicator: ({ svgX, svgY, color, label, size, style, className, }: EquipmentIndicatorProps) => react.JSX.Element;
1101
+ declare const TrendLine: ({ values, width, height, color, strokeWidth, backgroundColor, forced, }: TrendLineProps) => react.JSX.Element;
1102
+ declare const CircularGauge: ({ value, max, unit, label, size, color, forced, realValue, }: CircularGaugeProps) => react.JSX.Element;
1103
+ declare const Sparkline: ({ data, width, height, color, forced }: SparklineProps) => react.JSX.Element | null;
1104
+ declare const EquipmentIndicatorWithSparkline: ({ svgX, svgY, color, label, size, sparklineData, sparklineOffset, forced, }: EquipmentIndicatorWithSparklineProps) => react.JSX.Element;
1105
+ declare const EquipmentIndicator: ({ svgX, svgY, color, label, size, style, className, forced, }: EquipmentIndicatorProps) => react.JSX.Element;
962
1106
 
963
1107
  declare function FullscreenWorkspace({ svgContent, overlays, leftPanel, rightPanel, footer, tabs, activeTab, onTabChange, defaultLeftCollapsed, defaultRightCollapsed, leftCollapsed: leftCollapsedProp, rightCollapsed: rightCollapsedProp, onLeftCollapseChange, onRightCollapseChange, displayMode, defaultDisplayMode, onDisplayModeChange, showDisplayModeToggle, showZoomControls, onZoomIn, onZoomOut, onResetZoom, zoomDisabled, className, ...rest }: FullscreenWorkspaceProps): react__default.ReactElement;
964
1108
 
@@ -1018,6 +1162,17 @@ type StatusColorMap = Partial<Record<DeviceStatus, Partial<StatusColorEntry>>>;
1018
1162
  * - stopping: amber (transitional)
1019
1163
  */
1020
1164
  declare const DEFAULT_STATUS_COLORS: Record<DeviceStatus, StatusColorEntry>;
1165
+ /**
1166
+ * Maintenance-force marking color (#3607, R19). Deliberately outside
1167
+ * DEFAULT_STATUS_COLORS: a forced value is not a health status, and must
1168
+ * never share a color with warning/alarm/fault or read as one of them.
1169
+ * Violet is unused elsewhere in this palette.
1170
+ *
1171
+ * Light fill + dark text, not a solid vivid chip: reads as a calm marker
1172
+ * rather than an alarm sticker, while the vivid `border` shade still
1173
+ * outlines a forced value's box/ring so it stays findable at a glance.
1174
+ */
1175
+ declare const FORCED_MARK_COLOR: StatusColorEntry;
1021
1176
  /**
1022
1177
  * Resolve a status string to a full color entry.
1023
1178
  *
@@ -1730,6 +1885,15 @@ interface ConfigParameter {
1730
1885
  type: 'number' | 'string' | 'boolean' | 'select' | 'multiselect';
1731
1886
  /** Current value */
1732
1887
  value: any;
1888
+ /**
1889
+ * Maintenance force state for this parameter (#3607, R19). A field the
1890
+ * operator has not overridden falls back to control's live value (the
1891
+ * pilet's own DashboardScreen does this on every config refresh), so
1892
+ * `value` here can be a live, forced reading, not only a static setting.
1893
+ * Absent or `active: false` means `value` is a real reading or a real
1894
+ * saved setting. See `ForcedState`.
1895
+ */
1896
+ forced?: ForcedState;
1733
1897
  /** Default value */
1734
1898
  defaultValue?: any;
1735
1899
  /** Whether parameter is read-only */
@@ -2058,4 +2222,4 @@ interface SimulationOptions {
2058
2222
  */
2059
2223
  declare function useSimulation(telemetry: TelemetryMap, updateTelemetryBatch: (updates: Array<any>) => void, options?: SimulationOptions): void;
2060
2224
 
2061
- export { type AnchorType, Button, type ButtonProps, CardHeader, CardUnit, CardValue, CircularGauge, type CircularGaugeProps, type CommandKind, type ConfigActions, type ConfigDisplay, type ConfigParameter, type ConfigSection, type ConfigState, type ConfigTheme, type ControlCapabilities, type ControlMode, ControlPanel, type ControlPanelProps, type ControlParameter, type ControlState, type CustomAction, DEFAULT_STATUS_COLORS, DEFAULT_THRESHOLDS, DashboardCard, type DataBinding, type DeviceConfigBinding, type DeviceConfigMap, DeviceConfigPanel, type DeviceConfigPanelProps, type DeviceControlBinding, type DeviceControlMap, DeviceControlPanel, type DeviceControlPanelProps, type DeviceStatus, type Diagram, type DiagramMetadata, type DisplayMode, DisplayModeToggle, type DragPoint, type DragState, EquipmentIndicator, type EquipmentIndicatorProps, EquipmentIndicatorWithSparkline, type EquipmentIndicatorWithSparklineProps, FixedSVGContainer, FooterPanel, FullscreenContainer, FullscreenWorkspace, type FullscreenWorkspaceProps, type FullscreenWorkspaceTab, type KeyboardShortcutsOptions, LeftPanel, LeftToggleButton, LegacyValueEntry, type LegacyValueEntryProps, type ModeConfig, NodeConfigPanel, type NodeConfigPanelProps, type NodeControlConfig, NodeControlsPanel, type NodeControlsPanelProps, type NodeInstance, NumpadDialog, type NumpadDialogProps, type Overlay, type OverlayContent, type OverlayTheme, type OverlayType, PIDCanvas, type PIDCanvasControls, type PIDCanvasFeatures, type PIDCanvasProps, PanelContent, PanelTabs, type PipeEdge, type PipeStyle, type Point, type PortDefinition, type PortInstance, type PortType, RightPanel, RightToggleButton, SVGArea, SVGLockedOverlay, type SVGLockedOverlayProps, type ScalingMetadata, ScrollableSVGWrapper, type SelectionState, Selector, type SelectorOption, type SelectorProps, type SimulationOptions, Sparkline, type SparklineProps, type StatusColorEntry, type StatusColorMap, StatusIndicator, type StatusIndicatorProps, type SymbolCategory, type SymbolDefinition, SymbolLibrary, type SymbolLibraryProps, type SymbolMetadata, type TelemetryBinding, type TelemetryMap, type TelemetryStatus$1 as TelemetryStatus, type TelemetryValue, ThemeProvider, ThemeToggle, type ThemeToggleProps, type Thresholds, type Transform, TrendLine, type TrendLineProps, type UseDeviceControlsOptions, type UseDragOptions, type UseDragResult, type UseSelectionOptions, type UseSelectionResult, type UseTelemetryOptions, type UseTelemetryResult, type UseTelemetryStatusOptions, type UseViewBoxOptions, type UseViewBoxResult, ValueEntry, type ValueEntryProps, type ViewBox, ZoomButton, ZoomControls, calculateThresholdStatus, createConfigBinding, createControlBinding, exampleDiagram, exportDiagram, generateRoutePoints, getAvailableSymbols, getPortWorldPosition, getSymbolDefinition, importDiagram, mockSymbolLibrary, nodeHasPort, overlayStyles, registerSymbol, registerSymbols, resolveStatusColor, useDeviceConfigs, useDeviceControls, useDrag, useKeyboardShortcuts, useSelection, useSimulation, useTelemetry, useTelemetryStatus, useTheme, useViewBox, validateDiagram };
2225
+ export { type AnchorType, Button, type ButtonProps, CardHeader, CardUnit, CardValue, CircularGauge, type CircularGaugeProps, type CommandKind, type ConfigActions, type ConfigDisplay, type ConfigParameter, type ConfigSection, type ConfigState, type ConfigTheme, type ControlCapabilities, type ControlMode, ControlPanel, type ControlPanelProps, type ControlParameter, type ControlState, type CustomAction, DEFAULT_STATUS_COLORS, DEFAULT_THRESHOLDS, DashboardCard, type DataBinding, type DeviceConfigBinding, type DeviceConfigMap, DeviceConfigPanel, type DeviceConfigPanelProps, type DeviceControlBinding, type DeviceControlMap, DeviceControlPanel, type DeviceControlPanelProps, type DeviceStatus, type Diagram, type DiagramMetadata, type DisplayMode, DisplayModeToggle, type DragPoint, type DragState, EquipmentIndicator, type EquipmentIndicatorProps, EquipmentIndicatorWithSparkline, type EquipmentIndicatorWithSparklineProps, FORCED_MARK_COLOR, FixedSVGContainer, FooterPanel, type ForcedState, FullscreenContainer, FullscreenWorkspace, type FullscreenWorkspaceProps, type FullscreenWorkspaceTab, type KeyboardShortcutsOptions, LeftPanel, LeftToggleButton, LegacyValueEntry, type LegacyValueEntryProps, type ModeConfig, NodeConfigPanel, type NodeConfigPanelProps, type NodeControlConfig, NodeControlsPanel, type NodeControlsPanelProps, type NodeInstance, NumpadDialog, type NumpadDialogProps, type Overlay, type OverlayContent, type OverlayTheme, type OverlayType, PIDCanvas, type PIDCanvasControls, type PIDCanvasFeatures, type PIDCanvasProps, PanelContent, PanelTabs, type PipeEdge, type PipeStyle, type Point, type PortDefinition, type PortInstance, type PortType, RightPanel, RightToggleButton, SVGArea, SVGLockedOverlay, type SVGLockedOverlayProps, type ScalingMetadata, ScrollableSVGWrapper, type SelectionState, Selector, type SelectorOption, type SelectorProps, type SimulationOptions, Sparkline, type SparklineProps, type StatusColorEntry, type StatusColorMap, StatusIndicator, type StatusIndicatorProps, type SymbolCategory, type SymbolDefinition, SymbolLibrary, type SymbolLibraryProps, type SymbolMetadata, type TelemetryBinding, type TelemetryMap, type TelemetryStatus$1 as TelemetryStatus, type TelemetryValue, ThemeProvider, ThemeToggle, type ThemeToggleProps, type Thresholds, type Transform, TrendLine, type TrendLineProps, type UseDeviceControlsOptions, type UseDragOptions, type UseDragResult, type UseSelectionOptions, type UseSelectionResult, type UseTelemetryOptions, type UseTelemetryResult, type UseTelemetryStatusOptions, type UseViewBoxOptions, type UseViewBoxResult, ValueEntry, type ValueEntryProps, type ViewBox, ZoomButton, ZoomControls, calculateThresholdStatus, createConfigBinding, createControlBinding, exampleDiagram, exportDiagram, generateRoutePoints, getAvailableSymbols, getPortWorldPosition, getSymbolDefinition, importDiagram, mockSymbolLibrary, nodeHasPort, overlayStyles, registerSymbol, registerSymbols, resolveStatusColor, useDeviceConfigs, useDeviceControls, useDrag, useKeyboardShortcuts, useSelection, useSimulation, useTelemetry, useTelemetryStatus, useTheme, useViewBox, validateDiagram };
package/dist/index.d.ts CHANGED
@@ -48,6 +48,38 @@ declare const Selector: react__default.FC<SelectorProps>;
48
48
  * Status levels for telemetry values
49
49
  */
50
50
  type TelemetryStatus$1 = 'normal' | 'warning' | 'alarm' | 'fault' | 'off';
51
+ /**
52
+ * Marks a value as a maintenance force rather than a measured reading
53
+ * (alphinity-tffi issue #3607, unit U11). A forced value is a deliberate
54
+ * substitution at the instrument, so a surface that shows it must show
55
+ * `active` and, when known, the real value beside it. Never render `active`
56
+ * as a `TelemetryStatus` color; forced and alarm/warning/fault are
57
+ * independent facts about the same reading.
58
+ */
59
+ interface ForcedState {
60
+ /** True while the tag carries an active maintenance force. Source: the control program's Sts_SimulationActive flag. */
61
+ active: boolean;
62
+ /**
63
+ * The real, unforced value, in the same unit as the primary value.
64
+ * Optional: the backend does not publish this yet for every tag kind
65
+ * (alphinity-tffi unit U3b). Render the forced mark alone when this is
66
+ * absent; never show a placeholder in its place.
67
+ *
68
+ * Covers both directions this feature forces, and the two read
69
+ * differently even though the field is the same:
70
+ * - Forced INPUT (a transmitter): the real, currently measured value.
71
+ * - Forced OUTPUT (a valve, a lamp, a commanded position): the value the
72
+ * control system would be commanding right now if the force were not
73
+ * active. Not the feedback tag. XV valve position feedback (ZSC/ZSO) is
74
+ * synthesized from the commanded position, not sensed by a physical
75
+ * limit switch (alphinity-tffi #774, a permanent design choice), and
76
+ * pump feedback reaches the bus but nothing consumes it as a position.
77
+ * Showing either as "real" would present a derived number as measured -
78
+ * the exact confidently-wrong display this feature exists to prevent.
79
+ * A commanded value, honestly labeled, is the only real answer here.
80
+ */
81
+ realValue?: number | string | boolean;
82
+ }
51
83
  /**
52
84
  * Live telemetry value with status
53
85
  */
@@ -98,6 +130,11 @@ interface TelemetryBinding {
98
130
  tag: string;
99
131
  /** Current telemetry value */
100
132
  value: TelemetryValue;
133
+ /**
134
+ * Maintenance force state (#3607, R19). Absent or `active: false` means
135
+ * the value is a real reading; render nothing extra. See `ForcedState`.
136
+ */
137
+ forced?: ForcedState;
101
138
  /**
102
139
  * Uniform scaling / EU metadata (units, range, precision). When present it is
103
140
  * the authoritative source for the displayed units, decimal precision, and
@@ -197,10 +234,34 @@ interface ControlPanelProps extends react__default.HTMLAttributes<HTMLDivElement
197
234
  modeOptions: SelectorOption[];
198
235
  /** Callback when mode changes */
199
236
  onModeChange: (mode: string) => void;
200
- /** Current setpoint value */
237
+ /** Typed/target setpoint value (editable) */
201
238
  setpointValue: number | string;
202
239
  /** Callback when setpoint changes */
203
240
  onSetpointChange: (value: number | string) => void;
241
+ /**
242
+ * The setpoint the control loop is currently running: read-only feedback
243
+ * from live telemetry, shown beside the typed setpoint above so an
244
+ * operator sees target and current separately (the typed field never
245
+ * "snaps back" to reflect the live value).
246
+ *
247
+ * Optional and hidden by default: the caller decides when a live-feedback
248
+ * row is worth showing, since always showing a normally-differing current
249
+ * value can read as a fault when none exists. When this tag carries a
250
+ * maintenance force, the caller MUST pass this prop at that time - a
251
+ * hidden value shows nothing, forced or not, but a shown value must carry
252
+ * its FORCED mark (#3607, R19).
253
+ */
254
+ currentSetpointValue?: number | string;
255
+ /**
256
+ * True when `currentSetpointValue` is a maintenance force, not a measured
257
+ * reading. Ignored when `currentSetpointValue` is not provided.
258
+ */
259
+ currentSetpointForced?: boolean;
260
+ /**
261
+ * The real, unforced value for `currentSetpointValue`. Optional; absent
262
+ * until the backend publishes it (alphinity-tffi unit U3b).
263
+ */
264
+ currentSetpointRealValue?: number | string;
204
265
  /** Current second setpoint value (for ramp mode, etc.) */
205
266
  secondSetpointValue?: number | string;
206
267
  /** Callback when second setpoint changes */
@@ -266,6 +327,22 @@ interface StatusIndicatorProps extends react__default.HTMLAttributes<HTMLDivElem
266
327
  shape?: 'circle' | 'square' | 'diamond';
267
328
  /** Whether the indicator should have a 3D LED effect */
268
329
  led?: boolean;
330
+ /**
331
+ * True when the underlying tag's state is a maintenance force, not a
332
+ * measured reading (#3607, R19). Renders a small glyph badge, never a
333
+ * color change: this indicator's whole signal is color plus a short
334
+ * label today, and color alone fails a colorblind operator.
335
+ */
336
+ forced?: boolean;
337
+ /**
338
+ * The real, unforced state, shown as text beside `label` when `forced`
339
+ * is true. For a forced discrete OUTPUT (a lamp, a valve OPEN/CLOSED
340
+ * indicator - R2), this is the state the system would command if the
341
+ * force were not active, not a second physical reading. Optional:
342
+ * absent until the backend publishes it. When absent, only the forced
343
+ * glyph badge renders.
344
+ */
345
+ realValue?: string;
269
346
  }
270
347
  declare const StatusIndicator: react__default.FC<StatusIndicatorProps>;
271
348
 
@@ -290,6 +367,19 @@ interface ValueEntryProps extends Omit<react__default.InputHTMLAttributes<HTMLIn
290
367
  label?: string;
291
368
  /** Whether the input is read-only */
292
369
  readOnly?: boolean;
370
+ /**
371
+ * True when `value` is a maintenance force, not a measured reading
372
+ * (#3607, R19). Source: the control program's Sts_SimulationActive flag.
373
+ * Renders a FORCED badge; never changes `status`, which stays an
374
+ * independent fact about the same reading.
375
+ */
376
+ forced?: boolean;
377
+ /**
378
+ * The real, unforced value, shown beside `value` when `forced` is true.
379
+ * Optional: the backend does not publish this for every tag kind yet
380
+ * (alphinity-tffi unit U3b). When absent, only the FORCED badge renders.
381
+ */
382
+ realValue?: number | string;
293
383
  }
294
384
  declare const ValueEntry: react__default.FC<ValueEntryProps>;
295
385
 
@@ -314,6 +404,16 @@ interface LegacyValueEntryProps extends Omit<react__default.InputHTMLAttributes<
314
404
  label?: string;
315
405
  /** Whether the input is read-only */
316
406
  readOnly?: boolean;
407
+ /**
408
+ * True when `value` is a maintenance force, not a measured reading
409
+ * (#3607, R19). Renders a FORCED badge; never changes `status`.
410
+ */
411
+ forced?: boolean;
412
+ /**
413
+ * The real, unforced value, shown beside `value` when `forced` is true.
414
+ * Optional; absent until the backend publishes it (unit U3b).
415
+ */
416
+ realValue?: number | string;
317
417
  }
318
418
  declare const LegacyValueEntry: react__default.FC<LegacyValueEntryProps>;
319
419
 
@@ -328,10 +428,16 @@ interface NodeControlConfig {
328
428
  currentMode: string;
329
429
  /** Callback when mode changes */
330
430
  onModeChange: (mode: string) => void;
331
- /** Current setpoint value */
431
+ /** Typed/target setpoint value (editable) */
332
432
  setpoint: number | string;
333
433
  /** Callback when setpoint changes */
334
434
  onSetpointChange: (value: number | string) => void;
435
+ /** Current setpoint: read-only feedback from live telemetry. See ControlPanelProps.currentSetpointValue. */
436
+ currentSetpoint?: number | string;
437
+ /** True when `currentSetpoint` is a maintenance force, not a measured reading. */
438
+ currentSetpointForced?: boolean;
439
+ /** The real, unforced value for `currentSetpoint`. Optional; absent until the backend publishes it. */
440
+ currentSetpointRealValue?: number | string;
335
441
  /** Optional second setpoint value */
336
442
  secondSetpoint?: number | string;
337
443
  /** Callback for second setpoint */
@@ -450,6 +556,11 @@ interface ControlParameter {
450
556
  precision?: number;
451
557
  /** Current value */
452
558
  value: number | string | boolean;
559
+ /**
560
+ * Maintenance force state for this parameter (#3607, R19). Absent or
561
+ * `active: false` means `value` is a real reading. See `ForcedState`.
562
+ */
563
+ forced?: ForcedState;
453
564
  /** Whether parameter is read-only */
454
565
  readOnly?: boolean;
455
566
  /** Parameter type */
@@ -758,6 +869,11 @@ interface TrendLineProps {
758
869
  color?: string;
759
870
  strokeWidth?: number;
760
871
  backgroundColor?: string;
872
+ /**
873
+ * True when `values` trends a maintenance force, not measured readings
874
+ * (#3607, R19). Renders a FORCED tag; the trend line itself is unchanged.
875
+ */
876
+ forced?: boolean;
761
877
  }
762
878
  interface CircularGaugeProps {
763
879
  value: number;
@@ -766,12 +882,27 @@ interface CircularGaugeProps {
766
882
  label: string;
767
883
  size?: number;
768
884
  color?: string;
885
+ /**
886
+ * True when `value` is a maintenance force, not a measured reading
887
+ * (#3607, R19). Source: the control program's Sts_SimulationActive flag.
888
+ */
889
+ forced?: boolean;
890
+ /**
891
+ * The real, unforced value, shown beside `value` when `forced` is true.
892
+ * Optional; absent until the backend publishes it (unit U3b).
893
+ */
894
+ realValue?: number;
769
895
  }
770
896
  interface SparklineProps {
771
897
  data: number[];
772
898
  width: number;
773
899
  height: number;
774
900
  color: string;
901
+ /**
902
+ * True when `data` trends a maintenance force, not measured readings
903
+ * (#3607, R19). Renders a FORCED tag; the trend line itself is unchanged.
904
+ */
905
+ forced?: boolean;
775
906
  }
776
907
  interface EquipmentIndicatorWithSparklineProps {
777
908
  svgX: number;
@@ -784,6 +915,13 @@ interface EquipmentIndicatorWithSparklineProps {
784
915
  x: number;
785
916
  y: number;
786
917
  };
918
+ /**
919
+ * True when this equipment's state is a maintenance force, not a measured
920
+ * reading (#3607, R19). Renders a small glyph badge, never a color
921
+ * change: this indicator's whole signal is color plus a short label
922
+ * today, and color alone fails a colorblind operator.
923
+ */
924
+ forced?: boolean;
787
925
  }
788
926
  interface EquipmentIndicatorProps {
789
927
  svgX: number;
@@ -793,6 +931,12 @@ interface EquipmentIndicatorProps {
793
931
  size?: number;
794
932
  style?: react__default.CSSProperties;
795
933
  className?: string;
934
+ /**
935
+ * True when this equipment's state is a maintenance force, not a measured
936
+ * reading (#3607, R19). Renders a small glyph badge, never a color
937
+ * change. See EquipmentIndicatorWithSparklineProps.forced.
938
+ */
939
+ forced?: boolean;
796
940
  }
797
941
  interface FullscreenWorkspaceTab {
798
942
  label: string;
@@ -954,11 +1098,11 @@ declare const CardUnit: _emotion_styled.StyledComponent<{
954
1098
  as?: React.ElementType;
955
1099
  }, react.DetailedHTMLProps<react.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
956
1100
 
957
- declare const TrendLine: ({ values, width, height, color, strokeWidth, backgroundColor, }: TrendLineProps) => react.JSX.Element;
958
- declare const CircularGauge: ({ value, max, unit, label, size, color, }: CircularGaugeProps) => react.JSX.Element;
959
- declare const Sparkline: ({ data, width, height, color }: SparklineProps) => react.JSX.Element | null;
960
- declare const EquipmentIndicatorWithSparkline: ({ svgX, svgY, color, label, size, sparklineData, sparklineOffset, }: EquipmentIndicatorWithSparklineProps) => react.JSX.Element;
961
- declare const EquipmentIndicator: ({ svgX, svgY, color, label, size, style, className, }: EquipmentIndicatorProps) => react.JSX.Element;
1101
+ declare const TrendLine: ({ values, width, height, color, strokeWidth, backgroundColor, forced, }: TrendLineProps) => react.JSX.Element;
1102
+ declare const CircularGauge: ({ value, max, unit, label, size, color, forced, realValue, }: CircularGaugeProps) => react.JSX.Element;
1103
+ declare const Sparkline: ({ data, width, height, color, forced }: SparklineProps) => react.JSX.Element | null;
1104
+ declare const EquipmentIndicatorWithSparkline: ({ svgX, svgY, color, label, size, sparklineData, sparklineOffset, forced, }: EquipmentIndicatorWithSparklineProps) => react.JSX.Element;
1105
+ declare const EquipmentIndicator: ({ svgX, svgY, color, label, size, style, className, forced, }: EquipmentIndicatorProps) => react.JSX.Element;
962
1106
 
963
1107
  declare function FullscreenWorkspace({ svgContent, overlays, leftPanel, rightPanel, footer, tabs, activeTab, onTabChange, defaultLeftCollapsed, defaultRightCollapsed, leftCollapsed: leftCollapsedProp, rightCollapsed: rightCollapsedProp, onLeftCollapseChange, onRightCollapseChange, displayMode, defaultDisplayMode, onDisplayModeChange, showDisplayModeToggle, showZoomControls, onZoomIn, onZoomOut, onResetZoom, zoomDisabled, className, ...rest }: FullscreenWorkspaceProps): react__default.ReactElement;
964
1108
 
@@ -1018,6 +1162,17 @@ type StatusColorMap = Partial<Record<DeviceStatus, Partial<StatusColorEntry>>>;
1018
1162
  * - stopping: amber (transitional)
1019
1163
  */
1020
1164
  declare const DEFAULT_STATUS_COLORS: Record<DeviceStatus, StatusColorEntry>;
1165
+ /**
1166
+ * Maintenance-force marking color (#3607, R19). Deliberately outside
1167
+ * DEFAULT_STATUS_COLORS: a forced value is not a health status, and must
1168
+ * never share a color with warning/alarm/fault or read as one of them.
1169
+ * Violet is unused elsewhere in this palette.
1170
+ *
1171
+ * Light fill + dark text, not a solid vivid chip: reads as a calm marker
1172
+ * rather than an alarm sticker, while the vivid `border` shade still
1173
+ * outlines a forced value's box/ring so it stays findable at a glance.
1174
+ */
1175
+ declare const FORCED_MARK_COLOR: StatusColorEntry;
1021
1176
  /**
1022
1177
  * Resolve a status string to a full color entry.
1023
1178
  *
@@ -1730,6 +1885,15 @@ interface ConfigParameter {
1730
1885
  type: 'number' | 'string' | 'boolean' | 'select' | 'multiselect';
1731
1886
  /** Current value */
1732
1887
  value: any;
1888
+ /**
1889
+ * Maintenance force state for this parameter (#3607, R19). A field the
1890
+ * operator has not overridden falls back to control's live value (the
1891
+ * pilet's own DashboardScreen does this on every config refresh), so
1892
+ * `value` here can be a live, forced reading, not only a static setting.
1893
+ * Absent or `active: false` means `value` is a real reading or a real
1894
+ * saved setting. See `ForcedState`.
1895
+ */
1896
+ forced?: ForcedState;
1733
1897
  /** Default value */
1734
1898
  defaultValue?: any;
1735
1899
  /** Whether parameter is read-only */
@@ -2058,4 +2222,4 @@ interface SimulationOptions {
2058
2222
  */
2059
2223
  declare function useSimulation(telemetry: TelemetryMap, updateTelemetryBatch: (updates: Array<any>) => void, options?: SimulationOptions): void;
2060
2224
 
2061
- export { type AnchorType, Button, type ButtonProps, CardHeader, CardUnit, CardValue, CircularGauge, type CircularGaugeProps, type CommandKind, type ConfigActions, type ConfigDisplay, type ConfigParameter, type ConfigSection, type ConfigState, type ConfigTheme, type ControlCapabilities, type ControlMode, ControlPanel, type ControlPanelProps, type ControlParameter, type ControlState, type CustomAction, DEFAULT_STATUS_COLORS, DEFAULT_THRESHOLDS, DashboardCard, type DataBinding, type DeviceConfigBinding, type DeviceConfigMap, DeviceConfigPanel, type DeviceConfigPanelProps, type DeviceControlBinding, type DeviceControlMap, DeviceControlPanel, type DeviceControlPanelProps, type DeviceStatus, type Diagram, type DiagramMetadata, type DisplayMode, DisplayModeToggle, type DragPoint, type DragState, EquipmentIndicator, type EquipmentIndicatorProps, EquipmentIndicatorWithSparkline, type EquipmentIndicatorWithSparklineProps, FixedSVGContainer, FooterPanel, FullscreenContainer, FullscreenWorkspace, type FullscreenWorkspaceProps, type FullscreenWorkspaceTab, type KeyboardShortcutsOptions, LeftPanel, LeftToggleButton, LegacyValueEntry, type LegacyValueEntryProps, type ModeConfig, NodeConfigPanel, type NodeConfigPanelProps, type NodeControlConfig, NodeControlsPanel, type NodeControlsPanelProps, type NodeInstance, NumpadDialog, type NumpadDialogProps, type Overlay, type OverlayContent, type OverlayTheme, type OverlayType, PIDCanvas, type PIDCanvasControls, type PIDCanvasFeatures, type PIDCanvasProps, PanelContent, PanelTabs, type PipeEdge, type PipeStyle, type Point, type PortDefinition, type PortInstance, type PortType, RightPanel, RightToggleButton, SVGArea, SVGLockedOverlay, type SVGLockedOverlayProps, type ScalingMetadata, ScrollableSVGWrapper, type SelectionState, Selector, type SelectorOption, type SelectorProps, type SimulationOptions, Sparkline, type SparklineProps, type StatusColorEntry, type StatusColorMap, StatusIndicator, type StatusIndicatorProps, type SymbolCategory, type SymbolDefinition, SymbolLibrary, type SymbolLibraryProps, type SymbolMetadata, type TelemetryBinding, type TelemetryMap, type TelemetryStatus$1 as TelemetryStatus, type TelemetryValue, ThemeProvider, ThemeToggle, type ThemeToggleProps, type Thresholds, type Transform, TrendLine, type TrendLineProps, type UseDeviceControlsOptions, type UseDragOptions, type UseDragResult, type UseSelectionOptions, type UseSelectionResult, type UseTelemetryOptions, type UseTelemetryResult, type UseTelemetryStatusOptions, type UseViewBoxOptions, type UseViewBoxResult, ValueEntry, type ValueEntryProps, type ViewBox, ZoomButton, ZoomControls, calculateThresholdStatus, createConfigBinding, createControlBinding, exampleDiagram, exportDiagram, generateRoutePoints, getAvailableSymbols, getPortWorldPosition, getSymbolDefinition, importDiagram, mockSymbolLibrary, nodeHasPort, overlayStyles, registerSymbol, registerSymbols, resolveStatusColor, useDeviceConfigs, useDeviceControls, useDrag, useKeyboardShortcuts, useSelection, useSimulation, useTelemetry, useTelemetryStatus, useTheme, useViewBox, validateDiagram };
2225
+ export { type AnchorType, Button, type ButtonProps, CardHeader, CardUnit, CardValue, CircularGauge, type CircularGaugeProps, type CommandKind, type ConfigActions, type ConfigDisplay, type ConfigParameter, type ConfigSection, type ConfigState, type ConfigTheme, type ControlCapabilities, type ControlMode, ControlPanel, type ControlPanelProps, type ControlParameter, type ControlState, type CustomAction, DEFAULT_STATUS_COLORS, DEFAULT_THRESHOLDS, DashboardCard, type DataBinding, type DeviceConfigBinding, type DeviceConfigMap, DeviceConfigPanel, type DeviceConfigPanelProps, type DeviceControlBinding, type DeviceControlMap, DeviceControlPanel, type DeviceControlPanelProps, type DeviceStatus, type Diagram, type DiagramMetadata, type DisplayMode, DisplayModeToggle, type DragPoint, type DragState, EquipmentIndicator, type EquipmentIndicatorProps, EquipmentIndicatorWithSparkline, type EquipmentIndicatorWithSparklineProps, FORCED_MARK_COLOR, FixedSVGContainer, FooterPanel, type ForcedState, FullscreenContainer, FullscreenWorkspace, type FullscreenWorkspaceProps, type FullscreenWorkspaceTab, type KeyboardShortcutsOptions, LeftPanel, LeftToggleButton, LegacyValueEntry, type LegacyValueEntryProps, type ModeConfig, NodeConfigPanel, type NodeConfigPanelProps, type NodeControlConfig, NodeControlsPanel, type NodeControlsPanelProps, type NodeInstance, NumpadDialog, type NumpadDialogProps, type Overlay, type OverlayContent, type OverlayTheme, type OverlayType, PIDCanvas, type PIDCanvasControls, type PIDCanvasFeatures, type PIDCanvasProps, PanelContent, PanelTabs, type PipeEdge, type PipeStyle, type Point, type PortDefinition, type PortInstance, type PortType, RightPanel, RightToggleButton, SVGArea, SVGLockedOverlay, type SVGLockedOverlayProps, type ScalingMetadata, ScrollableSVGWrapper, type SelectionState, Selector, type SelectorOption, type SelectorProps, type SimulationOptions, Sparkline, type SparklineProps, type StatusColorEntry, type StatusColorMap, StatusIndicator, type StatusIndicatorProps, type SymbolCategory, type SymbolDefinition, SymbolLibrary, type SymbolLibraryProps, type SymbolMetadata, type TelemetryBinding, type TelemetryMap, type TelemetryStatus$1 as TelemetryStatus, type TelemetryValue, ThemeProvider, ThemeToggle, type ThemeToggleProps, type Thresholds, type Transform, TrendLine, type TrendLineProps, type UseDeviceControlsOptions, type UseDragOptions, type UseDragResult, type UseSelectionOptions, type UseSelectionResult, type UseTelemetryOptions, type UseTelemetryResult, type UseTelemetryStatusOptions, type UseViewBoxOptions, type UseViewBoxResult, ValueEntry, type ValueEntryProps, type ViewBox, ZoomButton, ZoomControls, calculateThresholdStatus, createConfigBinding, createControlBinding, exampleDiagram, exportDiagram, generateRoutePoints, getAvailableSymbols, getPortWorldPosition, getSymbolDefinition, importDiagram, mockSymbolLibrary, nodeHasPort, overlayStyles, registerSymbol, registerSymbols, resolveStatusColor, useDeviceConfigs, useDeviceControls, useDrag, useKeyboardShortcuts, useSelection, useSimulation, useTelemetry, useTelemetryStatus, useTheme, useViewBox, validateDiagram };