@procaaso/alphinity-ui-components 1.8.3 → 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.ts CHANGED
@@ -1,17 +1,16 @@
1
- import * as React$1 from 'react';
2
- import React__default from 'react';
3
- import * as react_jsx_runtime from 'react/jsx-runtime';
4
- import * as _mui_material_OverridableComponent from '@mui/material/OverridableComponent';
1
+ import * as react from 'react';
2
+ import react__default from 'react';
5
3
  import * as _emotion_styled from '@emotion/styled';
6
4
  import * as _emotion_react from '@emotion/react';
7
5
  import * as _mui_system from '@mui/system';
8
6
  import * as _mui_material from '@mui/material';
7
+ import * as _mui_material_OverridableComponent from '@mui/material/OverridableComponent';
9
8
 
10
- interface ButtonProps extends React__default.ButtonHTMLAttributes<HTMLButtonElement> {
9
+ interface ButtonProps extends react__default.ButtonHTMLAttributes<HTMLButtonElement> {
11
10
  variant?: 'primary' | 'secondary';
12
- children: React__default.ReactNode;
11
+ children: react__default.ReactNode;
13
12
  }
14
- declare const Button: React__default.FC<ButtonProps>;
13
+ declare const Button: react__default.FC<ButtonProps>;
15
14
 
16
15
  interface SelectorOption {
17
16
  /** Unique value for the option */
@@ -23,7 +22,7 @@ interface SelectorOption {
23
22
  /** Optional description for tooltip or additional context */
24
23
  description?: string;
25
24
  }
26
- interface SelectorProps extends Omit<React__default.HTMLAttributes<HTMLDivElement>, 'onChange'> {
25
+ interface SelectorProps extends Omit<react__default.HTMLAttributes<HTMLDivElement>, 'onChange'> {
27
26
  /** Currently selected value */
28
27
  value: string;
29
28
  /** Callback when selection changes */
@@ -43,12 +42,44 @@ interface SelectorProps extends Omit<React__default.HTMLAttributes<HTMLDivElemen
43
42
  /** Whether the dropdown should open upward */
44
43
  dropdownUp?: boolean;
45
44
  }
46
- declare const Selector: React__default.FC<SelectorProps>;
45
+ declare const Selector: react__default.FC<SelectorProps>;
47
46
 
48
47
  /**
49
48
  * Status levels for telemetry values
50
49
  */
51
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
+ }
52
83
  /**
53
84
  * Live telemetry value with status
54
85
  */
@@ -99,6 +130,11 @@ interface TelemetryBinding {
99
130
  tag: string;
100
131
  /** Current telemetry value */
101
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;
102
138
  /**
103
139
  * Uniform scaling / EU metadata (units, range, precision). When present it is
104
140
  * the authoritative source for the displayed units, decimal precision, and
@@ -189,7 +225,7 @@ interface ModeConfig {
189
225
  /** Precision for second setpoint */
190
226
  secondPrecision?: number;
191
227
  }
192
- interface ControlPanelProps extends React__default.HTMLAttributes<HTMLDivElement> {
228
+ interface ControlPanelProps extends react__default.HTMLAttributes<HTMLDivElement> {
193
229
  /** Panel title/identifier */
194
230
  title: string;
195
231
  /** Currently selected mode */
@@ -198,10 +234,34 @@ interface ControlPanelProps extends React__default.HTMLAttributes<HTMLDivElement
198
234
  modeOptions: SelectorOption[];
199
235
  /** Callback when mode changes */
200
236
  onModeChange: (mode: string) => void;
201
- /** Current setpoint value */
237
+ /** Typed/target setpoint value (editable) */
202
238
  setpointValue: number | string;
203
239
  /** Callback when setpoint changes */
204
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;
205
265
  /** Current second setpoint value (for ramp mode, etc.) */
206
266
  secondSetpointValue?: number | string;
207
267
  /** Callback when second setpoint changes */
@@ -250,9 +310,9 @@ interface ControlPanelProps extends React__default.HTMLAttributes<HTMLDivElement
250
310
  /** Custom stop button text */
251
311
  stopButtonText?: string;
252
312
  }
253
- declare const ControlPanel: React__default.FC<ControlPanelProps>;
313
+ declare const ControlPanel: react__default.FC<ControlPanelProps>;
254
314
 
255
- interface StatusIndicatorProps extends React__default.HTMLAttributes<HTMLDivElement> {
315
+ interface StatusIndicatorProps extends react__default.HTMLAttributes<HTMLDivElement> {
256
316
  /** Status state determining color and behavior */
257
317
  status: 'off' | 'normal' | 'alarm' | 'warning' | 'active' | 'fault';
258
318
  /** Size of the indicator */
@@ -267,10 +327,26 @@ interface StatusIndicatorProps extends React__default.HTMLAttributes<HTMLDivElem
267
327
  shape?: 'circle' | 'square' | 'diamond';
268
328
  /** Whether the indicator should have a 3D LED effect */
269
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;
270
346
  }
271
- declare const StatusIndicator: React__default.FC<StatusIndicatorProps>;
347
+ declare const StatusIndicator: react__default.FC<StatusIndicatorProps>;
272
348
 
273
- interface ValueEntryProps extends Omit<React__default.InputHTMLAttributes<HTMLInputElement>, 'value' | 'onChange'> {
349
+ interface ValueEntryProps extends Omit<react__default.InputHTMLAttributes<HTMLInputElement>, 'value' | 'onChange'> {
274
350
  /** Current value */
275
351
  value: number | string;
276
352
  /** Callback when value changes */
@@ -291,10 +367,23 @@ interface ValueEntryProps extends Omit<React__default.InputHTMLAttributes<HTMLIn
291
367
  label?: string;
292
368
  /** Whether the input is read-only */
293
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;
294
383
  }
295
- declare const ValueEntry: React__default.FC<ValueEntryProps>;
384
+ declare const ValueEntry: react__default.FC<ValueEntryProps>;
296
385
 
297
- interface LegacyValueEntryProps extends Omit<React__default.InputHTMLAttributes<HTMLInputElement>, 'value' | 'onChange'> {
386
+ interface LegacyValueEntryProps extends Omit<react__default.InputHTMLAttributes<HTMLInputElement>, 'value' | 'onChange'> {
298
387
  /** Current value */
299
388
  value: number | string;
300
389
  /** Callback when value changes */
@@ -315,8 +404,18 @@ interface LegacyValueEntryProps extends Omit<React__default.InputHTMLAttributes<
315
404
  label?: string;
316
405
  /** Whether the input is read-only */
317
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;
318
417
  }
319
- declare const LegacyValueEntry: React__default.FC<LegacyValueEntryProps>;
418
+ declare const LegacyValueEntry: react__default.FC<LegacyValueEntryProps>;
320
419
 
321
420
  interface NodeControlConfig {
322
421
  /** Node ID */
@@ -329,10 +428,16 @@ interface NodeControlConfig {
329
428
  currentMode: string;
330
429
  /** Callback when mode changes */
331
430
  onModeChange: (mode: string) => void;
332
- /** Current setpoint value */
431
+ /** Typed/target setpoint value (editable) */
333
432
  setpoint: number | string;
334
433
  /** Callback when setpoint changes */
335
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;
336
441
  /** Optional second setpoint value */
337
442
  secondSetpoint?: number | string;
338
443
  /** Callback for second setpoint */
@@ -354,7 +459,7 @@ interface NodeControlConfig {
354
459
  /** Whether setpoint is read-only */
355
460
  readOnly?: boolean;
356
461
  }
357
- interface NodeControlsPanelProps extends React__default.HTMLAttributes<HTMLDivElement> {
462
+ interface NodeControlsPanelProps extends react__default.HTMLAttributes<HTMLDivElement> {
358
463
  /** Control configuration for the selected node */
359
464
  config: NodeControlConfig | null;
360
465
  /** Callback to close the panel */
@@ -373,7 +478,7 @@ interface NodeControlsPanelProps extends React__default.HTMLAttributes<HTMLDivEl
373
478
  * - Clear visual feedback
374
479
  * - Bottom or side slide-in animation
375
480
  */
376
- declare const NodeControlsPanel: React__default.FC<NodeControlsPanelProps>;
481
+ declare const NodeControlsPanel: react__default.FC<NodeControlsPanelProps>;
377
482
 
378
483
  /**
379
484
  * A custom action button rendered in the device control panel (e.g. Tare, Zero).
@@ -451,6 +556,11 @@ interface ControlParameter {
451
556
  precision?: number;
452
557
  /** Current value */
453
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;
454
564
  /** Whether parameter is read-only */
455
565
  readOnly?: boolean;
456
566
  /** Parameter type */
@@ -659,6 +769,20 @@ interface DeviceControlPanelProps {
659
769
  undockIcon?: string;
660
770
  /** Style for mode selector: 'buttons' (horizontal scroll), 'dropdown' (select), or 'modal' (click to open modal) */
661
771
  modeSelectionStyle?: 'buttons' | 'dropdown' | 'modal';
772
+ /**
773
+ * Render this panel's OWN result toast. Default true, so existing
774
+ * consumers are unchanged.
775
+ *
776
+ * Set false when the host application already surfaces command and save
777
+ * results through its own notification channel. Without it the operator
778
+ * sees two notices for one action - this panel's optimistic "command
779
+ * sent", in this panel's styling, followed by the host's message for the
780
+ * real outcome - which reads as two different mechanisms.
781
+ *
782
+ * The result still lands in `binding.state`, so a host that opts out can
783
+ * read it and render its own.
784
+ */
785
+ showBuiltInToast?: boolean;
662
786
  /** Embedded mode - uses static positioning for rendering in containers (default: false) */
663
787
  embedded?: boolean;
664
788
  }
@@ -669,9 +793,9 @@ interface DeviceControlPanelProps {
669
793
  * its live values move, so the memo bails only on genuinely idle ticks - the
670
794
  * win is proportional to how often values are flat at display precision.
671
795
  */
672
- declare function DeviceControlPanelImpl({ binding, onClose, position, align, touchOptimized, compact, fontScale, maxHeight, maxWidth, toastDuration, onModeChange, onParameterChange, onParameterActivate, onStart, onStop, startPending, stopPending, onCustomAction, onOpenConfig, showConfigButton, onUndock, undockIcon, modeSelectionStyle, embedded, }: DeviceControlPanelProps): react_jsx_runtime.JSX.Element | null;
796
+ declare function DeviceControlPanelImpl({ binding, onClose, position, align, touchOptimized, compact, fontScale, maxHeight, maxWidth, toastDuration, onModeChange, onParameterChange, onParameterActivate, onStart, onStop, startPending, stopPending, onCustomAction, onOpenConfig, showConfigButton, onUndock, undockIcon, modeSelectionStyle, showBuiltInToast, embedded, }: DeviceControlPanelProps): react__default.JSX.Element | null;
673
797
  /** Memo boundary - see DeviceControlPanelImpl doc comment (kiosk heap-leak fix). */
674
- declare const DeviceControlPanel: React__default.MemoExoticComponent<typeof DeviceControlPanelImpl>;
798
+ declare const DeviceControlPanel: react__default.MemoExoticComponent<typeof DeviceControlPanelImpl>;
675
799
 
676
800
  interface NumpadDialogProps {
677
801
  /** Whether the dialog is open */
@@ -720,7 +844,7 @@ interface NumpadDialogProps {
720
844
  * out-of-range values are rejected (never silently clamped). The field pre-fills
721
845
  * with the current value so an operator never blind-zeroes a live setpoint.
722
846
  */
723
- declare const NumpadDialog: React__default.FC<NumpadDialogProps>;
847
+ declare const NumpadDialog: react__default.FC<NumpadDialogProps>;
724
848
 
725
849
  type DisplayMode = 'standard' | 'dashboard';
726
850
  interface FullscreenContainerProps {
@@ -731,9 +855,9 @@ type OverlayTheme = 'tank' | 'pressure' | 'vessel' | 'flow';
731
855
  interface SVGLockedOverlayProps {
732
856
  svgX: number;
733
857
  svgY: number;
734
- children: React__default.ReactNode;
858
+ children: react__default.ReactNode;
735
859
  theme?: OverlayTheme;
736
- style?: React__default.CSSProperties;
860
+ style?: react__default.CSSProperties;
737
861
  className?: string;
738
862
  onClick?: () => void;
739
863
  containerSelector?: string;
@@ -745,6 +869,11 @@ interface TrendLineProps {
745
869
  color?: string;
746
870
  strokeWidth?: number;
747
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;
748
877
  }
749
878
  interface CircularGaugeProps {
750
879
  value: number;
@@ -753,12 +882,27 @@ interface CircularGaugeProps {
753
882
  label: string;
754
883
  size?: number;
755
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;
756
895
  }
757
896
  interface SparklineProps {
758
897
  data: number[];
759
898
  width: number;
760
899
  height: number;
761
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;
762
906
  }
763
907
  interface EquipmentIndicatorWithSparklineProps {
764
908
  svgX: number;
@@ -771,6 +915,13 @@ interface EquipmentIndicatorWithSparklineProps {
771
915
  x: number;
772
916
  y: number;
773
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;
774
925
  }
775
926
  interface EquipmentIndicatorProps {
776
927
  svgX: number;
@@ -778,20 +929,26 @@ interface EquipmentIndicatorProps {
778
929
  color: string;
779
930
  label: string;
780
931
  size?: number;
781
- style?: React__default.CSSProperties;
932
+ style?: react__default.CSSProperties;
782
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;
783
940
  }
784
941
  interface FullscreenWorkspaceTab {
785
942
  label: string;
786
943
  value: string;
787
- content: React__default.ReactNode;
788
- }
789
- interface FullscreenWorkspaceProps extends React__default.HTMLAttributes<HTMLDivElement> {
790
- svgContent: React__default.ReactNode;
791
- overlays?: React__default.ReactNode;
792
- leftPanel?: React__default.ReactNode;
793
- rightPanel?: React__default.ReactNode;
794
- footer?: React__default.ReactNode;
944
+ content: react__default.ReactNode;
945
+ }
946
+ interface FullscreenWorkspaceProps extends react__default.HTMLAttributes<HTMLDivElement> {
947
+ svgContent: react__default.ReactNode;
948
+ overlays?: react__default.ReactNode;
949
+ leftPanel?: react__default.ReactNode;
950
+ rightPanel?: react__default.ReactNode;
951
+ footer?: react__default.ReactNode;
795
952
  tabs?: FullscreenWorkspaceTab[];
796
953
  activeTab?: string;
797
954
  onTabChange?: (value: string) => void;
@@ -812,60 +969,60 @@ interface FullscreenWorkspaceProps extends React__default.HTMLAttributes<HTMLDiv
812
969
  zoomDisabled?: boolean;
813
970
  }
814
971
 
815
- declare const FullscreenContainer: _emotion_styled.StyledComponent<_mui_system.BoxOwnProps<_mui_material.Theme> & Omit<React$1.DetailedHTMLProps<React$1.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof _mui_system.BoxOwnProps<_mui_material.Theme>> & {
972
+ declare const FullscreenContainer: _emotion_styled.StyledComponent<_mui_system.BoxOwnProps<_mui_material.Theme> & Omit<react.DetailedHTMLProps<react.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof _mui_system.BoxOwnProps<_mui_material.Theme>> & {
816
973
  theme?: _emotion_react.Theme;
817
974
  } & FullscreenContainerProps, {}, {}>;
818
- declare const LeftPanel: _emotion_styled.StyledComponent<_mui_system.BoxOwnProps<_mui_material.Theme> & Omit<React$1.DetailedHTMLProps<React$1.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof _mui_system.BoxOwnProps<_mui_material.Theme>> & {
975
+ declare const LeftPanel: _emotion_styled.StyledComponent<_mui_system.BoxOwnProps<_mui_material.Theme> & Omit<react.DetailedHTMLProps<react.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof _mui_system.BoxOwnProps<_mui_material.Theme>> & {
819
976
  theme?: _emotion_react.Theme;
820
977
  } & {
821
978
  collapsed: boolean;
822
979
  }, {}, {}>;
823
- declare const RightPanel: _emotion_styled.StyledComponent<_mui_system.BoxOwnProps<_mui_material.Theme> & Omit<React$1.DetailedHTMLProps<React$1.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof _mui_system.BoxOwnProps<_mui_material.Theme>> & {
980
+ declare const RightPanel: _emotion_styled.StyledComponent<_mui_system.BoxOwnProps<_mui_material.Theme> & Omit<react.DetailedHTMLProps<react.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof _mui_system.BoxOwnProps<_mui_material.Theme>> & {
824
981
  theme?: _emotion_react.Theme;
825
982
  } & {
826
983
  collapsed: boolean;
827
984
  }, {}, {}>;
828
- declare const SVGArea: _emotion_styled.StyledComponent<_mui_system.BoxOwnProps<_mui_material.Theme> & Omit<React$1.DetailedHTMLProps<React$1.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof _mui_system.BoxOwnProps<_mui_material.Theme>> & {
985
+ declare const SVGArea: _emotion_styled.StyledComponent<_mui_system.BoxOwnProps<_mui_material.Theme> & Omit<react.DetailedHTMLProps<react.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof _mui_system.BoxOwnProps<_mui_material.Theme>> & {
829
986
  theme?: _emotion_react.Theme;
830
987
  }, {}, {}>;
831
- declare const LeftToggleButton: _emotion_styled.StyledComponent<_mui_material.IconButtonOwnProps & Omit<_mui_material.ButtonBaseOwnProps, "classes"> & _mui_material_OverridableComponent.CommonProps & Omit<React$1.DetailedHTMLProps<React$1.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "children" | "className" | "disabled" | "style" | "tabIndex" | "color" | "size" | "sx" | "classes" | "action" | "centerRipple" | "disableRipple" | "disableTouchRipple" | "focusRipple" | "focusVisibleClassName" | "LinkComponent" | "onFocusVisible" | "TouchRippleProps" | "touchRippleRef" | "disableFocusRipple" | "edge" | "loading" | "loadingIndicator"> & {
988
+ declare const LeftToggleButton: _emotion_styled.StyledComponent<_mui_material.IconButtonOwnProps & Omit<_mui_material.ButtonBaseOwnProps, "classes"> & _mui_material_OverridableComponent.CommonProps & Omit<react.DetailedHTMLProps<react.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "children" | "className" | "disabled" | "style" | "tabIndex" | "color" | "size" | "sx" | "classes" | "action" | "centerRipple" | "disableRipple" | "disableTouchRipple" | "focusRipple" | "focusVisibleClassName" | "LinkComponent" | "onFocusVisible" | "TouchRippleProps" | "touchRippleRef" | "disableFocusRipple" | "edge" | "loading" | "loadingIndicator"> & {
832
989
  theme?: _emotion_react.Theme;
833
990
  } & {
834
991
  collapsed: boolean;
835
992
  }, {}, {}>;
836
- declare const RightToggleButton: _emotion_styled.StyledComponent<_mui_material.IconButtonOwnProps & Omit<_mui_material.ButtonBaseOwnProps, "classes"> & _mui_material_OverridableComponent.CommonProps & Omit<React$1.DetailedHTMLProps<React$1.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "children" | "className" | "disabled" | "style" | "tabIndex" | "color" | "size" | "sx" | "classes" | "action" | "centerRipple" | "disableRipple" | "disableTouchRipple" | "focusRipple" | "focusVisibleClassName" | "LinkComponent" | "onFocusVisible" | "TouchRippleProps" | "touchRippleRef" | "disableFocusRipple" | "edge" | "loading" | "loadingIndicator"> & {
993
+ declare const RightToggleButton: _emotion_styled.StyledComponent<_mui_material.IconButtonOwnProps & Omit<_mui_material.ButtonBaseOwnProps, "classes"> & _mui_material_OverridableComponent.CommonProps & Omit<react.DetailedHTMLProps<react.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "children" | "className" | "disabled" | "style" | "tabIndex" | "color" | "size" | "sx" | "classes" | "action" | "centerRipple" | "disableRipple" | "disableTouchRipple" | "focusRipple" | "focusVisibleClassName" | "LinkComponent" | "onFocusVisible" | "TouchRippleProps" | "touchRippleRef" | "disableFocusRipple" | "edge" | "loading" | "loadingIndicator"> & {
837
994
  theme?: _emotion_react.Theme;
838
995
  } & {
839
996
  collapsed: boolean;
840
997
  }, {}, {}>;
841
- declare const DisplayModeToggle: _emotion_styled.StyledComponent<_mui_material.IconButtonOwnProps & Omit<_mui_material.ButtonBaseOwnProps, "classes"> & _mui_material_OverridableComponent.CommonProps & Omit<React$1.DetailedHTMLProps<React$1.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "children" | "className" | "disabled" | "style" | "tabIndex" | "color" | "size" | "sx" | "classes" | "action" | "centerRipple" | "disableRipple" | "disableTouchRipple" | "focusRipple" | "focusVisibleClassName" | "LinkComponent" | "onFocusVisible" | "TouchRippleProps" | "touchRippleRef" | "disableFocusRipple" | "edge" | "loading" | "loadingIndicator"> & {
998
+ declare const DisplayModeToggle: _emotion_styled.StyledComponent<_mui_material.IconButtonOwnProps & Omit<_mui_material.ButtonBaseOwnProps, "classes"> & _mui_material_OverridableComponent.CommonProps & Omit<react.DetailedHTMLProps<react.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "children" | "className" | "disabled" | "style" | "tabIndex" | "color" | "size" | "sx" | "classes" | "action" | "centerRipple" | "disableRipple" | "disableTouchRipple" | "focusRipple" | "focusVisibleClassName" | "LinkComponent" | "onFocusVisible" | "TouchRippleProps" | "touchRippleRef" | "disableFocusRipple" | "edge" | "loading" | "loadingIndicator"> & {
842
999
  theme?: _emotion_react.Theme;
843
1000
  } & {
844
1001
  mode: DisplayMode;
845
1002
  }, {}, {}>;
846
- declare const ZoomControls: _emotion_styled.StyledComponent<_mui_system.BoxOwnProps<_mui_material.Theme> & Omit<React$1.DetailedHTMLProps<React$1.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof _mui_system.BoxOwnProps<_mui_material.Theme>> & {
1003
+ declare const ZoomControls: _emotion_styled.StyledComponent<_mui_system.BoxOwnProps<_mui_material.Theme> & Omit<react.DetailedHTMLProps<react.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof _mui_system.BoxOwnProps<_mui_material.Theme>> & {
847
1004
  theme?: _emotion_react.Theme;
848
1005
  }, {}, {}>;
849
- declare const ZoomButton: _emotion_styled.StyledComponent<_mui_material.IconButtonOwnProps & Omit<_mui_material.ButtonBaseOwnProps, "classes"> & _mui_material_OverridableComponent.CommonProps & Omit<React$1.DetailedHTMLProps<React$1.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "children" | "className" | "disabled" | "style" | "tabIndex" | "color" | "size" | "sx" | "classes" | "action" | "centerRipple" | "disableRipple" | "disableTouchRipple" | "focusRipple" | "focusVisibleClassName" | "LinkComponent" | "onFocusVisible" | "TouchRippleProps" | "touchRippleRef" | "disableFocusRipple" | "edge" | "loading" | "loadingIndicator"> & {
1006
+ declare const ZoomButton: _emotion_styled.StyledComponent<_mui_material.IconButtonOwnProps & Omit<_mui_material.ButtonBaseOwnProps, "classes"> & _mui_material_OverridableComponent.CommonProps & Omit<react.DetailedHTMLProps<react.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "children" | "className" | "disabled" | "style" | "tabIndex" | "color" | "size" | "sx" | "classes" | "action" | "centerRipple" | "disableRipple" | "disableTouchRipple" | "focusRipple" | "focusVisibleClassName" | "LinkComponent" | "onFocusVisible" | "TouchRippleProps" | "touchRippleRef" | "disableFocusRipple" | "edge" | "loading" | "loadingIndicator"> & {
850
1007
  theme?: _emotion_react.Theme;
851
1008
  }, {}, {}>;
852
- declare const FooterPanel: _emotion_styled.StyledComponent<_mui_system.BoxOwnProps<_mui_material.Theme> & Omit<React$1.DetailedHTMLProps<React$1.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof _mui_system.BoxOwnProps<_mui_material.Theme>> & {
1009
+ declare const FooterPanel: _emotion_styled.StyledComponent<_mui_system.BoxOwnProps<_mui_material.Theme> & Omit<react.DetailedHTMLProps<react.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof _mui_system.BoxOwnProps<_mui_material.Theme>> & {
853
1010
  theme?: _emotion_react.Theme;
854
1011
  }, {}, {}>;
855
- declare const PanelTabs: _emotion_styled.StyledComponent<_mui_material.TabsOwnProps & _mui_material_OverridableComponent.CommonProps & Omit<React$1.DetailedHTMLProps<React$1.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "variant" | "children" | "className" | "value" | "style" | "aria-label" | "aria-labelledby" | "onChange" | "sx" | "classes" | "action" | "allowScrollButtonsMobile" | "centered" | "indicatorColor" | "orientation" | "ScrollButtonComponent" | "scrollButtons" | "selectionFollowsFocus" | "TabIndicatorProps" | "TabScrollButtonProps" | "textColor" | "visibleScrollbar" | "slots" | "slotProps"> & {
1012
+ declare const PanelTabs: _emotion_styled.StyledComponent<_mui_material.TabsOwnProps & _mui_material_OverridableComponent.CommonProps & Omit<react.DetailedHTMLProps<react.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "variant" | "children" | "className" | "value" | "style" | "aria-label" | "aria-labelledby" | "onChange" | "sx" | "classes" | "action" | "allowScrollButtonsMobile" | "centered" | "indicatorColor" | "orientation" | "ScrollButtonComponent" | "scrollButtons" | "selectionFollowsFocus" | "TabIndicatorProps" | "TabScrollButtonProps" | "textColor" | "visibleScrollbar" | "slots" | "slotProps"> & {
856
1013
  theme?: _emotion_react.Theme;
857
1014
  }, {}, {}>;
858
- declare const PanelContent: _emotion_styled.StyledComponent<_mui_system.BoxOwnProps<_mui_material.Theme> & Omit<React$1.DetailedHTMLProps<React$1.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof _mui_system.BoxOwnProps<_mui_material.Theme>> & {
1015
+ declare const PanelContent: _emotion_styled.StyledComponent<_mui_system.BoxOwnProps<_mui_material.Theme> & Omit<react.DetailedHTMLProps<react.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof _mui_system.BoxOwnProps<_mui_material.Theme>> & {
859
1016
  theme?: _emotion_react.Theme;
860
1017
  }, {}, {}>;
861
1018
  declare const FixedSVGContainer: _emotion_styled.StyledComponent<{
862
1019
  theme?: _emotion_react.Theme;
863
1020
  as?: React.ElementType;
864
- }, React$1.DetailedHTMLProps<React$1.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
1021
+ }, react.DetailedHTMLProps<react.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
865
1022
  declare const ScrollableSVGWrapper: _emotion_styled.StyledComponent<{
866
1023
  theme?: _emotion_react.Theme;
867
1024
  as?: React.ElementType;
868
- }, React$1.DetailedHTMLProps<React$1.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
1025
+ }, react.DetailedHTMLProps<react.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
869
1026
 
870
1027
  declare const baseOverlayStyles: {
871
1028
  readonly tank: {
@@ -918,8 +1075,8 @@ declare const baseOverlayStyles: {
918
1075
  };
919
1076
  };
920
1077
  declare const overlayStyles: Record<OverlayTheme, typeof baseOverlayStyles[OverlayTheme]>;
921
- declare const SVGLockedOverlay: ({ svgX, svgY, children, theme, style, className, onClick, containerSelector, }: SVGLockedOverlayProps) => react_jsx_runtime.JSX.Element;
922
- declare const DashboardCard: _emotion_styled.StyledComponent<_mui_system.BoxOwnProps<_mui_material.Theme> & Omit<React$1.DetailedHTMLProps<React$1.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof _mui_system.BoxOwnProps<_mui_material.Theme>> & {
1078
+ declare const SVGLockedOverlay: ({ svgX, svgY, children, theme, style, className, onClick, containerSelector, }: SVGLockedOverlayProps) => react.JSX.Element;
1079
+ declare const DashboardCard: _emotion_styled.StyledComponent<_mui_system.BoxOwnProps<_mui_material.Theme> & Omit<react.DetailedHTMLProps<react.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof _mui_system.BoxOwnProps<_mui_material.Theme>> & {
923
1080
  theme?: _emotion_react.Theme;
924
1081
  } & {
925
1082
  svgX: number;
@@ -931,23 +1088,23 @@ declare const CardHeader: _emotion_styled.StyledComponent<{
931
1088
  as?: React.ElementType;
932
1089
  } & {
933
1090
  color?: string;
934
- }, React$1.DetailedHTMLProps<React$1.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
1091
+ }, react.DetailedHTMLProps<react.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
935
1092
  declare const CardValue: _emotion_styled.StyledComponent<{
936
1093
  theme?: _emotion_react.Theme;
937
1094
  as?: React.ElementType;
938
- }, React$1.DetailedHTMLProps<React$1.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
1095
+ }, react.DetailedHTMLProps<react.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
939
1096
  declare const CardUnit: _emotion_styled.StyledComponent<{
940
1097
  theme?: _emotion_react.Theme;
941
1098
  as?: React.ElementType;
942
- }, React$1.DetailedHTMLProps<React$1.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
1099
+ }, react.DetailedHTMLProps<react.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
943
1100
 
944
- declare const TrendLine: ({ values, width, height, color, strokeWidth, backgroundColor, }: TrendLineProps) => react_jsx_runtime.JSX.Element;
945
- declare const CircularGauge: ({ value, max, unit, label, size, color, }: CircularGaugeProps) => react_jsx_runtime.JSX.Element;
946
- declare const Sparkline: ({ data, width, height, color }: SparklineProps) => react_jsx_runtime.JSX.Element | null;
947
- declare const EquipmentIndicatorWithSparkline: ({ svgX, svgY, color, label, size, sparklineData, sparklineOffset, }: EquipmentIndicatorWithSparklineProps) => react_jsx_runtime.JSX.Element;
948
- declare const EquipmentIndicator: ({ svgX, svgY, color, label, size, style, className, }: EquipmentIndicatorProps) => react_jsx_runtime.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;
949
1106
 
950
- 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;
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;
951
1108
 
952
1109
  type Theme = 'modern' | 'hmi';
953
1110
  interface ThemeContextType {
@@ -957,17 +1114,17 @@ interface ThemeContextType {
957
1114
  }
958
1115
  declare const useTheme: () => ThemeContextType;
959
1116
  interface ThemeProviderProps {
960
- children: React__default.ReactNode;
1117
+ children: react__default.ReactNode;
961
1118
  }
962
- declare const ThemeProvider: React__default.FC<ThemeProviderProps>;
1119
+ declare const ThemeProvider: react__default.FC<ThemeProviderProps>;
963
1120
 
964
- interface ThemeToggleProps extends React__default.HTMLAttributes<HTMLDivElement> {
1121
+ interface ThemeToggleProps extends react__default.HTMLAttributes<HTMLDivElement> {
965
1122
  /** Size of the toggle */
966
1123
  size?: 'small' | 'medium' | 'large';
967
1124
  /** Position of the toggle */
968
1125
  position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' | 'inline';
969
1126
  }
970
- declare const ThemeToggle: React__default.FC<ThemeToggleProps>;
1127
+ declare const ThemeToggle: react__default.FC<ThemeToggleProps>;
971
1128
 
972
1129
  /**
973
1130
  * ISA-101 High Performance HMI — Unified Status Color System
@@ -1005,6 +1162,17 @@ type StatusColorMap = Partial<Record<DeviceStatus, Partial<StatusColorEntry>>>;
1005
1162
  * - stopping: amber (transitional)
1006
1163
  */
1007
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;
1008
1176
  /**
1009
1177
  * Resolve a status string to a full color entry.
1010
1178
  *
@@ -1436,13 +1604,13 @@ interface PIDCanvasFeatures {
1436
1604
  /** Background color for canvas (default: '#ffffff') */
1437
1605
  backgroundColor?: string;
1438
1606
  }
1439
- interface PIDCanvasProps extends React__default.HTMLAttributes<HTMLDivElement> {
1607
+ interface PIDCanvasProps extends react__default.HTMLAttributes<HTMLDivElement> {
1440
1608
  /** The diagram to render */
1441
1609
  diagram: Diagram;
1442
1610
  /** Optional className for the container */
1443
1611
  className?: string;
1444
1612
  /** Optional inline styles for the container */
1445
- style?: React__default.CSSProperties;
1613
+ style?: react__default.CSSProperties;
1446
1614
  /** Enable interactive features (pan, zoom, selection, telemetry, dragNodes) */
1447
1615
  features?: PIDCanvasFeatures;
1448
1616
  /** Callback when selection changes */
@@ -1498,20 +1666,20 @@ interface PIDCanvasControls {
1498
1666
  *
1499
1667
  * Future: Editing tools, symbol library UI
1500
1668
  */
1501
- declare function PIDCanvasImpl({ diagram, className, style, features, onSelectionChange, onNodeClick, onPipeClick, onNodeMove, onDiagramChange, onDelete, onItemsCopied, onPaste, onSymbolDrop, onPipeCreated, onMounted, telemetry, statusColorMap, ...props }: PIDCanvasProps): React__default.ReactElement;
1669
+ declare function PIDCanvasImpl({ diagram, className, style, features, onSelectionChange, onNodeClick, onPipeClick, onNodeMove, onDiagramChange, onDelete, onItemsCopied, onPaste, onSymbolDrop, onPipeCreated, onMounted, telemetry, statusColorMap, ...props }: PIDCanvasProps): react__default.ReactElement;
1502
1670
  /**
1503
1671
  * Memo boundary - see PIDCanvasImpl doc comment (renderer-OOM fix). Shallow
1504
1672
  * compare: `diagram`, `telemetry`, `features`, `style`, `statusColorMap`, and
1505
1673
  * every callback are compared by identity; hosts that keep them stable skip
1506
1674
  * the full-canvas re-render entirely when unrelated screen state changes.
1507
1675
  */
1508
- declare const PIDCanvas: React__default.MemoExoticComponent<typeof PIDCanvasImpl>;
1676
+ declare const PIDCanvas: react__default.MemoExoticComponent<typeof PIDCanvasImpl>;
1509
1677
 
1510
1678
  interface SymbolLibraryProps {
1511
1679
  /** Optional className for styling */
1512
1680
  className?: string;
1513
1681
  /** Callback when a symbol drag starts */
1514
- onSymbolDragStart?: (symbolId: string, event: React__default.DragEvent) => void;
1682
+ onSymbolDragStart?: (symbolId: string, event: react__default.DragEvent) => void;
1515
1683
  /** Show category filter */
1516
1684
  showCategories?: boolean;
1517
1685
  /** Custom symbol categories */
@@ -1523,7 +1691,7 @@ interface SymbolLibraryProps {
1523
1691
  * Displays available symbols organized by category
1524
1692
  * Supports drag-and-drop to add new nodes to diagrams
1525
1693
  */
1526
- declare function SymbolLibrary({ className, onSymbolDragStart, showCategories, categories, }: SymbolLibraryProps): React__default.ReactElement;
1694
+ declare function SymbolLibrary({ className, onSymbolDragStart, showCategories, categories, }: SymbolLibraryProps): react__default.ReactElement;
1527
1695
 
1528
1696
  interface NodeConfigPanelProps {
1529
1697
  /** Selected node to configure */
@@ -1541,7 +1709,7 @@ interface NodeConfigPanelProps {
1541
1709
  /** Additional CSS class name */
1542
1710
  className?: string;
1543
1711
  /** Custom styles */
1544
- style?: React__default.CSSProperties;
1712
+ style?: react__default.CSSProperties;
1545
1713
  }
1546
1714
  /**
1547
1715
  * NodeConfigPanel - Reusable configuration panel for editing node properties and telemetry
@@ -1557,7 +1725,7 @@ interface NodeConfigPanelProps {
1557
1725
  * />
1558
1726
  * ```
1559
1727
  */
1560
- declare function NodeConfigPanel({ node, binding, onUpdateNode, onUpdateTelemetry, onAddTelemetry, onRemove, className, style, }: NodeConfigPanelProps): react_jsx_runtime.JSX.Element;
1728
+ declare function NodeConfigPanel({ node, binding, onUpdateNode, onUpdateTelemetry, onAddTelemetry, onRemove, className, style, }: NodeConfigPanelProps): react__default.JSX.Element;
1561
1729
 
1562
1730
  /**
1563
1731
  * Validates a diagram object structure
@@ -1717,6 +1885,15 @@ interface ConfigParameter {
1717
1885
  type: 'number' | 'string' | 'boolean' | 'select' | 'multiselect';
1718
1886
  /** Current value */
1719
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;
1720
1897
  /** Default value */
1721
1898
  defaultValue?: any;
1722
1899
  /** Whether parameter is read-only */
@@ -1976,6 +2153,20 @@ interface DeviceConfigPanelProps {
1976
2153
  onOpenControls?: () => void;
1977
2154
  /** Show controls button in header */
1978
2155
  showControlsButton?: boolean;
2156
+ /**
2157
+ * Render this panel's OWN result toast. Default true, so existing
2158
+ * consumers are unchanged.
2159
+ *
2160
+ * Set false when the host application already surfaces command and save
2161
+ * results through its own notification channel. Without it the operator
2162
+ * sees two notices for one action - this panel's optimistic "command
2163
+ * sent", in this panel's styling, followed by the host's message for the
2164
+ * real outcome - which reads as two different mechanisms.
2165
+ *
2166
+ * The result still lands in `binding.state`, so a host that opts out can
2167
+ * read it and render its own.
2168
+ */
2169
+ showBuiltInToast?: boolean;
1979
2170
  /** Embedded mode - uses static positioning for rendering in containers (default: false) */
1980
2171
  embedded?: boolean;
1981
2172
  }
@@ -1989,9 +2180,9 @@ interface DeviceConfigPanelProps {
1989
2180
  * pays off when the host passes identity-stable `binding` and handler props;
1990
2181
  * an unstable host degrades gracefully to the old behavior.
1991
2182
  */
1992
- declare function DeviceConfigPanelImpl({ binding, onClose, onUndock, undockIcon, position, align, touchOptimized, compact, fontScale, maxHeight, maxWidth, toastDuration, onOpenControls, showControlsButton, embedded, }: DeviceConfigPanelProps): react_jsx_runtime.JSX.Element | null;
2183
+ declare function DeviceConfigPanelImpl({ binding, onClose, onUndock, undockIcon, position, align, touchOptimized, compact, fontScale, maxHeight, maxWidth, toastDuration, onOpenControls, showControlsButton, showBuiltInToast, embedded, }: DeviceConfigPanelProps): react__default.JSX.Element | null;
1993
2184
  /** Memo boundary - see DeviceConfigPanelImpl doc comment (kiosk heap-leak fix). */
1994
- declare const DeviceConfigPanel: React__default.MemoExoticComponent<typeof DeviceConfigPanelImpl>;
2185
+ declare const DeviceConfigPanel: react__default.MemoExoticComponent<typeof DeviceConfigPanelImpl>;
1995
2186
 
1996
2187
  /**
1997
2188
  * Options for simulation behavior
@@ -2031,4 +2222,4 @@ interface SimulationOptions {
2031
2222
  */
2032
2223
  declare function useSimulation(telemetry: TelemetryMap, updateTelemetryBatch: (updates: Array<any>) => void, options?: SimulationOptions): void;
2033
2224
 
2034
- 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 };