@oicl/openbridge-webcomponents-full-bundle 2.0.0-next.151 → 2.0.0-next.152

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/.storybook/vitest.setup.ts +12 -1
  2. package/bundle/openbridge-webcomponents.bundle.js +989 -319
  3. package/bundle/openbridge-webcomponents.bundle.js.map +1 -1
  4. package/custom-elements.json +1514 -77
  5. package/dist/alert-severity.d.ts +12 -9
  6. package/dist/alert-severity.d.ts.map +1 -1
  7. package/dist/alert-severity.js +30 -38
  8. package/dist/alert-severity.js.map +1 -1
  9. package/dist/building-blocks/bar-horizontal/bar-horizontal.d.ts +6 -0
  10. package/dist/building-blocks/bar-horizontal/bar-horizontal.d.ts.map +1 -1
  11. package/dist/building-blocks/bar-horizontal/bar-horizontal.js +6 -1
  12. package/dist/building-blocks/bar-horizontal/bar-horizontal.js.map +1 -1
  13. package/dist/building-blocks/bar-vertical/bar-vertical.d.ts +6 -0
  14. package/dist/building-blocks/bar-vertical/bar-vertical.d.ts.map +1 -1
  15. package/dist/building-blocks/bar-vertical/bar-vertical.js +6 -1
  16. package/dist/building-blocks/bar-vertical/bar-vertical.js.map +1 -1
  17. package/dist/building-blocks/chart-line/chart-line-base.d.ts +129 -0
  18. package/dist/building-blocks/chart-line/chart-line-base.d.ts.map +1 -1
  19. package/dist/building-blocks/chart-line/chart-line-base.js +464 -79
  20. package/dist/building-blocks/chart-line/chart-line-base.js.map +1 -1
  21. package/dist/building-blocks/external-scale/external-scale.d.ts +11 -0
  22. package/dist/building-blocks/external-scale/external-scale.d.ts.map +1 -1
  23. package/dist/building-blocks/external-scale/external-scale.js +45 -12
  24. package/dist/building-blocks/external-scale/external-scale.js.map +1 -1
  25. package/dist/charthelpers/index.d.ts +1 -0
  26. package/dist/charthelpers/index.d.ts.map +1 -1
  27. package/dist/charthelpers/index.js +7 -1
  28. package/dist/charthelpers/index.js.map +1 -1
  29. package/dist/charthelpers/range-labels.d.ts +55 -0
  30. package/dist/charthelpers/range-labels.d.ts.map +1 -0
  31. package/dist/charthelpers/range-labels.js +36 -0
  32. package/dist/charthelpers/range-labels.js.map +1 -0
  33. package/dist/components/alert-button/alert-button.css.js +13 -21
  34. package/dist/components/alert-button/alert-button.css.js.map +1 -1
  35. package/dist/components/alert-button/alert-button.d.ts +9 -4
  36. package/dist/components/alert-button/alert-button.d.ts.map +1 -1
  37. package/dist/components/alert-button/alert-button.js +24 -15
  38. package/dist/components/alert-button/alert-button.js.map +1 -1
  39. package/dist/components/alert-frame/alert-frame.css.js +109 -33
  40. package/dist/components/alert-frame/alert-frame.css.js.map +1 -1
  41. package/dist/components/alert-frame/alert-frame.d.ts +34 -7
  42. package/dist/components/alert-frame/alert-frame.d.ts.map +1 -1
  43. package/dist/components/alert-frame/alert-frame.js +134 -30
  44. package/dist/components/alert-frame/alert-frame.js.map +1 -1
  45. package/dist/components/alert-icon/alert-icon.d.ts +10 -7
  46. package/dist/components/alert-icon/alert-icon.d.ts.map +1 -1
  47. package/dist/components/alert-icon/alert-icon.js +37 -60
  48. package/dist/components/alert-icon/alert-icon.js.map +1 -1
  49. package/dist/components/alert-menu-item/alert-menu-item.css.js +1 -4
  50. package/dist/components/alert-menu-item/alert-menu-item.css.js.map +1 -1
  51. package/dist/components/date-item/date-item.css.js +3 -3
  52. package/dist/components/keyboard-full/keyboard-full.css.js +4 -4
  53. package/dist/components/message-menu-item/message-menu-item.css.js +2 -6
  54. package/dist/components/message-menu-item/message-menu-item.css.js.map +1 -1
  55. package/dist/components/sequence-toolbar/sequence-toolbar.css.js +1 -2
  56. package/dist/components/sequence-toolbar/sequence-toolbar.css.js.map +1 -1
  57. package/dist/index.js +2 -1
  58. package/dist/navigation-instruments/gauge-trend/gauge-trend.d.ts +6 -0
  59. package/dist/navigation-instruments/gauge-trend/gauge-trend.d.ts.map +1 -1
  60. package/dist/navigation-instruments/gauge-trend/gauge-trend.js +8 -0
  61. package/dist/navigation-instruments/gauge-trend/gauge-trend.js.map +1 -1
  62. package/dist/navigation-instruments/instrument-field/instrument-field.css.js +2 -2
  63. package/dist/navigation-instruments/readout/readout.d.ts.map +1 -1
  64. package/dist/navigation-instruments/readout/readout.js +2 -1
  65. package/dist/navigation-instruments/readout/readout.js.map +1 -1
  66. package/dist/navigation-instruments/readout-list-item/readout-list-item.d.ts.map +1 -1
  67. package/dist/navigation-instruments/readout-list-item/readout-list-item.js +2 -1
  68. package/dist/navigation-instruments/readout-list-item/readout-list-item.js.map +1 -1
  69. package/dist/openbridge.css +19 -4
  70. package/dist/palettes/blinking.d.ts +14 -4
  71. package/dist/palettes/blinking.d.ts.map +1 -1
  72. package/dist/palettes/blinking.js +41 -35
  73. package/dist/palettes/blinking.js.map +1 -1
  74. package/dist/palettes/flashing-controller.d.ts +21 -0
  75. package/dist/palettes/flashing-controller.d.ts.map +1 -0
  76. package/dist/palettes/flashing-controller.js +45 -0
  77. package/dist/palettes/flashing-controller.js.map +1 -0
  78. package/dist/svghelpers/index.d.ts +1 -0
  79. package/dist/svghelpers/index.d.ts.map +1 -1
  80. package/dist/svghelpers/index.js +2 -0
  81. package/dist/svghelpers/index.js.map +1 -1
  82. package/dist/svghelpers/rounded-rect.d.ts +15 -0
  83. package/dist/svghelpers/rounded-rect.d.ts.map +1 -0
  84. package/dist/svghelpers/rounded-rect.js +29 -0
  85. package/dist/svghelpers/rounded-rect.js.map +1 -0
  86. package/dist/types.d.ts +14 -0
  87. package/dist/types.d.ts.map +1 -1
  88. package/dist/types.js +9 -0
  89. package/dist/types.js.map +1 -1
  90. package/package.json +1 -1
  91. package/script/check-css-variables.ts +2 -15
  92. package/src/alert-severity.spec.ts +56 -0
  93. package/src/alert-severity.ts +45 -43
  94. package/src/bars-graphs/area-graph/area-graph.stories.ts +235 -1
  95. package/src/bars-graphs/line-graph/line-graph.stories.ts +24 -0
  96. package/src/building-blocks/bar-horizontal/bar-horizontal.ts +7 -0
  97. package/src/building-blocks/bar-vertical/bar-vertical.ts +7 -0
  98. package/src/building-blocks/chart-line/chart-line-base.spec.ts +767 -0
  99. package/src/building-blocks/chart-line/chart-line-base.stories.ts +124 -0
  100. package/src/building-blocks/chart-line/chart-line-base.ts +671 -97
  101. package/src/building-blocks/chart-line/chart-sizing-battleground.stories.ts +17 -0
  102. package/src/building-blocks/external-scale/external-scale.spec.ts +154 -0
  103. package/src/building-blocks/external-scale/external-scale.ts +78 -20
  104. package/src/charthelpers/index.ts +1 -0
  105. package/src/charthelpers/range-labels.spec.ts +46 -0
  106. package/src/charthelpers/range-labels.ts +93 -0
  107. package/src/components/alert-button/alert-button.css +10 -23
  108. package/src/components/alert-button/alert-button.spec.ts +56 -15
  109. package/src/components/alert-button/alert-button.stories.ts +5 -1
  110. package/src/components/alert-button/alert-button.ts +33 -24
  111. package/src/components/alert-frame/alert-flash-scenario.stories.ts +669 -0
  112. package/src/components/alert-frame/alert-frame.css +106 -33
  113. package/src/components/alert-frame/alert-frame.spec.ts +176 -17
  114. package/src/components/alert-frame/alert-frame.stories.ts +61 -0
  115. package/src/components/alert-frame/alert-frame.ts +179 -41
  116. package/src/components/alert-icon/alert-icon.spec.ts +82 -27
  117. package/src/components/alert-icon/alert-icon.stories.ts +7 -1
  118. package/src/components/alert-icon/alert-icon.ts +48 -74
  119. package/src/components/alert-menu-item/alert-menu-item.css +1 -4
  120. package/src/components/date-item/date-item.css +3 -3
  121. package/src/components/keyboard-full/keyboard-full.css +4 -4
  122. package/src/components/message-menu-item/message-menu-item.css +2 -6
  123. package/src/components/sequence-toolbar/sequence-toolbar.css +1 -2
  124. package/src/navigation-instruments/gauge-trend/gauge-trend.stories.ts +29 -0
  125. package/src/navigation-instruments/gauge-trend/gauge-trend.ts +11 -0
  126. package/src/navigation-instruments/instrument-field/instrument-field.css +2 -2
  127. package/src/navigation-instruments/readout/readout.ts +2 -1
  128. package/src/navigation-instruments/readout-list-item/readout-list-item.ts +2 -1
  129. package/src/palettes/blinking.spec.ts +83 -0
  130. package/src/palettes/blinking.ts +47 -35
  131. package/src/palettes/flashing-controller.ts +62 -0
  132. package/src/palettes/manual.css +18 -4
  133. package/src/svghelpers/index.ts +1 -0
  134. package/src/svghelpers/rounded-rect.spec.ts +47 -0
  135. package/src/svghelpers/rounded-rect.ts +42 -0
  136. package/src/types.ts +20 -0
@@ -1 +1 @@
1
- {"version":3,"file":"gauge-trend.js","sources":["../../../src/navigation-instruments/gauge-trend/gauge-trend.ts"],"sourcesContent":["import {property} from 'lit/decorators.js';\nimport {customElement} from '../../decorator.js';\nimport {\n ObcChartLineBase,\n XAxisType,\n YAxisPosition,\n LineMode,\n TimeDisplay,\n} from '../../building-blocks/chart-line/chart-line-base.js';\nimport {BorderRadiusPosition} from '../types.js';\nimport {\n FillMode,\n AdvicePosition,\n BarContainerStyle,\n ScaleType,\n} from '../../building-blocks/bar-vertical/bar-vertical.js';\nimport type {LinearAdvice} from '../../building-blocks/instrument-linear/advice.js';\nimport {SetpointMixin} from '../../svghelpers/setpoint-mixin.js';\nimport '../../building-blocks/bar-vertical/bar-vertical.js';\n\n// Re-export FillMode and ScaleType for user convenience\nexport {FillMode, ScaleType};\n\n/**\n * Gauge Trend - A navigation instrument combining a line/area chart with an integrated vertical scale.\n *\n * This is a high-level, self-contained component that combines:\n * - A line/area chart (based on `ObcChartLineBase`) with configurable fill mode\n * - An integrated vertical scale (`obc-bar-vertical`) on the right side\n *\n * The component is designed for displaying time-series or categorical trend data alongside a calibrated\n * vertical measurement scale, commonly used in maritime navigation instruments.\n *\n * ## Architecture\n *\n * Internally composed of:\n * - **Base**: `ObcChartLineBase` (line/area graph functionality)\n * - **Right scale**: `obc-bar-vertical` (external scale component)\n *\n * ## Locked Configuration (not user-configurable)\n * - Fixed aspect ratio scaling: always enabled\n * - Instrument mode: always enabled (8px border radius)\n * - X-axis type: auto-detected — 'category' for `{label, value}` data,\n * 'time' for `{x, value}` data (uneven intervals position proportionally).\n * Assigning `xAxisType` explicitly disables auto-detection.\n * - Line mode: always 'smooth'\n * - Grid, tick marks, points, legend: always hidden\n * - Scale advice position: always 'inner'\n * - Scale state: automatically inherits from `state` property\n *\n * ## Usage Examples\n *\n * ### Basic gauge trend with default area fill\n * ```html\n * <obc-gauge-trend\n * .data=${[\n * {label: 'Jan', value: 3.5},\n * {label: 'Feb', value: 4.2},\n * {label: 'Mar', value: 5.0}\n * ]}\n * .minValue=${3}\n * .maxValue=${7}\n * .value=${5}\n * .width=${480}\n * .height=${480}\n * ></obc-gauge-trend>\n * ```\n *\n * ### Line-only (no fill) - default\n * ```html\n * <obc-gauge-trend\n * .data=${chartData}\n * ></obc-gauge-trend>\n * ```\n *\n * ### With area fill\n * ```html\n * <obc-gauge-trend\n * .chartFill=${true}\n * .data=${chartData}\n * ></obc-gauge-trend>\n * ```\n *\n * ### With enhanced colors and setpoint\n * ```html\n * <obc-gauge-trend\n * .enhanced=${true}\n * .state=${'in-command'}\n * .setpoint=${5.5}\n * .value=${5.2}\n * .hasBar=${true}\n * .hasScale=${true}\n * ></obc-gauge-trend>\n * ```\n *\n * ### With advice overlays\n * ```html\n * <obc-gauge-trend\n * .hasAdvice=${true}\n * .advice=${[\n * {min: 3, max: 5, type: 'caution', hinted: true},\n * {min: 6, max: 7, type: 'advice', hinted: false}\n * ]}\n * ></obc-gauge-trend>\n * ```\n *\n * ### Time-based data with uneven intervals\n * ```html\n * <obc-gauge-trend\n * .data=${[\n * {x: '2026-07-06T10:00:00Z', value: 3.5},\n * {x: '2026-07-06T10:03:00Z', value: 4.2},\n * {x: '2026-07-06T10:15:00Z', value: 5.0}\n * ]}\n * ></obc-gauge-trend>\n * ```\n *\n *\n * Setpoint properties are inherited from {@link SetpointMixin}.\n * These are forwarded to the internal `obc-bar-vertical` scale:\n * `setpoint`, `newSetpoint`, `touching`, `atSetpoint`, `autoAtSetpoint`,\n * `autoAtSetpointDeadband`, `setpointAtZeroDeadband`, `setpointOverride`.\n * See {@link SetpointMixinInterface} for full documentation.\n *\n * @property minValue - Minimum value for the scale range.\n * Also used as chart y-axis minimum when `chartMinValue` is undefined.\n * @property maxValue - Maximum value for the scale range.\n * Also used as chart y-axis maximum when `chartMaxValue` is undefined.\n * @property chartMinValue - Minimum value for the chart y-axis.\n * When undefined, defaults to `minValue` to keep chart and scale aligned.\n * @property chartMaxValue - Maximum value for the chart y-axis.\n * When undefined, defaults to `maxValue` to keep chart and scale aligned.\n * @property hasScale - Show scale tick marks and labels.\n * @property hasAdvice - Show advice overlays on the vertical scale.\n * @property fillMin - Fill origin value - the starting point for the bar fill.\n * In both fill modes, the bar fills from this value toward the current value.\n * For scales like -100..100, set this to 0 to have the bar fill up or down from zero.\n * @availableWhen fillMin hasBar==true && value!=undefined\n * @property advice - Advice/alert overlays for the vertical scale.\n * @availableWhen advice hasAdvice==true\n * @property primaryTickmarkInterval - Primary tick interval for the vertical scale (longest ticks with labels).\n * @property secondaryTickmarkInterval - Secondary tick interval for the vertical scale (medium ticks).\n * @availableWhen secondaryTickmarkInterval hasScale==true\n * @property tertiaryTickmarkInterval - Tertiary tick interval for the vertical scale (shortest ticks).\n * @availableWhen tertiaryTickmarkInterval hasScale==true\n * @property chartFill - Enable chart area fill.\n * When true, fills the area under the line with semitransparent color.\n * When false (default), renders as line-only chart.\n * @stable\n */\n@customElement('obc-gauge-trend')\nexport class ObcGaugeTrend extends SetpointMixin(ObcChartLineBase) {\n private _barVerticalElement?: HTMLElement;\n private _isFirstUpdate = false;\n private _explicitXAxisType = false;\n private _autoAppliedXAxisType?: XAxisType;\n\n constructor() {\n super();\n\n // Chart display options - locked for gauge-trend\n this.legend = false;\n this.showDebugOverlay = false;\n this.showGrid = false;\n this.showTickMarks = false;\n this.showPoints = false;\n\n // Axis configuration - locked for gauge-trend\n this.xAxisType = XAxisType.category;\n this.yAxisPosition = YAxisPosition.left;\n\n // Line rendering - locked for gauge-trend\n this.lineMode = LineMode.smooth;\n\n // Tooltip/unit - locked for gauge-trend (scale shows values)\n this.unit = '';\n this.timeDisplay = TimeDisplay.date;\n\n // Scaling and sizing - locked for gauge-trend\n this.fixedAspectRatioScaling = true;\n this.instrumentMode = true;\n this.borderRadius = 8;\n\n // Border radius positions for chart + scale composition\n this.borderRadiusPosition = BorderRadiusPosition.innerFirstChild;\n this.borderRadiusPositionExternalScales = BorderRadiusPosition.middleChild;\n\n // Y-axis configuration (managed internally, single axis only)\n // Note: yAxes will be properly set in willUpdate once properties are initialized\n // Using minValue/maxValue as defaults when chartMinValue/chartMaxValue are undefined\n this.yAxes = [\n {\n id: 'y',\n position: 'left',\n min: this.chartMinValue ?? this.minValue,\n max: this.chartMaxValue ?? this.maxValue,\n },\n ];\n }\n\n override async firstUpdated() {\n // IMPORTANT: create the external scale *before* base firstUpdated runs.\n // The base waits for external scale dimensions to integrate chart padding.\n this._createBarVerticalElement();\n this._updateBorderRadiusPosition();\n\n await super.firstUpdated();\n\n this._isFirstUpdate = false;\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n // Note: We intentionally don't remove _barVerticalElement here.\n // It's a light DOM child that naturally travels with the parent when\n // the component is moved in the DOM. Removing it would cause the scale\n // to be lost on reconnect since firstUpdated() only runs once.\n }\n\n private _createBarVerticalElement() {\n // Create bar-vertical element in light DOM so it can be slotted\n if (!this._barVerticalElement) {\n const barVertical = document.createElement('obc-bar-vertical');\n barVertical.setAttribute('slot', 'right-scale');\n this._barVerticalElement = barVertical;\n this.appendChild(barVertical);\n this._updateBarVerticalProperties();\n }\n }\n\n private _updateBorderRadiusPosition() {\n // When there's no bar and no scale (labels only), round all corners\n if (!this.hasBar && !this.hasScale) {\n this.borderRadiusPosition = BorderRadiusPosition.middleRoundedChild;\n } else {\n // Otherwise, use innerFirstChild (rounds left side when scale is on right)\n this.borderRadiusPosition = BorderRadiusPosition.innerFirstChild;\n }\n }\n\n private _updateBarVerticalProperties() {\n if (!this._barVerticalElement) {\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const barVertical = this._barVerticalElement as any;\n\n // Use getEffectiveHeight() which returns computed height in fixedAspectRatioScaling mode\n // This ensures the bar-vertical gets the correct height that matches the chart's actual size\n const effectiveHeight = this.getEffectiveHeight();\n\n barVertical.minValue = this.minValue;\n barVertical.maxValue = this.maxValue;\n barVertical.height = effectiveHeight;\n barVertical.side = 'right';\n barVertical.hasScale = this.hasScale;\n barVertical.hasBar = this.hasBar;\n // Bar thickness: 48 for scale mode, 24 for bar-only mode (internal, not user-configurable)\n barVertical.barThickness = this.hasScale ? 48 : 24;\n barVertical.scaleType = this.scaleType;\n barVertical.fillMode = this.fillMode;\n barVertical.fillMin = this.fillMin;\n // In 'fill' mode: fillMax always tracks value (bar shows current value)\n // In 'tint' mode: fillMax uses explicit value or defaults to value\n barVertical.fillMax =\n this.fillMode === FillMode.fill\n ? this.value\n : (this.fillMax ?? this.value);\n barVertical.value = this.value;\n barVertical.setpoint = this.setpoint;\n barVertical.newSetpoint = this.newSetpoint;\n barVertical.touching = this.touching;\n barVertical.atSetpoint = this.atSetpoint;\n barVertical.autoAtSetpoint = this.autoAtSetpoint;\n barVertical.autoAtSetpointDeadband = this.autoAtSetpointDeadband;\n barVertical.setpointAtZeroDeadband = this.setpointAtZeroDeadband;\n barVertical.animateSetpoint = this.animateSetpoint;\n barVertical.setpointOverride = this.setpointOverride;\n // Advice position is always 'inner' for gauge-trend\n barVertical.advicePosition = AdvicePosition.inner;\n // obc-bar-vertical uses 'advices' (plural), not 'advice' or 'hasAdvice'\n barVertical.advices = this.hasAdvice ? this.advice : [];\n barVertical.primaryTickmarkInterval = this.primaryTickmarkInterval;\n barVertical.secondaryTickmarkInterval = this.secondaryTickmarkInterval;\n barVertical.tertiaryTickmarkInterval = this.tertiaryTickmarkInterval;\n barVertical.scaleBackground = this.hasScale;\n // When hasScale=false, use gray (secondary) background for the bar container\n barVertical.barContainerStyle = this.hasScale\n ? undefined\n : BarContainerStyle.secondary;\n // Pass fixedAspectRatio to match parent's fixedAspectRatioScaling\n barVertical.fixedAspectRatio = this.fixedAspectRatioScaling;\n // Pass scaleReferenceSize from parent (inherited from ObcChartLineBase)\n barVertical.scaleReferenceSize = this.scaleReferenceSize;\n // Derive tickmark visibility from whether intervals are defined\n barVertical.hasPrimaryTickmarks =\n this.primaryTickmarkInterval !== undefined;\n barVertical.hasTertiaryTickmarks =\n this.tertiaryTickmarkInterval !== undefined;\n barVertical.priority = this.priority;\n // Scale state inherits from parent 'state' property automatically\n barVertical.state = this.state;\n\n // Enable instrument mode: only label font size responds to .obc-component-size-* CSS classes\n // Border radius and bar thickness are controlled by explicit values, not CSS variables\n barVertical.instrumentMode = true;\n // Use fixed border radius of 8px (same as medium component size) for consistent instrument appearance\n // This matches the chart's border radius for visual consistency\n barVertical.borderRadius = 8;\n\n // Automatically adjust border radius position based on hasScale\n // When hasScale=false, the bar-vertical should have outerLastChild border radius\n // When hasScale=true, it should be middleChild (has scale background as neighbor)\n barVertical.borderRadiusPosition = this.hasScale\n ? BorderRadiusPosition.middleChild\n : BorderRadiusPosition.outerLastChild;\n\n // Auto-derive: show dot indicator when no bar is shown\n barVertical.highlightCurrentValue = !this.hasBar;\n }\n\n /**\n * Scale type for the vertical scale.\n * - `'regular'`: Standard tick lengths (default)\n * - `'condensed'`: Shorter tick lengths for compact display\n *\n * Hidden from Storybook controls via argTypes configuration.\n * @availableWhen hasScale==true\n */\n @property({type: String})\n scaleType: ScaleType = ScaleType.regular;\n\n @property({type: Number})\n minValue = 0;\n\n @property({type: Number})\n maxValue = 100;\n\n @property({type: Number})\n chartMinValue?: number = undefined;\n\n @property({type: Number})\n chartMaxValue?: number = undefined;\n\n /**\n * Current value displayed on the vertical scale.\n *\n * This is the primary value property that drives:\n * - The bar fill level (when `hasBar=true`)\n * - The dot indicator position (when `hasBar=false`)\n * - The `fillMax` value (when `fillMax` is not explicitly set)\n *\n * In typical usage, you only need to set this property to update the gauge.\n * @availableWhen hasBar==true || hasScale==true\n */\n @property({type: Number})\n value?: number = undefined;\n\n /**\n * Show bar on the vertical scale.\n *\n * When `true`, displays a filled bar indicating the current value.\n * When `false`, a dot indicator is automatically shown at the value position instead.\n */\n @property({type: Boolean})\n hasBar = false;\n\n @property({type: Boolean})\n hasScale = false;\n\n @property({type: Boolean})\n hasAdvice = false;\n\n /**\n * Fill mode for the bar.\n * - `'fill'`: Bar fills from `fillMin` to `value` — the bar visually tracks the current value.\n * The `fillMax` property is **ignored** in this mode.\n * - `'tint'`: Bar fills from `fillMin` to `fillMax` — an explicit highlighted range.\n * Use this when you want to show a fixed range independent of the current value.\n *\n * In both modes, `fillMin` is the origin point (e.g., 0 in a -100..100 scale).\n * @availableWhen hasBar==true && value!=undefined\n */\n @property({type: String})\n fillMode: FillMode = FillMode.fill;\n\n @property({type: Number})\n fillMin = 0;\n\n /**\n * Maximum fill value for the bar (only used in `'tint'` mode).\n *\n * In `'fill'` mode, this property is **ignored** — the bar always fills to `value`.\n *\n * In `'tint'` mode, this defines the upper bound of the highlighted range.\n * When `undefined`, defaults to `value`.\n * @availableWhen hasBar==true && value!=undefined && fillMode==tint\n */\n @property({type: Number})\n fillMax?: number = undefined;\n\n @property({type: Array, attribute: false})\n advice: LinearAdvice[] = [];\n\n @property({type: Number})\n primaryTickmarkInterval?: number = undefined;\n\n // Setpoint properties (setpoint, newSetpoint, touching, atSetpoint,\n // autoAtSetpoint, autoAtSetpointDeadband, setpointAtZeroDeadband,\n // setpointOverride, computeAtSetpoint()) are provided by SetpointMixin.\n // See setpoint-mixin.ts for full docs.\n\n @property({type: Number})\n secondaryTickmarkInterval = 0.5;\n\n @property({type: Number})\n tertiaryTickmarkInterval?: number = undefined;\n\n @property({type: Boolean})\n chartFill = false;\n\n /**\n * Apply fill when chartFill is true.\n */\n protected override shouldApplyFill(): boolean {\n return this.chartFill;\n }\n\n /**\n * Return the fill mode for area rendering.\n * Maps chartFill boolean to base class fillMode.\n */\n protected override getFillMode(): string | undefined {\n return this.chartFill ? 'semitransparent' : undefined;\n }\n\n /**\n * Stacking is not used in gauge-trend (always false).\n */\n protected override shouldStack(): boolean {\n return false;\n }\n\n override willUpdate(changed: Map<PropertyKey, unknown>) {\n // Auto axis detection: {x, value} data switches to time spacing, {label,\n // value} stays category. An explicit xAxisType assignment (anything we\n // did not auto-apply) permanently disables auto-detection. The\n // constructor's 'category' default lands in the first changed-map but is\n // not treated as explicit (hasUpdated is false and it equals the default).\n if (\n changed.has('xAxisType') &&\n this.xAxisType !== this._autoAppliedXAxisType &&\n (this.hasUpdated || this.xAxisType !== XAxisType.category)\n ) {\n this._explicitXAxisType = true;\n }\n if (!this._explicitXAxisType && changed.has('data')) {\n const allHaveX =\n (this.data?.length ?? 0) > 0 && this.data.every((d) => d.x != null);\n const target = allHaveX ? XAxisType.time : XAxisType.category;\n if (this.xAxisType !== target) {\n this._autoAppliedXAxisType = target;\n this.xAxisType = target;\n }\n }\n\n super.willUpdate(changed);\n\n // Update y-axis range when chart or scale min/max changes\n // Note: yAxes is managed internally - users cannot set multiple axes\n // When chartMinValue/chartMaxValue are undefined, fall back to minValue/maxValue\n if (\n changed.has('chartMinValue') ||\n changed.has('chartMaxValue') ||\n changed.has('minValue') ||\n changed.has('maxValue')\n ) {\n const chartMin = this.chartMinValue ?? this.minValue;\n const chartMax = this.chartMaxValue ?? this.maxValue;\n this.yAxes = [\n {\n id: 'y',\n position: 'left',\n min: chartMin,\n max: chartMax,\n },\n ];\n }\n\n // Adjust chart's border radius position for external scales based on hasScale\n // This needs to be set before render, so we do it in willUpdate\n if (changed.has('hasScale')) {\n this.borderRadiusPositionExternalScales = this.hasScale\n ? BorderRadiusPosition.middleChild\n : BorderRadiusPosition.outerLastChild;\n }\n }\n\n override updated(changed: Map<PropertyKey, unknown>) {\n // Handle chartFill changes by forcing a data refresh\n // This triggers the base class to update the chart with new fill settings\n if (changed.has('chartFill') && this.data) {\n // Create a shallow copy to trigger the base class's watched property detection\n this.data = [...this.data];\n }\n\n super.updated(changed);\n // Update border radius position when bar/scale visibility changes\n if (changed.has('hasBar') || changed.has('hasScale')) {\n this._updateBorderRadiusPosition();\n }\n // Keep the internal right-scale in sync with public API changes.\n // (Mirrors the storybook “chart integration” examples, but encapsulated.)\n if (!this._barVerticalElement || this._isFirstUpdate) return;\n\n const shouldUpdateScale =\n changed.has('minValue') ||\n changed.has('maxValue') ||\n changed.has('value') ||\n changed.has('setpoint') ||\n changed.has('newSetpoint') ||\n changed.has('touching') ||\n changed.has('atSetpoint') ||\n changed.has('autoAtSetpoint') ||\n changed.has('autoAtSetpointDeadband') ||\n changed.has('setpointAtZeroDeadband') ||\n changed.has('setpointOverride') ||\n changed.has('hasBar') ||\n changed.has('hasScale') ||\n changed.has('hasAdvice') ||\n changed.has('fillMode') ||\n changed.has('fillMin') ||\n changed.has('fillMax') ||\n changed.has('advice') ||\n changed.has('primaryTickmarkInterval') ||\n changed.has('secondaryTickmarkInterval') ||\n changed.has('tertiaryTickmarkInterval') ||\n changed.has('scaleType') ||\n changed.has('state') || // Scale state inherits from parent 'state'\n changed.has('priority') ||\n changed.has('height') ||\n changed.has('width') ||\n changed.has('scaleReferenceSize') ||\n changed.has('chartMinValue') ||\n changed.has('chartMaxValue');\n\n if (shouldUpdateScale) this._updateBarVerticalProperties();\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'obc-gauge-trend': ObcGaugeTrend;\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gauge-trend.js","sources":["../../../src/navigation-instruments/gauge-trend/gauge-trend.ts"],"sourcesContent":["import {property} from 'lit/decorators.js';\nimport {customElement} from '../../decorator.js';\nimport {\n ObcChartLineBase,\n XAxisType,\n YAxisPosition,\n LineMode,\n TimeDisplay,\n} from '../../building-blocks/chart-line/chart-line-base.js';\nimport {BorderRadiusPosition} from '../types.js';\nimport {\n FillMode,\n AdvicePosition,\n BarContainerStyle,\n ScaleType,\n} from '../../building-blocks/bar-vertical/bar-vertical.js';\nimport type {LinearAdvice} from '../../building-blocks/instrument-linear/advice.js';\nimport {SetpointMixin} from '../../svghelpers/setpoint-mixin.js';\nimport '../../building-blocks/bar-vertical/bar-vertical.js';\n\n// Re-export FillMode and ScaleType for user convenience\nexport {FillMode, ScaleType};\n\n/**\n * Gauge Trend - A navigation instrument combining a line/area chart with an integrated vertical scale.\n *\n * This is a high-level, self-contained component that combines:\n * - A line/area chart (based on `ObcChartLineBase`) with configurable fill mode\n * - An integrated vertical scale (`obc-bar-vertical`) on the right side\n *\n * The component is designed for displaying time-series or categorical trend data alongside a calibrated\n * vertical measurement scale, commonly used in maritime navigation instruments.\n *\n * ## Architecture\n *\n * Internally composed of:\n * - **Base**: `ObcChartLineBase` (line/area graph functionality)\n * - **Right scale**: `obc-bar-vertical` (external scale component)\n *\n * ## Locked Configuration (not user-configurable)\n * - Fixed aspect ratio scaling: always enabled\n * - Instrument mode: always enabled (8px border radius)\n * - X-axis type: auto-detected — 'category' for `{label, value}` data,\n * 'time' for `{x, value}` data (uneven intervals position proportionally).\n * Assigning `xAxisType` explicitly disables auto-detection.\n * - Line mode: always 'smooth'\n * - Grid, tick marks, points, legend: always hidden\n * - Scale advice position: always 'inner'\n * - Scale state: automatically inherits from `state` property\n *\n * ## Usage Examples\n *\n * ### Basic gauge trend with default area fill\n * ```html\n * <obc-gauge-trend\n * .data=${[\n * {label: 'Jan', value: 3.5},\n * {label: 'Feb', value: 4.2},\n * {label: 'Mar', value: 5.0}\n * ]}\n * .minValue=${3}\n * .maxValue=${7}\n * .value=${5}\n * .width=${480}\n * .height=${480}\n * ></obc-gauge-trend>\n * ```\n *\n * ### Line-only (no fill) - default\n * ```html\n * <obc-gauge-trend\n * .data=${chartData}\n * ></obc-gauge-trend>\n * ```\n *\n * ### With area fill\n * ```html\n * <obc-gauge-trend\n * .chartFill=${true}\n * .data=${chartData}\n * ></obc-gauge-trend>\n * ```\n *\n * ### With enhanced colors and setpoint\n * ```html\n * <obc-gauge-trend\n * .enhanced=${true}\n * .state=${'in-command'}\n * .setpoint=${5.5}\n * .value=${5.2}\n * .hasBar=${true}\n * .hasScale=${true}\n * ></obc-gauge-trend>\n * ```\n *\n * ### With advice overlays\n * ```html\n * <obc-gauge-trend\n * .hasAdvice=${true}\n * .advice=${[\n * {min: 3, max: 5, type: 'caution', hinted: true},\n * {min: 6, max: 7, type: 'advice', hinted: false}\n * ]}\n * ></obc-gauge-trend>\n * ```\n *\n * ### Time-based data with uneven intervals\n * ```html\n * <obc-gauge-trend\n * .data=${[\n * {x: '2026-07-06T10:00:00Z', value: 3.5},\n * {x: '2026-07-06T10:03:00Z', value: 4.2},\n * {x: '2026-07-06T10:15:00Z', value: 5.0}\n * ]}\n * ></obc-gauge-trend>\n * ```\n *\n *\n * Setpoint properties are inherited from {@link SetpointMixin}.\n * These are forwarded to the internal `obc-bar-vertical` scale:\n * `setpoint`, `newSetpoint`, `touching`, `atSetpoint`, `autoAtSetpoint`,\n * `autoAtSetpointDeadband`, `setpointAtZeroDeadband`, `setpointOverride`.\n * See {@link SetpointMixinInterface} for full documentation.\n *\n * @property minValue - Minimum value for the scale range.\n * Also used as chart y-axis minimum when `chartMinValue` is undefined.\n * @property maxValue - Maximum value for the scale range.\n * Also used as chart y-axis maximum when `chartMaxValue` is undefined.\n * @property chartMinValue - Minimum value for the chart y-axis.\n * When undefined, defaults to `minValue` to keep chart and scale aligned.\n * @property chartMaxValue - Maximum value for the chart y-axis.\n * When undefined, defaults to `maxValue` to keep chart and scale aligned.\n * @property hasScale - Show scale tick marks and labels.\n * @property hasAdvice - Show advice overlays on the vertical scale.\n * @property fillMin - Fill origin value - the starting point for the bar fill.\n * In both fill modes, the bar fills from this value toward the current value.\n * For scales like -100..100, set this to 0 to have the bar fill up or down from zero.\n * @availableWhen fillMin hasBar==true && value!=undefined\n * @property advice - Advice/alert overlays for the vertical scale.\n * @availableWhen advice hasAdvice==true\n * @property primaryTickmarkInterval - Primary tick interval for the vertical scale (longest ticks with labels).\n * @property secondaryTickmarkInterval - Secondary tick interval for the vertical scale (medium ticks).\n * @availableWhen secondaryTickmarkInterval hasScale==true\n * @property tertiaryTickmarkInterval - Tertiary tick interval for the vertical scale (shortest ticks).\n * @availableWhen tertiaryTickmarkInterval hasScale==true\n * @property chartFill - Enable chart area fill.\n * When true, fills the area under the line with semitransparent color.\n * When false (default), renders as line-only chart.\n * @stable\n */\n@customElement('obc-gauge-trend')\nexport class ObcGaugeTrend extends SetpointMixin(ObcChartLineBase) {\n private _barVerticalElement?: HTMLElement;\n private _isFirstUpdate = false;\n private _explicitXAxisType = false;\n private _autoAppliedXAxisType?: XAxisType;\n\n constructor() {\n super();\n\n // Chart display options - locked for gauge-trend\n this.legend = false;\n this.showDebugOverlay = false;\n this.showGrid = false;\n this.showTickMarks = false;\n this.showPoints = false;\n\n // Axis configuration - locked for gauge-trend\n this.xAxisType = XAxisType.category;\n this.yAxisPosition = YAxisPosition.left;\n\n // Line rendering - locked for gauge-trend\n this.lineMode = LineMode.smooth;\n\n // Tooltip/unit - locked for gauge-trend (scale shows values)\n this.unit = '';\n this.timeDisplay = TimeDisplay.date;\n\n // Scaling and sizing - locked for gauge-trend\n this.fixedAspectRatioScaling = true;\n this.instrumentMode = true;\n this.borderRadius = 8;\n\n // Border radius positions for chart + scale composition\n this.borderRadiusPosition = BorderRadiusPosition.innerFirstChild;\n this.borderRadiusPositionExternalScales = BorderRadiusPosition.middleChild;\n\n // Y-axis configuration (managed internally, single axis only)\n // Note: yAxes will be properly set in willUpdate once properties are initialized\n // Using minValue/maxValue as defaults when chartMinValue/chartMaxValue are undefined\n this.yAxes = [\n {\n id: 'y',\n position: 'left',\n min: this.chartMinValue ?? this.minValue,\n max: this.chartMaxValue ?? this.maxValue,\n },\n ];\n }\n\n override async firstUpdated() {\n // IMPORTANT: create the external scale *before* base firstUpdated runs.\n // The base waits for external scale dimensions to integrate chart padding.\n this._createBarVerticalElement();\n this._updateBorderRadiusPosition();\n\n await super.firstUpdated();\n\n this._isFirstUpdate = false;\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n // Note: We intentionally don't remove _barVerticalElement here.\n // It's a light DOM child that naturally travels with the parent when\n // the component is moved in the DOM. Removing it would cause the scale\n // to be lost on reconnect since firstUpdated() only runs once.\n }\n\n private _createBarVerticalElement() {\n // Create bar-vertical element in light DOM so it can be slotted\n if (!this._barVerticalElement) {\n const barVertical = document.createElement('obc-bar-vertical');\n barVertical.setAttribute('slot', 'right-scale');\n this._barVerticalElement = barVertical;\n this.appendChild(barVertical);\n this._updateBarVerticalProperties();\n }\n }\n\n private _updateBorderRadiusPosition() {\n // When there's no bar and no scale (labels only), round all corners\n if (!this.hasBar && !this.hasScale) {\n this.borderRadiusPosition = BorderRadiusPosition.middleRoundedChild;\n } else {\n // Otherwise, use innerFirstChild (rounds left side when scale is on right)\n this.borderRadiusPosition = BorderRadiusPosition.innerFirstChild;\n }\n }\n\n private _updateBarVerticalProperties() {\n if (!this._barVerticalElement) {\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const barVertical = this._barVerticalElement as any;\n\n // Use getEffectiveHeight() which returns computed height in fixedAspectRatioScaling mode\n // This ensures the bar-vertical gets the correct height that matches the chart's actual size\n const effectiveHeight = this.getEffectiveHeight();\n\n barVertical.minValue = this.minValue;\n barVertical.maxValue = this.maxValue;\n barVertical.height = effectiveHeight;\n barVertical.side = 'right';\n barVertical.hasScale = this.hasScale;\n barVertical.hasBar = this.hasBar;\n // Bar thickness: 48 for scale mode, 24 for bar-only mode (internal, not user-configurable)\n barVertical.barThickness = this.hasScale ? 48 : 24;\n barVertical.scaleType = this.scaleType;\n barVertical.fillMode = this.fillMode;\n barVertical.fillMin = this.fillMin;\n // In 'fill' mode: fillMax always tracks value (bar shows current value)\n // In 'tint' mode: fillMax uses explicit value or defaults to value\n barVertical.fillMax =\n this.fillMode === FillMode.fill\n ? this.value\n : (this.fillMax ?? this.value);\n barVertical.value = this.value;\n barVertical.setpoint = this.setpoint;\n barVertical.newSetpoint = this.newSetpoint;\n barVertical.touching = this.touching;\n barVertical.atSetpoint = this.atSetpoint;\n barVertical.autoAtSetpoint = this.autoAtSetpoint;\n barVertical.autoAtSetpointDeadband = this.autoAtSetpointDeadband;\n barVertical.setpointAtZeroDeadband = this.setpointAtZeroDeadband;\n barVertical.animateSetpoint = this.animateSetpoint;\n barVertical.setpointOverride = this.setpointOverride;\n // Advice position is always 'inner' for gauge-trend\n barVertical.advicePosition = AdvicePosition.inner;\n // obc-bar-vertical uses 'advices' (plural), not 'advice' or 'hasAdvice'\n barVertical.advices = this.hasAdvice ? this.advice : [];\n barVertical.primaryTickmarkInterval = this.primaryTickmarkInterval;\n barVertical.secondaryTickmarkInterval = this.secondaryTickmarkInterval;\n barVertical.tertiaryTickmarkInterval = this.tertiaryTickmarkInterval;\n barVertical.scaleBackground = this.hasScale;\n // When hasScale=false, use gray (secondary) background for the bar container\n barVertical.barContainerStyle = this.hasScale\n ? undefined\n : BarContainerStyle.secondary;\n // Pass fixedAspectRatio to match parent's fixedAspectRatioScaling\n barVertical.fixedAspectRatio = this.fixedAspectRatioScaling;\n // Pass scaleReferenceSize from parent (inherited from ObcChartLineBase)\n barVertical.scaleReferenceSize = this.scaleReferenceSize;\n // Derive tickmark visibility from whether intervals are defined\n barVertical.hasPrimaryTickmarks =\n this.primaryTickmarkInterval !== undefined;\n barVertical.hasTertiaryTickmarks =\n this.tertiaryTickmarkInterval !== undefined;\n barVertical.priority = this.priority;\n // Scale state inherits from parent 'state' property automatically\n barVertical.state = this.state;\n\n // Enable instrument mode: only label font size responds to .obc-component-size-* CSS classes\n // Border radius and bar thickness are controlled by explicit values, not CSS variables\n barVertical.instrumentMode = true;\n // Use fixed border radius of 8px (same as medium component size) for consistent instrument appearance\n // This matches the chart's border radius for visual consistency\n barVertical.borderRadius = 8;\n\n // Automatically adjust border radius position based on hasScale\n // When hasScale=false, the bar-vertical should have outerLastChild border radius\n // When hasScale=true, it should be middleChild (has scale background as neighbor)\n barVertical.borderRadiusPosition = this.hasScale\n ? BorderRadiusPosition.middleChild\n : BorderRadiusPosition.outerLastChild;\n\n // Auto-derive: show dot indicator when no bar is shown\n barVertical.highlightCurrentValue = !this.hasBar;\n }\n\n /**\n * Scale type for the vertical scale.\n * - `'regular'`: Standard tick lengths (default)\n * - `'condensed'`: Shorter tick lengths for compact display\n *\n * Hidden from Storybook controls via argTypes configuration.\n * @availableWhen hasScale==true\n */\n @property({type: String})\n scaleType: ScaleType = ScaleType.regular;\n\n @property({type: Number})\n minValue = 0;\n\n @property({type: Number})\n maxValue = 100;\n\n @property({type: Number})\n chartMinValue?: number = undefined;\n\n @property({type: Number})\n chartMaxValue?: number = undefined;\n\n /**\n * Current value displayed on the vertical scale.\n *\n * This is the primary value property that drives:\n * - The bar fill level (when `hasBar=true`)\n * - The dot indicator position (when `hasBar=false`)\n * - The `fillMax` value (when `fillMax` is not explicitly set)\n *\n * In typical usage, you only need to set this property to update the gauge.\n * @availableWhen hasBar==true || hasScale==true\n */\n @property({type: Number})\n value?: number = undefined;\n\n /**\n * Show bar on the vertical scale.\n *\n * When `true`, displays a filled bar indicating the current value.\n * When `false`, a dot indicator is automatically shown at the value position instead.\n */\n @property({type: Boolean})\n hasBar = false;\n\n @property({type: Boolean})\n hasScale = false;\n\n @property({type: Boolean})\n hasAdvice = false;\n\n /**\n * Fill mode for the bar.\n * - `'fill'`: Bar fills from `fillMin` to `value` — the bar visually tracks the current value.\n * The `fillMax` property is **ignored** in this mode.\n * - `'tint'`: Bar fills from `fillMin` to `fillMax` — an explicit highlighted range.\n * Use this when you want to show a fixed range independent of the current value.\n *\n * In both modes, `fillMin` is the origin point (e.g., 0 in a -100..100 scale).\n * @availableWhen hasBar==true && value!=undefined\n */\n @property({type: String})\n fillMode: FillMode = FillMode.fill;\n\n @property({type: Number})\n fillMin = 0;\n\n /**\n * Maximum fill value for the bar (only used in `'tint'` mode).\n *\n * In `'fill'` mode, this property is **ignored** — the bar always fills to `value`.\n *\n * In `'tint'` mode, this defines the upper bound of the highlighted range.\n * When `undefined`, defaults to `value`.\n * @availableWhen hasBar==true && value!=undefined && fillMode==tint\n */\n @property({type: Number})\n fillMax?: number = undefined;\n\n @property({type: Array, attribute: false})\n advice: LinearAdvice[] = [];\n\n @property({type: Number})\n primaryTickmarkInterval?: number = undefined;\n\n // Setpoint properties (setpoint, newSetpoint, touching, atSetpoint,\n // autoAtSetpoint, autoAtSetpointDeadband, setpointAtZeroDeadband,\n // setpointOverride, computeAtSetpoint()) are provided by SetpointMixin.\n // See setpoint-mixin.ts for full docs.\n\n @property({type: Number})\n secondaryTickmarkInterval = 0.5;\n\n @property({type: Number})\n tertiaryTickmarkInterval?: number = undefined;\n\n @property({type: Boolean})\n chartFill = false;\n\n /**\n * Apply fill when chartFill is true.\n */\n protected override shouldApplyFill(): boolean {\n return this.chartFill;\n }\n\n /**\n * Return the fill mode for area rendering.\n * Maps chartFill boolean to base class fillMode.\n */\n protected override getFillMode(): string | undefined {\n return this.chartFill ? 'semitransparent' : undefined;\n }\n\n /**\n * Stacking is not used in gauge-trend (always false).\n */\n protected override shouldStack(): boolean {\n return false;\n }\n\n /**\n * The right scale is this component's own bar, ranged by `minValue` /\n * `maxValue`. `chartMinValue` / `chartMaxValue` exist so the plotted range\n * can differ from it, so the chart's axis range must not overwrite it.\n */\n protected override ownsSlottedScaleRange(\n side: 'left' | 'right' | 'top' | 'bottom'\n ): boolean {\n return side !== 'right';\n }\n\n override willUpdate(changed: Map<PropertyKey, unknown>) {\n // Auto axis detection: {x, value} data switches to time spacing, {label,\n // value} stays category. An explicit xAxisType assignment (anything we\n // did not auto-apply) permanently disables auto-detection. The\n // constructor's 'category' default lands in the first changed-map but is\n // not treated as explicit (hasUpdated is false and it equals the default).\n if (\n changed.has('xAxisType') &&\n this.xAxisType !== this._autoAppliedXAxisType &&\n (this.hasUpdated || this.xAxisType !== XAxisType.category)\n ) {\n this._explicitXAxisType = true;\n }\n if (!this._explicitXAxisType && changed.has('data')) {\n const allHaveX =\n (this.data?.length ?? 0) > 0 && this.data.every((d) => d.x != null);\n const target = allHaveX ? XAxisType.time : XAxisType.category;\n if (this.xAxisType !== target) {\n this._autoAppliedXAxisType = target;\n this.xAxisType = target;\n }\n }\n\n super.willUpdate(changed);\n\n // Update y-axis range when chart or scale min/max changes\n // Note: yAxes is managed internally - users cannot set multiple axes\n // When chartMinValue/chartMaxValue are undefined, fall back to minValue/maxValue\n if (\n changed.has('chartMinValue') ||\n changed.has('chartMaxValue') ||\n changed.has('minValue') ||\n changed.has('maxValue')\n ) {\n const chartMin = this.chartMinValue ?? this.minValue;\n const chartMax = this.chartMaxValue ?? this.maxValue;\n this.yAxes = [\n {\n id: 'y',\n position: 'left',\n min: chartMin,\n max: chartMax,\n },\n ];\n }\n\n // Adjust chart's border radius position for external scales based on hasScale\n // This needs to be set before render, so we do it in willUpdate\n if (changed.has('hasScale')) {\n this.borderRadiusPositionExternalScales = this.hasScale\n ? BorderRadiusPosition.middleChild\n : BorderRadiusPosition.outerLastChild;\n }\n }\n\n override updated(changed: Map<PropertyKey, unknown>) {\n // Handle chartFill changes by forcing a data refresh\n // This triggers the base class to update the chart with new fill settings\n if (changed.has('chartFill') && this.data) {\n // Create a shallow copy to trigger the base class's watched property detection\n this.data = [...this.data];\n }\n\n super.updated(changed);\n // Update border radius position when bar/scale visibility changes\n if (changed.has('hasBar') || changed.has('hasScale')) {\n this._updateBorderRadiusPosition();\n }\n // Keep the internal right-scale in sync with public API changes.\n // (Mirrors the storybook “chart integration” examples, but encapsulated.)\n if (!this._barVerticalElement || this._isFirstUpdate) return;\n\n const shouldUpdateScale =\n changed.has('minValue') ||\n changed.has('maxValue') ||\n changed.has('value') ||\n changed.has('setpoint') ||\n changed.has('newSetpoint') ||\n changed.has('touching') ||\n changed.has('atSetpoint') ||\n changed.has('autoAtSetpoint') ||\n changed.has('autoAtSetpointDeadband') ||\n changed.has('setpointAtZeroDeadband') ||\n changed.has('setpointOverride') ||\n changed.has('hasBar') ||\n changed.has('hasScale') ||\n changed.has('hasAdvice') ||\n changed.has('fillMode') ||\n changed.has('fillMin') ||\n changed.has('fillMax') ||\n changed.has('advice') ||\n changed.has('primaryTickmarkInterval') ||\n changed.has('secondaryTickmarkInterval') ||\n changed.has('tertiaryTickmarkInterval') ||\n changed.has('scaleType') ||\n changed.has('state') || // Scale state inherits from parent 'state'\n changed.has('priority') ||\n changed.has('height') ||\n changed.has('width') ||\n changed.has('scaleReferenceSize') ||\n changed.has('chartMinValue') ||\n changed.has('chartMaxValue');\n\n if (shouldUpdateScale) this._updateBarVerticalProperties();\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'obc-gauge-trend': ObcGaugeTrend;\n }\n}\n"],"names":[],"mappings":"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"}
@@ -103,7 +103,7 @@ const compentStyle = css`* {
103
103
  "liga" off,
104
104
  "clig" off,
105
105
  "ss04" on;
106
- width: var(--obc-instrument-field-tag-width);
106
+ width: var(--obc-instrument-field-tag-width, auto);
107
107
  }
108
108
 
109
109
  :is(.wrapper .label) .unit {
@@ -145,7 +145,7 @@ const compentStyle = css`* {
145
145
  "ss04" on;
146
146
  color: var(--element-neutral-color);
147
147
  justify-content: end;
148
- width: var(--obc-instrument-field-source-width);
148
+ width: var(--obc-instrument-field-source-width, auto);
149
149
  box-sizing: content-box;
150
150
  }
151
151
 
@@ -1 +1 @@
1
- {"version":3,"file":"readout.d.ts","sourceRoot":"","sources":["../../../src/navigation-instruments/readout/readout.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"readout.d.ts","sourceRoot":"","sources":["../../../src/navigation-instruments/readout/readout.ts"],"names":[],"mappings":"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"}
@@ -10,7 +10,7 @@ import { Priority } from "../types.js";
10
10
  import { ReadoutValueType, resolveReadoutDigitCount, isReadoutDigitCountMissing, resolveReadoutNumericValue, assertReadoutValueType, assertReadoutFractionDigits } from "./readout-formatters.js";
11
11
  import { isDisplayedAtSetpoint, readoutPrimarySize, readoutSecondarySize, readoutValueSize, readoutSetpointSize, readoutSetpointWeight, readoutNumericFormatOptions, readoutDataQualityClasses, resolveSetpointHidePhase } from "./readout-shared.js";
12
12
  import { wrapWithAlertFrame, ObcAlertFrameThickness, ObcAlertFrameType, ObcAlertFrameMode } from "../../components/alert-frame/alert-frame.js";
13
- import { AlertType } from "../../types.js";
13
+ import { AlertType, FlashingSpeed } from "../../types.js";
14
14
  import "../../components/button/button.js";
15
15
  import { ContextMenuType } from "../../components/context-menu-input/context-menu-input.js";
16
16
  import "../../icons/icon-chevron-right-google.js";
@@ -475,6 +475,7 @@ let ObcReadout = class extends LitElement {
475
475
  .thickness=${thickness}
476
476
  .status=${alert.status ?? AlertType.Alarm}
477
477
  .mode=${alert.mode ?? ObcAlertFrameMode.ackedActive}
478
+ .flashingSpeed=${alert.flashingSpeed ?? FlashingSpeed.Default}
478
479
  .showIcon=${alert.showIcon ?? false}
479
480
  .showAlertCategoryIcon=${alert.showAlertCategoryIcon ?? true}
480
481
  .wrapContent=${false}
@@ -1 +1 @@
1
- {"version":3,"file":"readout.js","sources":["../../../src/navigation-instruments/readout/readout.ts"],"sourcesContent":["import {LitElement, html, nothing, unsafeCSS, type TemplateResult} from 'lit';\nimport {property, query, state} from 'lit/decorators.js';\nimport {classMap} from 'lit/directives/class-map.js';\nimport componentStyle from './readout.css?inline';\nimport {customElement} from '../../decorator.js';\nimport '../../components/textbox/textbox.js';\nimport {\n ObcTextboxSize,\n ObcTextboxFontWeight,\n} from '../../components/textbox/textbox.js';\nimport '../../building-blocks/readout-block/readout-block.js';\nimport {\n ReadoutBlockVariant,\n ReadoutBlockSize,\n ReadoutBlockDataQuality,\n ReadoutBlockHidePhase,\n ReadoutAdviceCategory,\n} from '../../building-blocks/readout-block/readout-block.js';\nimport {\n ReadoutListItemSetpointInteraction,\n ReadoutSourceState,\n type ReadoutBlockState,\n type ReadoutValueOptions,\n type ReadoutSetpointOptions,\n type ReadoutAdviceOptions,\n type ReadoutLabelOptions,\n type ReadoutReserverOptions,\n type ReadoutSrcOptions,\n} from '../readout-list-item/readout-list-item.js';\nimport {Priority} from '../types.js';\nimport {\n assertReadoutValueType,\n assertReadoutFractionDigits,\n isReadoutDigitCountMissing,\n resolveReadoutDigitCount,\n resolveReadoutNumericValue,\n ReadoutValueType,\n type ReadoutNumericFormatOptions,\n} from './readout-formatters.js';\nimport {\n isDisplayedAtSetpoint,\n readoutNumericFormatOptions,\n readoutPrimarySize,\n readoutSecondarySize,\n readoutSetpointSize,\n readoutValueSize,\n readoutSetpointWeight,\n readoutDataQualityClasses,\n resolveSetpointHidePhase,\n} from './readout-shared.js';\nimport {\n type AlertFrameConfig,\n wrapWithAlertFrame,\n ObcAlertFrameType,\n ObcAlertFrameThickness,\n ObcAlertFrameMode,\n} from '../../components/alert-frame/alert-frame.js';\nimport {AlertType} from '../../types.js';\nimport '../../components/button/button.js';\nimport '../../components/context-menu-input/context-menu-input.js';\nimport {\n ContextMenuType,\n type ContextMenuOption,\n type ObcContextMenuInputItemClickEvent,\n} from '../../components/context-menu-input/context-menu-input.js';\nimport '../../icons/icon-chevron-right-google.js';\nimport '../../icons/icon-drop-down-google.js';\nimport '../../icons/icon-delta.js';\n\n// Re-exported so consumers configure the readout without a second import path.\n// The option interfaces and enums are shared with `obc-readout-list-item` on\n// purpose: the two components are layout variants of the same primitives +\n// per-block options API and may merge in a future release.\nexport {ObcTextboxFontWeight} from '../../components/textbox/textbox.js';\nexport {ReadoutValueType} from './readout-formatters.js';\nexport {ReadoutAdviceCategory} from '../../building-blocks/readout-block/readout-block.js';\nexport {ReadoutSourceState} from '../readout-list-item/readout-list-item.js';\nexport type {\n ReadoutBlockState,\n ReadoutValueOptions,\n ReadoutSetpointOptions,\n ReadoutAdviceOptions,\n ReadoutLabelOptions,\n ReadoutReserverOptions,\n ReadoutSrcOptions,\n} from '../readout-list-item/readout-list-item.js';\n\n/**\n * Density/size scale of the readout (an alias of `ReadoutBlockSize`).\n * - `small`: regular value typography (smallest, densest).\n * - `medium`: medium value typography.\n * - `large`: large value typography.\n */\nexport const ReadoutSize = ReadoutBlockSize;\nexport type ReadoutSize = ReadoutBlockSize;\n\n/**\n * Colour emphasis of the value (an alias of the shared instrument `Priority`;\n * same values as `ReadoutListItemPriority`).\n * - `regular`: neutral.\n * - `enhanced`: accented (in-command) colour.\n */\nexport const ReadoutPriority = Priority;\nexport type ReadoutPriority = Priority;\n\n/**\n * Measurement quality of the value (an alias of `ReadoutBlockDataQuality`).\n * Orthogonal to the readout-level `alert` – a low-integrity or invalid value\n * can also sit inside an alert frame.\n */\nexport const ReadoutDataQuality = ReadoutBlockDataQuality;\nexport type ReadoutDataQuality = ReadoutBlockDataQuality;\n\n/**\n * How the setpoint segment behaves relative to the value (an alias of\n * `ReadoutListItemSetpointInteraction`).\n * - `always-visible` (default): the setpoint is always shown.\n * - `equal-size`: value and setpoint are always shown at the same (primary)\n * size (Figma 6.1 \"Equal size\") — the value does not demote while\n * `touching`, unlike the other modes.\n * - `flip-flop`: value and setpoint swap emphasis (size) as the value reaches\n * the setpoint.\n * - `pop-up`: the setpoint is shown only while the value has not reached it,\n * then fades out (100ms) once value === setpoint.\n */\nexport const ReadoutSetpointInteraction = ReadoutListItemSetpointInteraction;\nexport type ReadoutSetpointInteraction = ReadoutListItemSetpointInteraction;\n\n/**\n * Flow direction of the readout.\n * - `vertical` (default): advice / setpoint / value stack on top of the\n * label+unit meta zone and the source row (Figma \"Readout Group / Vertical\"\n * and \"Readout Stack\").\n * - `horizontal`: all segments flow on one cap-height-aligned row, with the\n * label stacked over the unit beside the value (Figma \"Readout Group /\n * Horizontal\").\n */\nexport enum ReadoutDirection {\n vertical = 'vertical',\n horizontal = 'horizontal',\n}\n\n/**\n * Arrangement of the label/unit meta zone in a vertical readout.\n * - `inline` (default): label and unit share one row below the value (Figma\n * \"Readout Group / Vertical\").\n * - `stacked`: label and unit render on separate rows (Figma \"Readout Stack\"),\n * arranged by `alignment`.\n */\nexport enum ReadoutStacking {\n inline = 'inline',\n stacked = 'stacked',\n}\n\n/**\n * Cross-axis alignment of a stacked vertical readout (Figma \"Readout Stack\"\n * Alignment axis).\n * - `vertical` (default): right-aligned column.\n * - `left`: left-aligned column.\n * - `center`: centered column.\n */\nexport enum ReadoutAlignment {\n vertical = 'vertical',\n left = 'left',\n center = 'center',\n}\n\n/**\n * Interactivity of the source row.\n * - `none` (default): plain source text (same rendering as\n * `obc-readout-list-item`).\n * - `picker`: a flat button with a drop-down icon that opens a context menu\n * built from the `src-picker-content` slot; selecting an option fires\n * `source-change`.\n * - `flyout`: a flat button with a chevron icon that fires\n * `source-flyout-click`.\n */\nexport enum ReadoutSourceInteraction {\n none = 'none',\n picker = 'picker',\n flyout = 'flyout',\n}\n\n/**\n * Per-source options. Extends the shared per-block state (data quality, alert,\n * space reserver) with the readout's source interactivity.\n *\n * `state` and `deviation` apply to the plain (non-interactive) source only —\n * the Figma 6.1 sheets do not define them on the picker / flyout buttons, so\n * those branches render without a state chip or deviation line\n * (TODO(designer): pending a design for interactive source states).\n */\nexport interface ReadoutSourceOptions extends ReadoutSrcOptions {\n /** Interactivity of the source row (default `none`). */\n interaction?: ReadoutSourceInteraction;\n}\n\n/**\n * `<obc-readout>` – An instrument readout: a value with optional setpoint,\n * advice, label, unit, and source, arranged vertically or horizontally.\n *\n * A layout sibling of `<obc-readout-list-item>` built from the same\n * cap-height \"readout building blocks\" (`obc-readout-block`): dynamic data is\n * passed as top-level primitives (`value`, `setpoint`, `advice`, `label`,\n * `unit`, `src`), global layout/format via top-level props (`size`,\n * `priority`, `direction`, `stacking`, `alignment`, `hasDegree`,\n * `dataQuality`, `alert`, …) and per-block tweaks via one object per block\n * (`valueOptions`, `setpointOptions`, `adviceOptions`, `unitOptions`,\n * `srcOptions`).\n *\n * ### Features\n * - **Building blocks:** value, optional setpoint, and optional advice\n * segments, each cap-height-aligned and able to reserve a stable width.\n * - **Sizes:** `small`, `medium`, `large` density scales.\n * - **Direction:** `vertical` (blocks above a label+unit meta zone and source\n * row) or `horizontal` (all segments on one row).\n * - **Stacking & alignment:** vertical readouts arrange label/unit `inline`\n * or `stacked`; stacked readouts align `vertical` (right), `left`, or\n * `center`.\n * - **Priority:** `regular`/`enhanced` colour emphasis; per-value `weight`\n * is independent of colour.\n * - **Setpoint interactions:** `always-visible`, `flip-flop` (emphasis swap),\n * and `pop-up` (fade-out at setpoint), plus the `touching` focus state.\n * - **Data quality:** `low-integrity`/`invalid` styling, per block or for the\n * whole readout, combinable with `alert`.\n * - **Alert frame:** optional `alert` wrapper (caution/warning/alarm/level).\n * - **Source:** plain text by default; opt-in `picker` (context menu) or\n * `flyout` interactivity via `srcOptions.interaction`.\n * - **Formatting:** shared `fractionDigits`, width reservation via\n * `maxDigits` and per-segment `hintedZeros`; a `null` value renders a dash.\n * - **Text values:** `valueType=\"text\"` renders `value` verbatim (e.g.\n * `\"Auto\"`) instead of formatting it as a number.\n *\n * ### Usage Guidelines\n * Use for stand-alone instrument readouts and readouts embedded in\n * instruments. Prefer `<obc-readout-list-item>` for dense rows in\n * lists/tables (label left, value right) and `<obc-readout-list>` for\n * auto-aligned groups of rows.\n *\n * ### Slots\n * | Slot Name | Renders When | Purpose |\n * |--------------------|---------------------------------------|--------------------------------------|\n * | leading-icon | `hasLeadingIcon` | Icon before the label/unit meta zone.|\n * | value-icon | `valueOptions.hasIcon` | Icon before the value. |\n * | setpoint-icon | `hasSetpoint` | Overrides the default setpoint icon. |\n * | advice-icon | `hasAdvice` | Overrides the default advice icon. |\n * | src-picker-content | `srcOptions.interaction == 'picker'` | Source picker context-menu content. |\n *\n * @property hasValue - Layout switch: `false` renders a deliberately value-less (label-only)\n * readout that hugs its remaining parts. For a temporarily missing value\n * keep `hasValue` and set `value` to `null` instead — the dash keeps the\n * value block at full size, so the layout does not shift when data arrives.\n * @property value - The value; `null` renders a dash. A number by default, or text when\n * `valueType` is `text`.\n * @property valueType - How `value` is interpreted. `number` (default) formats it via\n * `fractionDigits`; `text` renders it verbatim and ignores the numeric\n * format options. Passing text while this is `number` throws.\n * @property off - Render the value as `offText` (e.g. equipment powered down). Affects the value only.\n * @property offText - Text shown in place of the value when `off` is true.\n * @availableWhen offText off==true\n * @availableWhen setpoint hasSetpoint==true\n * @availableWhen advice hasAdvice==true\n * @property size - Density tier. Applies to the vertical direction only — the horizontal\n * arrangement exists in the large tier alone (Figma 6.1: it relies on the\n * label+unit stack aligning with the L-size value caps), so `size` is\n * ignored when `direction` is `horizontal`; a horizontal readout given any\n * other `size` logs a console warning once per element.\n * @availableWhen size direction==vertical\n * @availableWhen stacking direction==vertical\n * @availableWhen alignment direction==vertical && stacking==stacked\n * @property hasDegree - Render the cap-height degree glyph (`°`) after the ACTUAL VALUE only —\n * the setpoint / advice blocks never carry one (Figma 6.1 review: the unit\n * is written once for the readout, and the degree follows the same rule).\n * @availableWhen hasDegreeSpacer hasDegree==false\n * @property hasLeadingIcon - Show the `leading-icon` slot before the label/unit meta zone.\n * @property fractionDigits - Also formats the numeric setpoint / advice blocks, which stay numeric\n * even when the value is text. Must be between 0 and 100 — the range\n * `Number.prototype.toFixed` accepts; outside it throws a `RangeError`.\n * A fractional count truncates (`2.7` → `2`). A count that never arrived\n * (`NaN`, `null` or unset) renders the reading as the unavailable dash —\n * formatting with a precision the author never chose would let a critical\n * `0.4` pass for a healthy `0`.\n * @availableWhen fractionDigits valueType==number || hasSetpoint==true || hasAdvice==true\n * @property maxDigits - Also formats the numeric setpoint / advice blocks, which stay numeric\n * even when the value is text. Bounded before use: a fractional count\n * truncates (`2.7` → `2`), anything above 100 — including `Infinity` —\n * caps at 100, and a negative count reserves nothing. A count that never\n * arrived (`NaN`, `null` or unset) renders the reading as the unavailable\n * dash, consistent with `fractionDigits`.\n * @availableWhen maxDigits valueType==number || hasSetpoint==true || hasAdvice==true\n * @availableWhen valueOptions hasValue==true\n * @availableWhen setpointOptions hasSetpoint==true\n * @availableWhen adviceOptions hasAdvice==true\n * @availableWhen labelOptions label!=''\n * @availableWhen unitOptions unit!=''\n * @availableWhen srcOptions src!=''\n * @property showDebugOverlay - Development aid: outline the readout building blocks (red), the degree\n * columns (blue) and the degree spacer (green) so reserved widths / alignment\n * are visible. Off by default.\n * @slot leading-icon - Icon before the label/unit meta zone.\n * @slot value-icon - Icon before the value.\n * @slot setpoint-icon - Overrides the default setpoint icon.\n * @slot advice-icon - Overrides the default advice icon.\n * @slot src-picker-content - Provides the source picker context menu content.\n * @fires {CustomEvent<{value: string, label?: string}>} source-change - Fired when a source picker option is selected.\n * @fires {CustomEvent<{src: string}>} source-flyout-click - Fired when the source row is clicked while `srcOptions.interaction == 'flyout'`.\n * @beta\n */\n@customElement('obc-readout')\nexport class ObcReadout extends LitElement {\n // Primitives (dynamic data)\n @property({type: String}) label?: string;\n @property({type: String}) unit?: string;\n @property({type: String}) src?: string;\n\n @property({type: Boolean, attribute: false}) hasValue = true;\n @property({type: String}) value: number | string | null = null;\n @property({type: String}) valueType: ReadoutValueType =\n ReadoutValueType.number;\n @property({type: Boolean}) off = false;\n @property({type: String}) offText = 'OFF';\n\n @property({type: Boolean}) hasSetpoint = false;\n @property({type: Number}) setpoint?: number;\n\n @property({type: Boolean}) hasAdvice = false;\n @property({type: Number}) advice?: number;\n\n // Global layout/format (each defaults via its `resolved*` getter where useful).\n @property({type: String}) size?: ReadoutSize;\n @property({type: String}) priority?: ReadoutPriority;\n @property({type: String}) direction?: ReadoutDirection;\n @property({type: String}) stacking?: ReadoutStacking;\n @property({type: String}) alignment?: ReadoutAlignment;\n @property({type: Boolean}) hasDegree = false;\n @property({type: Boolean}) hasDegreeSpacer = false;\n @property({type: Boolean}) hasLeadingIcon = false;\n @property({type: Number}) fractionDigits = 0;\n @property({type: Number}) maxDigits = 0;\n @property({type: String}) dataQuality?: ReadoutDataQuality;\n // `boolean | …` (not `false | …`): the generated Angular wrapper widens a\n // literal-`false` union to `boolean`, which then won't assign back to a\n // `false`-typed element property. `wrapWithAlertFrame` treats any non-object\n // (incl. `true`) as \"no frame\", so accepting `boolean` is harmless.\n @property({type: Object}) alert: boolean | AlertFrameConfig = false;\n\n // Per-block configuration — one object per block (see the Readout*Options types).\n @property({type: Object}) valueOptions?: ReadoutValueOptions;\n @property({type: Object}) setpointOptions?: ReadoutSetpointOptions;\n @property({type: Object}) adviceOptions?: ReadoutAdviceOptions;\n @property({type: Object}) labelOptions?: ReadoutLabelOptions;\n @property({type: Object}) unitOptions?: ReadoutReserverOptions;\n @property({type: Object}) srcOptions?: ReadoutSourceOptions;\n\n @property({type: Boolean, reflect: true}) showDebugOverlay = false;\n\n /** Pop-up deferred-hide phase for the setpoint (see {@link updated}). */\n @state() private deferredSetpointHidePhase: ReadoutBlockHidePhase =\n ReadoutBlockHidePhase.none;\n private deferredSetpointHideTimer?: number;\n private hasCompletedFirstUpdate = false;\n private hasWarnedHorizontalSize = false;\n\n @state() private sourcePickerContentVisible = false;\n @state() private sourcePickerOptions: ContextMenuOption[] = [];\n\n @query('slot[name=\"src-picker-content\"]')\n private sourcePickerSlot?: HTMLSlotElement;\n\n private readonly onWindowPointerDown = (event: PointerEvent) => {\n if (!this.sourcePickerContentVisible) {\n return;\n }\n if (event.composedPath().includes(this)) {\n return;\n }\n this.sourcePickerContentVisible = false;\n };\n\n private get resolvedSize(): ReadoutSize {\n // The horizontal arrangement exists only in the large tier (Figma 6.1): it\n // relies on the label+unit stack aligning with the L-size value caps.\n if (this.isHorizontal) {\n return ReadoutSize.large;\n }\n return this.size ?? ReadoutSize.small;\n }\n\n private get resolvedPriority(): ReadoutPriority {\n return this.priority ?? ReadoutPriority.regular;\n }\n\n private get resolvedDirection(): ReadoutDirection {\n return this.direction ?? ReadoutDirection.vertical;\n }\n\n private get resolvedStacking(): ReadoutStacking {\n return this.stacking ?? ReadoutStacking.inline;\n }\n\n private get resolvedAlignment(): ReadoutAlignment {\n return this.alignment ?? ReadoutAlignment.vertical;\n }\n\n private get isHorizontal(): boolean {\n return this.resolvedDirection === ReadoutDirection.horizontal;\n }\n\n private get resolvedFractionDigits(): number {\n return this.fractionDigits ?? 0;\n }\n\n private get resolvedMaxDigits(): number {\n return resolveReadoutDigitCount(this.maxDigits);\n }\n\n /**\n * Whether a digit knob failed to arrive (`NaN` / `null` / `undefined`).\n * The raw knobs are forwarded to the blocks, which render the reading as\n * the unavailable dash (see `obc-readout-block.digitCountsMissing`); this\n * getter only keeps the setpoint comparison in agreement with what is\n * displayed.\n */\n private get digitCountsMissing(): boolean {\n return (\n isReadoutDigitCountMissing(this.fractionDigits) ||\n isReadoutDigitCountMissing(this.maxDigits)\n );\n }\n\n private get hasSrc(): boolean {\n return this.src !== undefined && this.src.trim() !== '';\n }\n\n private get resolvedSourceInteraction(): ReadoutSourceInteraction {\n return this.srcOptions?.interaction ?? ReadoutSourceInteraction.none;\n }\n\n private get isAtSetpoint(): boolean {\n if (!this.hasSetpoint) {\n return false;\n }\n // A missing digit knob renders every numeric block as the dash; two\n // dashes must not read as \"at the setpoint\", so the comparison stays off\n // entirely while the configuration is untrustworthy.\n if (this.digitCountsMissing) {\n return false;\n }\n // A text value never compares equal to a setpoint, so flip-flop / pop-up\n // stay dormant for `valueType=\"text\"`.\n return isDisplayedAtSetpoint(\n resolveReadoutNumericValue(this.value, this.valueType) ?? null,\n this.setpoint,\n this.numericFormatOptions(this.resolvedMaxDigits)\n );\n }\n\n private get resolvedSetpointInteraction(): ReadoutSetpointInteraction {\n return (\n this.setpointOptions?.interaction ??\n ReadoutSetpointInteraction.alwaysVisible\n );\n }\n\n private get isFlipFlop(): boolean {\n return (\n this.resolvedSetpointInteraction === ReadoutSetpointInteraction.flipFlop\n );\n }\n\n private get isEqualSize(): boolean {\n return (\n this.resolvedSetpointInteraction === ReadoutSetpointInteraction.equalSize\n );\n }\n\n private get isPopUp(): boolean {\n return (\n this.resolvedSetpointInteraction === ReadoutSetpointInteraction.popUp\n );\n }\n\n private get setpointTouching(): boolean {\n return this.setpointOptions?.touching ?? false;\n }\n\n /**\n * Whether the setpoint interaction re-sizes or hides blocks at runtime —\n * flip-flop (emphasis swap) and pop-up (touch swap + fade-out) — the modes\n * that need the width/height reservation so the readout never shifts (see\n * {@link renderSetpointWidthReserve}).\n */\n private get hasDynamicSetpoint(): boolean {\n return this.hasSetpoint && (this.isFlipFlop || this.isPopUp);\n }\n\n /**\n * The setpoint is rendered \"emphasised\" (primary size + SemiBold weight) when\n * it is the focus of attention: while actively adjusting (`touching`), or while\n * a flip-flop has the value away from the setpoint. Otherwise it is a secondary\n * (smaller, regular-weight) reference next to the value.\n */\n private get isSetpointEmphasized(): boolean {\n if (!this.hasSetpoint) {\n return false;\n }\n if (this.setpointTouching) {\n return true;\n }\n return this.isFlipFlop && !this.isAtSetpoint;\n }\n\n /**\n * The readout's enhanced (in-command) colour state, applied uniformly to BOTH\n * the value and the setpoint — they are always either both neutral or both\n * enhanced (never a blue setpoint next to a grey value). Driven by `priority`\n * only; `valueOptions.weight` changes weight, not colour.\n */\n private get rowEnhanced(): boolean {\n return this.resolvedPriority === ReadoutPriority.enhanced;\n }\n\n /** Primary value-typography size for the current density tier. */\n private get primarySize(): ObcTextboxSize {\n return readoutPrimarySize(this.resolvedSize);\n }\n\n /** Secondary (de-emphasised) value-typography size for the current density tier. */\n private get secondarySize(): ObcTextboxSize {\n return readoutSecondarySize(this.resolvedSize);\n }\n\n private get valueSize(): ObcTextboxSize {\n // The value de-emphasises (secondary size) whenever the setpoint is the\n // focus — while actively adjusting (`touching`) or while a flip-flop holds\n // the value away from the setpoint — except in `equal-size`, where both\n // blocks always hold the primary size (even while touching).\n return readoutValueSize({\n primary: this.primarySize,\n secondary: this.secondarySize,\n setpointEmphasized: this.isSetpointEmphasized,\n equalSize: this.isEqualSize,\n });\n }\n\n private get setpointSize(): ObcTextboxSize {\n return readoutSetpointSize({\n primary: this.primarySize,\n secondary: this.secondarySize,\n emphasized: this.isSetpointEmphasized,\n equalSize: this.isEqualSize,\n });\n }\n\n /** Value font weight passes straight to obc-textbox; regular when unset. Colour is separate. */\n private get valueWeight(): ObcTextboxFontWeight {\n return this.valueOptions?.weight ?? ObcTextboxFontWeight.regular;\n }\n\n /**\n * Label size. The Figma 6.1 title block defaults large readouts to `s` — a\n * scannable label should not sit at the smallest permitted size — while\n * small/medium tiers stay `xs`; `labelOptions.size` overrides either way\n * (per the design team, for context / density / secondary instruments).\n * TODO(designer): the medium-tier default is unverified in the new sheets\n * (only XS and S exist on the title's size axis).\n */\n private get labelSize(): ObcTextboxSize {\n return (\n this.labelOptions?.size ??\n (this.resolvedSize === ReadoutSize.large\n ? ObcTextboxSize.s\n : ObcTextboxSize.xs)\n );\n }\n\n /**\n * Label weight: SemiBold only for enhanced (in-command) readouts, regular\n * otherwise — the designer reduced the amount of semibold in the interface\n * (Figma 6.1 review).\n */\n private get labelWeight(): ObcTextboxFontWeight {\n return this.rowEnhanced\n ? ObcTextboxFontWeight.semibold\n : ObcTextboxFontWeight.regular;\n }\n\n /** Setpoint is SemiBold only while emphasised, otherwise regular weight. */\n private get setpointWeight(): ObcTextboxFontWeight {\n return readoutSetpointWeight(this.isSetpointEmphasized);\n }\n\n private numericFormatOptions(maxDigits: number): ReadoutNumericFormatOptions {\n return readoutNumericFormatOptions(maxDigits, this.resolvedFractionDigits);\n }\n\n /** classMap fragment for a block / source carrying per-block data quality. */\n private dataQualityClasses(\n dataQuality: ReadoutDataQuality | undefined\n ): Record<string, boolean> {\n return readoutDataQualityClasses(dataQuality);\n }\n\n /**\n * Forward the matching readout icon slot into the block's single `icon`\n * slot. The variant's default marker lives in `obc-readout-block` and shows\n * when nothing is assigned here (an empty forwarded slot flattens to nothing).\n */\n private renderForwardedIcon(variant: ReadoutBlockVariant): TemplateResult {\n if (variant === ReadoutBlockVariant.setpoint) {\n return html`<slot name=\"setpoint-icon\" slot=\"icon\"></slot>`;\n }\n if (variant === ReadoutBlockVariant.advice) {\n return html`<slot name=\"advice-icon\" slot=\"icon\"></slot>`;\n }\n return html`<slot name=\"value-icon\" slot=\"icon\"></slot>`;\n }\n\n private renderBlock(config: {\n variant: ReadoutBlockVariant;\n value: number | string | null | undefined;\n /** Only the value block is ever text; setpoint / advice stay numeric. */\n valueType?: ReadoutValueType;\n valueSize: ObcTextboxSize;\n enhanced: boolean;\n weight: ObcTextboxFontWeight;\n hintedZeros: boolean;\n hasSignSpacer?: boolean;\n spaceReserver?: string;\n off?: boolean;\n hasDegree?: boolean;\n hasIcon?: boolean;\n touching?: boolean;\n hidePhase?: ReadoutBlockHidePhase;\n dataQuality?: ReadoutBlockDataQuality;\n alert?: false | AlertFrameConfig;\n /** Advice-only: semantic category + triggered state. */\n category?: ReadoutAdviceCategory;\n active?: boolean;\n /**\n * Invisible width-reserving duplicate (see\n * {@link renderSetpointWidthReserve}): skips the forwarded icon slot so\n * the visible block keeps the slotted content — the block's default\n * marker has the same fixed tier width.\n */\n ghost?: boolean;\n }): TemplateResult {\n // The block owns the formatting, hinted zeros, reserver, degree and icon; the\n // readout keeps the density tier (`size`) and the resolved per-block number\n // size (`valueSize`) so flip-flop/pop-up emphasis stays a readout decision.\n return html`\n <obc-readout-block\n exportparts=\"block, block-content, block-text, block-icon, degree\"\n .variant=${config.variant}\n .value=${config.value ?? null}\n .valueType=${config.valueType ?? ReadoutValueType.number}\n .size=${this.resolvedSize}\n .valueSize=${config.valueSize}\n .enhanced=${config.enhanced}\n .weight=${config.weight}\n .hasDegree=${config.hasDegree ?? false}\n .hasIcon=${config.hasIcon ?? false}\n .fractionDigits=${this.fractionDigits}\n .maxDigits=${this.maxDigits}\n .hintedZeros=${config.hintedZeros}\n .hasSignSpacer=${config.hasSignSpacer ?? false}\n .spaceReserver=${config.spaceReserver}\n .off=${config.off ?? false}\n .offText=${this.offText}\n .touching=${config.touching ?? false}\n .hidePhase=${config.hidePhase ?? ReadoutBlockHidePhase.none}\n .dataQuality=${config.dataQuality}\n .alert=${config.alert ?? false}\n .category=${config.category ?? ReadoutAdviceCategory.regular}\n .active=${config.active ?? false}\n >\n ${config.ghost ? nothing : this.renderForwardedIcon(config.variant)}\n </obc-readout-block>\n `;\n }\n\n /**\n * A cap-height `°` column whose width scales with the value size, rendered\n * after the value block. Setpoint / advice blocks render their own degree via\n * `obc-readout-block`.\n */\n private renderDegreeGlyph(size: ObcTextboxSize): TemplateResult {\n return html`\n <span\n class=${classMap({\n 'degree-column': true,\n [`degree-${size}`]: true,\n 'tone-enhanced': this.rowEnhanced,\n })}\n part=\"degree\"\n >\n <obc-textbox class=\"degree-glyph\" .size=${size} alignment=\"center\"\n >°</obc-textbox\n >\n </span>\n `;\n }\n\n /**\n * The column rendered after the value digits:\n *\n * - `hasDegree`: a cap-height `°` column whose width scales with the value size.\n * - `hasDegreeSpacer` (non-degree readouts): an invisible reserve of the same\n * width, so this readout's value digits stay aligned with degree readouts\n * in the same column.\n */\n private renderDegreeColumn(\n size: ObcTextboxSize = this.valueSize\n ): TemplateResult | typeof nothing {\n if ((this.hasDegree ?? false) && !this.off) {\n return this.renderDegreeGlyph(size);\n }\n if (this.hasDegreeSpacer ?? false) {\n return html`<span\n class=\"degree-spacer\"\n part=\"degree-spacer\"\n aria-hidden=\"true\"\n ></span>`;\n }\n return nothing;\n }\n\n private renderTextbox(\n role: 'label' | 'unit' | 'source',\n text: string,\n reserver?: string,\n blockState?: ReadoutBlockState\n ): TemplateResult {\n // The label carries its own size (labelOptions / tier default) and\n // priority-driven weight; unit and source stay xs / regular.\n const weight =\n role === 'label' ? this.labelWeight : ObcTextboxFontWeight.regular;\n const size = role === 'label' ? this.labelSize : ObcTextboxSize.xs;\n const box = html`\n <obc-textbox\n class=${classMap({\n [role]: true,\n ...this.dataQualityClasses(blockState?.dataQuality),\n })}\n part=${role}\n .size=${size}\n .fontWeight=${weight}\n alignment=\"left\"\n >\n ${text}\n ${reserver ? html`<span slot=\"length\">${reserver}</span>` : nothing}\n </obc-textbox>\n `;\n return wrapWithAlertFrame(blockState?.alert ?? false, box);\n }\n\n private get setpointHidePhase(): ReadoutBlockHidePhase {\n const popUpAtSetpoint =\n this.isPopUp && this.isAtSetpoint && !this.setpointTouching;\n return resolveSetpointHidePhase(\n popUpAtSetpoint,\n this.deferredSetpointHidePhase\n );\n }\n\n // `hasDegree` is deliberately NOT forwarded to the advice / setpoint blocks:\n // the unit is written once per readout and the degree follows the same rule\n // (Figma 6.1). `obc-readout-list-item` keeps its own per-row convention.\n private renderAdviceBlock(): TemplateResult {\n return this.renderBlock({\n variant: ReadoutBlockVariant.advice,\n value: this.advice,\n valueSize: this.secondarySize,\n enhanced: false,\n weight: ObcTextboxFontWeight.regular,\n hintedZeros: this.adviceOptions?.hintedZeros ?? false,\n hasSignSpacer: this.adviceOptions?.hasSignSpacer ?? false,\n spaceReserver: this.adviceOptions?.spaceReserver,\n dataQuality: this.adviceOptions?.dataQuality,\n alert: this.adviceOptions?.alert,\n category: this.adviceOptions?.category,\n active: this.adviceOptions?.active,\n });\n }\n\n private renderSetpointBlock(): TemplateResult {\n return this.renderBlock({\n variant: ReadoutBlockVariant.setpoint,\n value: this.setpoint,\n valueSize: this.setpointSize,\n // Value and setpoint share the enhanced colour state (both neutral\n // or both enhanced); the setpoint is bold only while emphasised.\n enhanced: this.rowEnhanced,\n weight: this.setpointWeight,\n hintedZeros: this.setpointOptions?.hintedZeros ?? false,\n hasSignSpacer: this.setpointOptions?.hasSignSpacer ?? false,\n spaceReserver: this.setpointOptions?.spaceReserver,\n touching: this.setpointTouching,\n hidePhase: this.setpointHidePhase,\n dataQuality: this.setpointOptions?.dataQuality,\n alert: this.setpointOptions?.alert,\n });\n }\n\n /**\n * The value reading: the value block and its degree column (or spacer)\n * grouped in one relatively-positioned wrapper so the value alert frame AND\n * the value data-quality chip can wrap both together. Unlike\n * `obc-readout-list-item` the unit is not part of the reading — it lives in\n * the label/unit meta zone.\n */\n private renderValueReading(): TemplateResult {\n return html`\n <div\n class=${classMap({\n 'value-reading': true,\n ...this.dataQualityClasses(this.valueOptions?.dataQuality),\n })}\n part=\"value-reading\"\n >\n ${this.renderBlock({\n variant: ReadoutBlockVariant.value,\n value: this.value,\n valueType: this.valueType,\n valueSize: this.valueSize,\n enhanced: this.rowEnhanced,\n weight: this.valueWeight,\n hintedZeros: this.valueOptions?.hintedZeros ?? false,\n hasSignSpacer: this.valueOptions?.hasSignSpacer ?? false,\n spaceReserver: this.valueOptions?.spaceReserver,\n off: this.off,\n hasIcon: this.valueOptions?.hasIcon ?? false,\n })}\n ${this.renderDegreeColumn()} ${this.renderValueAlertOverlay()}\n </div>\n `;\n }\n\n /**\n * The value alert frame, drawn as a pure overlay around the value reading\n * (value + degree). It reserves no space — the `obc-alert-frame` sits in an\n * absolutely-positioned box offset outward (see `.value-alert-overlay` in the\n * CSS) so its stroke is centred on the 4px/2px padding line and toggling it\n * never shifts content. Renders only when `valueOptions.alert` is a config\n * object.\n */\n private renderValueAlertOverlay(): TemplateResult | typeof nothing {\n const alert = this.valueOptions?.alert;\n if (typeof alert !== 'object' || alert === null) {\n return nothing;\n }\n const thickness = alert.thickness ?? ObcAlertFrameThickness.Small;\n return html`\n <div\n class=${classMap({\n 'value-alert-overlay': true,\n // The outward offset is thickness-dependent (see the CSS): large frames\n // draw a wider outline, so the box must sit further out to stay centred.\n 'thickness-large': thickness === ObcAlertFrameThickness.Large,\n })}\n aria-hidden=\"true\"\n >\n <obc-alert-frame\n part=\"value-alert-frame\"\n .type=${alert.type ?? ObcAlertFrameType.Regular}\n .thickness=${thickness}\n .status=${alert.status ?? AlertType.Alarm}\n .mode=${alert.mode ?? ObcAlertFrameMode.ackedActive}\n .showIcon=${alert.showIcon ?? false}\n .showAlertCategoryIcon=${alert.showAlertCategoryIcon ?? true}\n .wrapContent=${false}\n .fullWidth=${false}\n ></obc-alert-frame>\n </div>\n `;\n }\n\n /** The label/unit meta zone; `stacking` picks the inline or stacked arrangement. */\n private renderMetaZone(): TemplateResult | typeof nothing {\n if (!this.label && !this.unit) {\n return nothing;\n }\n // Horizontal readouts always stack the label over the unit beside the value.\n const stacked =\n this.isHorizontal || this.resolvedStacking === ReadoutStacking.stacked;\n return html`\n <div\n class=${classMap({\n meta: true,\n 'meta-inline': !stacked,\n 'meta-stacked': stacked,\n 'label-only': !!this.label && !this.unit,\n 'unit-only': !!this.unit && !this.label,\n })}\n part=\"meta-wrapper\"\n >\n ${this.hasLeadingIcon\n ? html`<span class=\"leading-icon\" aria-hidden=\"true\"\n ><slot name=\"leading-icon\"></slot\n ></span>`\n : nothing}\n <div class=\"meta-labels\" part=\"meta-labels\">\n ${this.label\n ? this.renderTextbox(\n 'label',\n this.label,\n this.labelOptions?.spaceReserver\n )\n : nothing}\n ${this.unit\n ? this.renderTextbox(\n 'unit',\n this.unit,\n this.unitOptions?.spaceReserver\n )\n : nothing}\n </div>\n </div>\n `;\n }\n\n private renderSourceContent(): TemplateResult {\n const interaction = this.resolvedSourceInteraction;\n const src = this.src ?? '';\n\n // The interactive variants keep the source's per-block state: the\n // data-quality chip moves onto the button and the alert frame wraps it,\n // matching the plain-text branch (renderTextbox) below.\n const buttonClasses = classMap({\n 'source-button': true,\n ...this.dataQualityClasses(this.srcOptions?.dataQuality),\n });\n\n if (interaction === ReadoutSourceInteraction.picker) {\n const button = html`\n <obc-button\n class=${buttonClasses}\n variant=\"flat\"\n .fullWidth=${false}\n showTrailingIcon\n @click=${() => {\n this.sourcePickerContentVisible = !this.sourcePickerContentVisible;\n }}\n >\n <obi-drop-down-google slot=\"trailing-icon\"></obi-drop-down-google>\n ${src}\n </obc-button>\n `;\n return wrapWithAlertFrame(this.srcOptions?.alert ?? false, button);\n }\n\n if (interaction === ReadoutSourceInteraction.flyout) {\n const button = html`\n <obc-button\n class=${buttonClasses}\n variant=\"flat\"\n .fullWidth=${false}\n showTrailingIcon\n @click=${() => {\n this.dispatchEvent(\n new CustomEvent('source-flyout-click', {\n bubbles: true,\n composed: true,\n detail: {src},\n })\n );\n }}\n >\n <obi-chevron-right-google\n slot=\"trailing-icon\"\n ></obi-chevron-right-google>\n ${src}\n </obc-button>\n `;\n return wrapWithAlertFrame(this.srcOptions?.alert ?? false, button);\n }\n\n return this.renderSourceBlock(src);\n }\n\n /**\n * The plain (non-interactive) source: the textbox plus its optional state\n * chip and deviation line. The regular no-deviation case renders the bare\n * textbox; a state or deviation wraps it in the `.source-block` stack. The\n * picker / flyout button variants do not carry state / deviation yet —\n * TODO(designer): undefined in the 6.1 sheets.\n */\n private renderSourceBlock(src: string): TemplateResult {\n const state = this.srcOptions?.state ?? ReadoutSourceState.regular;\n const deviation = this.srcOptions?.deviation;\n const hasDeviation = deviation !== undefined && Number.isFinite(deviation);\n const box = this.renderTextbox(\n 'source',\n src,\n this.srcOptions?.spaceReserver,\n this.srcOptions\n );\n if (state === ReadoutSourceState.regular && !hasDeviation) {\n return box;\n }\n return html`\n <div\n class=${classMap({\n 'source-block': true,\n [`source-state-${state}`]: state !== ReadoutSourceState.regular,\n })}\n part=\"source-block\"\n >\n ${box}\n ${hasDeviation\n ? html`<span class=\"source-deviation\">\n <obi-delta aria-hidden=\"true\"></obi-delta>\n <obc-textbox\n class=\"source-deviation-value\"\n .size=${ObcTextboxSize.xs}\n .tabularNums=${true}\n alignment=\"left\"\n >${deviation}</obc-textbox\n >\n </span>`\n : nothing}\n </div>\n `;\n }\n\n /**\n * The source row (vertical) / segment (horizontal). Only the horizontal\n * direction draws an auto divider before the source — the Figma 6.1 review\n * (node 95:24490 \"remove dividers\", 95:26891 \"Source-divider are there\")\n * keeps the vertical source row divider-free while the horizontal flow\n * separates the source with a vertical rule.\n */\n private renderSource(): TemplateResult | typeof nothing {\n if (!this.hasSrc) {\n return nothing;\n }\n return html`\n ${this.isHorizontal\n ? html`<div\n class=\"divider divider-vertical\"\n part=\"divider\"\n aria-hidden=\"true\"\n ></div>`\n : nothing}\n <div class=\"source-row\" part=\"source-wrapper\">\n ${this.renderSourceContent()}\n </div>\n `;\n }\n\n // ---------- Source picker (context menu built from src-picker-content) ----------\n\n private getSourcePickerNavigationItems(): HTMLElement[] {\n const assignedElements =\n this.sourcePickerSlot?.assignedElements({flatten: true}) ?? [];\n\n return assignedElements.flatMap((element) => {\n if (!(element instanceof HTMLElement)) {\n return [];\n }\n if (element.localName === 'obc-navigation-item') {\n return [element];\n }\n return Array.from(\n element.querySelectorAll<HTMLElement>('obc-navigation-item')\n );\n });\n }\n\n private createSourcePickerOptionIcon(element: HTMLElement) {\n const iconElement = element.querySelector('[slot=\"icon\"]');\n if (!(iconElement instanceof HTMLElement)) {\n return undefined;\n }\n return html`${iconElement.cloneNode(true)}`;\n }\n\n private getSourcePickerItemInfo(item: HTMLElement, index: number) {\n const itemWithValues = item as HTMLElement & {\n label?: string;\n value?: string;\n };\n const itemLabel = itemWithValues.label || item.getAttribute('label') || '';\n const itemValue =\n item.getAttribute('data-value') ||\n itemWithValues.value ||\n item.getAttribute('value') ||\n itemLabel ||\n `source-option-${index}`;\n\n return {itemLabel, itemValue};\n }\n\n private findSourcePickerOptionElement(value: string) {\n const navigationItems = this.getSourcePickerNavigationItems();\n for (const [index, item] of navigationItems.entries()) {\n const {itemValue} = this.getSourcePickerItemInfo(item, index);\n if (itemValue === value) {\n return item;\n }\n }\n return undefined;\n }\n\n private syncSourcePickerOptions = () => {\n this.sourcePickerOptions = this.getSourcePickerNavigationItems().map(\n (item, index) => {\n const {itemLabel, itemValue} = this.getSourcePickerItemInfo(\n item,\n index\n );\n return {\n value: itemValue,\n label: itemLabel,\n icon: this.createSourcePickerOptionIcon(item),\n };\n }\n );\n };\n\n private handleSourcePickerItemClick(\n event: ObcContextMenuInputItemClickEvent\n ) {\n this.dispatchEvent(\n new CustomEvent('source-change', {\n bubbles: true,\n composed: true,\n detail: {\n value: event.detail.value,\n label: event.detail.option?.label,\n },\n })\n );\n this.findSourcePickerOptionElement(event.detail.value)?.click();\n this.sourcePickerContentVisible = false;\n }\n\n /**\n * The context menu highlights options by their VALUE, while `src` holds the\n * displayed source text — which may be an option's label when the two\n * differ (e.g. `data-value=\"gps-1\"` with label \"GPS 1\"). Resolve the current\n * source to the matching option's value (by value or label) so the open\n * picker always highlights the active source.\n */\n private get selectedSourceValues(): string[] {\n if (!this.src) {\n return [];\n }\n const match = this.sourcePickerOptions.find(\n (option) => option.value === this.src || option.label === this.src\n );\n return [match?.value ?? this.src];\n }\n\n private renderSourcePickerContent(): TemplateResult | typeof nothing {\n if (\n this.resolvedSourceInteraction !== ReadoutSourceInteraction.picker ||\n !this.sourcePickerContentVisible\n ) {\n return nothing;\n }\n return html`\n <obc-context-menu-input\n .type=${ContextMenuType.Regular}\n .options=${this.sourcePickerOptions}\n .selectedValues=${this.selectedSourceValues}\n class=\"source-picker-content\"\n @item-click=${this.handleSourcePickerItemClick}\n @close=${() => {\n this.sourcePickerContentVisible = false;\n }}\n ></obc-context-menu-input>\n `;\n }\n\n private renderSourcePickerSlot(): TemplateResult {\n return html`\n <slot\n name=\"src-picker-content\"\n hidden\n @slotchange=${this.syncSourcePickerOptions}\n ></slot>\n `;\n }\n\n // ---------- Layouts ----------\n\n /**\n * An invisible primary-size duplicate of a dynamic setpoint row's content,\n * stacked under the visible block in the same grid cell purely to reserve\n * width. With both rows permanently holding their emphasised width, the\n * widest row — and therefore the readout's total width — stays constant\n * while a flip-flop swaps the value/setpoint sizes, while a touch swap\n * runs, and while a pop-up setpoint fades out, so the meta zone and source\n * never shift. This is the vertical analogue of the horizontal arrangement,\n * where the swapped pair sits on one row and its summed width is constant\n * by construction (the designer's flip-flop invariant). Only the vertical\n * direction needs it; `always-visible` layouts are untouched.\n */\n private renderSetpointWidthReserve(\n kind: 'setpoint' | 'value'\n ): TemplateResult | typeof nothing {\n if (!this.hasDynamicSetpoint || this.isHorizontal) {\n return nothing;\n }\n const content =\n kind === 'setpoint'\n ? this.renderBlock({\n variant: ReadoutBlockVariant.setpoint,\n value: this.setpoint,\n valueSize: this.primarySize,\n enhanced: false,\n // The emphasised setpoint is SemiBold — reserve its widest form.\n // No degree: the visible setpoint block carries none (the degree\n // renders on the actual value only), so the ghost mirrors it.\n weight: ObcTextboxFontWeight.semibold,\n hintedZeros: this.setpointOptions?.hintedZeros ?? false,\n hasSignSpacer: this.setpointOptions?.hasSignSpacer ?? false,\n spaceReserver: this.setpointOptions?.spaceReserver,\n alert: this.setpointOptions?.alert,\n ghost: true,\n })\n : html`${this.renderBlock({\n variant: ReadoutBlockVariant.value,\n value: this.value,\n valueType: this.valueType,\n valueSize: this.primarySize,\n enhanced: false,\n weight: this.valueWeight,\n hintedZeros: this.valueOptions?.hintedZeros ?? false,\n hasSignSpacer: this.valueOptions?.hasSignSpacer ?? false,\n spaceReserver: this.valueOptions?.spaceReserver,\n off: this.off,\n hasIcon: this.valueOptions?.hasIcon ?? false,\n ghost: true,\n })}${this.renderDegreeColumn(this.primarySize)}`;\n return html`<div class=\"setpoint-width-reserve\" aria-hidden=\"true\">\n ${content}\n </div>`;\n }\n\n /**\n * Vertical: advice / setpoint / value rows right-aligned in a cluster, the\n * label+unit meta zone below, then the source row under an auto divider.\n * `alignment` re-aligns the whole column for stacked readouts.\n */\n private renderVerticalLayout(): TemplateResult {\n return html`\n <div class=\"value-cluster\" part=\"value-cluster\">\n ${this.hasAdvice\n ? html`<div class=\"advice-row\" part=\"advice-wrapper\">\n ${this.renderAdviceBlock()}\n </div>`\n : nothing}\n ${this.hasSetpoint\n ? html`<div class=\"setpoint-row\" part=\"setpoint-wrapper\">\n ${this.renderSetpointBlock()}\n ${this.renderSetpointWidthReserve('setpoint')}\n </div>`\n : nothing}\n ${this.hasValue\n ? html`<div class=\"value-row\" part=\"value-wrapper\">\n ${this.renderValueReading()}\n ${this.renderSetpointWidthReserve('value')}\n </div>`\n : nothing}\n </div>\n ${this.renderMetaZone()} ${this.renderSource()}\n `;\n }\n\n /**\n * Horizontal: advice, setpoint, value and the stacked label/unit meta flow on\n * one cap-height-aligned row, with the source at the end after an auto\n * divider.\n */\n private renderHorizontalLayout(): TemplateResult {\n return html`\n <div class=\"inline-row\" part=\"value-cluster\">\n ${this.hasAdvice\n ? html`<div class=\"advice-row\" part=\"advice-wrapper\">\n ${this.renderAdviceBlock()}\n </div>`\n : nothing}\n ${this.hasSetpoint\n ? html`<div class=\"setpoint-row\" part=\"setpoint-wrapper\">\n ${this.renderSetpointBlock()}\n </div>`\n : nothing}\n ${this.hasValue\n ? html`<div class=\"value-row\" part=\"value-wrapper\">\n ${this.renderValueReading()}\n </div>`\n : nothing}\n ${this.renderMetaZone()} ${this.renderSource()}\n </div>\n `;\n }\n\n protected override willUpdate(changed: Map<string, unknown>): void {\n super.willUpdate(changed);\n // Never gate this on `changed`: a throw clears Lit's changed map, so the\n // next update would skip the check and render the invalid value as a dash\n // (readout-components.md § 1, pinned by readout-block.spec.ts).\n assertReadoutValueType('obc-readout', this.value, this.valueType);\n assertReadoutFractionDigits('obc-readout', this.fractionDigits);\n this.warnHorizontalSizeIgnored();\n }\n\n /**\n * A horizontal readout discards any `size` but `large` (see `resolvedSize`).\n * A silent discard is indistinguishable from a bug to a consumer, so each\n * offending element says so once and logs itself for locating (#1182).\n * A removed `size` attribute arrives as `null` and counts as unset.\n */\n private warnHorizontalSizeIgnored(): void {\n if (\n this.hasWarnedHorizontalSize ||\n !this.isHorizontal ||\n !this.size ||\n this.size === ReadoutSize.large\n ) {\n return;\n }\n this.hasWarnedHorizontalSize = true;\n console.warn(\n `[obc-readout] size=\"${this.size}\" is ignored when direction=\"horizontal\": ` +\n 'the horizontal arrangement exists in the large tier only. Remove the ' +\n 'size, or use direction=\"vertical\" for the small / medium tiers.',\n this\n );\n }\n\n override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n\n if (changed.has('sourcePickerContentVisible')) {\n if (this.sourcePickerContentVisible) {\n window.addEventListener('pointerdown', this.onWindowPointerDown, true);\n } else {\n window.removeEventListener(\n 'pointerdown',\n this.onWindowPointerDown,\n true\n );\n }\n }\n\n const firstUpdate = !this.hasCompletedFirstUpdate;\n this.hasCompletedFirstUpdate = true;\n\n // Pop-up: hide the setpoint shortly after the value reaches it. `touching`\n // and the non-pop-up modes keep the setpoint visible.\n if (!this.isPopUp || this.setpointTouching) {\n this.clearDeferredSetpointHide();\n return;\n }\n\n const shouldHide = this.hasSetpoint && this.isAtSetpoint;\n\n if (firstUpdate) {\n // Settle to the resting state on mount without animating.\n this.deferredSetpointHidePhase = shouldHide\n ? ReadoutBlockHidePhase.hidden\n : ReadoutBlockHidePhase.none;\n return;\n }\n\n if (!shouldHide) {\n this.clearDeferredSetpointHide();\n return;\n }\n\n if (this.deferredSetpointHidePhase !== ReadoutBlockHidePhase.none) {\n return;\n }\n\n this.deferredSetpointHidePhase = ReadoutBlockHidePhase.hiding;\n window.clearTimeout(this.deferredSetpointHideTimer);\n this.deferredSetpointHideTimer = window.setTimeout(() => {\n this.deferredSetpointHidePhase = ReadoutBlockHidePhase.hidden;\n this.deferredSetpointHideTimer = undefined;\n }, 100);\n }\n\n private clearDeferredSetpointHide(): void {\n if (this.deferredSetpointHidePhase !== ReadoutBlockHidePhase.none) {\n this.deferredSetpointHidePhase = ReadoutBlockHidePhase.none;\n }\n window.clearTimeout(this.deferredSetpointHideTimer);\n this.deferredSetpointHideTimer = undefined;\n }\n\n override disconnectedCallback(): void {\n window.removeEventListener('pointerdown', this.onWindowPointerDown, true);\n window.clearTimeout(this.deferredSetpointHideTimer);\n this.deferredSetpointHideTimer = undefined;\n // Settle a mid-flight hide to its end state. Without this, disconnecting\n // during the 100ms window leaves the phase stuck at 'hiding' (the timer that\n // would advance it to 'hidden' is gone), so a later reconnect never resolves.\n if (this.deferredSetpointHidePhase === ReadoutBlockHidePhase.hiding) {\n this.deferredSetpointHidePhase = ReadoutBlockHidePhase.hidden;\n }\n super.disconnectedCallback();\n }\n\n override render() {\n const dataQuality = this.dataQuality;\n const classes = classMap({\n readout: true,\n [`size-${this.resolvedSize}`]: true,\n [`direction-${this.resolvedDirection}`]: true,\n [`stacking-${this.resolvedStacking}`]: true,\n [`alignment-${this.resolvedAlignment}`]: true,\n [`priority-${this.resolvedPriority}`]: true,\n 'data-low-integrity': dataQuality === ReadoutDataQuality.lowIntegrity,\n 'data-invalid': dataQuality === ReadoutDataQuality.invalid,\n 'flip-flop': this.isFlipFlop,\n 'setpoint-dynamic': this.hasDynamicSetpoint,\n });\n\n const root = html`\n <div class=${classes} part=\"root\">\n ${this.isHorizontal\n ? this.renderHorizontalLayout()\n : this.renderVerticalLayout()}\n ${this.renderSourcePickerSlot()}\n </div>\n ${this.renderSourcePickerContent()}\n `;\n\n // `alert` accepts `boolean` (so the generated Angular wrapper's widened\n // `boolean` type assigns cleanly), but `wrapWithAlertFrame` ignores\n // non-object truthy values. Normalise `true` → a default frame `{}` so it\n // isn't a silent no-op; `false`/object pass through. The frame hugs the\n // readout (no fullWidth), matching the previous behaviour.\n const alert = this.alert === true ? {} : this.alert;\n return wrapWithAlertFrame(alert, root);\n }\n\n static override styles = unsafeCSS(componentStyle);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'obc-readout': ObcReadout;\n }\n}\n"],"names":["ReadoutDirection","ReadoutStacking","ReadoutAlignment","ReadoutSourceInteraction","state"],"mappings":"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"}
1
+ {"version":3,"file":"readout.js","sources":["../../../src/navigation-instruments/readout/readout.ts"],"sourcesContent":["import {LitElement, html, nothing, unsafeCSS, type TemplateResult} from 'lit';\nimport {property, query, state} from 'lit/decorators.js';\nimport {classMap} from 'lit/directives/class-map.js';\nimport componentStyle from './readout.css?inline';\nimport {customElement} from '../../decorator.js';\nimport '../../components/textbox/textbox.js';\nimport {\n ObcTextboxSize,\n ObcTextboxFontWeight,\n} from '../../components/textbox/textbox.js';\nimport '../../building-blocks/readout-block/readout-block.js';\nimport {\n ReadoutBlockVariant,\n ReadoutBlockSize,\n ReadoutBlockDataQuality,\n ReadoutBlockHidePhase,\n ReadoutAdviceCategory,\n} from '../../building-blocks/readout-block/readout-block.js';\nimport {\n ReadoutListItemSetpointInteraction,\n ReadoutSourceState,\n type ReadoutBlockState,\n type ReadoutValueOptions,\n type ReadoutSetpointOptions,\n type ReadoutAdviceOptions,\n type ReadoutLabelOptions,\n type ReadoutReserverOptions,\n type ReadoutSrcOptions,\n} from '../readout-list-item/readout-list-item.js';\nimport {Priority} from '../types.js';\nimport {\n assertReadoutValueType,\n assertReadoutFractionDigits,\n isReadoutDigitCountMissing,\n resolveReadoutDigitCount,\n resolveReadoutNumericValue,\n ReadoutValueType,\n type ReadoutNumericFormatOptions,\n} from './readout-formatters.js';\nimport {\n isDisplayedAtSetpoint,\n readoutNumericFormatOptions,\n readoutPrimarySize,\n readoutSecondarySize,\n readoutSetpointSize,\n readoutValueSize,\n readoutSetpointWeight,\n readoutDataQualityClasses,\n resolveSetpointHidePhase,\n} from './readout-shared.js';\nimport {\n type AlertFrameConfig,\n wrapWithAlertFrame,\n ObcAlertFrameType,\n ObcAlertFrameThickness,\n ObcAlertFrameMode,\n} from '../../components/alert-frame/alert-frame.js';\nimport {AlertType, FlashingSpeed} from '../../types.js';\nimport '../../components/button/button.js';\nimport '../../components/context-menu-input/context-menu-input.js';\nimport {\n ContextMenuType,\n type ContextMenuOption,\n type ObcContextMenuInputItemClickEvent,\n} from '../../components/context-menu-input/context-menu-input.js';\nimport '../../icons/icon-chevron-right-google.js';\nimport '../../icons/icon-drop-down-google.js';\nimport '../../icons/icon-delta.js';\n\n// Re-exported so consumers configure the readout without a second import path.\n// The option interfaces and enums are shared with `obc-readout-list-item` on\n// purpose: the two components are layout variants of the same primitives +\n// per-block options API and may merge in a future release.\nexport {ObcTextboxFontWeight} from '../../components/textbox/textbox.js';\nexport {ReadoutValueType} from './readout-formatters.js';\nexport {ReadoutAdviceCategory} from '../../building-blocks/readout-block/readout-block.js';\nexport {ReadoutSourceState} from '../readout-list-item/readout-list-item.js';\nexport type {\n ReadoutBlockState,\n ReadoutValueOptions,\n ReadoutSetpointOptions,\n ReadoutAdviceOptions,\n ReadoutLabelOptions,\n ReadoutReserverOptions,\n ReadoutSrcOptions,\n} from '../readout-list-item/readout-list-item.js';\n\n/**\n * Density/size scale of the readout (an alias of `ReadoutBlockSize`).\n * - `small`: regular value typography (smallest, densest).\n * - `medium`: medium value typography.\n * - `large`: large value typography.\n */\nexport const ReadoutSize = ReadoutBlockSize;\nexport type ReadoutSize = ReadoutBlockSize;\n\n/**\n * Colour emphasis of the value (an alias of the shared instrument `Priority`;\n * same values as `ReadoutListItemPriority`).\n * - `regular`: neutral.\n * - `enhanced`: accented (in-command) colour.\n */\nexport const ReadoutPriority = Priority;\nexport type ReadoutPriority = Priority;\n\n/**\n * Measurement quality of the value (an alias of `ReadoutBlockDataQuality`).\n * Orthogonal to the readout-level `alert` – a low-integrity or invalid value\n * can also sit inside an alert frame.\n */\nexport const ReadoutDataQuality = ReadoutBlockDataQuality;\nexport type ReadoutDataQuality = ReadoutBlockDataQuality;\n\n/**\n * How the setpoint segment behaves relative to the value (an alias of\n * `ReadoutListItemSetpointInteraction`).\n * - `always-visible` (default): the setpoint is always shown.\n * - `equal-size`: value and setpoint are always shown at the same (primary)\n * size (Figma 6.1 \"Equal size\") — the value does not demote while\n * `touching`, unlike the other modes.\n * - `flip-flop`: value and setpoint swap emphasis (size) as the value reaches\n * the setpoint.\n * - `pop-up`: the setpoint is shown only while the value has not reached it,\n * then fades out (100ms) once value === setpoint.\n */\nexport const ReadoutSetpointInteraction = ReadoutListItemSetpointInteraction;\nexport type ReadoutSetpointInteraction = ReadoutListItemSetpointInteraction;\n\n/**\n * Flow direction of the readout.\n * - `vertical` (default): advice / setpoint / value stack on top of the\n * label+unit meta zone and the source row (Figma \"Readout Group / Vertical\"\n * and \"Readout Stack\").\n * - `horizontal`: all segments flow on one cap-height-aligned row, with the\n * label stacked over the unit beside the value (Figma \"Readout Group /\n * Horizontal\").\n */\nexport enum ReadoutDirection {\n vertical = 'vertical',\n horizontal = 'horizontal',\n}\n\n/**\n * Arrangement of the label/unit meta zone in a vertical readout.\n * - `inline` (default): label and unit share one row below the value (Figma\n * \"Readout Group / Vertical\").\n * - `stacked`: label and unit render on separate rows (Figma \"Readout Stack\"),\n * arranged by `alignment`.\n */\nexport enum ReadoutStacking {\n inline = 'inline',\n stacked = 'stacked',\n}\n\n/**\n * Cross-axis alignment of a stacked vertical readout (Figma \"Readout Stack\"\n * Alignment axis).\n * - `vertical` (default): right-aligned column.\n * - `left`: left-aligned column.\n * - `center`: centered column.\n */\nexport enum ReadoutAlignment {\n vertical = 'vertical',\n left = 'left',\n center = 'center',\n}\n\n/**\n * Interactivity of the source row.\n * - `none` (default): plain source text (same rendering as\n * `obc-readout-list-item`).\n * - `picker`: a flat button with a drop-down icon that opens a context menu\n * built from the `src-picker-content` slot; selecting an option fires\n * `source-change`.\n * - `flyout`: a flat button with a chevron icon that fires\n * `source-flyout-click`.\n */\nexport enum ReadoutSourceInteraction {\n none = 'none',\n picker = 'picker',\n flyout = 'flyout',\n}\n\n/**\n * Per-source options. Extends the shared per-block state (data quality, alert,\n * space reserver) with the readout's source interactivity.\n *\n * `state` and `deviation` apply to the plain (non-interactive) source only —\n * the Figma 6.1 sheets do not define them on the picker / flyout buttons, so\n * those branches render without a state chip or deviation line\n * (TODO(designer): pending a design for interactive source states).\n */\nexport interface ReadoutSourceOptions extends ReadoutSrcOptions {\n /** Interactivity of the source row (default `none`). */\n interaction?: ReadoutSourceInteraction;\n}\n\n/**\n * `<obc-readout>` – An instrument readout: a value with optional setpoint,\n * advice, label, unit, and source, arranged vertically or horizontally.\n *\n * A layout sibling of `<obc-readout-list-item>` built from the same\n * cap-height \"readout building blocks\" (`obc-readout-block`): dynamic data is\n * passed as top-level primitives (`value`, `setpoint`, `advice`, `label`,\n * `unit`, `src`), global layout/format via top-level props (`size`,\n * `priority`, `direction`, `stacking`, `alignment`, `hasDegree`,\n * `dataQuality`, `alert`, …) and per-block tweaks via one object per block\n * (`valueOptions`, `setpointOptions`, `adviceOptions`, `unitOptions`,\n * `srcOptions`).\n *\n * ### Features\n * - **Building blocks:** value, optional setpoint, and optional advice\n * segments, each cap-height-aligned and able to reserve a stable width.\n * - **Sizes:** `small`, `medium`, `large` density scales.\n * - **Direction:** `vertical` (blocks above a label+unit meta zone and source\n * row) or `horizontal` (all segments on one row).\n * - **Stacking & alignment:** vertical readouts arrange label/unit `inline`\n * or `stacked`; stacked readouts align `vertical` (right), `left`, or\n * `center`.\n * - **Priority:** `regular`/`enhanced` colour emphasis; per-value `weight`\n * is independent of colour.\n * - **Setpoint interactions:** `always-visible`, `flip-flop` (emphasis swap),\n * and `pop-up` (fade-out at setpoint), plus the `touching` focus state.\n * - **Data quality:** `low-integrity`/`invalid` styling, per block or for the\n * whole readout, combinable with `alert`.\n * - **Alert frame:** optional `alert` wrapper (caution/warning/alarm/level).\n * - **Source:** plain text by default; opt-in `picker` (context menu) or\n * `flyout` interactivity via `srcOptions.interaction`.\n * - **Formatting:** shared `fractionDigits`, width reservation via\n * `maxDigits` and per-segment `hintedZeros`; a `null` value renders a dash.\n * - **Text values:** `valueType=\"text\"` renders `value` verbatim (e.g.\n * `\"Auto\"`) instead of formatting it as a number.\n *\n * ### Usage Guidelines\n * Use for stand-alone instrument readouts and readouts embedded in\n * instruments. Prefer `<obc-readout-list-item>` for dense rows in\n * lists/tables (label left, value right) and `<obc-readout-list>` for\n * auto-aligned groups of rows.\n *\n * ### Slots\n * | Slot Name | Renders When | Purpose |\n * |--------------------|---------------------------------------|--------------------------------------|\n * | leading-icon | `hasLeadingIcon` | Icon before the label/unit meta zone.|\n * | value-icon | `valueOptions.hasIcon` | Icon before the value. |\n * | setpoint-icon | `hasSetpoint` | Overrides the default setpoint icon. |\n * | advice-icon | `hasAdvice` | Overrides the default advice icon. |\n * | src-picker-content | `srcOptions.interaction == 'picker'` | Source picker context-menu content. |\n *\n * @property hasValue - Layout switch: `false` renders a deliberately value-less (label-only)\n * readout that hugs its remaining parts. For a temporarily missing value\n * keep `hasValue` and set `value` to `null` instead — the dash keeps the\n * value block at full size, so the layout does not shift when data arrives.\n * @property value - The value; `null` renders a dash. A number by default, or text when\n * `valueType` is `text`.\n * @property valueType - How `value` is interpreted. `number` (default) formats it via\n * `fractionDigits`; `text` renders it verbatim and ignores the numeric\n * format options. Passing text while this is `number` throws.\n * @property off - Render the value as `offText` (e.g. equipment powered down). Affects the value only.\n * @property offText - Text shown in place of the value when `off` is true.\n * @availableWhen offText off==true\n * @availableWhen setpoint hasSetpoint==true\n * @availableWhen advice hasAdvice==true\n * @property size - Density tier. Applies to the vertical direction only — the horizontal\n * arrangement exists in the large tier alone (Figma 6.1: it relies on the\n * label+unit stack aligning with the L-size value caps), so `size` is\n * ignored when `direction` is `horizontal`; a horizontal readout given any\n * other `size` logs a console warning once per element.\n * @availableWhen size direction==vertical\n * @availableWhen stacking direction==vertical\n * @availableWhen alignment direction==vertical && stacking==stacked\n * @property hasDegree - Render the cap-height degree glyph (`°`) after the ACTUAL VALUE only —\n * the setpoint / advice blocks never carry one (Figma 6.1 review: the unit\n * is written once for the readout, and the degree follows the same rule).\n * @availableWhen hasDegreeSpacer hasDegree==false\n * @property hasLeadingIcon - Show the `leading-icon` slot before the label/unit meta zone.\n * @property fractionDigits - Also formats the numeric setpoint / advice blocks, which stay numeric\n * even when the value is text. Must be between 0 and 100 — the range\n * `Number.prototype.toFixed` accepts; outside it throws a `RangeError`.\n * A fractional count truncates (`2.7` → `2`). A count that never arrived\n * (`NaN`, `null` or unset) renders the reading as the unavailable dash —\n * formatting with a precision the author never chose would let a critical\n * `0.4` pass for a healthy `0`.\n * @availableWhen fractionDigits valueType==number || hasSetpoint==true || hasAdvice==true\n * @property maxDigits - Also formats the numeric setpoint / advice blocks, which stay numeric\n * even when the value is text. Bounded before use: a fractional count\n * truncates (`2.7` → `2`), anything above 100 — including `Infinity` —\n * caps at 100, and a negative count reserves nothing. A count that never\n * arrived (`NaN`, `null` or unset) renders the reading as the unavailable\n * dash, consistent with `fractionDigits`.\n * @availableWhen maxDigits valueType==number || hasSetpoint==true || hasAdvice==true\n * @availableWhen valueOptions hasValue==true\n * @availableWhen setpointOptions hasSetpoint==true\n * @availableWhen adviceOptions hasAdvice==true\n * @availableWhen labelOptions label!=''\n * @availableWhen unitOptions unit!=''\n * @availableWhen srcOptions src!=''\n * @property showDebugOverlay - Development aid: outline the readout building blocks (red), the degree\n * columns (blue) and the degree spacer (green) so reserved widths / alignment\n * are visible. Off by default.\n * @slot leading-icon - Icon before the label/unit meta zone.\n * @slot value-icon - Icon before the value.\n * @slot setpoint-icon - Overrides the default setpoint icon.\n * @slot advice-icon - Overrides the default advice icon.\n * @slot src-picker-content - Provides the source picker context menu content.\n * @fires {CustomEvent<{value: string, label?: string}>} source-change - Fired when a source picker option is selected.\n * @fires {CustomEvent<{src: string}>} source-flyout-click - Fired when the source row is clicked while `srcOptions.interaction == 'flyout'`.\n * @beta\n */\n@customElement('obc-readout')\nexport class ObcReadout extends LitElement {\n // Primitives (dynamic data)\n @property({type: String}) label?: string;\n @property({type: String}) unit?: string;\n @property({type: String}) src?: string;\n\n @property({type: Boolean, attribute: false}) hasValue = true;\n @property({type: String}) value: number | string | null = null;\n @property({type: String}) valueType: ReadoutValueType =\n ReadoutValueType.number;\n @property({type: Boolean}) off = false;\n @property({type: String}) offText = 'OFF';\n\n @property({type: Boolean}) hasSetpoint = false;\n @property({type: Number}) setpoint?: number;\n\n @property({type: Boolean}) hasAdvice = false;\n @property({type: Number}) advice?: number;\n\n // Global layout/format (each defaults via its `resolved*` getter where useful).\n @property({type: String}) size?: ReadoutSize;\n @property({type: String}) priority?: ReadoutPriority;\n @property({type: String}) direction?: ReadoutDirection;\n @property({type: String}) stacking?: ReadoutStacking;\n @property({type: String}) alignment?: ReadoutAlignment;\n @property({type: Boolean}) hasDegree = false;\n @property({type: Boolean}) hasDegreeSpacer = false;\n @property({type: Boolean}) hasLeadingIcon = false;\n @property({type: Number}) fractionDigits = 0;\n @property({type: Number}) maxDigits = 0;\n @property({type: String}) dataQuality?: ReadoutDataQuality;\n // `boolean | …` (not `false | …`): the generated Angular wrapper widens a\n // literal-`false` union to `boolean`, which then won't assign back to a\n // `false`-typed element property. `wrapWithAlertFrame` treats any non-object\n // (incl. `true`) as \"no frame\", so accepting `boolean` is harmless.\n @property({type: Object}) alert: boolean | AlertFrameConfig = false;\n\n // Per-block configuration — one object per block (see the Readout*Options types).\n @property({type: Object}) valueOptions?: ReadoutValueOptions;\n @property({type: Object}) setpointOptions?: ReadoutSetpointOptions;\n @property({type: Object}) adviceOptions?: ReadoutAdviceOptions;\n @property({type: Object}) labelOptions?: ReadoutLabelOptions;\n @property({type: Object}) unitOptions?: ReadoutReserverOptions;\n @property({type: Object}) srcOptions?: ReadoutSourceOptions;\n\n @property({type: Boolean, reflect: true}) showDebugOverlay = false;\n\n /** Pop-up deferred-hide phase for the setpoint (see {@link updated}). */\n @state() private deferredSetpointHidePhase: ReadoutBlockHidePhase =\n ReadoutBlockHidePhase.none;\n private deferredSetpointHideTimer?: number;\n private hasCompletedFirstUpdate = false;\n private hasWarnedHorizontalSize = false;\n\n @state() private sourcePickerContentVisible = false;\n @state() private sourcePickerOptions: ContextMenuOption[] = [];\n\n @query('slot[name=\"src-picker-content\"]')\n private sourcePickerSlot?: HTMLSlotElement;\n\n private readonly onWindowPointerDown = (event: PointerEvent) => {\n if (!this.sourcePickerContentVisible) {\n return;\n }\n if (event.composedPath().includes(this)) {\n return;\n }\n this.sourcePickerContentVisible = false;\n };\n\n private get resolvedSize(): ReadoutSize {\n // The horizontal arrangement exists only in the large tier (Figma 6.1): it\n // relies on the label+unit stack aligning with the L-size value caps.\n if (this.isHorizontal) {\n return ReadoutSize.large;\n }\n return this.size ?? ReadoutSize.small;\n }\n\n private get resolvedPriority(): ReadoutPriority {\n return this.priority ?? ReadoutPriority.regular;\n }\n\n private get resolvedDirection(): ReadoutDirection {\n return this.direction ?? ReadoutDirection.vertical;\n }\n\n private get resolvedStacking(): ReadoutStacking {\n return this.stacking ?? ReadoutStacking.inline;\n }\n\n private get resolvedAlignment(): ReadoutAlignment {\n return this.alignment ?? ReadoutAlignment.vertical;\n }\n\n private get isHorizontal(): boolean {\n return this.resolvedDirection === ReadoutDirection.horizontal;\n }\n\n private get resolvedFractionDigits(): number {\n return this.fractionDigits ?? 0;\n }\n\n private get resolvedMaxDigits(): number {\n return resolveReadoutDigitCount(this.maxDigits);\n }\n\n /**\n * Whether a digit knob failed to arrive (`NaN` / `null` / `undefined`).\n * The raw knobs are forwarded to the blocks, which render the reading as\n * the unavailable dash (see `obc-readout-block.digitCountsMissing`); this\n * getter only keeps the setpoint comparison in agreement with what is\n * displayed.\n */\n private get digitCountsMissing(): boolean {\n return (\n isReadoutDigitCountMissing(this.fractionDigits) ||\n isReadoutDigitCountMissing(this.maxDigits)\n );\n }\n\n private get hasSrc(): boolean {\n return this.src !== undefined && this.src.trim() !== '';\n }\n\n private get resolvedSourceInteraction(): ReadoutSourceInteraction {\n return this.srcOptions?.interaction ?? ReadoutSourceInteraction.none;\n }\n\n private get isAtSetpoint(): boolean {\n if (!this.hasSetpoint) {\n return false;\n }\n // A missing digit knob renders every numeric block as the dash; two\n // dashes must not read as \"at the setpoint\", so the comparison stays off\n // entirely while the configuration is untrustworthy.\n if (this.digitCountsMissing) {\n return false;\n }\n // A text value never compares equal to a setpoint, so flip-flop / pop-up\n // stay dormant for `valueType=\"text\"`.\n return isDisplayedAtSetpoint(\n resolveReadoutNumericValue(this.value, this.valueType) ?? null,\n this.setpoint,\n this.numericFormatOptions(this.resolvedMaxDigits)\n );\n }\n\n private get resolvedSetpointInteraction(): ReadoutSetpointInteraction {\n return (\n this.setpointOptions?.interaction ??\n ReadoutSetpointInteraction.alwaysVisible\n );\n }\n\n private get isFlipFlop(): boolean {\n return (\n this.resolvedSetpointInteraction === ReadoutSetpointInteraction.flipFlop\n );\n }\n\n private get isEqualSize(): boolean {\n return (\n this.resolvedSetpointInteraction === ReadoutSetpointInteraction.equalSize\n );\n }\n\n private get isPopUp(): boolean {\n return (\n this.resolvedSetpointInteraction === ReadoutSetpointInteraction.popUp\n );\n }\n\n private get setpointTouching(): boolean {\n return this.setpointOptions?.touching ?? false;\n }\n\n /**\n * Whether the setpoint interaction re-sizes or hides blocks at runtime —\n * flip-flop (emphasis swap) and pop-up (touch swap + fade-out) — the modes\n * that need the width/height reservation so the readout never shifts (see\n * {@link renderSetpointWidthReserve}).\n */\n private get hasDynamicSetpoint(): boolean {\n return this.hasSetpoint && (this.isFlipFlop || this.isPopUp);\n }\n\n /**\n * The setpoint is rendered \"emphasised\" (primary size + SemiBold weight) when\n * it is the focus of attention: while actively adjusting (`touching`), or while\n * a flip-flop has the value away from the setpoint. Otherwise it is a secondary\n * (smaller, regular-weight) reference next to the value.\n */\n private get isSetpointEmphasized(): boolean {\n if (!this.hasSetpoint) {\n return false;\n }\n if (this.setpointTouching) {\n return true;\n }\n return this.isFlipFlop && !this.isAtSetpoint;\n }\n\n /**\n * The readout's enhanced (in-command) colour state, applied uniformly to BOTH\n * the value and the setpoint — they are always either both neutral or both\n * enhanced (never a blue setpoint next to a grey value). Driven by `priority`\n * only; `valueOptions.weight` changes weight, not colour.\n */\n private get rowEnhanced(): boolean {\n return this.resolvedPriority === ReadoutPriority.enhanced;\n }\n\n /** Primary value-typography size for the current density tier. */\n private get primarySize(): ObcTextboxSize {\n return readoutPrimarySize(this.resolvedSize);\n }\n\n /** Secondary (de-emphasised) value-typography size for the current density tier. */\n private get secondarySize(): ObcTextboxSize {\n return readoutSecondarySize(this.resolvedSize);\n }\n\n private get valueSize(): ObcTextboxSize {\n // The value de-emphasises (secondary size) whenever the setpoint is the\n // focus — while actively adjusting (`touching`) or while a flip-flop holds\n // the value away from the setpoint — except in `equal-size`, where both\n // blocks always hold the primary size (even while touching).\n return readoutValueSize({\n primary: this.primarySize,\n secondary: this.secondarySize,\n setpointEmphasized: this.isSetpointEmphasized,\n equalSize: this.isEqualSize,\n });\n }\n\n private get setpointSize(): ObcTextboxSize {\n return readoutSetpointSize({\n primary: this.primarySize,\n secondary: this.secondarySize,\n emphasized: this.isSetpointEmphasized,\n equalSize: this.isEqualSize,\n });\n }\n\n /** Value font weight passes straight to obc-textbox; regular when unset. Colour is separate. */\n private get valueWeight(): ObcTextboxFontWeight {\n return this.valueOptions?.weight ?? ObcTextboxFontWeight.regular;\n }\n\n /**\n * Label size. The Figma 6.1 title block defaults large readouts to `s` — a\n * scannable label should not sit at the smallest permitted size — while\n * small/medium tiers stay `xs`; `labelOptions.size` overrides either way\n * (per the design team, for context / density / secondary instruments).\n * TODO(designer): the medium-tier default is unverified in the new sheets\n * (only XS and S exist on the title's size axis).\n */\n private get labelSize(): ObcTextboxSize {\n return (\n this.labelOptions?.size ??\n (this.resolvedSize === ReadoutSize.large\n ? ObcTextboxSize.s\n : ObcTextboxSize.xs)\n );\n }\n\n /**\n * Label weight: SemiBold only for enhanced (in-command) readouts, regular\n * otherwise — the designer reduced the amount of semibold in the interface\n * (Figma 6.1 review).\n */\n private get labelWeight(): ObcTextboxFontWeight {\n return this.rowEnhanced\n ? ObcTextboxFontWeight.semibold\n : ObcTextboxFontWeight.regular;\n }\n\n /** Setpoint is SemiBold only while emphasised, otherwise regular weight. */\n private get setpointWeight(): ObcTextboxFontWeight {\n return readoutSetpointWeight(this.isSetpointEmphasized);\n }\n\n private numericFormatOptions(maxDigits: number): ReadoutNumericFormatOptions {\n return readoutNumericFormatOptions(maxDigits, this.resolvedFractionDigits);\n }\n\n /** classMap fragment for a block / source carrying per-block data quality. */\n private dataQualityClasses(\n dataQuality: ReadoutDataQuality | undefined\n ): Record<string, boolean> {\n return readoutDataQualityClasses(dataQuality);\n }\n\n /**\n * Forward the matching readout icon slot into the block's single `icon`\n * slot. The variant's default marker lives in `obc-readout-block` and shows\n * when nothing is assigned here (an empty forwarded slot flattens to nothing).\n */\n private renderForwardedIcon(variant: ReadoutBlockVariant): TemplateResult {\n if (variant === ReadoutBlockVariant.setpoint) {\n return html`<slot name=\"setpoint-icon\" slot=\"icon\"></slot>`;\n }\n if (variant === ReadoutBlockVariant.advice) {\n return html`<slot name=\"advice-icon\" slot=\"icon\"></slot>`;\n }\n return html`<slot name=\"value-icon\" slot=\"icon\"></slot>`;\n }\n\n private renderBlock(config: {\n variant: ReadoutBlockVariant;\n value: number | string | null | undefined;\n /** Only the value block is ever text; setpoint / advice stay numeric. */\n valueType?: ReadoutValueType;\n valueSize: ObcTextboxSize;\n enhanced: boolean;\n weight: ObcTextboxFontWeight;\n hintedZeros: boolean;\n hasSignSpacer?: boolean;\n spaceReserver?: string;\n off?: boolean;\n hasDegree?: boolean;\n hasIcon?: boolean;\n touching?: boolean;\n hidePhase?: ReadoutBlockHidePhase;\n dataQuality?: ReadoutBlockDataQuality;\n alert?: false | AlertFrameConfig;\n /** Advice-only: semantic category + triggered state. */\n category?: ReadoutAdviceCategory;\n active?: boolean;\n /**\n * Invisible width-reserving duplicate (see\n * {@link renderSetpointWidthReserve}): skips the forwarded icon slot so\n * the visible block keeps the slotted content — the block's default\n * marker has the same fixed tier width.\n */\n ghost?: boolean;\n }): TemplateResult {\n // The block owns the formatting, hinted zeros, reserver, degree and icon; the\n // readout keeps the density tier (`size`) and the resolved per-block number\n // size (`valueSize`) so flip-flop/pop-up emphasis stays a readout decision.\n return html`\n <obc-readout-block\n exportparts=\"block, block-content, block-text, block-icon, degree\"\n .variant=${config.variant}\n .value=${config.value ?? null}\n .valueType=${config.valueType ?? ReadoutValueType.number}\n .size=${this.resolvedSize}\n .valueSize=${config.valueSize}\n .enhanced=${config.enhanced}\n .weight=${config.weight}\n .hasDegree=${config.hasDegree ?? false}\n .hasIcon=${config.hasIcon ?? false}\n .fractionDigits=${this.fractionDigits}\n .maxDigits=${this.maxDigits}\n .hintedZeros=${config.hintedZeros}\n .hasSignSpacer=${config.hasSignSpacer ?? false}\n .spaceReserver=${config.spaceReserver}\n .off=${config.off ?? false}\n .offText=${this.offText}\n .touching=${config.touching ?? false}\n .hidePhase=${config.hidePhase ?? ReadoutBlockHidePhase.none}\n .dataQuality=${config.dataQuality}\n .alert=${config.alert ?? false}\n .category=${config.category ?? ReadoutAdviceCategory.regular}\n .active=${config.active ?? false}\n >\n ${config.ghost ? nothing : this.renderForwardedIcon(config.variant)}\n </obc-readout-block>\n `;\n }\n\n /**\n * A cap-height `°` column whose width scales with the value size, rendered\n * after the value block. Setpoint / advice blocks render their own degree via\n * `obc-readout-block`.\n */\n private renderDegreeGlyph(size: ObcTextboxSize): TemplateResult {\n return html`\n <span\n class=${classMap({\n 'degree-column': true,\n [`degree-${size}`]: true,\n 'tone-enhanced': this.rowEnhanced,\n })}\n part=\"degree\"\n >\n <obc-textbox class=\"degree-glyph\" .size=${size} alignment=\"center\"\n >°</obc-textbox\n >\n </span>\n `;\n }\n\n /**\n * The column rendered after the value digits:\n *\n * - `hasDegree`: a cap-height `°` column whose width scales with the value size.\n * - `hasDegreeSpacer` (non-degree readouts): an invisible reserve of the same\n * width, so this readout's value digits stay aligned with degree readouts\n * in the same column.\n */\n private renderDegreeColumn(\n size: ObcTextboxSize = this.valueSize\n ): TemplateResult | typeof nothing {\n if ((this.hasDegree ?? false) && !this.off) {\n return this.renderDegreeGlyph(size);\n }\n if (this.hasDegreeSpacer ?? false) {\n return html`<span\n class=\"degree-spacer\"\n part=\"degree-spacer\"\n aria-hidden=\"true\"\n ></span>`;\n }\n return nothing;\n }\n\n private renderTextbox(\n role: 'label' | 'unit' | 'source',\n text: string,\n reserver?: string,\n blockState?: ReadoutBlockState\n ): TemplateResult {\n // The label carries its own size (labelOptions / tier default) and\n // priority-driven weight; unit and source stay xs / regular.\n const weight =\n role === 'label' ? this.labelWeight : ObcTextboxFontWeight.regular;\n const size = role === 'label' ? this.labelSize : ObcTextboxSize.xs;\n const box = html`\n <obc-textbox\n class=${classMap({\n [role]: true,\n ...this.dataQualityClasses(blockState?.dataQuality),\n })}\n part=${role}\n .size=${size}\n .fontWeight=${weight}\n alignment=\"left\"\n >\n ${text}\n ${reserver ? html`<span slot=\"length\">${reserver}</span>` : nothing}\n </obc-textbox>\n `;\n return wrapWithAlertFrame(blockState?.alert ?? false, box);\n }\n\n private get setpointHidePhase(): ReadoutBlockHidePhase {\n const popUpAtSetpoint =\n this.isPopUp && this.isAtSetpoint && !this.setpointTouching;\n return resolveSetpointHidePhase(\n popUpAtSetpoint,\n this.deferredSetpointHidePhase\n );\n }\n\n // `hasDegree` is deliberately NOT forwarded to the advice / setpoint blocks:\n // the unit is written once per readout and the degree follows the same rule\n // (Figma 6.1). `obc-readout-list-item` keeps its own per-row convention.\n private renderAdviceBlock(): TemplateResult {\n return this.renderBlock({\n variant: ReadoutBlockVariant.advice,\n value: this.advice,\n valueSize: this.secondarySize,\n enhanced: false,\n weight: ObcTextboxFontWeight.regular,\n hintedZeros: this.adviceOptions?.hintedZeros ?? false,\n hasSignSpacer: this.adviceOptions?.hasSignSpacer ?? false,\n spaceReserver: this.adviceOptions?.spaceReserver,\n dataQuality: this.adviceOptions?.dataQuality,\n alert: this.adviceOptions?.alert,\n category: this.adviceOptions?.category,\n active: this.adviceOptions?.active,\n });\n }\n\n private renderSetpointBlock(): TemplateResult {\n return this.renderBlock({\n variant: ReadoutBlockVariant.setpoint,\n value: this.setpoint,\n valueSize: this.setpointSize,\n // Value and setpoint share the enhanced colour state (both neutral\n // or both enhanced); the setpoint is bold only while emphasised.\n enhanced: this.rowEnhanced,\n weight: this.setpointWeight,\n hintedZeros: this.setpointOptions?.hintedZeros ?? false,\n hasSignSpacer: this.setpointOptions?.hasSignSpacer ?? false,\n spaceReserver: this.setpointOptions?.spaceReserver,\n touching: this.setpointTouching,\n hidePhase: this.setpointHidePhase,\n dataQuality: this.setpointOptions?.dataQuality,\n alert: this.setpointOptions?.alert,\n });\n }\n\n /**\n * The value reading: the value block and its degree column (or spacer)\n * grouped in one relatively-positioned wrapper so the value alert frame AND\n * the value data-quality chip can wrap both together. Unlike\n * `obc-readout-list-item` the unit is not part of the reading — it lives in\n * the label/unit meta zone.\n */\n private renderValueReading(): TemplateResult {\n return html`\n <div\n class=${classMap({\n 'value-reading': true,\n ...this.dataQualityClasses(this.valueOptions?.dataQuality),\n })}\n part=\"value-reading\"\n >\n ${this.renderBlock({\n variant: ReadoutBlockVariant.value,\n value: this.value,\n valueType: this.valueType,\n valueSize: this.valueSize,\n enhanced: this.rowEnhanced,\n weight: this.valueWeight,\n hintedZeros: this.valueOptions?.hintedZeros ?? false,\n hasSignSpacer: this.valueOptions?.hasSignSpacer ?? false,\n spaceReserver: this.valueOptions?.spaceReserver,\n off: this.off,\n hasIcon: this.valueOptions?.hasIcon ?? false,\n })}\n ${this.renderDegreeColumn()} ${this.renderValueAlertOverlay()}\n </div>\n `;\n }\n\n /**\n * The value alert frame, drawn as a pure overlay around the value reading\n * (value + degree). It reserves no space — the `obc-alert-frame` sits in an\n * absolutely-positioned box offset outward (see `.value-alert-overlay` in the\n * CSS) so its stroke is centred on the 4px/2px padding line and toggling it\n * never shifts content. Renders only when `valueOptions.alert` is a config\n * object.\n */\n private renderValueAlertOverlay(): TemplateResult | typeof nothing {\n const alert = this.valueOptions?.alert;\n if (typeof alert !== 'object' || alert === null) {\n return nothing;\n }\n const thickness = alert.thickness ?? ObcAlertFrameThickness.Small;\n return html`\n <div\n class=${classMap({\n 'value-alert-overlay': true,\n // The outward offset is thickness-dependent (see the CSS): large frames\n // draw a wider outline, so the box must sit further out to stay centred.\n 'thickness-large': thickness === ObcAlertFrameThickness.Large,\n })}\n aria-hidden=\"true\"\n >\n <obc-alert-frame\n part=\"value-alert-frame\"\n .type=${alert.type ?? ObcAlertFrameType.Regular}\n .thickness=${thickness}\n .status=${alert.status ?? AlertType.Alarm}\n .mode=${alert.mode ?? ObcAlertFrameMode.ackedActive}\n .flashingSpeed=${alert.flashingSpeed ?? FlashingSpeed.Default}\n .showIcon=${alert.showIcon ?? false}\n .showAlertCategoryIcon=${alert.showAlertCategoryIcon ?? true}\n .wrapContent=${false}\n .fullWidth=${false}\n ></obc-alert-frame>\n </div>\n `;\n }\n\n /** The label/unit meta zone; `stacking` picks the inline or stacked arrangement. */\n private renderMetaZone(): TemplateResult | typeof nothing {\n if (!this.label && !this.unit) {\n return nothing;\n }\n // Horizontal readouts always stack the label over the unit beside the value.\n const stacked =\n this.isHorizontal || this.resolvedStacking === ReadoutStacking.stacked;\n return html`\n <div\n class=${classMap({\n meta: true,\n 'meta-inline': !stacked,\n 'meta-stacked': stacked,\n 'label-only': !!this.label && !this.unit,\n 'unit-only': !!this.unit && !this.label,\n })}\n part=\"meta-wrapper\"\n >\n ${this.hasLeadingIcon\n ? html`<span class=\"leading-icon\" aria-hidden=\"true\"\n ><slot name=\"leading-icon\"></slot\n ></span>`\n : nothing}\n <div class=\"meta-labels\" part=\"meta-labels\">\n ${this.label\n ? this.renderTextbox(\n 'label',\n this.label,\n this.labelOptions?.spaceReserver\n )\n : nothing}\n ${this.unit\n ? this.renderTextbox(\n 'unit',\n this.unit,\n this.unitOptions?.spaceReserver\n )\n : nothing}\n </div>\n </div>\n `;\n }\n\n private renderSourceContent(): TemplateResult {\n const interaction = this.resolvedSourceInteraction;\n const src = this.src ?? '';\n\n // The interactive variants keep the source's per-block state: the\n // data-quality chip moves onto the button and the alert frame wraps it,\n // matching the plain-text branch (renderTextbox) below.\n const buttonClasses = classMap({\n 'source-button': true,\n ...this.dataQualityClasses(this.srcOptions?.dataQuality),\n });\n\n if (interaction === ReadoutSourceInteraction.picker) {\n const button = html`\n <obc-button\n class=${buttonClasses}\n variant=\"flat\"\n .fullWidth=${false}\n showTrailingIcon\n @click=${() => {\n this.sourcePickerContentVisible = !this.sourcePickerContentVisible;\n }}\n >\n <obi-drop-down-google slot=\"trailing-icon\"></obi-drop-down-google>\n ${src}\n </obc-button>\n `;\n return wrapWithAlertFrame(this.srcOptions?.alert ?? false, button);\n }\n\n if (interaction === ReadoutSourceInteraction.flyout) {\n const button = html`\n <obc-button\n class=${buttonClasses}\n variant=\"flat\"\n .fullWidth=${false}\n showTrailingIcon\n @click=${() => {\n this.dispatchEvent(\n new CustomEvent('source-flyout-click', {\n bubbles: true,\n composed: true,\n detail: {src},\n })\n );\n }}\n >\n <obi-chevron-right-google\n slot=\"trailing-icon\"\n ></obi-chevron-right-google>\n ${src}\n </obc-button>\n `;\n return wrapWithAlertFrame(this.srcOptions?.alert ?? false, button);\n }\n\n return this.renderSourceBlock(src);\n }\n\n /**\n * The plain (non-interactive) source: the textbox plus its optional state\n * chip and deviation line. The regular no-deviation case renders the bare\n * textbox; a state or deviation wraps it in the `.source-block` stack. The\n * picker / flyout button variants do not carry state / deviation yet —\n * TODO(designer): undefined in the 6.1 sheets.\n */\n private renderSourceBlock(src: string): TemplateResult {\n const state = this.srcOptions?.state ?? ReadoutSourceState.regular;\n const deviation = this.srcOptions?.deviation;\n const hasDeviation = deviation !== undefined && Number.isFinite(deviation);\n const box = this.renderTextbox(\n 'source',\n src,\n this.srcOptions?.spaceReserver,\n this.srcOptions\n );\n if (state === ReadoutSourceState.regular && !hasDeviation) {\n return box;\n }\n return html`\n <div\n class=${classMap({\n 'source-block': true,\n [`source-state-${state}`]: state !== ReadoutSourceState.regular,\n })}\n part=\"source-block\"\n >\n ${box}\n ${hasDeviation\n ? html`<span class=\"source-deviation\">\n <obi-delta aria-hidden=\"true\"></obi-delta>\n <obc-textbox\n class=\"source-deviation-value\"\n .size=${ObcTextboxSize.xs}\n .tabularNums=${true}\n alignment=\"left\"\n >${deviation}</obc-textbox\n >\n </span>`\n : nothing}\n </div>\n `;\n }\n\n /**\n * The source row (vertical) / segment (horizontal). Only the horizontal\n * direction draws an auto divider before the source — the Figma 6.1 review\n * (node 95:24490 \"remove dividers\", 95:26891 \"Source-divider are there\")\n * keeps the vertical source row divider-free while the horizontal flow\n * separates the source with a vertical rule.\n */\n private renderSource(): TemplateResult | typeof nothing {\n if (!this.hasSrc) {\n return nothing;\n }\n return html`\n ${this.isHorizontal\n ? html`<div\n class=\"divider divider-vertical\"\n part=\"divider\"\n aria-hidden=\"true\"\n ></div>`\n : nothing}\n <div class=\"source-row\" part=\"source-wrapper\">\n ${this.renderSourceContent()}\n </div>\n `;\n }\n\n // ---------- Source picker (context menu built from src-picker-content) ----------\n\n private getSourcePickerNavigationItems(): HTMLElement[] {\n const assignedElements =\n this.sourcePickerSlot?.assignedElements({flatten: true}) ?? [];\n\n return assignedElements.flatMap((element) => {\n if (!(element instanceof HTMLElement)) {\n return [];\n }\n if (element.localName === 'obc-navigation-item') {\n return [element];\n }\n return Array.from(\n element.querySelectorAll<HTMLElement>('obc-navigation-item')\n );\n });\n }\n\n private createSourcePickerOptionIcon(element: HTMLElement) {\n const iconElement = element.querySelector('[slot=\"icon\"]');\n if (!(iconElement instanceof HTMLElement)) {\n return undefined;\n }\n return html`${iconElement.cloneNode(true)}`;\n }\n\n private getSourcePickerItemInfo(item: HTMLElement, index: number) {\n const itemWithValues = item as HTMLElement & {\n label?: string;\n value?: string;\n };\n const itemLabel = itemWithValues.label || item.getAttribute('label') || '';\n const itemValue =\n item.getAttribute('data-value') ||\n itemWithValues.value ||\n item.getAttribute('value') ||\n itemLabel ||\n `source-option-${index}`;\n\n return {itemLabel, itemValue};\n }\n\n private findSourcePickerOptionElement(value: string) {\n const navigationItems = this.getSourcePickerNavigationItems();\n for (const [index, item] of navigationItems.entries()) {\n const {itemValue} = this.getSourcePickerItemInfo(item, index);\n if (itemValue === value) {\n return item;\n }\n }\n return undefined;\n }\n\n private syncSourcePickerOptions = () => {\n this.sourcePickerOptions = this.getSourcePickerNavigationItems().map(\n (item, index) => {\n const {itemLabel, itemValue} = this.getSourcePickerItemInfo(\n item,\n index\n );\n return {\n value: itemValue,\n label: itemLabel,\n icon: this.createSourcePickerOptionIcon(item),\n };\n }\n );\n };\n\n private handleSourcePickerItemClick(\n event: ObcContextMenuInputItemClickEvent\n ) {\n this.dispatchEvent(\n new CustomEvent('source-change', {\n bubbles: true,\n composed: true,\n detail: {\n value: event.detail.value,\n label: event.detail.option?.label,\n },\n })\n );\n this.findSourcePickerOptionElement(event.detail.value)?.click();\n this.sourcePickerContentVisible = false;\n }\n\n /**\n * The context menu highlights options by their VALUE, while `src` holds the\n * displayed source text — which may be an option's label when the two\n * differ (e.g. `data-value=\"gps-1\"` with label \"GPS 1\"). Resolve the current\n * source to the matching option's value (by value or label) so the open\n * picker always highlights the active source.\n */\n private get selectedSourceValues(): string[] {\n if (!this.src) {\n return [];\n }\n const match = this.sourcePickerOptions.find(\n (option) => option.value === this.src || option.label === this.src\n );\n return [match?.value ?? this.src];\n }\n\n private renderSourcePickerContent(): TemplateResult | typeof nothing {\n if (\n this.resolvedSourceInteraction !== ReadoutSourceInteraction.picker ||\n !this.sourcePickerContentVisible\n ) {\n return nothing;\n }\n return html`\n <obc-context-menu-input\n .type=${ContextMenuType.Regular}\n .options=${this.sourcePickerOptions}\n .selectedValues=${this.selectedSourceValues}\n class=\"source-picker-content\"\n @item-click=${this.handleSourcePickerItemClick}\n @close=${() => {\n this.sourcePickerContentVisible = false;\n }}\n ></obc-context-menu-input>\n `;\n }\n\n private renderSourcePickerSlot(): TemplateResult {\n return html`\n <slot\n name=\"src-picker-content\"\n hidden\n @slotchange=${this.syncSourcePickerOptions}\n ></slot>\n `;\n }\n\n // ---------- Layouts ----------\n\n /**\n * An invisible primary-size duplicate of a dynamic setpoint row's content,\n * stacked under the visible block in the same grid cell purely to reserve\n * width. With both rows permanently holding their emphasised width, the\n * widest row — and therefore the readout's total width — stays constant\n * while a flip-flop swaps the value/setpoint sizes, while a touch swap\n * runs, and while a pop-up setpoint fades out, so the meta zone and source\n * never shift. This is the vertical analogue of the horizontal arrangement,\n * where the swapped pair sits on one row and its summed width is constant\n * by construction (the designer's flip-flop invariant). Only the vertical\n * direction needs it; `always-visible` layouts are untouched.\n */\n private renderSetpointWidthReserve(\n kind: 'setpoint' | 'value'\n ): TemplateResult | typeof nothing {\n if (!this.hasDynamicSetpoint || this.isHorizontal) {\n return nothing;\n }\n const content =\n kind === 'setpoint'\n ? this.renderBlock({\n variant: ReadoutBlockVariant.setpoint,\n value: this.setpoint,\n valueSize: this.primarySize,\n enhanced: false,\n // The emphasised setpoint is SemiBold — reserve its widest form.\n // No degree: the visible setpoint block carries none (the degree\n // renders on the actual value only), so the ghost mirrors it.\n weight: ObcTextboxFontWeight.semibold,\n hintedZeros: this.setpointOptions?.hintedZeros ?? false,\n hasSignSpacer: this.setpointOptions?.hasSignSpacer ?? false,\n spaceReserver: this.setpointOptions?.spaceReserver,\n alert: this.setpointOptions?.alert,\n ghost: true,\n })\n : html`${this.renderBlock({\n variant: ReadoutBlockVariant.value,\n value: this.value,\n valueType: this.valueType,\n valueSize: this.primarySize,\n enhanced: false,\n weight: this.valueWeight,\n hintedZeros: this.valueOptions?.hintedZeros ?? false,\n hasSignSpacer: this.valueOptions?.hasSignSpacer ?? false,\n spaceReserver: this.valueOptions?.spaceReserver,\n off: this.off,\n hasIcon: this.valueOptions?.hasIcon ?? false,\n ghost: true,\n })}${this.renderDegreeColumn(this.primarySize)}`;\n return html`<div class=\"setpoint-width-reserve\" aria-hidden=\"true\">\n ${content}\n </div>`;\n }\n\n /**\n * Vertical: advice / setpoint / value rows right-aligned in a cluster, the\n * label+unit meta zone below, then the source row under an auto divider.\n * `alignment` re-aligns the whole column for stacked readouts.\n */\n private renderVerticalLayout(): TemplateResult {\n return html`\n <div class=\"value-cluster\" part=\"value-cluster\">\n ${this.hasAdvice\n ? html`<div class=\"advice-row\" part=\"advice-wrapper\">\n ${this.renderAdviceBlock()}\n </div>`\n : nothing}\n ${this.hasSetpoint\n ? html`<div class=\"setpoint-row\" part=\"setpoint-wrapper\">\n ${this.renderSetpointBlock()}\n ${this.renderSetpointWidthReserve('setpoint')}\n </div>`\n : nothing}\n ${this.hasValue\n ? html`<div class=\"value-row\" part=\"value-wrapper\">\n ${this.renderValueReading()}\n ${this.renderSetpointWidthReserve('value')}\n </div>`\n : nothing}\n </div>\n ${this.renderMetaZone()} ${this.renderSource()}\n `;\n }\n\n /**\n * Horizontal: advice, setpoint, value and the stacked label/unit meta flow on\n * one cap-height-aligned row, with the source at the end after an auto\n * divider.\n */\n private renderHorizontalLayout(): TemplateResult {\n return html`\n <div class=\"inline-row\" part=\"value-cluster\">\n ${this.hasAdvice\n ? html`<div class=\"advice-row\" part=\"advice-wrapper\">\n ${this.renderAdviceBlock()}\n </div>`\n : nothing}\n ${this.hasSetpoint\n ? html`<div class=\"setpoint-row\" part=\"setpoint-wrapper\">\n ${this.renderSetpointBlock()}\n </div>`\n : nothing}\n ${this.hasValue\n ? html`<div class=\"value-row\" part=\"value-wrapper\">\n ${this.renderValueReading()}\n </div>`\n : nothing}\n ${this.renderMetaZone()} ${this.renderSource()}\n </div>\n `;\n }\n\n protected override willUpdate(changed: Map<string, unknown>): void {\n super.willUpdate(changed);\n // Never gate this on `changed`: a throw clears Lit's changed map, so the\n // next update would skip the check and render the invalid value as a dash\n // (readout-components.md § 1, pinned by readout-block.spec.ts).\n assertReadoutValueType('obc-readout', this.value, this.valueType);\n assertReadoutFractionDigits('obc-readout', this.fractionDigits);\n this.warnHorizontalSizeIgnored();\n }\n\n /**\n * A horizontal readout discards any `size` but `large` (see `resolvedSize`).\n * A silent discard is indistinguishable from a bug to a consumer, so each\n * offending element says so once and logs itself for locating (#1182).\n * A removed `size` attribute arrives as `null` and counts as unset.\n */\n private warnHorizontalSizeIgnored(): void {\n if (\n this.hasWarnedHorizontalSize ||\n !this.isHorizontal ||\n !this.size ||\n this.size === ReadoutSize.large\n ) {\n return;\n }\n this.hasWarnedHorizontalSize = true;\n console.warn(\n `[obc-readout] size=\"${this.size}\" is ignored when direction=\"horizontal\": ` +\n 'the horizontal arrangement exists in the large tier only. Remove the ' +\n 'size, or use direction=\"vertical\" for the small / medium tiers.',\n this\n );\n }\n\n override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n\n if (changed.has('sourcePickerContentVisible')) {\n if (this.sourcePickerContentVisible) {\n window.addEventListener('pointerdown', this.onWindowPointerDown, true);\n } else {\n window.removeEventListener(\n 'pointerdown',\n this.onWindowPointerDown,\n true\n );\n }\n }\n\n const firstUpdate = !this.hasCompletedFirstUpdate;\n this.hasCompletedFirstUpdate = true;\n\n // Pop-up: hide the setpoint shortly after the value reaches it. `touching`\n // and the non-pop-up modes keep the setpoint visible.\n if (!this.isPopUp || this.setpointTouching) {\n this.clearDeferredSetpointHide();\n return;\n }\n\n const shouldHide = this.hasSetpoint && this.isAtSetpoint;\n\n if (firstUpdate) {\n // Settle to the resting state on mount without animating.\n this.deferredSetpointHidePhase = shouldHide\n ? ReadoutBlockHidePhase.hidden\n : ReadoutBlockHidePhase.none;\n return;\n }\n\n if (!shouldHide) {\n this.clearDeferredSetpointHide();\n return;\n }\n\n if (this.deferredSetpointHidePhase !== ReadoutBlockHidePhase.none) {\n return;\n }\n\n this.deferredSetpointHidePhase = ReadoutBlockHidePhase.hiding;\n window.clearTimeout(this.deferredSetpointHideTimer);\n this.deferredSetpointHideTimer = window.setTimeout(() => {\n this.deferredSetpointHidePhase = ReadoutBlockHidePhase.hidden;\n this.deferredSetpointHideTimer = undefined;\n }, 100);\n }\n\n private clearDeferredSetpointHide(): void {\n if (this.deferredSetpointHidePhase !== ReadoutBlockHidePhase.none) {\n this.deferredSetpointHidePhase = ReadoutBlockHidePhase.none;\n }\n window.clearTimeout(this.deferredSetpointHideTimer);\n this.deferredSetpointHideTimer = undefined;\n }\n\n override disconnectedCallback(): void {\n window.removeEventListener('pointerdown', this.onWindowPointerDown, true);\n window.clearTimeout(this.deferredSetpointHideTimer);\n this.deferredSetpointHideTimer = undefined;\n // Settle a mid-flight hide to its end state. Without this, disconnecting\n // during the 100ms window leaves the phase stuck at 'hiding' (the timer that\n // would advance it to 'hidden' is gone), so a later reconnect never resolves.\n if (this.deferredSetpointHidePhase === ReadoutBlockHidePhase.hiding) {\n this.deferredSetpointHidePhase = ReadoutBlockHidePhase.hidden;\n }\n super.disconnectedCallback();\n }\n\n override render() {\n const dataQuality = this.dataQuality;\n const classes = classMap({\n readout: true,\n [`size-${this.resolvedSize}`]: true,\n [`direction-${this.resolvedDirection}`]: true,\n [`stacking-${this.resolvedStacking}`]: true,\n [`alignment-${this.resolvedAlignment}`]: true,\n [`priority-${this.resolvedPriority}`]: true,\n 'data-low-integrity': dataQuality === ReadoutDataQuality.lowIntegrity,\n 'data-invalid': dataQuality === ReadoutDataQuality.invalid,\n 'flip-flop': this.isFlipFlop,\n 'setpoint-dynamic': this.hasDynamicSetpoint,\n });\n\n const root = html`\n <div class=${classes} part=\"root\">\n ${this.isHorizontal\n ? this.renderHorizontalLayout()\n : this.renderVerticalLayout()}\n ${this.renderSourcePickerSlot()}\n </div>\n ${this.renderSourcePickerContent()}\n `;\n\n // `alert` accepts `boolean` (so the generated Angular wrapper's widened\n // `boolean` type assigns cleanly), but `wrapWithAlertFrame` ignores\n // non-object truthy values. Normalise `true` → a default frame `{}` so it\n // isn't a silent no-op; `false`/object pass through. The frame hugs the\n // readout (no fullWidth), matching the previous behaviour.\n const alert = this.alert === true ? {} : this.alert;\n return wrapWithAlertFrame(alert, root);\n }\n\n static override styles = unsafeCSS(componentStyle);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'obc-readout': ObcReadout;\n }\n}\n"],"names":["ReadoutDirection","ReadoutStacking","ReadoutAlignment","ReadoutSourceInteraction","state"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"readout-list-item.d.ts","sourceRoot":"","sources":["../../../src/navigation-instruments/readout-list-item/readout-list-item.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"readout-list-item.d.ts","sourceRoot":"","sources":["../../../src/navigation-instruments/readout-list-item/readout-list-item.ts"],"names":[],"mappings":"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"}