@oicl/openbridge-webcomponents-full-bundle 2.0.0-next.111 → 2.0.0-next.113

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 (85) hide show
  1. package/bundle/openbridge-webcomponents.bundle.js +185 -29
  2. package/bundle/openbridge-webcomponents.bundle.js.map +1 -1
  3. package/custom-elements.json +180 -21
  4. package/dist/building-blocks/readout-block/readout-block.d.ts +29 -5
  5. package/dist/building-blocks/readout-block/readout-block.d.ts.map +1 -1
  6. package/dist/building-blocks/readout-block/readout-block.js +21 -7
  7. package/dist/building-blocks/readout-block/readout-block.js.map +1 -1
  8. package/dist/navigation-instruments/compass/compass.d.ts +1 -1
  9. package/dist/navigation-instruments/compass/compass.d.ts.map +1 -1
  10. package/dist/navigation-instruments/compass/compass.js +1 -1
  11. package/dist/navigation-instruments/compass/compass.js.map +1 -1
  12. package/dist/navigation-instruments/current/current.d.ts +25 -0
  13. package/dist/navigation-instruments/current/current.d.ts.map +1 -1
  14. package/dist/navigation-instruments/current/current.js +25 -4
  15. package/dist/navigation-instruments/current/current.js.map +1 -1
  16. package/dist/navigation-instruments/heading/heading.js +1 -1
  17. package/dist/navigation-instruments/heading/heading.js.map +1 -1
  18. package/dist/navigation-instruments/pitch-roll-heave/pitch-roll-heave.d.ts +6 -0
  19. package/dist/navigation-instruments/pitch-roll-heave/pitch-roll-heave.d.ts.map +1 -1
  20. package/dist/navigation-instruments/pitch-roll-heave/pitch-roll-heave.js +8 -1
  21. package/dist/navigation-instruments/pitch-roll-heave/pitch-roll-heave.js.map +1 -1
  22. package/dist/navigation-instruments/rate-of-turn/rate-of-turn.d.ts +5 -2
  23. package/dist/navigation-instruments/rate-of-turn/rate-of-turn.d.ts.map +1 -1
  24. package/dist/navigation-instruments/rate-of-turn/rate-of-turn.js.map +1 -1
  25. package/dist/navigation-instruments/readout/readout-formatters.d.ts +31 -0
  26. package/dist/navigation-instruments/readout/readout-formatters.d.ts.map +1 -1
  27. package/dist/navigation-instruments/readout/readout-formatters.js +55 -1
  28. package/dist/navigation-instruments/readout/readout-formatters.js.map +1 -1
  29. package/dist/navigation-instruments/readout/readout.d.ts +26 -1
  30. package/dist/navigation-instruments/readout/readout.d.ts.map +1 -1
  31. package/dist/navigation-instruments/readout/readout.js +16 -3
  32. package/dist/navigation-instruments/readout/readout.js.map +1 -1
  33. package/dist/navigation-instruments/readout-list/readout-list.d.ts +6 -1
  34. package/dist/navigation-instruments/readout-list/readout-list.d.ts.map +1 -1
  35. package/dist/navigation-instruments/readout-list/readout-list.js +21 -4
  36. package/dist/navigation-instruments/readout-list/readout-list.js.map +1 -1
  37. package/dist/navigation-instruments/readout-list-item/readout-list-item.d.ts +26 -1
  38. package/dist/navigation-instruments/readout-list-item/readout-list-item.d.ts.map +1 -1
  39. package/dist/navigation-instruments/readout-list-item/readout-list-item.js +15 -3
  40. package/dist/navigation-instruments/readout-list-item/readout-list-item.js.map +1 -1
  41. package/dist/navigation-instruments/top-view-propulsion/top-view-propulsion.d.ts +6 -0
  42. package/dist/navigation-instruments/top-view-propulsion/top-view-propulsion.d.ts.map +1 -1
  43. package/dist/navigation-instruments/top-view-propulsion/top-view-propulsion.js +19 -4
  44. package/dist/navigation-instruments/top-view-propulsion/top-view-propulsion.js.map +1 -1
  45. package/dist/navigation-instruments/watch/environment.d.ts +8 -0
  46. package/dist/navigation-instruments/watch/environment.d.ts.map +1 -1
  47. package/dist/navigation-instruments/watch/environment.js +3 -0
  48. package/dist/navigation-instruments/watch/environment.js.map +1 -1
  49. package/dist/navigation-instruments/watch/force-pattern.d.ts +20 -2
  50. package/dist/navigation-instruments/watch/force-pattern.d.ts.map +1 -1
  51. package/dist/navigation-instruments/watch/force-pattern.js +12 -5
  52. package/dist/navigation-instruments/watch/force-pattern.js.map +1 -1
  53. package/dist/navigation-instruments/watch/watch.d.ts.map +1 -1
  54. package/dist/navigation-instruments/watch/watch.js +6 -4
  55. package/dist/navigation-instruments/watch/watch.js.map +1 -1
  56. package/dist/navigation-instruments/wind/wind.d.ts +5 -2
  57. package/dist/navigation-instruments/wind/wind.d.ts.map +1 -1
  58. package/dist/navigation-instruments/wind/wind.js +5 -1
  59. package/dist/navigation-instruments/wind/wind.js.map +1 -1
  60. package/package.json +1 -1
  61. package/src/building-blocks/readout-block/readout-block.stories.ts +112 -3
  62. package/src/building-blocks/readout-block/readout-block.ts +64 -10
  63. package/src/navigation-instruments/compass/compass.ts +2 -2
  64. package/src/navigation-instruments/current/current.stories.ts +33 -0
  65. package/src/navigation-instruments/current/current.ts +37 -3
  66. package/src/navigation-instruments/heading/heading.stories.ts +6 -4
  67. package/src/navigation-instruments/heading/heading.ts +1 -1
  68. package/src/navigation-instruments/pitch-roll-heave/pitch-roll-heave.ts +8 -1
  69. package/src/navigation-instruments/rate-of-turn/rate-of-turn.stories.ts +3 -3
  70. package/src/navigation-instruments/rate-of-turn/rate-of-turn.ts +5 -2
  71. package/src/navigation-instruments/readout/readout-formatters.spec.ts +229 -0
  72. package/src/navigation-instruments/readout/readout-formatters.ts +105 -0
  73. package/src/navigation-instruments/readout/readout.stories.ts +167 -3
  74. package/src/navigation-instruments/readout/readout.ts +52 -4
  75. package/src/navigation-instruments/readout-list/readout-list.stories.ts +122 -1
  76. package/src/navigation-instruments/readout-list/readout-list.ts +54 -5
  77. package/src/navigation-instruments/readout-list-item/readout-list-item.stories.ts +124 -4
  78. package/src/navigation-instruments/readout-list-item/readout-list-item.ts +53 -4
  79. package/src/navigation-instruments/top-view-propulsion/top-view-propulsion.ts +20 -2
  80. package/src/navigation-instruments/watch/environment.ts +10 -0
  81. package/src/navigation-instruments/watch/force-pattern.spec.ts +42 -0
  82. package/src/navigation-instruments/watch/force-pattern.ts +44 -7
  83. package/src/navigation-instruments/watch/watch.ts +20 -5
  84. package/src/navigation-instruments/wind/wind.spec.ts +3 -1
  85. package/src/navigation-instruments/wind/wind.ts +12 -3
@@ -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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"}
@@ -5,6 +5,7 @@ import componentStyle from "./readout-list-item.css.js";
5
5
  import { customElement } from "../../decorator.js";
6
6
  import { ObcTextboxFontWeight, ObcTextboxSize } from "../../components/textbox/textbox.js";
7
7
  import { ReadoutBlockHidePhase, ReadoutBlockSize, ReadoutBlockVariant, ReadoutBlockDataQuality } from "../../building-blocks/readout-block/readout-block.js";
8
+ import { ReadoutValueType, resolveReadoutNumericValue, assertReadoutValueType } from "../readout/readout-formatters.js";
8
9
  import { isDisplayedAtSetpoint, readoutPrimarySize, readoutSecondarySize, readoutSetpointWeight, readoutNumericFormatOptions, readoutDataQualityClasses, resolveSetpointHidePhase } from "../readout/readout-shared.js";
9
10
  import { wrapWithAlertFrame, ObcAlertFrameThickness, ObcAlertFrameType, ObcAlertFrameMode } from "../../components/alert-frame/alert-frame.js";
10
11
  import { AlertType } from "../../types.js";
@@ -48,6 +49,7 @@ let ObcReadoutListItem = class extends LitElement {
48
49
  super(...arguments);
49
50
  this.hasValue = true;
50
51
  this.value = null;
52
+ this.valueType = ReadoutValueType.number;
51
53
  this.off = false;
52
54
  this.offText = "OFF";
53
55
  this.hasSetpoint = false;
@@ -99,7 +101,7 @@ let ObcReadoutListItem = class extends LitElement {
99
101
  return false;
100
102
  }
101
103
  return isDisplayedAtSetpoint(
102
- this.value,
104
+ resolveReadoutNumericValue(this.value, this.valueType) ?? null,
103
105
  this.setpoint,
104
106
  this.numericFormatOptions(this.resolvedMaxDigits)
105
107
  );
@@ -192,6 +194,7 @@ let ObcReadoutListItem = class extends LitElement {
192
194
  exportparts="block, block-content, block-text, block-icon, degree"
193
195
  .variant=${config.variant}
194
196
  .value=${config.value ?? null}
197
+ .valueType=${config.valueType ?? ReadoutValueType.number}
195
198
  .size=${this.resolvedSize}
196
199
  .valueSize=${config.valueSize}
197
200
  .enhanced=${config.enhanced}
@@ -377,6 +380,7 @@ let ObcReadoutListItem = class extends LitElement {
377
380
  ${this.hasValue ? this.renderBlock({
378
381
  variant: ReadoutBlockVariant.value,
379
382
  value: this.value,
383
+ valueType: this.valueType,
380
384
  valueSize: this.valueSize,
381
385
  enhanced: this.rowEnhanced,
382
386
  weight: this.valueWeight,
@@ -492,6 +496,10 @@ let ObcReadoutListItem = class extends LitElement {
492
496
  </div>
493
497
  `;
494
498
  }
499
+ willUpdate(changed) {
500
+ super.willUpdate(changed);
501
+ assertReadoutValueType("obc-readout-list-item", this.value, this.valueType);
502
+ }
495
503
  updated(changed) {
496
504
  super.updated(changed);
497
505
  const firstUpdate = !this.hasCompletedFirstUpdate;
@@ -572,8 +580,11 @@ __decorateClass([
572
580
  property({ type: Boolean, attribute: false })
573
581
  ], ObcReadoutListItem.prototype, "hasValue", 2);
574
582
  __decorateClass([
575
- property({ type: Number })
583
+ property({ type: String })
576
584
  ], ObcReadoutListItem.prototype, "value", 2);
585
+ __decorateClass([
586
+ property({ type: String })
587
+ ], ObcReadoutListItem.prototype, "valueType", 2);
577
588
  __decorateClass([
578
589
  property({ type: Boolean })
579
590
  ], ObcReadoutListItem.prototype, "off", 2);
@@ -657,6 +668,7 @@ export {
657
668
  ReadoutListItemPriority,
658
669
  ReadoutListItemSetpointInteraction,
659
670
  ReadoutListItemSize,
660
- ReadoutListItemStacking
671
+ ReadoutListItemStacking,
672
+ ReadoutValueType
661
673
  };
662
674
  //# sourceMappingURL=readout-list-item.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"readout-list-item.js","sources":["../../../src/navigation-instruments/readout-list-item/readout-list-item.ts"],"sourcesContent":["import {LitElement, html, nothing, unsafeCSS, type TemplateResult} from 'lit';\nimport {property, state} from 'lit/decorators.js';\nimport {classMap} from 'lit/directives/class-map.js';\nimport componentStyle from './readout-list-item.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} from '../../building-blocks/readout-block/readout-block.js';\nimport {type ReadoutNumericFormatOptions} from '../readout/readout-formatters.js';\nimport {\n isDisplayedAtSetpoint,\n readoutNumericFormatOptions,\n readoutPrimarySize,\n readoutSecondarySize,\n readoutSetpointWeight,\n readoutDataQualityClasses,\n resolveSetpointHidePhase,\n} from '../readout/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';\n\n// The value weight maps straight to obc-textbox's font weights (regular /\n// semibold / bold). Re-exported so consumers can set `valueOptions.weight`\n// without a second import path.\nexport {ObcTextboxFontWeight} from '../../components/textbox/textbox.js';\n\n/**\n * Density/size scale of the readout row (an alias of `ReadoutBlockSize`).\n * - `small`: regular value typography (smallest, densest).\n * - `medium`: medium value typography.\n * - `large`: large value typography.\n */\nexport const ReadoutListItemSize = ReadoutBlockSize;\nexport type ReadoutListItemSize = ReadoutBlockSize;\n\n/**\n * Placement of the unit/source relative to the label and value.\n * - `trailing-unit`: unit after the value, source after a trailing divider.\n * - `leading-unit`: unit beside/under the label.\n * - `leading-src`: source beside/under the label (no trailing source).\n */\nexport enum ReadoutListItemStacking {\n trailingUnit = 'trailing-unit',\n leadingUnit = 'leading-unit',\n leadingSrc = 'leading-src',\n}\n\n/**\n * Colour emphasis of the value.\n * - `regular`: neutral.\n * - `enhanced`: accented (in-command) colour.\n */\nexport enum ReadoutListItemPriority {\n regular = 'regular',\n enhanced = 'enhanced',\n}\n\n/**\n * Measurement quality of the value (an alias of `ReadoutBlockDataQuality`).\n * Orthogonal to the row-level `alert` – a low-integrity or invalid value can\n * also sit inside an alert frame.\n */\nexport const ReadoutListItemDataQuality = ReadoutBlockDataQuality;\nexport type ReadoutListItemDataQuality = ReadoutBlockDataQuality;\n\n/**\n * Corner style of the interactive (clickable) surface.\n * - `squared` (default): no rounding (true rectangle).\n * - `round-corners`: larger rounded corners.\n * - `round`: fully rounded (pill).\n */\nexport enum ReadoutListItemBorder {\n squared = 'squared',\n round = 'round',\n roundCorners = 'round-corners',\n}\n\nexport interface ReadoutListItemClickable {\n border?: ReadoutListItemBorder;\n}\n\n/**\n * Per-block state shared by value / setpoint / advice / src. Each is independent\n * of (and nests inside) the row-level `dataQuality` / `alert` props. All\n * combinations are allowed.\n */\nexport interface ReadoutBlockState {\n /** Per-block measurement quality (low-integrity / invalid). */\n dataQuality?: ReadoutListItemDataQuality;\n /** Per-block alert frame; nests inside any row-level alert frame. */\n alert?: false | AlertFrameConfig;\n}\n\n/**\n * Per-value options. Unlike setpoint/advice, the value's `alert` frame AND\n * `dataQuality` chip wrap the whole reading — value (+ value-icon) + degree +\n * trailing unit — rather than the value alone. The alert frame is a pure overlay\n * (4px/2px padding, stroke centred on that line); the data-quality chip reuses\n * the block chip's `outline` styling with no extra padding. Neither shifts\n * content or changes the row height / column alignment (Figma 58:10120).\n */\nexport interface ReadoutValueOptions extends ReadoutBlockState {\n /** Render the unfilled leading positions as muted zeroes (requires `maxDigits`). */\n hintedZeros?: boolean;\n /**\n * Value font weight — `regular` (default), `semibold`, or `bold` (the\n * obc-textbox weights). Affects weight only; it does NOT change the colour\n * (colour is driven by `priority`).\n */\n weight?: ObcTextboxFontWeight;\n /** Show the `value-icon` slot before the value. */\n hasIcon?: boolean;\n /**\n * Longest value string to reserve width for (e.g. `\"0000.0\"`), so rows align\n * across different value lengths / `fractionDigits` — set the same value on\n * every row. Combined with the `maxDigits`/`fractionDigits`-derived reserve by\n * taking whichever is **wider**, so it never reserves less than the formatted\n * value needs.\n */\n spaceReserver?: string;\n}\n\n/**\n * How the setpoint segment behaves relative to the value.\n * - `always-visible` (default): the setpoint is always shown.\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 enum ReadoutListItemSetpointInteraction {\n alwaysVisible = 'always-visible',\n flipFlop = 'flip-flop',\n popUp = 'pop-up',\n}\n\nexport interface ReadoutSetpointOptions extends ReadoutBlockState {\n hintedZeros?: boolean;\n /** How the setpoint behaves relative to the value (default `always-visible`). */\n interaction?: ReadoutListItemSetpointInteraction;\n /**\n * The user is physically interacting with (adjusting) the setpoint — the\n * \"focus\" visual state. Same convention as `touching` on the instrument\n * setpoint marker (`SetpointMixin` / `svghelpers/setpoint.ts`): keeps the\n * setpoint visible and shows the lighter-blue focus triangle.\n */\n touching?: boolean;\n /** Longest value string to reserve width for; see {@link ReadoutValueOptions.spaceReserver}. */\n spaceReserver?: string;\n}\n\nexport interface ReadoutAdviceOptions extends ReadoutBlockState {\n hintedZeros?: boolean;\n /** Longest value string to reserve width for; see {@link ReadoutValueOptions.spaceReserver}. */\n spaceReserver?: string;\n}\n\nexport interface ReadoutReserverOptions {\n /** Longest expected string to reserve width for (aligns multiple rows), e.g. `\"miles\"`. */\n spaceReserver?: string;\n}\n\nexport interface ReadoutSrcOptions extends ReadoutBlockState {\n /** Longest expected source string to reserve width for; see {@link ReadoutReserverOptions.spaceReserver}. */\n spaceReserver?: string;\n}\n\n/**\n * `<obc-readout-list-item>` – A compact, dense readout row for lists and tables.\n *\n * Renders a label, an optional source, an optional unit, and up to three\n * cap-height \"readout building blocks\" – advice, setpoint, and value – each a\n * fixed-width-reservable numeric segment. Dynamic data is passed as top-level\n * primitives (`value`, `setpoint`, `advice`, `label`, `unit`, `src`). Global\n * layout/format is configured via top-level props (`size`, `priority`,\n * `stacking`, `hasDegree`, `dataQuality`, `alert`, …) and per-block tweaks via one\n * object per block (`valueOptions`, `setpointOptions`, `adviceOptions`,\n * `unitOptions`, `srcOptions`).\n *\n * ### Features\n * - **Building blocks:** value, optional setpoint, and optional advice segments,\n * each cap-height-aligned and able to reserve a stable width.\n * - **Sizes:** `small`, `medium`, `large` density scales.\n * - **Stacking:** `trailing-unit`, `leading-unit`, `leading-src` placement.\n * - **Priority:** `regular`/`enhanced` colour emphasis; per-value `weight`\n * (`regular`/`semibold`/`bold`) is independent of colour.\n * - **Setpoint flip-flop:** swaps emphasis between value and setpoint as the\n * value reaches the setpoint.\n * - **Data quality:** `low-integrity`/`invalid` styling, combinable with `alert`.\n * - **Alert frame:** optional `alert` wrapper (caution/warning/alarm/level).\n * - **Clickable:** optionally rendered as a focusable button with `squared`,\n * `round-corners`, or `round` corners.\n * - **Formatting:** shared `fractionDigits`, width reservation via `maxDigits`\n * and per-segment `hintedZeros`; a `null` value renders a dash (`-`).\n *\n * ### Usage Guidelines\n * Use for dense readout rows in lists/tables. Prefer `<obc-readout>` for rich\n * multi-segment instrument layouts, source pickers, or flyout behaviour.\n *\n * @experimental This component is the pilot for the new primitives + per-block\n * options Readout API; its API may change in a future release.\n *\n * ### Slots\n * | Slot Name | Renders When | Purpose |\n * |---------------|-------------------------------|------------------------------------------|\n * | leading-icon | `hasLeadingIcon` | Icon before the label. |\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 *\n * @slot leading-icon - Icon before the label.\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 */\n@customElement('obc-readout-list-item')\nexport class ObcReadoutListItem 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 /**\n * Layout switch: `false` renders a deliberately value-less (label-only)\n * row that hugs its remaining parts. For a temporarily missing value keep\n * `hasValue` and set `value` to `null` instead — the dash keeps the value\n * block at full size, so the row does not shift when data arrives.\n */\n @property({type: Boolean, attribute: false}) hasValue = true;\n @property({type: Number}) value: number | null = null;\n /** Render the value as `offText` (e.g. equipment powered down). Affects the value only. */\n @property({type: Boolean}) off = false;\n /** Text shown in place of the value when `off` is true. @availableWhen off==true */\n @property({type: String}) offText = 'OFF';\n\n @property({type: Boolean}) hasSetpoint = false;\n /** @availableWhen hasSetpoint==true */\n @property({type: Number}) setpoint?: number;\n\n @property({type: Boolean}) hasAdvice = false;\n /** @availableWhen hasAdvice==true */\n @property({type: Number}) advice?: number;\n\n // Global layout/format (each defaults via its `resolved*` getter where useful).\n @property({type: String}) size?: ReadoutListItemSize;\n @property({type: String}) priority?: ReadoutListItemPriority;\n @property({type: String}) stacking?: ReadoutListItemStacking;\n @property({type: Object}) clickable: boolean | ReadoutListItemClickable =\n false;\n @property({type: Boolean}) hasLeadingIcon = false;\n @property({type: Boolean}) hasDegree = false;\n @property({type: Boolean}) hasDegreeSpacer = false;\n @property({type: Number}) fractionDigits = 0;\n @property({type: Number}) maxDigits = 0;\n @property({type: String}) dataQuality?: ReadoutListItemDataQuality;\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}) unitOptions?: ReadoutReserverOptions;\n @property({type: Object}) srcOptions?: ReadoutSrcOptions;\n\n /**\n * Development aid: outline the readout building blocks (red), the degree\n * columns (blue) and the degree spacer (green) so reserver widths / alignment\n * are visible. Off by default.\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\n private get resolvedSize(): ReadoutListItemSize {\n return this.size ?? ReadoutListItemSize.small;\n }\n\n private get resolvedStacking(): ReadoutListItemStacking {\n return this.stacking ?? ReadoutListItemStacking.trailingUnit;\n }\n\n private get resolvedPriority(): ReadoutListItemPriority {\n return this.priority ?? ReadoutListItemPriority.regular;\n }\n\n private get resolvedFractionDigits(): number {\n return this.fractionDigits ?? 0;\n }\n\n private get resolvedMaxDigits(): number {\n return this.maxDigits ?? 0;\n }\n\n private get resolvedClickable(): false | Required<ReadoutListItemClickable> {\n const clickable = this.clickable;\n if (!clickable) {\n return false;\n }\n if (clickable === true) {\n return {border: ReadoutListItemBorder.squared};\n }\n return {border: clickable.border ?? ReadoutListItemBorder.squared};\n }\n\n private get isAtSetpoint(): boolean {\n if (!this.hasSetpoint) {\n return false;\n }\n return isDisplayedAtSetpoint(\n this.value,\n this.setpoint,\n this.numericFormatOptions(this.resolvedMaxDigits)\n );\n }\n\n private get resolvedSetpointInteraction(): ReadoutListItemSetpointInteraction {\n return (\n this.setpointOptions?.interaction ??\n ReadoutListItemSetpointInteraction.alwaysVisible\n );\n }\n\n private get isFlipFlop(): boolean {\n return (\n this.resolvedSetpointInteraction ===\n ReadoutListItemSetpointInteraction.flipFlop\n );\n }\n\n private get isPopUp(): boolean {\n return (\n this.resolvedSetpointInteraction ===\n ReadoutListItemSetpointInteraction.popUp\n );\n }\n\n private get setpointTouching(): boolean {\n return this.setpointOptions?.touching ?? false;\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 row's enhanced (in-command) colour state, applied uniformly to BOTH the\n * value and the setpoint — they are always either both neutral or both enhanced\n * (never a blue setpoint next to a grey value). Driven by `priority` only;\n * `valueOptions.weight` changes weight, not colour.\n */\n private get rowEnhanced(): boolean {\n return this.resolvedPriority === ReadoutListItemPriority.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. So \"grab the setpoint\" shrinks the value for\n // the whole adjustment (initiate + move read the same: setpoint big, value\n // small), mirroring the flip-flop convention.\n if (this.isSetpointEmphasized) {\n return this.secondarySize;\n }\n return this.primarySize;\n }\n\n private get setpointSize(): ObcTextboxSize {\n return this.isSetpointEmphasized ? this.primarySize : this.secondarySize;\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 /** 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: ReadoutListItemDataQuality | undefined\n ): Record<string, boolean> {\n return readoutDataQualityClasses(dataQuality);\n }\n\n /**\n * Forward the matching list-item 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 | null | undefined;\n valueSize: ObcTextboxSize;\n enhanced: boolean;\n weight: ObcTextboxFontWeight;\n hintedZeros: 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 }): TemplateResult {\n // The block owns the formatting, hinted zeros, reserver, degree and icon; the\n // row keeps the density tier (`size`) and the resolved per-block number size\n // (`valueSize`) so flip-flop/pop-up emphasis stays a row 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 .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.resolvedFractionDigits}\n .maxDigits=${this.resolvedMaxDigits}\n .hintedZeros=${config.hintedZeros}\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 >\n ${this.renderForwardedIcon(config.variant)}\n </obc-readout-block>\n `;\n }\n\n /**\n * A cap-height `°` column whose width scales with the value size. Used after\n * the value (as the value↔unit boundary, via {@link renderValueUnitGap}) and\n * inside the setpoint / advice blocks. `inherit` makes the glyph take the\n * surrounding block's colour (setpoint/advice); otherwise it uses the value\n * colour, optionally `enhanced`.\n */\n private renderDegreeGlyph(\n size: ObcTextboxSize,\n opts: {enhanced?: boolean; inherit?: boolean} = {}\n ): TemplateResult {\n return html`\n <span\n class=${classMap({\n 'degree-column': true,\n [`degree-${size}`]: true,\n 'tone-enhanced': !opts.inherit && Boolean(opts.enhanced),\n 'degree-inherit': Boolean(opts.inherit),\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 gap rendered between the value digits and the unit.\n *\n * - `hasDegree`: a cap-height `°` column whose width scales with the value\n * size (the `°` replaces the default gap).\n * - otherwise: the default 2px gap (only when a trailing unit follows).\n *\n * `hasDegreeSpacer` deliberately does NOT add anything here — it keeps the 2px\n * gap and instead widens the unit column via {@link renderDegreeSpacer} (a\n * spacer AFTER the unit). That way a non-degree row's value digits stay\n * aligned with degree rows (degree column width = spacer width + 2px gap)\n * while its unit shifts left. Mirrors Figma `1:2920` (spacer) / `1:2970`\n * (degree).\n *\n * TODO(designer): cross-size alignment is deferred. Degree rows of different\n * value sizes have different `°` column widths (6/8/12px), so their value digit\n * edges stagger by `degree-width`. For degree rows of mixed sizes you cannot\n * align the value digit edges AND keep the unit column aligned — resolving it\n * needs a design decision (a constant degree reserve, which widens the smaller\n * rows' `°`, OR pinning the value edge and letting the unit column stagger).\n */\n private renderValueUnitGap(): TemplateResult | typeof nothing {\n if (!this.hasValue) {\n return nothing;\n }\n const hasTrailingUnit =\n Boolean(this.unit) &&\n this.resolvedStacking !== ReadoutListItemStacking.leadingUnit;\n\n if ((this.hasDegree ?? false) && !this.off) {\n return this.renderDegreeGlyph(this.valueSize, {\n enhanced: this.rowEnhanced,\n });\n }\n if (hasTrailingUnit) {\n return html`<span class=\"value-unit-gap\" aria-hidden=\"true\"></span>`;\n }\n return nothing;\n }\n\n /**\n * A spacer rendered AFTER the unit when `hasDegreeSpacer` is set on a\n * non-degree row. Its width (`degree-compensation-padding`) = the degree\n * column width minus the 2px gap, so the row's value digits align with degree\n * rows in the same column while its unit shifts left. See\n * {@link renderValueUnitGap}.\n */\n private renderDegreeSpacer(): TemplateResult | typeof nothing {\n const hasDegree = this.hasDegree ?? false;\n const hasDegreeSpacer = this.hasDegreeSpacer ?? false;\n if (hasDegree || !hasDegreeSpacer) {\n return nothing;\n }\n return html`<span\n class=\"degree-spacer\"\n part=\"degree-spacer\"\n aria-hidden=\"true\"\n ></span>`;\n }\n\n private renderTextbox(\n role: 'label' | 'unit' | 'source',\n text: string,\n reserver?: string,\n state?: ReadoutBlockState\n ): TemplateResult {\n const weight =\n role === 'label'\n ? ObcTextboxFontWeight.semibold\n : ObcTextboxFontWeight.regular;\n const box = html`\n <obc-textbox\n class=${classMap({\n [role]: true,\n ...this.dataQualityClasses(state?.dataQuality),\n })}\n part=${role}\n .size=${ObcTextboxSize.xs}\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(state?.alert ?? false, box);\n }\n\n private renderValueCluster(): TemplateResult {\n const popUpAtSetpoint =\n this.isPopUp && this.isAtSetpoint && !this.setpointTouching;\n const setpointHidePhase = resolveSetpointHidePhase(\n popUpAtSetpoint,\n this.deferredSetpointHidePhase\n );\n return html`\n <div class=\"value-cluster\" part=\"value-cluster\">\n ${this.hasAdvice\n ? 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 spaceReserver: this.adviceOptions?.spaceReserver,\n hasDegree: this.hasDegree ?? false,\n dataQuality: this.adviceOptions?.dataQuality,\n alert: this.adviceOptions?.alert,\n })\n : nothing}\n ${this.hasSetpoint\n ? 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 spaceReserver: this.setpointOptions?.spaceReserver,\n hasDegree: this.hasDegree ?? false,\n touching: this.setpointTouching,\n hidePhase: setpointHidePhase,\n dataQuality: this.setpointOptions?.dataQuality,\n alert: this.setpointOptions?.alert,\n })\n : nothing}\n ${this.renderValueReading()}\n </div>\n `;\n }\n\n /**\n * The value reading: the value block, its degree column and the trailing unit\n * grouped in one relatively-positioned wrapper so the value alert frame AND the\n * value data-quality chip can wrap value + degree + unit together (Figma\n * 58:10120).\n *\n * Moving the degree / unit into this wrapper (the new last child of\n * `.value-cluster`) preserves every existing gap, so the underlying content\n * stays column-aligned with or without the frame / chip. Both the value alert\n * (overlay) and the value data-quality chip are applied here — NOT inside\n * `obc-readout-block` — so they extend over the unit; setpoint/advice keep their\n * own block-level frame and chip. The chip uses `outline` (not `border`), so it\n * never shifts the value's width / column alignment.\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.hasValue\n ? this.renderBlock({\n variant: ReadoutBlockVariant.value,\n value: this.value,\n valueSize: this.valueSize,\n enhanced: this.rowEnhanced,\n weight: this.valueWeight,\n hintedZeros: this.valueOptions?.hintedZeros ?? false,\n spaceReserver: this.valueOptions?.spaceReserver,\n off: this.off,\n hasIcon: this.valueOptions?.hasIcon ?? false,\n })\n : nothing}\n ${this.renderValueUnitGap()}\n <div class=\"unit-area\" part=\"unit-area\">\n ${this.renderTrailingUnit()} ${this.renderDegreeSpacer()}\n </div>\n ${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 + unit). It reserves no space — the `obc-alert-frame` sits in\n * an absolutely-positioned box offset outward (see `.value-alert-overlay` in\n * the CSS) so its stroke is centred on the 4px/2px padding line and toggling it\n * never shifts content or row height. Renders only when `valueOptions.alert` is\n * a config 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 private renderLabelContainer(): TemplateResult {\n const stacking = this.resolvedStacking;\n const showLeadingUnit =\n stacking === ReadoutListItemStacking.leadingUnit && Boolean(this.unit);\n const showLeadingSrc =\n stacking === ReadoutListItemStacking.leadingSrc && Boolean(this.src);\n\n return html`\n <div class=\"label-container\" part=\"label-container\">\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=\"label-stack\" part=\"label-stack\">\n ${this.label ? this.renderTextbox('label', this.label) : nothing}\n ${showLeadingUnit\n ? this.renderTextbox(\n 'unit',\n this.unit ?? '',\n this.unitOptions?.spaceReserver\n )\n : nothing}\n ${showLeadingSrc\n ? this.renderTextbox(\n 'source',\n this.src ?? '',\n this.srcOptions?.spaceReserver,\n this.srcOptions\n )\n : nothing}\n </div>\n </div>\n `;\n }\n\n private renderTrailingUnit(): TemplateResult | typeof nothing {\n if (\n this.resolvedStacking === ReadoutListItemStacking.leadingUnit ||\n !this.unit\n ) {\n return nothing;\n }\n return this.renderTextbox(\n 'unit',\n this.unit,\n this.unitOptions?.spaceReserver\n );\n }\n\n private renderTrailingSource(): TemplateResult | typeof nothing {\n if (\n this.resolvedStacking === ReadoutListItemStacking.leadingSrc ||\n !this.src\n ) {\n return nothing;\n }\n return html`\n <div class=\"divider\" part=\"divider\" aria-hidden=\"true\"></div>\n ${this.renderTextbox(\n 'source',\n this.src,\n this.srcOptions?.spaceReserver,\n this.srcOptions\n )}\n `;\n }\n\n private renderContent(): TemplateResult {\n return html`\n <div class=\"content\" part=\"content\">\n ${this.renderLabelContainer()}\n <div class=\"value-area\" part=\"value-area\">\n ${this.renderValueCluster()}\n </div>\n ${this.renderTrailingSource()}\n </div>\n `;\n }\n\n override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\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.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 clickable = this.resolvedClickable;\n const dataQuality = this.dataQuality;\n const classes = classMap({\n root: true,\n [`size-${this.resolvedSize}`]: true,\n [`stacking-${this.resolvedStacking}`]: true,\n [`priority-${this.resolvedPriority}`]: true,\n 'data-low-integrity':\n dataQuality === ReadoutListItemDataQuality.lowIntegrity,\n 'data-invalid': dataQuality === ReadoutListItemDataQuality.invalid,\n 'flip-flop': this.isFlipFlop,\n clickable: Boolean(clickable),\n [`border-${clickable ? clickable.border : ReadoutListItemBorder.squared}`]:\n Boolean(clickable),\n });\n\n const surface = html`<div class=\"surface\" part=\"surface\">\n ${this.renderContent()}\n </div>`;\n\n // No `aria-label` here: it would override the button's accessible name and\n // hide the dynamic readout text (value / unit / source) from screen readers.\n // The visible content (label + value + unit + source) already forms a\n // complete accessible name; icons/reservers are aria-hidden / visibility-clipped.\n const root = clickable\n ? html`<button class=${classes} part=\"root\" type=\"button\">\n ${surface}\n </button>`\n : html`<div class=${classes} part=\"root\">${surface}</div>`;\n\n // `alert` accepts `boolean` (so the generated Angular wrapper's widened\n // `boolean` type assigns cleanly), but `wrapWithAlertFrame` ignores non-object\n // truthy values. Normalise `true` → a default frame `{}` (like `clickable:\n // true`) so it isn't a silent no-op; `false`/object pass through.\n // fullWidth=true: the row-level alert frame stretches to the readout's full\n // width (PR #1001) rather than hugging it. Per-block / src alert frames keep\n // the default (hug) so they stay inline.\n const alert = this.alert === true ? {} : this.alert;\n return wrapWithAlertFrame(alert, root, true);\n }\n\n static override styles = unsafeCSS(componentStyle);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'obc-readout-list-item': ObcReadoutListItem;\n }\n}\n"],"names":["ReadoutListItemStacking","ReadoutListItemPriority","ReadoutListItemBorder","ReadoutListItemSetpointInteraction","state"],"mappings":";;;;;;;;;;;;;;;;;;;;AA+CO,MAAM,sBAAsB;AAS5B,IAAK,4CAAAA,6BAAL;AACLA,2BAAA,cAAA,IAAe;AACfA,2BAAA,aAAA,IAAc;AACdA,2BAAA,YAAA,IAAa;AAHH,SAAAA;AAAA,GAAA,2BAAA,CAAA,CAAA;AAWL,IAAK,4CAAAC,6BAAL;AACLA,2BAAA,SAAA,IAAU;AACVA,2BAAA,UAAA,IAAW;AAFD,SAAAA;AAAA,GAAA,2BAAA,CAAA,CAAA;AAUL,MAAM,6BAA6B;AASnC,IAAK,0CAAAC,2BAAL;AACLA,yBAAA,SAAA,IAAU;AACVA,yBAAA,OAAA,IAAQ;AACRA,yBAAA,cAAA,IAAe;AAHL,SAAAA;AAAA,GAAA,yBAAA,CAAA,CAAA;AA2DL,IAAK,uDAAAC,wCAAL;AACLA,sCAAA,eAAA,IAAgB;AAChBA,sCAAA,UAAA,IAAW;AACXA,sCAAA,OAAA,IAAQ;AAHE,SAAAA;AAAA,GAAA,sCAAA,CAAA,CAAA;AAsFL,IAAM,qBAAN,cAAiC,WAAW;AAAA,EAA5C,cAAA;AAAA,UAAA,GAAA,SAAA;AAYwC,SAAA,WAAW;AAC9B,SAAA,QAAuB;AAEtB,SAAA,MAAM;AAEP,SAAA,UAAU;AAET,SAAA,cAAc;AAId,SAAA,YAAY;AAQb,SAAA,YACxB;AACyB,SAAA,iBAAiB;AACjB,SAAA,YAAY;AACZ,SAAA,kBAAkB;AACnB,SAAA,iBAAiB;AACjB,SAAA,YAAY;AAMZ,SAAA,QAAoC;AAcpB,SAAA,mBAAmB;AAGpD,SAAQ,4BACf,sBAAsB;AAExB,SAAQ,0BAA0B;AAAA,EAAA;AAAA,EAElC,IAAY,eAAoC;AAC9C,WAAO,KAAK,QAAQ,oBAAoB;AAAA,EAC1C;AAAA,EAEA,IAAY,mBAA4C;AACtD,WAAO,KAAK,YAAY;AAAA,EAC1B;AAAA,EAEA,IAAY,mBAA4C;AACtD,WAAO,KAAK,YAAY;AAAA,EAC1B;AAAA,EAEA,IAAY,yBAAiC;AAC3C,WAAO,KAAK,kBAAkB;AAAA,EAChC;AAAA,EAEA,IAAY,oBAA4B;AACtC,WAAO,KAAK,aAAa;AAAA,EAC3B;AAAA,EAEA,IAAY,oBAAgE;AAC1E,UAAM,YAAY,KAAK;AACvB,QAAI,CAAC,WAAW;AACd,aAAO;AAAA,IACT;AACA,QAAI,cAAc,MAAM;AACtB,aAAO;AAAA,QAAC,QAAQ;AAAA;AAAA,MAAA;AAAA,IAClB;AACA,WAAO;AAAA,MAAC,QAAQ,UAAU,UAAU;AAAA;AAAA,IAAA;AAAA,EACtC;AAAA,EAEA,IAAY,eAAwB;AAClC,QAAI,CAAC,KAAK,aAAa;AACrB,aAAO;AAAA,IACT;AACA,WAAO;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK,qBAAqB,KAAK,iBAAiB;AAAA,IAAA;AAAA,EAEpD;AAAA,EAEA,IAAY,8BAAkE;AAC5E,WACE,KAAK,iBAAiB,eACtB;AAAA,EAEJ;AAAA,EAEA,IAAY,aAAsB;AAChC,WACE,KAAK,gCACL;AAAA,EAEJ;AAAA,EAEA,IAAY,UAAmB;AAC7B,WACE,KAAK,gCACL;AAAA,EAEJ;AAAA,EAEA,IAAY,mBAA4B;AACtC,WAAO,KAAK,iBAAiB,YAAY;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAY,uBAAgC;AAC1C,QAAI,CAAC,KAAK,aAAa;AACrB,aAAO;AAAA,IACT;AACA,QAAI,KAAK,kBAAkB;AACzB,aAAO;AAAA,IACT;AACA,WAAO,KAAK,cAAc,CAAC,KAAK;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAY,cAAuB;AACjC,WAAO,KAAK,qBAAqB;AAAA,EACnC;AAAA;AAAA,EAGA,IAAY,cAA8B;AACxC,WAAO,mBAAmB,KAAK,YAAY;AAAA,EAC7C;AAAA;AAAA,EAGA,IAAY,gBAAgC;AAC1C,WAAO,qBAAqB,KAAK,YAAY;AAAA,EAC/C;AAAA,EAEA,IAAY,YAA4B;AAMtC,QAAI,KAAK,sBAAsB;AAC7B,aAAO,KAAK;AAAA,IACd;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAY,eAA+B;AACzC,WAAO,KAAK,uBAAuB,KAAK,cAAc,KAAK;AAAA,EAC7D;AAAA;AAAA,EAGA,IAAY,cAAoC;AAC9C,WAAO,KAAK,cAAc,UAAU,qBAAqB;AAAA,EAC3D;AAAA;AAAA,EAGA,IAAY,iBAAuC;AACjD,WAAO,sBAAsB,KAAK,oBAAoB;AAAA,EACxD;AAAA,EAEQ,qBAAqB,WAAgD;AAC3E,WAAO,4BAA4B,WAAW,KAAK,sBAAsB;AAAA,EAC3E;AAAA;AAAA,EAGQ,mBACN,aACyB;AACzB,WAAO,0BAA0B,WAAW;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,oBAAoB,SAA8C;AACxE,QAAI,YAAY,oBAAoB,UAAU;AAC5C,aAAO;AAAA,IACT;AACA,QAAI,YAAY,oBAAoB,QAAQ;AAC1C,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,YAAY,QAeD;AAIjB,WAAO;AAAA;AAAA;AAAA,mBAGQ,OAAO,OAAO;AAAA,iBAChB,OAAO,SAAS,IAAI;AAAA,gBACrB,KAAK,YAAY;AAAA,qBACZ,OAAO,SAAS;AAAA,oBACjB,OAAO,QAAQ;AAAA,kBACjB,OAAO,MAAM;AAAA,qBACV,OAAO,aAAa,KAAK;AAAA,mBAC3B,OAAO,WAAW,KAAK;AAAA,0BAChB,KAAK,sBAAsB;AAAA,qBAChC,KAAK,iBAAiB;AAAA,uBACpB,OAAO,WAAW;AAAA,yBAChB,OAAO,aAAa;AAAA,eAC9B,OAAO,OAAO,KAAK;AAAA,mBACf,KAAK,OAAO;AAAA,oBACX,OAAO,YAAY,KAAK;AAAA,qBACvB,OAAO,aAAa,sBAAsB,IAAI;AAAA,uBAC5C,OAAO,WAAW;AAAA,iBACxB,OAAO,SAAS,KAAK;AAAA;AAAA,UAE5B,KAAK,oBAAoB,OAAO,OAAO,CAAC;AAAA;AAAA;AAAA,EAGhD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,kBACN,MACA,OAAgD,IAChC;AAChB,WAAO;AAAA;AAAA,gBAEK,SAAS;AAAA,MACf,iBAAiB;AAAA,MACjB,CAAC,UAAU,IAAI,EAAE,GAAG;AAAA,MACpB,iBAAiB,CAAC,KAAK,WAAW,QAAQ,KAAK,QAAQ;AAAA,MACvD,kBAAkB,QAAQ,KAAK,OAAO;AAAA,IAAA,CACvC,CAAC;AAAA;AAAA;AAAA,kDAGwC,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,EAKpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBQ,qBAAsD;AAC5D,QAAI,CAAC,KAAK,UAAU;AAClB,aAAO;AAAA,IACT;AACA,UAAM,kBACJ,QAAQ,KAAK,IAAI,KACjB,KAAK,qBAAqB;AAE5B,SAAK,KAAK,aAAa,UAAU,CAAC,KAAK,KAAK;AAC1C,aAAO,KAAK,kBAAkB,KAAK,WAAW;AAAA,QAC5C,UAAU,KAAK;AAAA,MAAA,CAChB;AAAA,IACH;AACA,QAAI,iBAAiB;AACnB,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,qBAAsD;AAC5D,UAAM,YAAY,KAAK,aAAa;AACpC,UAAM,kBAAkB,KAAK,mBAAmB;AAChD,QAAI,aAAa,CAAC,iBAAiB;AACjC,aAAO;AAAA,IACT;AACA,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAKT;AAAA,EAEQ,cACN,MACA,MACA,UACAC,QACgB;AAChB,UAAM,SACJ,SAAS,UACL,qBAAqB,WACrB,qBAAqB;AAC3B,UAAM,MAAM;AAAA;AAAA,gBAEA,SAAS;AAAA,MACf,CAAC,IAAI,GAAG;AAAA,MACR,GAAG,KAAK,mBAAmBA,QAAO,WAAW;AAAA,IAAA,CAC9C,CAAC;AAAA,eACK,IAAI;AAAA,gBACH,eAAe,EAAE;AAAA,sBACX,MAAM;AAAA;AAAA;AAAA,UAGlB,IAAI;AAAA,UACJ,WAAW,2BAA2B,QAAQ,YAAY,OAAO;AAAA;AAAA;AAGvE,WAAO,mBAAmBA,QAAO,SAAS,OAAO,GAAG;AAAA,EACtD;AAAA,EAEQ,qBAAqC;AAC3C,UAAM,kBACJ,KAAK,WAAW,KAAK,gBAAgB,CAAC,KAAK;AAC7C,UAAM,oBAAoB;AAAA,MACxB;AAAA,MACA,KAAK;AAAA,IAAA;AAEP,WAAO;AAAA;AAAA,UAED,KAAK,YACH,KAAK,YAAY;AAAA,MACf,SAAS,oBAAoB;AAAA,MAC7B,OAAO,KAAK;AAAA,MACZ,WAAW,KAAK;AAAA,MAChB,UAAU;AAAA,MACV,QAAQ,qBAAqB;AAAA,MAC7B,aAAa,KAAK,eAAe,eAAe;AAAA,MAChD,eAAe,KAAK,eAAe;AAAA,MACnC,WAAW,KAAK,aAAa;AAAA,MAC7B,aAAa,KAAK,eAAe;AAAA,MACjC,OAAO,KAAK,eAAe;AAAA,IAAA,CAC5B,IACD,OAAO;AAAA,UACT,KAAK,cACH,KAAK,YAAY;AAAA,MACf,SAAS,oBAAoB;AAAA,MAC7B,OAAO,KAAK;AAAA,MACZ,WAAW,KAAK;AAAA;AAAA;AAAA,MAGhB,UAAU,KAAK;AAAA,MACf,QAAQ,KAAK;AAAA,MACb,aAAa,KAAK,iBAAiB,eAAe;AAAA,MAClD,eAAe,KAAK,iBAAiB;AAAA,MACrC,WAAW,KAAK,aAAa;AAAA,MAC7B,UAAU,KAAK;AAAA,MACf,WAAW;AAAA,MACX,aAAa,KAAK,iBAAiB;AAAA,MACnC,OAAO,KAAK,iBAAiB;AAAA,IAAA,CAC9B,IACD,OAAO;AAAA,UACT,KAAK,oBAAoB;AAAA;AAAA;AAAA,EAGjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBQ,qBAAqC;AAC3C,WAAO;AAAA;AAAA,gBAEK,SAAS;AAAA,MACf,iBAAiB;AAAA,MACjB,GAAG,KAAK,mBAAmB,KAAK,cAAc,WAAW;AAAA,IAAA,CAC1D,CAAC;AAAA;AAAA;AAAA,UAGA,KAAK,WACH,KAAK,YAAY;AAAA,MACf,SAAS,oBAAoB;AAAA,MAC7B,OAAO,KAAK;AAAA,MACZ,WAAW,KAAK;AAAA,MAChB,UAAU,KAAK;AAAA,MACf,QAAQ,KAAK;AAAA,MACb,aAAa,KAAK,cAAc,eAAe;AAAA,MAC/C,eAAe,KAAK,cAAc;AAAA,MAClC,KAAK,KAAK;AAAA,MACV,SAAS,KAAK,cAAc,WAAW;AAAA,IAAA,CACxC,IACD,OAAO;AAAA,UACT,KAAK,oBAAoB;AAAA;AAAA,YAEvB,KAAK,mBAAA,CAAoB,IAAI,KAAK,oBAAoB;AAAA;AAAA,UAExD,KAAK,yBAAyB;AAAA;AAAA;AAAA,EAGtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,0BAA2D;AACjE,UAAM,QAAQ,KAAK,cAAc;AACjC,QAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,aAAO;AAAA,IACT;AACA,UAAM,YAAY,MAAM,aAAa,uBAAuB;AAC5D,WAAO;AAAA;AAAA,gBAEK,SAAS;AAAA,MACf,uBAAuB;AAAA;AAAA;AAAA,MAGvB,mBAAmB,cAAc,uBAAuB;AAAA,IAAA,CACzD,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,kBAKQ,MAAM,QAAQ,kBAAkB,OAAO;AAAA,uBAClC,SAAS;AAAA,oBACZ,MAAM,UAAU,UAAU,KAAK;AAAA,kBACjC,MAAM,QAAQ,kBAAkB,WAAW;AAAA,sBACvC,MAAM,YAAY,KAAK;AAAA,mCACV,MAAM,yBAAyB,IAAI;AAAA,yBAC7C,KAAK;AAAA,uBACP,KAAK;AAAA;AAAA;AAAA;AAAA,EAI1B;AAAA,EAEQ,uBAAuC;AAC7C,UAAM,WAAW,KAAK;AACtB,UAAM,kBACJ,aAAa,kBAAuC,QAAQ,KAAK,IAAI;AACvE,UAAM,iBACJ,aAAa,iBAAsC,QAAQ,KAAK,GAAG;AAErE,WAAO;AAAA;AAAA,UAED,KAAK,iBACH;AAAA;AAAA,wBAGA,OAAO;AAAA;AAAA,YAEP,KAAK,QAAQ,KAAK,cAAc,SAAS,KAAK,KAAK,IAAI,OAAO;AAAA,YAC9D,kBACE,KAAK;AAAA,MACH;AAAA,MACA,KAAK,QAAQ;AAAA,MACb,KAAK,aAAa;AAAA,IAAA,IAEpB,OAAO;AAAA,YACT,iBACE,KAAK;AAAA,MACH;AAAA,MACA,KAAK,OAAO;AAAA,MACZ,KAAK,YAAY;AAAA,MACjB,KAAK;AAAA,IAAA,IAEP,OAAO;AAAA;AAAA;AAAA;AAAA,EAInB;AAAA,EAEQ,qBAAsD;AAC5D,QACE,KAAK,qBAAqB,kBAC1B,CAAC,KAAK,MACN;AACA,aAAO;AAAA,IACT;AACA,WAAO,KAAK;AAAA,MACV;AAAA,MACA,KAAK;AAAA,MACL,KAAK,aAAa;AAAA,IAAA;AAAA,EAEtB;AAAA,EAEQ,uBAAwD;AAC9D,QACE,KAAK,qBAAqB,iBAC1B,CAAC,KAAK,KACN;AACA,aAAO;AAAA,IACT;AACA,WAAO;AAAA;AAAA,QAEH,KAAK;AAAA,MACL;AAAA,MACA,KAAK;AAAA,MACL,KAAK,YAAY;AAAA,MACjB,KAAK;AAAA,IAAA,CACN;AAAA;AAAA,EAEL;AAAA,EAEQ,gBAAgC;AACtC,WAAO;AAAA;AAAA,UAED,KAAK,sBAAsB;AAAA;AAAA,YAEzB,KAAK,oBAAoB;AAAA;AAAA,UAE3B,KAAK,sBAAsB;AAAA;AAAA;AAAA,EAGnC;AAAA,EAES,QAAQ,SAAqC;AACpD,UAAM,QAAQ,OAAO;AAErB,UAAM,cAAc,CAAC,KAAK;AAC1B,SAAK,0BAA0B;AAI/B,QAAI,CAAC,KAAK,WAAW,KAAK,kBAAkB;AAC1C,WAAK,0BAAA;AACL;AAAA,IACF;AAEA,UAAM,aAAa,KAAK,eAAe,KAAK;AAE5C,QAAI,aAAa;AAEf,WAAK,4BAA4B,aAC7B,sBAAsB,SACtB,sBAAsB;AAC1B;AAAA,IACF;AAEA,QAAI,CAAC,YAAY;AACf,WAAK,0BAAA;AACL;AAAA,IACF;AAEA,QAAI,KAAK,8BAA8B,sBAAsB,MAAM;AACjE;AAAA,IACF;AAEA,SAAK,4BAA4B,sBAAsB;AACvD,WAAO,aAAa,KAAK,yBAAyB;AAClD,SAAK,4BAA4B,OAAO,WAAW,MAAM;AACvD,WAAK,4BAA4B,sBAAsB;AACvD,WAAK,4BAA4B;AAAA,IACnC,GAAG,GAAG;AAAA,EACR;AAAA,EAEQ,4BAAkC;AACxC,QAAI,KAAK,8BAA8B,sBAAsB,MAAM;AACjE,WAAK,4BAA4B,sBAAsB;AAAA,IACzD;AACA,WAAO,aAAa,KAAK,yBAAyB;AAClD,SAAK,4BAA4B;AAAA,EACnC;AAAA,EAES,uBAA6B;AACpC,WAAO,aAAa,KAAK,yBAAyB;AAClD,SAAK,4BAA4B;AAIjC,QAAI,KAAK,8BAA8B,sBAAsB,QAAQ;AACnE,WAAK,4BAA4B,sBAAsB;AAAA,IACzD;AACA,UAAM,qBAAA;AAAA,EACR;AAAA,EAES,SAAS;AAChB,UAAM,YAAY,KAAK;AACvB,UAAM,cAAc,KAAK;AACzB,UAAM,UAAU,SAAS;AAAA,MACvB,MAAM;AAAA,MACN,CAAC,QAAQ,KAAK,YAAY,EAAE,GAAG;AAAA,MAC/B,CAAC,YAAY,KAAK,gBAAgB,EAAE,GAAG;AAAA,MACvC,CAAC,YAAY,KAAK,gBAAgB,EAAE,GAAG;AAAA,MACvC,sBACE,gBAAgB,2BAA2B;AAAA,MAC7C,gBAAgB,gBAAgB,2BAA2B;AAAA,MAC3D,aAAa,KAAK;AAAA,MAClB,WAAW,QAAQ,SAAS;AAAA,MAC5B,CAAC,UAAU,YAAY,UAAU,SAAS,SAAA,EAA+B,GACvE,QAAQ,SAAS;AAAA,IAAA,CACpB;AAED,UAAM,UAAU;AAAA,QACZ,KAAK,eAAe;AAAA;AAOxB,UAAM,OAAO,YACT,qBAAqB,OAAO;AAAA,YACxB,OAAO;AAAA,qBAEX,kBAAkB,OAAO,gBAAgB,OAAO;AASpD,UAAM,QAAQ,KAAK,UAAU,OAAO,CAAA,IAAK,KAAK;AAC9C,WAAO,mBAAmB,OAAO,MAAM,IAAI;AAAA,EAC7C;AAGF;AAvrBa,mBAsrBK,SAAS,UAAU,cAAc;AAprBvB,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GAFb,mBAEe,WAAA,SAAA,CAAA;AACA,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GAHb,mBAGe,WAAA,QAAA,CAAA;AACA,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GAJb,mBAIe,WAAA,OAAA,CAAA;AAQmB,gBAAA;AAAA,EAA5C,SAAS,EAAC,MAAM,SAAS,WAAW,OAAM;AAAA,GAZhC,mBAYkC,WAAA,YAAA,CAAA;AACnB,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GAbb,mBAae,WAAA,SAAA,CAAA;AAEC,gBAAA;AAAA,EAA1B,SAAS,EAAC,MAAM,QAAA,CAAQ;AAAA,GAfd,mBAegB,WAAA,OAAA,CAAA;AAED,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GAjBb,mBAiBe,WAAA,WAAA,CAAA;AAEC,gBAAA;AAAA,EAA1B,SAAS,EAAC,MAAM,QAAA,CAAQ;AAAA,GAnBd,mBAmBgB,WAAA,eAAA,CAAA;AAED,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GArBb,mBAqBe,WAAA,YAAA,CAAA;AAEC,gBAAA;AAAA,EAA1B,SAAS,EAAC,MAAM,QAAA,CAAQ;AAAA,GAvBd,mBAuBgB,WAAA,aAAA,CAAA;AAED,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GAzBb,mBAyBe,WAAA,UAAA,CAAA;AAGA,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GA5Bb,mBA4Be,WAAA,QAAA,CAAA;AACA,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GA7Bb,mBA6Be,WAAA,YAAA,CAAA;AACA,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GA9Bb,mBA8Be,WAAA,YAAA,CAAA;AACA,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GA/Bb,mBA+Be,WAAA,aAAA,CAAA;AAEC,gBAAA;AAAA,EAA1B,SAAS,EAAC,MAAM,QAAA,CAAQ;AAAA,GAjCd,mBAiCgB,WAAA,kBAAA,CAAA;AACA,gBAAA;AAAA,EAA1B,SAAS,EAAC,MAAM,QAAA,CAAQ;AAAA,GAlCd,mBAkCgB,WAAA,aAAA,CAAA;AACA,gBAAA;AAAA,EAA1B,SAAS,EAAC,MAAM,QAAA,CAAQ;AAAA,GAnCd,mBAmCgB,WAAA,mBAAA,CAAA;AACD,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GApCb,mBAoCe,WAAA,kBAAA,CAAA;AACA,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GArCb,mBAqCe,WAAA,aAAA,CAAA;AACA,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GAtCb,mBAsCe,WAAA,eAAA,CAAA;AAKA,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GA3Cb,mBA2Ce,WAAA,SAAA,CAAA;AAGA,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GA9Cb,mBA8Ce,WAAA,gBAAA,CAAA;AACA,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GA/Cb,mBA+Ce,WAAA,mBAAA,CAAA;AACA,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GAhDb,mBAgDe,WAAA,iBAAA,CAAA;AACA,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GAjDb,mBAiDe,WAAA,eAAA,CAAA;AACA,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GAlDb,mBAkDe,WAAA,cAAA,CAAA;AAOgB,gBAAA;AAAA,EAAzC,SAAS,EAAC,MAAM,SAAS,SAAS,MAAK;AAAA,GAzD7B,mBAyD+B,WAAA,oBAAA,CAAA;AAGzB,gBAAA;AAAA,EAAhB,MAAA;AAAM,GA5DI,mBA4DM,WAAA,6BAAA,CAAA;AA5DN,qBAAN,gBAAA;AAAA,EADN,cAAc,uBAAuB;AAAA,GACzB,kBAAA;"}
1
+ {"version":3,"file":"readout-list-item.js","sources":["../../../src/navigation-instruments/readout-list-item/readout-list-item.ts"],"sourcesContent":["import {LitElement, html, nothing, unsafeCSS, type TemplateResult} from 'lit';\nimport {property, state} from 'lit/decorators.js';\nimport {classMap} from 'lit/directives/class-map.js';\nimport componentStyle from './readout-list-item.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} from '../../building-blocks/readout-block/readout-block.js';\nimport {\n assertReadoutValueType,\n resolveReadoutNumericValue,\n ReadoutValueType,\n type ReadoutNumericFormatOptions,\n} from '../readout/readout-formatters.js';\nimport {\n isDisplayedAtSetpoint,\n readoutNumericFormatOptions,\n readoutPrimarySize,\n readoutSecondarySize,\n readoutSetpointWeight,\n readoutDataQualityClasses,\n resolveSetpointHidePhase,\n} from '../readout/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';\n\n// The value weight maps straight to obc-textbox's font weights (regular /\n// semibold / bold). Re-exported so consumers can set `valueOptions.weight`\n// without a second import path.\nexport {ObcTextboxFontWeight} from '../../components/textbox/textbox.js';\n\n// Re-exported so consumers can type `valueType` without a second import path.\nexport {ReadoutValueType} from '../readout/readout-formatters.js';\n\n/**\n * Density/size scale of the readout row (an alias of `ReadoutBlockSize`).\n * - `small`: regular value typography (smallest, densest).\n * - `medium`: medium value typography.\n * - `large`: large value typography.\n */\nexport const ReadoutListItemSize = ReadoutBlockSize;\nexport type ReadoutListItemSize = ReadoutBlockSize;\n\n/**\n * Placement of the unit/source relative to the label and value.\n * - `trailing-unit`: unit after the value, source after a trailing divider.\n * - `leading-unit`: unit beside/under the label.\n * - `leading-src`: source beside/under the label (no trailing source).\n */\nexport enum ReadoutListItemStacking {\n trailingUnit = 'trailing-unit',\n leadingUnit = 'leading-unit',\n leadingSrc = 'leading-src',\n}\n\n/**\n * Colour emphasis of the value.\n * - `regular`: neutral.\n * - `enhanced`: accented (in-command) colour.\n */\nexport enum ReadoutListItemPriority {\n regular = 'regular',\n enhanced = 'enhanced',\n}\n\n/**\n * Measurement quality of the value (an alias of `ReadoutBlockDataQuality`).\n * Orthogonal to the row-level `alert` – a low-integrity or invalid value can\n * also sit inside an alert frame.\n */\nexport const ReadoutListItemDataQuality = ReadoutBlockDataQuality;\nexport type ReadoutListItemDataQuality = ReadoutBlockDataQuality;\n\n/**\n * Corner style of the interactive (clickable) surface.\n * - `squared` (default): no rounding (true rectangle).\n * - `round-corners`: larger rounded corners.\n * - `round`: fully rounded (pill).\n */\nexport enum ReadoutListItemBorder {\n squared = 'squared',\n round = 'round',\n roundCorners = 'round-corners',\n}\n\nexport interface ReadoutListItemClickable {\n border?: ReadoutListItemBorder;\n}\n\n/**\n * Per-block state shared by value / setpoint / advice / src. Each is independent\n * of (and nests inside) the row-level `dataQuality` / `alert` props. All\n * combinations are allowed.\n */\nexport interface ReadoutBlockState {\n /** Per-block measurement quality (low-integrity / invalid). */\n dataQuality?: ReadoutListItemDataQuality;\n /** Per-block alert frame; nests inside any row-level alert frame. */\n alert?: false | AlertFrameConfig;\n}\n\n/**\n * Per-value options. Unlike setpoint/advice, the value's `alert` frame AND\n * `dataQuality` chip wrap the whole reading — value (+ value-icon) + degree +\n * trailing unit — rather than the value alone. The alert frame is a pure overlay\n * (4px/2px padding, stroke centred on that line); the data-quality chip reuses\n * the block chip's `outline` styling with no extra padding. Neither shifts\n * content or changes the row height / column alignment (Figma 58:10120).\n */\nexport interface ReadoutValueOptions extends ReadoutBlockState {\n /** Render the unfilled leading positions as muted zeroes (requires `maxDigits`). */\n hintedZeros?: boolean;\n /**\n * Value font weight — `regular` (default), `semibold`, or `bold` (the\n * obc-textbox weights). Affects weight only; it does NOT change the colour\n * (colour is driven by `priority`).\n */\n weight?: ObcTextboxFontWeight;\n /** Show the `value-icon` slot before the value. */\n hasIcon?: boolean;\n /**\n * Longest value string to reserve width for (e.g. `\"0000.0\"`), so rows align\n * across different value lengths / `fractionDigits` — set the same value on\n * every row. Combined with the `maxDigits`/`fractionDigits`-derived reserve by\n * taking whichever is **wider**, so it never reserves less than the formatted\n * value needs.\n */\n spaceReserver?: string;\n}\n\n/**\n * How the setpoint segment behaves relative to the value.\n * - `always-visible` (default): the setpoint is always shown.\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 enum ReadoutListItemSetpointInteraction {\n alwaysVisible = 'always-visible',\n flipFlop = 'flip-flop',\n popUp = 'pop-up',\n}\n\nexport interface ReadoutSetpointOptions extends ReadoutBlockState {\n hintedZeros?: boolean;\n /** How the setpoint behaves relative to the value (default `always-visible`). */\n interaction?: ReadoutListItemSetpointInteraction;\n /**\n * The user is physically interacting with (adjusting) the setpoint — the\n * \"focus\" visual state. Same convention as `touching` on the instrument\n * setpoint marker (`SetpointMixin` / `svghelpers/setpoint.ts`): keeps the\n * setpoint visible and shows the lighter-blue focus triangle.\n */\n touching?: boolean;\n /** Longest value string to reserve width for; see {@link ReadoutValueOptions.spaceReserver}. */\n spaceReserver?: string;\n}\n\nexport interface ReadoutAdviceOptions extends ReadoutBlockState {\n hintedZeros?: boolean;\n /** Longest value string to reserve width for; see {@link ReadoutValueOptions.spaceReserver}. */\n spaceReserver?: string;\n}\n\nexport interface ReadoutReserverOptions {\n /** Longest expected string to reserve width for (aligns multiple rows), e.g. `\"miles\"`. */\n spaceReserver?: string;\n}\n\nexport interface ReadoutSrcOptions extends ReadoutBlockState {\n /** Longest expected source string to reserve width for; see {@link ReadoutReserverOptions.spaceReserver}. */\n spaceReserver?: string;\n}\n\n/**\n * `<obc-readout-list-item>` – A compact, dense readout row for lists and tables.\n *\n * Renders a label, an optional source, an optional unit, and up to three\n * cap-height \"readout building blocks\" – advice, setpoint, and value – each a\n * fixed-width-reservable numeric segment. Dynamic data is passed as top-level\n * primitives (`value`, `setpoint`, `advice`, `label`, `unit`, `src`). Global\n * layout/format is configured via top-level props (`size`, `priority`,\n * `stacking`, `hasDegree`, `dataQuality`, `alert`, …) and per-block tweaks via one\n * object per block (`valueOptions`, `setpointOptions`, `adviceOptions`,\n * `unitOptions`, `srcOptions`).\n *\n * ### Features\n * - **Building blocks:** value, optional setpoint, and optional advice segments,\n * each cap-height-aligned and able to reserve a stable width.\n * - **Sizes:** `small`, `medium`, `large` density scales.\n * - **Stacking:** `trailing-unit`, `leading-unit`, `leading-src` placement.\n * - **Priority:** `regular`/`enhanced` colour emphasis; per-value `weight`\n * (`regular`/`semibold`/`bold`) is independent of colour.\n * - **Setpoint flip-flop:** swaps emphasis between value and setpoint as the\n * value reaches the setpoint.\n * - **Data quality:** `low-integrity`/`invalid` styling, combinable with `alert`.\n * - **Alert frame:** optional `alert` wrapper (caution/warning/alarm/level).\n * - **Clickable:** optionally rendered as a focusable button with `squared`,\n * `round-corners`, or `round` corners.\n * - **Formatting:** shared `fractionDigits`, width reservation via `maxDigits`\n * and per-segment `hintedZeros`; a `null` value renders a dash (`-`).\n * - **Text values:** `valueType=\"text\"` renders `value` verbatim (e.g.\n * `\"Thermo On\"`) instead of formatting it as a number.\n *\n * ### Usage Guidelines\n * Use for dense readout rows in lists/tables. Prefer `<obc-readout>` for rich\n * multi-segment instrument layouts, source pickers, or flyout behaviour.\n *\n * @experimental This component is the pilot for the new primitives + per-block\n * options Readout API; its API may change in a future release.\n *\n * ### Slots\n * | Slot Name | Renders When | Purpose |\n * |---------------|-------------------------------|------------------------------------------|\n * | leading-icon | `hasLeadingIcon` | Icon before the label. |\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 *\n * @slot leading-icon - Icon before the label.\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 */\n@customElement('obc-readout-list-item')\nexport class ObcReadoutListItem 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 /**\n * Layout switch: `false` renders a deliberately value-less (label-only)\n * row that hugs its remaining parts. For a temporarily missing value keep\n * `hasValue` and set `value` to `null` instead — the dash keeps the value\n * block at full size, so the row does not shift when data arrives.\n */\n @property({type: Boolean, attribute: false}) hasValue = true;\n /**\n * The value; `null` renders a dash. A number by default, or text when\n * {@link valueType} is `text`.\n */\n @property({type: String}) value: number | string | null = null;\n /**\n * How {@link 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 */\n @property({type: String}) valueType: ReadoutValueType =\n ReadoutValueType.number;\n /** Render the value as `offText` (e.g. equipment powered down). Affects the value only. */\n @property({type: Boolean}) off = false;\n /** Text shown in place of the value when `off` is true. @availableWhen off==true */\n @property({type: String}) offText = 'OFF';\n\n @property({type: Boolean}) hasSetpoint = false;\n /** @availableWhen hasSetpoint==true */\n @property({type: Number}) setpoint?: number;\n\n @property({type: Boolean}) hasAdvice = false;\n /** @availableWhen hasAdvice==true */\n @property({type: Number}) advice?: number;\n\n // Global layout/format (each defaults via its `resolved*` getter where useful).\n @property({type: String}) size?: ReadoutListItemSize;\n @property({type: String}) priority?: ReadoutListItemPriority;\n @property({type: String}) stacking?: ReadoutListItemStacking;\n @property({type: Object}) clickable: boolean | ReadoutListItemClickable =\n false;\n @property({type: Boolean}) hasLeadingIcon = false;\n @property({type: Boolean}) hasDegree = false;\n @property({type: Boolean}) hasDegreeSpacer = false;\n /**\n * Also formats the numeric setpoint / advice blocks, which stay numeric\n * even when the value is text.\n * @availableWhen valueType==number || hasSetpoint==true || hasAdvice==true\n */\n @property({type: Number}) fractionDigits = 0;\n /**\n * Also formats the numeric setpoint / advice blocks, which stay numeric\n * even when the value is text.\n * @availableWhen valueType==number || hasSetpoint==true || hasAdvice==true\n */\n @property({type: Number}) maxDigits = 0;\n @property({type: String}) dataQuality?: ReadoutListItemDataQuality;\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}) unitOptions?: ReadoutReserverOptions;\n @property({type: Object}) srcOptions?: ReadoutSrcOptions;\n\n /**\n * Development aid: outline the readout building blocks (red), the degree\n * columns (blue) and the degree spacer (green) so reserver widths / alignment\n * are visible. Off by default.\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\n private get resolvedSize(): ReadoutListItemSize {\n return this.size ?? ReadoutListItemSize.small;\n }\n\n private get resolvedStacking(): ReadoutListItemStacking {\n return this.stacking ?? ReadoutListItemStacking.trailingUnit;\n }\n\n private get resolvedPriority(): ReadoutListItemPriority {\n return this.priority ?? ReadoutListItemPriority.regular;\n }\n\n private get resolvedFractionDigits(): number {\n return this.fractionDigits ?? 0;\n }\n\n private get resolvedMaxDigits(): number {\n return this.maxDigits ?? 0;\n }\n\n private get resolvedClickable(): false | Required<ReadoutListItemClickable> {\n const clickable = this.clickable;\n if (!clickable) {\n return false;\n }\n if (clickable === true) {\n return {border: ReadoutListItemBorder.squared};\n }\n return {border: clickable.border ?? ReadoutListItemBorder.squared};\n }\n\n private get isAtSetpoint(): boolean {\n if (!this.hasSetpoint) {\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(): ReadoutListItemSetpointInteraction {\n return (\n this.setpointOptions?.interaction ??\n ReadoutListItemSetpointInteraction.alwaysVisible\n );\n }\n\n private get isFlipFlop(): boolean {\n return (\n this.resolvedSetpointInteraction ===\n ReadoutListItemSetpointInteraction.flipFlop\n );\n }\n\n private get isPopUp(): boolean {\n return (\n this.resolvedSetpointInteraction ===\n ReadoutListItemSetpointInteraction.popUp\n );\n }\n\n private get setpointTouching(): boolean {\n return this.setpointOptions?.touching ?? false;\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 row's enhanced (in-command) colour state, applied uniformly to BOTH the\n * value and the setpoint — they are always either both neutral or both enhanced\n * (never a blue setpoint next to a grey value). Driven by `priority` only;\n * `valueOptions.weight` changes weight, not colour.\n */\n private get rowEnhanced(): boolean {\n return this.resolvedPriority === ReadoutListItemPriority.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. So \"grab the setpoint\" shrinks the value for\n // the whole adjustment (initiate + move read the same: setpoint big, value\n // small), mirroring the flip-flop convention.\n if (this.isSetpointEmphasized) {\n return this.secondarySize;\n }\n return this.primarySize;\n }\n\n private get setpointSize(): ObcTextboxSize {\n return this.isSetpointEmphasized ? this.primarySize : this.secondarySize;\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 /** 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: ReadoutListItemDataQuality | undefined\n ): Record<string, boolean> {\n return readoutDataQualityClasses(dataQuality);\n }\n\n /**\n * Forward the matching list-item 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 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 }): TemplateResult {\n // The block owns the formatting, hinted zeros, reserver, degree and icon; the\n // row keeps the density tier (`size`) and the resolved per-block number size\n // (`valueSize`) so flip-flop/pop-up emphasis stays a row 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.resolvedFractionDigits}\n .maxDigits=${this.resolvedMaxDigits}\n .hintedZeros=${config.hintedZeros}\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 >\n ${this.renderForwardedIcon(config.variant)}\n </obc-readout-block>\n `;\n }\n\n /**\n * A cap-height `°` column whose width scales with the value size. Used after\n * the value (as the value↔unit boundary, via {@link renderValueUnitGap}) and\n * inside the setpoint / advice blocks. `inherit` makes the glyph take the\n * surrounding block's colour (setpoint/advice); otherwise it uses the value\n * colour, optionally `enhanced`.\n */\n private renderDegreeGlyph(\n size: ObcTextboxSize,\n opts: {enhanced?: boolean; inherit?: boolean} = {}\n ): TemplateResult {\n return html`\n <span\n class=${classMap({\n 'degree-column': true,\n [`degree-${size}`]: true,\n 'tone-enhanced': !opts.inherit && Boolean(opts.enhanced),\n 'degree-inherit': Boolean(opts.inherit),\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 gap rendered between the value digits and the unit.\n *\n * - `hasDegree`: a cap-height `°` column whose width scales with the value\n * size (the `°` replaces the default gap).\n * - otherwise: the default 2px gap (only when a trailing unit follows).\n *\n * `hasDegreeSpacer` deliberately does NOT add anything here — it keeps the 2px\n * gap and instead widens the unit column via {@link renderDegreeSpacer} (a\n * spacer AFTER the unit). That way a non-degree row's value digits stay\n * aligned with degree rows (degree column width = spacer width + 2px gap)\n * while its unit shifts left. Mirrors Figma `1:2920` (spacer) / `1:2970`\n * (degree).\n *\n * TODO(designer): cross-size alignment is deferred. Degree rows of different\n * value sizes have different `°` column widths (6/8/12px), so their value digit\n * edges stagger by `degree-width`. For degree rows of mixed sizes you cannot\n * align the value digit edges AND keep the unit column aligned — resolving it\n * needs a design decision (a constant degree reserve, which widens the smaller\n * rows' `°`, OR pinning the value edge and letting the unit column stagger).\n */\n private renderValueUnitGap(): TemplateResult | typeof nothing {\n if (!this.hasValue) {\n return nothing;\n }\n const hasTrailingUnit =\n Boolean(this.unit) &&\n this.resolvedStacking !== ReadoutListItemStacking.leadingUnit;\n\n if ((this.hasDegree ?? false) && !this.off) {\n return this.renderDegreeGlyph(this.valueSize, {\n enhanced: this.rowEnhanced,\n });\n }\n if (hasTrailingUnit) {\n return html`<span class=\"value-unit-gap\" aria-hidden=\"true\"></span>`;\n }\n return nothing;\n }\n\n /**\n * A spacer rendered AFTER the unit when `hasDegreeSpacer` is set on a\n * non-degree row. Its width (`degree-compensation-padding`) = the degree\n * column width minus the 2px gap, so the row's value digits align with degree\n * rows in the same column while its unit shifts left. See\n * {@link renderValueUnitGap}.\n */\n private renderDegreeSpacer(): TemplateResult | typeof nothing {\n const hasDegree = this.hasDegree ?? false;\n const hasDegreeSpacer = this.hasDegreeSpacer ?? false;\n if (hasDegree || !hasDegreeSpacer) {\n return nothing;\n }\n return html`<span\n class=\"degree-spacer\"\n part=\"degree-spacer\"\n aria-hidden=\"true\"\n ></span>`;\n }\n\n private renderTextbox(\n role: 'label' | 'unit' | 'source',\n text: string,\n reserver?: string,\n state?: ReadoutBlockState\n ): TemplateResult {\n const weight =\n role === 'label'\n ? ObcTextboxFontWeight.semibold\n : ObcTextboxFontWeight.regular;\n const box = html`\n <obc-textbox\n class=${classMap({\n [role]: true,\n ...this.dataQualityClasses(state?.dataQuality),\n })}\n part=${role}\n .size=${ObcTextboxSize.xs}\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(state?.alert ?? false, box);\n }\n\n private renderValueCluster(): TemplateResult {\n const popUpAtSetpoint =\n this.isPopUp && this.isAtSetpoint && !this.setpointTouching;\n const setpointHidePhase = resolveSetpointHidePhase(\n popUpAtSetpoint,\n this.deferredSetpointHidePhase\n );\n return html`\n <div class=\"value-cluster\" part=\"value-cluster\">\n ${this.hasAdvice\n ? 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 spaceReserver: this.adviceOptions?.spaceReserver,\n hasDegree: this.hasDegree ?? false,\n dataQuality: this.adviceOptions?.dataQuality,\n alert: this.adviceOptions?.alert,\n })\n : nothing}\n ${this.hasSetpoint\n ? 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 spaceReserver: this.setpointOptions?.spaceReserver,\n hasDegree: this.hasDegree ?? false,\n touching: this.setpointTouching,\n hidePhase: setpointHidePhase,\n dataQuality: this.setpointOptions?.dataQuality,\n alert: this.setpointOptions?.alert,\n })\n : nothing}\n ${this.renderValueReading()}\n </div>\n `;\n }\n\n /**\n * The value reading: the value block, its degree column and the trailing unit\n * grouped in one relatively-positioned wrapper so the value alert frame AND the\n * value data-quality chip can wrap value + degree + unit together (Figma\n * 58:10120).\n *\n * Moving the degree / unit into this wrapper (the new last child of\n * `.value-cluster`) preserves every existing gap, so the underlying content\n * stays column-aligned with or without the frame / chip. Both the value alert\n * (overlay) and the value data-quality chip are applied here — NOT inside\n * `obc-readout-block` — so they extend over the unit; setpoint/advice keep their\n * own block-level frame and chip. The chip uses `outline` (not `border`), so it\n * never shifts the value's width / column alignment.\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.hasValue\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 spaceReserver: this.valueOptions?.spaceReserver,\n off: this.off,\n hasIcon: this.valueOptions?.hasIcon ?? false,\n })\n : nothing}\n ${this.renderValueUnitGap()}\n <div class=\"unit-area\" part=\"unit-area\">\n ${this.renderTrailingUnit()} ${this.renderDegreeSpacer()}\n </div>\n ${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 + unit). It reserves no space — the `obc-alert-frame` sits in\n * an absolutely-positioned box offset outward (see `.value-alert-overlay` in\n * the CSS) so its stroke is centred on the 4px/2px padding line and toggling it\n * never shifts content or row height. Renders only when `valueOptions.alert` is\n * a config 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 private renderLabelContainer(): TemplateResult {\n const stacking = this.resolvedStacking;\n const showLeadingUnit =\n stacking === ReadoutListItemStacking.leadingUnit && Boolean(this.unit);\n const showLeadingSrc =\n stacking === ReadoutListItemStacking.leadingSrc && Boolean(this.src);\n\n return html`\n <div class=\"label-container\" part=\"label-container\">\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=\"label-stack\" part=\"label-stack\">\n ${this.label ? this.renderTextbox('label', this.label) : nothing}\n ${showLeadingUnit\n ? this.renderTextbox(\n 'unit',\n this.unit ?? '',\n this.unitOptions?.spaceReserver\n )\n : nothing}\n ${showLeadingSrc\n ? this.renderTextbox(\n 'source',\n this.src ?? '',\n this.srcOptions?.spaceReserver,\n this.srcOptions\n )\n : nothing}\n </div>\n </div>\n `;\n }\n\n private renderTrailingUnit(): TemplateResult | typeof nothing {\n if (\n this.resolvedStacking === ReadoutListItemStacking.leadingUnit ||\n !this.unit\n ) {\n return nothing;\n }\n return this.renderTextbox(\n 'unit',\n this.unit,\n this.unitOptions?.spaceReserver\n );\n }\n\n private renderTrailingSource(): TemplateResult | typeof nothing {\n if (\n this.resolvedStacking === ReadoutListItemStacking.leadingSrc ||\n !this.src\n ) {\n return nothing;\n }\n return html`\n <div class=\"divider\" part=\"divider\" aria-hidden=\"true\"></div>\n ${this.renderTextbox(\n 'source',\n this.src,\n this.srcOptions?.spaceReserver,\n this.srcOptions\n )}\n `;\n }\n\n private renderContent(): TemplateResult {\n return html`\n <div class=\"content\" part=\"content\">\n ${this.renderLabelContainer()}\n <div class=\"value-area\" part=\"value-area\">\n ${this.renderValueCluster()}\n </div>\n ${this.renderTrailingSource()}\n </div>\n `;\n }\n\n protected override willUpdate(changed: Map<string, unknown>): void {\n super.willUpdate(changed);\n // Validated on EVERY update, deliberately NOT gated on `value`/`valueType`\n // appearing in `changed`. When this assertion throws, Lit's `performUpdate`\n // catch calls `__markUpdated()`, which clears the changed-properties map. A\n // later update driven by any OTHER property — inside `obc-readout-list`,\n // `align()` writing the shared reservers — would then see no `value` in\n // `changed`, skip the check, and render the invalid value as a plain dash:\n // exactly the silent failure this assertion exists to prevent.\n assertReadoutValueType('obc-readout-list-item', this.value, this.valueType);\n }\n\n override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\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.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 clickable = this.resolvedClickable;\n const dataQuality = this.dataQuality;\n const classes = classMap({\n root: true,\n [`size-${this.resolvedSize}`]: true,\n [`stacking-${this.resolvedStacking}`]: true,\n [`priority-${this.resolvedPriority}`]: true,\n 'data-low-integrity':\n dataQuality === ReadoutListItemDataQuality.lowIntegrity,\n 'data-invalid': dataQuality === ReadoutListItemDataQuality.invalid,\n 'flip-flop': this.isFlipFlop,\n clickable: Boolean(clickable),\n [`border-${clickable ? clickable.border : ReadoutListItemBorder.squared}`]:\n Boolean(clickable),\n });\n\n const surface = html`<div class=\"surface\" part=\"surface\">\n ${this.renderContent()}\n </div>`;\n\n // No `aria-label` here: it would override the button's accessible name and\n // hide the dynamic readout text (value / unit / source) from screen readers.\n // The visible content (label + value + unit + source) already forms a\n // complete accessible name; icons/reservers are aria-hidden / visibility-clipped.\n const root = clickable\n ? html`<button class=${classes} part=\"root\" type=\"button\">\n ${surface}\n </button>`\n : html`<div class=${classes} part=\"root\">${surface}</div>`;\n\n // `alert` accepts `boolean` (so the generated Angular wrapper's widened\n // `boolean` type assigns cleanly), but `wrapWithAlertFrame` ignores non-object\n // truthy values. Normalise `true` → a default frame `{}` (like `clickable:\n // true`) so it isn't a silent no-op; `false`/object pass through.\n // fullWidth=true: the row-level alert frame stretches to the readout's full\n // width (PR #1001) rather than hugging it. Per-block / src alert frames keep\n // the default (hug) so they stay inline.\n const alert = this.alert === true ? {} : this.alert;\n return wrapWithAlertFrame(alert, root, true);\n }\n\n static override styles = unsafeCSS(componentStyle);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'obc-readout-list-item': ObcReadoutListItem;\n }\n}\n"],"names":["ReadoutListItemStacking","ReadoutListItemPriority","ReadoutListItemBorder","ReadoutListItemSetpointInteraction","state"],"mappings":"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"}
@@ -139,6 +139,12 @@ export declare class ObcTopViewPropulsion extends LitElement {
139
139
  private get secondaryColor();
140
140
  private renderSecondaryArc;
141
141
  private renderLoadingArc;
142
+ /**
143
+ * Thin outline on the track band's inner edge, always shown per the
144
+ * design's track face. Drawn on the overlay because the watch paints its
145
+ * band bars over the ring circles, which would swallow a watch-side line.
146
+ */
147
+ private renderInnerRingLine;
142
148
  private renderPropeller;
143
149
  render(): import('lit-html').TemplateResult<1>;
144
150
  static styles: import('lit').CSSResult;
@@ -1 +1 @@
1
- {"version":3,"file":"top-view-propulsion.d.ts","sourceRoot":"","sources":["../../../src/navigation-instruments/top-view-propulsion/top-view-propulsion.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"top-view-propulsion.d.ts","sourceRoot":"","sources":["../../../src/navigation-instruments/top-view-propulsion/top-view-propulsion.ts"],"names":[],"mappings":"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"}
@@ -4,8 +4,8 @@ import { ResizeController } from "@lit-labs/observers/resize-controller.js";
4
4
  import { observeInnerBox, applyPinnedHostSize, computeRadialFrame, measureContainerPx, estimateLabelWidthPx } from "../../svghelpers/radial-frame.js";
5
5
  import { InstrumentState, Priority } from "../types.js";
6
6
  import { SetpointBundle } from "../../svghelpers/setpoint-bundle.js";
7
- import { OUTER_RING_RADIUS } from "../watch/watch.js";
8
- import { PRIMARY_SUBBAND_INNER_RADIUS, PRIMARY_SUBBAND_NEEDLE_LENGTH, LANE_DIVIDER_RADIUS, LANE_DIVIDER_WIDTH, renderSecondaryLine, arcPath } from "../watch/secondary-lane.js";
7
+ import { WatchCircleType, OUTER_RING_RADIUS } from "../watch/watch.js";
8
+ import { PRIMARY_SUBBAND_INNER_RADIUS, PRIMARY_SUBBAND_NEEDLE_LENGTH, LANE_DIVIDER_RADIUS, LANE_DIVIDER_WIDTH, renderSecondaryLine, arcPath, BAND_INNER_RADIUS } from "../watch/secondary-lane.js";
9
9
  import { TickmarkStyle, TickmarkType } from "../watch/tickmark.js";
10
10
  import { PropellerImage, propellerImages } from "../watch/propeller.js";
11
11
  import { customElement } from "../../decorator.js";
@@ -248,6 +248,20 @@ let ObcTopViewPropulsion = class extends LitElement {
248
248
  stroke-linecap="round"
249
249
  ></path>`;
250
250
  }
251
+ /**
252
+ * Thin outline on the track band's inner edge, always shown per the
253
+ * design's track face. Drawn on the overlay because the watch paints its
254
+ * band bars over the ring circles, which would swallow a watch-side line.
255
+ */
256
+ renderInnerRingLine() {
257
+ return svg`<circle
258
+ r=${BAND_INNER_RADIUS}
259
+ fill="none"
260
+ stroke="var(--instrument-frame-tertiary-color)"
261
+ stroke-width="1"
262
+ vector-effect="non-scaling-stroke"
263
+ ></circle>`;
264
+ }
251
265
  renderPropeller() {
252
266
  return svg`<g transform="scale(${PROPELLER_SCALE}) translate(-80 -80)">${propellerImages[this.propeller]}</g>`;
253
267
  }
@@ -268,6 +282,7 @@ let ObcTopViewPropulsion = class extends LitElement {
268
282
  <obc-watch
269
283
  .touching=${this.touching}
270
284
  .arcFrame=${frame}
285
+ .watchCircleType=${WatchCircleType.double}
271
286
  .tickmarks=${shownTickmarks}
272
287
  .state=${this.state}
273
288
  .priority=${this.priority}
@@ -285,8 +300,8 @@ let ObcTopViewPropulsion = class extends LitElement {
285
300
  .tickmarkStyle=${this.tickmarkStyle}
286
301
  ></obc-watch>
287
302
  <svg viewBox=${frame.viewBox} xmlns="http://www.w3.org/2000/svg">
288
- ${this.renderLoadingArc()} ${this.renderSecondaryArc()}
289
- ${this.renderPropeller()}
303
+ ${this.renderInnerRingLine()} ${this.renderLoadingArc()}
304
+ ${this.renderSecondaryArc()} ${this.renderPropeller()}
290
305
  </svg>
291
306
  </div>
292
307
  `;
@@ -1 +1 @@
1
- {"version":3,"file":"top-view-propulsion.js","sources":["../../../src/navigation-instruments/top-view-propulsion/top-view-propulsion.ts"],"sourcesContent":["import {html, svg, LitElement, nothing, unsafeCSS} from 'lit';\nimport {property} from 'lit/decorators.js';\nimport type {PropertyValues} from 'lit';\nimport {ResizeController} from '@lit-labs/observers/resize-controller.js';\nimport {\n applyPinnedHostSize,\n computeRadialFrame,\n estimateLabelWidthPx,\n measureContainerPx,\n observeInnerBox,\n type RadialFrame,\n} from '../../svghelpers/radial-frame.js';\nimport {InstrumentState, Priority} from '../types.js';\nimport {SetpointBundle} from '../../svghelpers/setpoint-bundle.js';\nimport '../watch/watch.js';\nimport {\n OUTER_RING_RADIUS,\n type WatchBarArea,\n type WatchNeedle,\n} from '../watch/watch.js';\nimport {\n LANE_DIVIDER_RADIUS,\n LANE_DIVIDER_WIDTH,\n PRIMARY_SUBBAND_INNER_RADIUS,\n PRIMARY_SUBBAND_NEEDLE_LENGTH,\n arcPath,\n renderSecondaryLine,\n} from '../watch/secondary-lane.js';\nimport {Tickmark, TickmarkStyle, TickmarkType} from '../watch/tickmark.js';\nimport {PropellerImage, propellerImages} from '../watch/propeller.js';\nimport {customElement} from '../../decorator.js';\nimport componentStyle from './top-view-propulsion.css?inline';\n\nexport enum TopViewPropulsionType {\n power = 'power',\n pitchRpm = 'pitch-rpm',\n}\n\nconst FULL_CIRCLE_END_ANGLE = 359.999;\nconst LOADING_ARC_RADIUS = (OUTER_RING_RADIUS + 320 / 2) / 2;\nconst PROPELLER_SCALE = 224 / 160;\n\nfunction percentToAngle(value: number): number {\n if (!Number.isFinite(value)) {\n return 0;\n }\n return Math.max(-100, Math.min(100, value)) * 1.8;\n}\n\n/**\n * Top View Propulsion - a propulsion gauge on a circular watch face with a\n * top-view propeller in the center.\n *\n * ## Features / Variants\n * - `power` type: signed percent value shown as a tinted arc on the inner\n * track from the thick zero line, with a needle at the arc end.\n * - `pitch-rpm` type: rpm on the primary track (same rendering as power)\n * plus pitch as a thin secondary arc at the track's inner edge with its\n * own zero mark and end nub.\n * - Interchangeable center propeller art (`PropellerImage`).\n * - Full setpoint support (marker, adjustment preview, at-setpoint states)\n * for the primary axis (power or rpm).\n * - Loading progress arc on the outer ring while `state` is `loading`.\n *\n * ## Usage Guidelines\n * Use for a propulsion unit overview. For an azimuthing unit with a\n * direction bar, use `obc-azimuth-thruster` instead.\n *\n * @experimental The API of this component is under design review and may\n * change in a future release.\n */\n@customElement('obc-top-view-propulsion')\nexport class ObcTopViewPropulsion extends LitElement {\n @property({type: String}) type: TopViewPropulsionType =\n TopViewPropulsionType.power;\n\n /**\n * Signed power in percent: 0 at the top, positive clockwise, ±100% = ±180°.\n * @availableWhen type==power\n */\n @property({type: Number}) power = 0;\n /** @availableWhen type==power */\n @property({type: Number}) powerSetpoint: number | undefined;\n /** @availableWhen type==power && powerSetpoint!=undefined */\n @property({type: Number}) newPowerSetpoint: number | undefined;\n /** @availableWhen type==power && powerSetpoint!=undefined && autoAtPowerSetpoint==false */\n @property({type: Boolean}) atPowerSetpoint = false;\n /** @availableWhen type==power && powerSetpoint!=undefined */\n @property({type: Number}) powerSetpointAtZeroDeadband = 0.1;\n /** @availableWhen type==power && powerSetpoint!=undefined */\n @property({type: Boolean}) powerSetpointOverride = false;\n /** @availableWhen type==power && powerSetpoint!=undefined */\n @property({type: Boolean, attribute: false}) autoAtPowerSetpoint = true;\n /** @availableWhen type==power && powerSetpoint!=undefined && autoAtPowerSetpoint==true */\n @property({type: Number}) autoAtPowerSetpointDeadband = 1;\n\n /**\n * Signed rpm in percent of the maximum: 0 at the top, positive clockwise,\n * ±100% = ±180°. Shown on the primary track.\n * @availableWhen type==pitch-rpm\n */\n @property({type: Number}) rpm = 0;\n /** @availableWhen type==pitch-rpm */\n @property({type: Number}) rpmSetpoint: number | undefined;\n /** @availableWhen type==pitch-rpm && rpmSetpoint!=undefined */\n @property({type: Number}) newRpmSetpoint: number | undefined;\n /** @availableWhen type==pitch-rpm && rpmSetpoint!=undefined && autoAtRpmSetpoint==false */\n @property({type: Boolean}) atRpmSetpoint = false;\n /** @availableWhen type==pitch-rpm && rpmSetpoint!=undefined */\n @property({type: Number}) rpmSetpointAtZeroDeadband = 0.1;\n /** @availableWhen type==pitch-rpm && rpmSetpoint!=undefined */\n @property({type: Boolean}) rpmSetpointOverride = false;\n /** @availableWhen type==pitch-rpm && rpmSetpoint!=undefined */\n @property({type: Boolean, attribute: false}) autoAtRpmSetpoint = true;\n /** @availableWhen type==pitch-rpm && rpmSetpoint!=undefined && autoAtRpmSetpoint==true */\n @property({type: Number}) autoAtRpmSetpointDeadband = 1;\n\n /**\n * Signed pitch in percent: 0 at the top, positive clockwise, ±100% = ±180°.\n * Shown as the thin secondary arc.\n * @availableWhen type==pitch-rpm\n */\n @property({type: Number}) pitch = 0;\n\n /** @availableWhen powerSetpoint!=undefined || rpmSetpoint!=undefined */\n @property({type: Boolean}) touching = false;\n /** @availableWhen powerSetpoint!=undefined || rpmSetpoint!=undefined */\n @property({type: Boolean}) animateSetpoint = false;\n\n @property({type: String}) state: InstrumentState = InstrumentState.active;\n @property({type: String}) priority: Priority = Priority.regular;\n /**\n * Loading progress in percent, shown as an arc on the outer ring.\n * @availableWhen state==loading\n */\n @property({type: Number}) loading = 0;\n\n /**\n * Interval (in degrees) for primary tickmarks.\n * When undefined or <= 0, no primary tickmarks are shown (only the zero line).\n */\n @property({type: Number}) primaryTickmarkInterval: number | undefined = 90;\n /**\n * Interval (in degrees) for secondary tickmarks.\n * When undefined or <= 0, no secondary tickmarks are shown.\n */\n @property({type: Number}) secondaryTickmarkInterval: number | undefined =\n undefined;\n /**\n * Interval (in degrees) for tertiary tickmarks.\n * When undefined or <= 0, no tertiary tickmarks are shown.\n */\n @property({type: Number}) tertiaryTickmarkInterval: number | undefined =\n undefined;\n @property({type: Boolean}) showLabels = false;\n @property({type: Boolean}) tickmarksInside = false;\n @property({type: String}) tickmarkStyle: TickmarkStyle =\n TickmarkStyle.regular;\n @property({type: Boolean, attribute: false}) hasLabelSpacer = true;\n\n @property({type: String}) propeller: PropellerImage =\n PropellerImage.fourBlade;\n\n /**\n * Outer-ring diameter in CSS pixels. When set, the instrument renders at a\n * fixed intrinsic size derived from the ring, arc shape and label reserve —\n * so instruments sharing the same value have identical ring circumference\n * regardless of label width or arc extent (like obc-donut-chart's\n * fixedHeight). When unset (default), the instrument fills its container.\n */\n @property({type: Number, attribute: 'face-diameter'})\n faceDiameter: number | undefined;\n\n private _powerSp = new SetpointBundle({\n defaultDeadband: 1,\n defaultZeroDeadband: 0.1,\n onAnimationEnd: () => this.requestUpdate(),\n });\n private _rpmSp = new SetpointBundle({\n defaultDeadband: 1,\n defaultZeroDeadband: 0.1,\n onAnimationEnd: () => this.requestUpdate(),\n });\n\n private _frame: RadialFrame | undefined;\n private _hostSizePinned = false;\n private _resizeController = new ResizeController(this, {});\n\n override firstUpdated(changed: PropertyValues): void {\n super.firstUpdated(changed);\n observeInnerBox(this._resizeController, this.renderRoot);\n }\n\n override willUpdate(changed: PropertyValues): void {\n super.willUpdate(changed);\n this._powerSp.sync({\n setpoint: this.powerSetpoint,\n newSetpoint: this.newPowerSetpoint,\n atSetpoint: this.atPowerSetpoint,\n touching: this.touching,\n autoAtSetpoint: this.autoAtPowerSetpoint,\n autoAtSetpointDeadband: this.autoAtPowerSetpointDeadband,\n setpointAtZeroDeadband: this.powerSetpointAtZeroDeadband,\n setpointOverride: this.powerSetpointOverride,\n animateSetpoint: this.animateSetpoint,\n });\n this._rpmSp.sync({\n setpoint: this.rpmSetpoint,\n newSetpoint: this.newRpmSetpoint,\n atSetpoint: this.atRpmSetpoint,\n touching: this.touching,\n autoAtSetpoint: this.autoAtRpmSetpoint,\n autoAtSetpointDeadband: this.autoAtRpmSetpointDeadband,\n setpointAtZeroDeadband: this.rpmSetpointAtZeroDeadband,\n setpointOverride: this.rpmSetpointOverride,\n animateSetpoint: this.animateSetpoint,\n });\n }\n\n private get isPitchRpm(): boolean {\n return this.type === TopViewPropulsionType.pitchRpm;\n }\n\n private get primaryValue(): number {\n return this.isPitchRpm ? this.rpm : this.power;\n }\n\n private get primarySp(): SetpointBundle {\n return this.isPitchRpm ? this._rpmSp : this._powerSp;\n }\n\n private get primarySetpoint(): number | undefined {\n return this.isPitchRpm ? this.rpmSetpoint : this.powerSetpoint;\n }\n\n private get primaryNewSetpoint(): number | undefined {\n return this.isPitchRpm ? this.newRpmSetpoint : this.newPowerSetpoint;\n }\n\n private get primaryZeroDeadband(): number {\n return this.isPitchRpm\n ? this.rpmSetpointAtZeroDeadband\n : this.powerSetpointAtZeroDeadband;\n }\n\n private get primarySetpointOverride(): boolean {\n return this.isPitchRpm\n ? this.rpmSetpointOverride\n : this.powerSetpointOverride;\n }\n\n override updated(changed: PropertyValues): void {\n super.updated(changed);\n this._hostSizePinned = applyPinnedHostSize(\n this,\n this._frame,\n this._hostSizePinned\n );\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this._powerSp.dispose();\n this._rpmSp.dispose();\n }\n\n private get isActive(): boolean {\n return (\n this.state !== InstrumentState.loading &&\n this.state !== InstrumentState.off\n );\n }\n\n private get isEnhanced(): boolean {\n return this.priority === Priority.enhanced;\n }\n\n private getTickmarks(): Tickmark[] {\n const tickmarks: Tickmark[] = [];\n const skipAngles: number[] = [];\n\n const labelText = (angle: number): string | undefined => {\n if (!this.showLabels) return undefined;\n return angle <= 180 ? `${angle}` : `${angle - 360}`;\n };\n\n tickmarks.push({\n angle: 0,\n type: TickmarkType.zeroLineThick,\n text: this.showLabels ? '0' : undefined,\n color:\n this.isActive && this.isEnhanced\n ? 'var(--instrument-enhanced-tertiary-color)'\n : undefined,\n });\n skipAngles.push(0);\n\n const addInterval = (\n interval: number | undefined,\n type: TickmarkType,\n withLabels = false\n ) => {\n if (interval === undefined || interval <= 0 || !Number.isFinite(interval))\n return;\n for (let i = interval; i < 360; i += interval) {\n if (skipAngles.includes(i)) continue;\n tickmarks.push({\n angle: i,\n type,\n text: withLabels ? labelText(i) : undefined,\n });\n skipAngles.push(i);\n }\n };\n\n addInterval(this.primaryTickmarkInterval, TickmarkType.primary, true);\n addInterval(this.secondaryTickmarkInterval, TickmarkType.secondary);\n addInterval(this.tertiaryTickmarkInterval, TickmarkType.tertiary);\n\n return tickmarks;\n }\n\n private getBarAreas(): WatchBarArea[] {\n const areas: WatchBarArea[] = [\n {\n startAngle: 0,\n endAngle: FULL_CIRCLE_END_ANGLE,\n fillColor: 'var(--instrument-frame-secondary-color)',\n },\n ];\n const valueAngle = percentToAngle(this.primaryValue);\n if (this.isActive && Math.abs(valueAngle) > 0.1) {\n areas.push({\n startAngle: Math.min(0, valueAngle),\n endAngle: Math.max(0, valueAngle),\n fillColor: this.isEnhanced\n ? 'var(--instrument-enhanced-tertiary-color)'\n : 'var(--instrument-regular-tertiary-color)',\n innerRadius: this.isPitchRpm ? PRIMARY_SUBBAND_INNER_RADIUS : undefined,\n });\n }\n return areas;\n }\n\n private getNeedles(): WatchNeedle[] {\n const fill = !this.isActive\n ? 'var(--instrument-frame-tertiary-color)'\n : this.isEnhanced\n ? 'var(--instrument-enhanced-secondary-color)'\n : 'var(--instrument-regular-secondary-color)';\n const stroke = !this.isActive\n ? 'var(--border-silhouette-color)'\n : this.isEnhanced\n ? 'var(--instrument-enhanced-tertiary-color)'\n : 'var(--instrument-regular-tertiary-color)';\n return [\n {\n angle: percentToAngle(this.primaryValue),\n fillColor: fill,\n strokeColor: stroke,\n length: this.isPitchRpm ? PRIMARY_SUBBAND_NEEDLE_LENGTH : undefined,\n },\n ];\n }\n\n private get secondaryColor(): string {\n if (!this.isActive) {\n return 'var(--instrument-frame-tertiary-color)';\n }\n return this.isEnhanced\n ? 'var(--instrument-enhanced-secondary-color)'\n : 'var(--instrument-regular-secondary-color)';\n }\n\n private renderSecondaryArc() {\n if (!this.isPitchRpm) {\n return nothing;\n }\n const divider = svg`<circle\n r=${LANE_DIVIDER_RADIUS}\n fill=\"none\"\n stroke=\"var(--instrument-frame-primary-color)\"\n stroke-width=${LANE_DIVIDER_WIDTH}\n ></circle>`;\n const pitchAngle = this.isActive ? percentToAngle(this.pitch) : 0;\n return svg`\n ${divider}\n ${renderSecondaryLine({\n originAngle: 0,\n endAngle: pitchAngle,\n color: this.secondaryColor,\n })}\n `;\n }\n\n private renderLoadingArc() {\n if (this.state !== InstrumentState.loading || this.loading <= 0) {\n return nothing;\n }\n const endAngle = percentToAngle(Math.abs(this.loading)) * 2;\n return svg`<path\n d=${arcPath(LOADING_ARC_RADIUS, 0, Math.min(endAngle, FULL_CIRCLE_END_ANGLE))}\n fill=\"none\"\n stroke=${\n this.isEnhanced\n ? 'var(--instrument-enhanced-secondary-color)'\n : 'var(--instrument-regular-secondary-color)'\n }\n stroke-width=\"8\"\n stroke-linecap=\"round\"\n ></path>`;\n }\n\n private renderPropeller() {\n return svg`<g transform=\"scale(${PROPELLER_SCALE}) translate(-80 -80)\">${\n propellerImages[this.propeller]\n }</g>`;\n }\n\n override render() {\n const tickmarks = this.getTickmarks();\n\n const frame = computeRadialFrame({\n basePadding: this.hasLabelSpacer ? 24 : 16,\n labelWidthPx:\n this.hasLabelSpacer && !this.tickmarksInside\n ? estimateLabelWidthPx(tickmarks.map((t) => t.text))\n : 0,\n containerPx: measureContainerPx(this),\n faceDiameter: this.faceDiameter,\n });\n this._frame = frame;\n const shownTickmarks = frame.labelsHidden\n ? tickmarks.map((t) => ({...t, text: undefined}))\n : tickmarks;\n\n const setpointAngle =\n this.primarySetpoint !== undefined\n ? percentToAngle(this.primarySetpoint)\n : undefined;\n const newSetpointAngle =\n this.primaryNewSetpoint !== undefined\n ? percentToAngle(this.primaryNewSetpoint)\n : undefined;\n\n return html`\n <div class=\"container\">\n <obc-watch\n .touching=${this.touching}\n .arcFrame=${frame}\n .tickmarks=${shownTickmarks}\n .state=${this.state}\n .priority=${this.priority}\n .barAreas=${this.getBarAreas()}\n .needles=${this.getNeedles()}\n .angleSetpoint=${setpointAngle}\n .newAngleSetpoint=${newSetpointAngle}\n .atAngleSetpoint=${this.primarySp.computeAtSetpoint(\n this.primaryValue\n )}\n .angleSetpointAtZeroDeadband=${this.primaryZeroDeadband * 1.8}\n .setpointOverride=${this.primarySetpointOverride}\n .animateSetpoint=${this.animateSetpoint}\n .tickmarksInside=${this.tickmarksInside}\n .tickmarkStyle=${this.tickmarkStyle}\n ></obc-watch>\n <svg viewBox=${frame.viewBox} xmlns=\"http://www.w3.org/2000/svg\">\n ${this.renderLoadingArc()} ${this.renderSecondaryArc()}\n ${this.renderPropeller()}\n </svg>\n </div>\n `;\n }\n\n static override styles = unsafeCSS(componentStyle);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'obc-top-view-propulsion': ObcTopViewPropulsion;\n }\n}\n"],"names":["TopViewPropulsionType"],"mappings":"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"}
1
+ {"version":3,"file":"top-view-propulsion.js","sources":["../../../src/navigation-instruments/top-view-propulsion/top-view-propulsion.ts"],"sourcesContent":["import {html, svg, LitElement, nothing, unsafeCSS} from 'lit';\nimport {property} from 'lit/decorators.js';\nimport type {PropertyValues} from 'lit';\nimport {ResizeController} from '@lit-labs/observers/resize-controller.js';\nimport {\n applyPinnedHostSize,\n computeRadialFrame,\n estimateLabelWidthPx,\n measureContainerPx,\n observeInnerBox,\n type RadialFrame,\n} from '../../svghelpers/radial-frame.js';\nimport {InstrumentState, Priority} from '../types.js';\nimport {SetpointBundle} from '../../svghelpers/setpoint-bundle.js';\nimport '../watch/watch.js';\nimport {\n OUTER_RING_RADIUS,\n WatchCircleType,\n type WatchBarArea,\n type WatchNeedle,\n} from '../watch/watch.js';\nimport {\n BAND_INNER_RADIUS,\n LANE_DIVIDER_RADIUS,\n LANE_DIVIDER_WIDTH,\n PRIMARY_SUBBAND_INNER_RADIUS,\n PRIMARY_SUBBAND_NEEDLE_LENGTH,\n arcPath,\n renderSecondaryLine,\n} from '../watch/secondary-lane.js';\nimport {Tickmark, TickmarkStyle, TickmarkType} from '../watch/tickmark.js';\nimport {PropellerImage, propellerImages} from '../watch/propeller.js';\nimport {customElement} from '../../decorator.js';\nimport componentStyle from './top-view-propulsion.css?inline';\n\nexport enum TopViewPropulsionType {\n power = 'power',\n pitchRpm = 'pitch-rpm',\n}\n\nconst FULL_CIRCLE_END_ANGLE = 359.999;\nconst LOADING_ARC_RADIUS = (OUTER_RING_RADIUS + 320 / 2) / 2;\nconst PROPELLER_SCALE = 224 / 160;\n\nfunction percentToAngle(value: number): number {\n if (!Number.isFinite(value)) {\n return 0;\n }\n return Math.max(-100, Math.min(100, value)) * 1.8;\n}\n\n/**\n * Top View Propulsion - a propulsion gauge on a circular watch face with a\n * top-view propeller in the center.\n *\n * ## Features / Variants\n * - `power` type: signed percent value shown as a tinted arc on the inner\n * track from the thick zero line, with a needle at the arc end.\n * - `pitch-rpm` type: rpm on the primary track (same rendering as power)\n * plus pitch as a thin secondary arc at the track's inner edge with its\n * own zero mark and end nub.\n * - Interchangeable center propeller art (`PropellerImage`).\n * - Full setpoint support (marker, adjustment preview, at-setpoint states)\n * for the primary axis (power or rpm).\n * - Loading progress arc on the outer ring while `state` is `loading`.\n *\n * ## Usage Guidelines\n * Use for a propulsion unit overview. For an azimuthing unit with a\n * direction bar, use `obc-azimuth-thruster` instead.\n *\n * @experimental The API of this component is under design review and may\n * change in a future release.\n */\n@customElement('obc-top-view-propulsion')\nexport class ObcTopViewPropulsion extends LitElement {\n @property({type: String}) type: TopViewPropulsionType =\n TopViewPropulsionType.power;\n\n /**\n * Signed power in percent: 0 at the top, positive clockwise, ±100% = ±180°.\n * @availableWhen type==power\n */\n @property({type: Number}) power = 0;\n /** @availableWhen type==power */\n @property({type: Number}) powerSetpoint: number | undefined;\n /** @availableWhen type==power && powerSetpoint!=undefined */\n @property({type: Number}) newPowerSetpoint: number | undefined;\n /** @availableWhen type==power && powerSetpoint!=undefined && autoAtPowerSetpoint==false */\n @property({type: Boolean}) atPowerSetpoint = false;\n /** @availableWhen type==power && powerSetpoint!=undefined */\n @property({type: Number}) powerSetpointAtZeroDeadband = 0.1;\n /** @availableWhen type==power && powerSetpoint!=undefined */\n @property({type: Boolean}) powerSetpointOverride = false;\n /** @availableWhen type==power && powerSetpoint!=undefined */\n @property({type: Boolean, attribute: false}) autoAtPowerSetpoint = true;\n /** @availableWhen type==power && powerSetpoint!=undefined && autoAtPowerSetpoint==true */\n @property({type: Number}) autoAtPowerSetpointDeadband = 1;\n\n /**\n * Signed rpm in percent of the maximum: 0 at the top, positive clockwise,\n * ±100% = ±180°. Shown on the primary track.\n * @availableWhen type==pitch-rpm\n */\n @property({type: Number}) rpm = 0;\n /** @availableWhen type==pitch-rpm */\n @property({type: Number}) rpmSetpoint: number | undefined;\n /** @availableWhen type==pitch-rpm && rpmSetpoint!=undefined */\n @property({type: Number}) newRpmSetpoint: number | undefined;\n /** @availableWhen type==pitch-rpm && rpmSetpoint!=undefined && autoAtRpmSetpoint==false */\n @property({type: Boolean}) atRpmSetpoint = false;\n /** @availableWhen type==pitch-rpm && rpmSetpoint!=undefined */\n @property({type: Number}) rpmSetpointAtZeroDeadband = 0.1;\n /** @availableWhen type==pitch-rpm && rpmSetpoint!=undefined */\n @property({type: Boolean}) rpmSetpointOverride = false;\n /** @availableWhen type==pitch-rpm && rpmSetpoint!=undefined */\n @property({type: Boolean, attribute: false}) autoAtRpmSetpoint = true;\n /** @availableWhen type==pitch-rpm && rpmSetpoint!=undefined && autoAtRpmSetpoint==true */\n @property({type: Number}) autoAtRpmSetpointDeadband = 1;\n\n /**\n * Signed pitch in percent: 0 at the top, positive clockwise, ±100% = ±180°.\n * Shown as the thin secondary arc.\n * @availableWhen type==pitch-rpm\n */\n @property({type: Number}) pitch = 0;\n\n /** @availableWhen powerSetpoint!=undefined || rpmSetpoint!=undefined */\n @property({type: Boolean}) touching = false;\n /** @availableWhen powerSetpoint!=undefined || rpmSetpoint!=undefined */\n @property({type: Boolean}) animateSetpoint = false;\n\n @property({type: String}) state: InstrumentState = InstrumentState.active;\n @property({type: String}) priority: Priority = Priority.regular;\n /**\n * Loading progress in percent, shown as an arc on the outer ring.\n * @availableWhen state==loading\n */\n @property({type: Number}) loading = 0;\n\n /**\n * Interval (in degrees) for primary tickmarks.\n * When undefined or <= 0, no primary tickmarks are shown (only the zero line).\n */\n @property({type: Number}) primaryTickmarkInterval: number | undefined = 90;\n /**\n * Interval (in degrees) for secondary tickmarks.\n * When undefined or <= 0, no secondary tickmarks are shown.\n */\n @property({type: Number}) secondaryTickmarkInterval: number | undefined =\n undefined;\n /**\n * Interval (in degrees) for tertiary tickmarks.\n * When undefined or <= 0, no tertiary tickmarks are shown.\n */\n @property({type: Number}) tertiaryTickmarkInterval: number | undefined =\n undefined;\n @property({type: Boolean}) showLabels = false;\n @property({type: Boolean}) tickmarksInside = false;\n @property({type: String}) tickmarkStyle: TickmarkStyle =\n TickmarkStyle.regular;\n @property({type: Boolean, attribute: false}) hasLabelSpacer = true;\n\n @property({type: String}) propeller: PropellerImage =\n PropellerImage.fourBlade;\n\n /**\n * Outer-ring diameter in CSS pixels. When set, the instrument renders at a\n * fixed intrinsic size derived from the ring, arc shape and label reserve —\n * so instruments sharing the same value have identical ring circumference\n * regardless of label width or arc extent (like obc-donut-chart's\n * fixedHeight). When unset (default), the instrument fills its container.\n */\n @property({type: Number, attribute: 'face-diameter'})\n faceDiameter: number | undefined;\n\n private _powerSp = new SetpointBundle({\n defaultDeadband: 1,\n defaultZeroDeadband: 0.1,\n onAnimationEnd: () => this.requestUpdate(),\n });\n private _rpmSp = new SetpointBundle({\n defaultDeadband: 1,\n defaultZeroDeadband: 0.1,\n onAnimationEnd: () => this.requestUpdate(),\n });\n\n private _frame: RadialFrame | undefined;\n private _hostSizePinned = false;\n private _resizeController = new ResizeController(this, {});\n\n override firstUpdated(changed: PropertyValues): void {\n super.firstUpdated(changed);\n observeInnerBox(this._resizeController, this.renderRoot);\n }\n\n override willUpdate(changed: PropertyValues): void {\n super.willUpdate(changed);\n this._powerSp.sync({\n setpoint: this.powerSetpoint,\n newSetpoint: this.newPowerSetpoint,\n atSetpoint: this.atPowerSetpoint,\n touching: this.touching,\n autoAtSetpoint: this.autoAtPowerSetpoint,\n autoAtSetpointDeadband: this.autoAtPowerSetpointDeadband,\n setpointAtZeroDeadband: this.powerSetpointAtZeroDeadband,\n setpointOverride: this.powerSetpointOverride,\n animateSetpoint: this.animateSetpoint,\n });\n this._rpmSp.sync({\n setpoint: this.rpmSetpoint,\n newSetpoint: this.newRpmSetpoint,\n atSetpoint: this.atRpmSetpoint,\n touching: this.touching,\n autoAtSetpoint: this.autoAtRpmSetpoint,\n autoAtSetpointDeadband: this.autoAtRpmSetpointDeadband,\n setpointAtZeroDeadband: this.rpmSetpointAtZeroDeadband,\n setpointOverride: this.rpmSetpointOverride,\n animateSetpoint: this.animateSetpoint,\n });\n }\n\n private get isPitchRpm(): boolean {\n return this.type === TopViewPropulsionType.pitchRpm;\n }\n\n private get primaryValue(): number {\n return this.isPitchRpm ? this.rpm : this.power;\n }\n\n private get primarySp(): SetpointBundle {\n return this.isPitchRpm ? this._rpmSp : this._powerSp;\n }\n\n private get primarySetpoint(): number | undefined {\n return this.isPitchRpm ? this.rpmSetpoint : this.powerSetpoint;\n }\n\n private get primaryNewSetpoint(): number | undefined {\n return this.isPitchRpm ? this.newRpmSetpoint : this.newPowerSetpoint;\n }\n\n private get primaryZeroDeadband(): number {\n return this.isPitchRpm\n ? this.rpmSetpointAtZeroDeadband\n : this.powerSetpointAtZeroDeadband;\n }\n\n private get primarySetpointOverride(): boolean {\n return this.isPitchRpm\n ? this.rpmSetpointOverride\n : this.powerSetpointOverride;\n }\n\n override updated(changed: PropertyValues): void {\n super.updated(changed);\n this._hostSizePinned = applyPinnedHostSize(\n this,\n this._frame,\n this._hostSizePinned\n );\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this._powerSp.dispose();\n this._rpmSp.dispose();\n }\n\n private get isActive(): boolean {\n return (\n this.state !== InstrumentState.loading &&\n this.state !== InstrumentState.off\n );\n }\n\n private get isEnhanced(): boolean {\n return this.priority === Priority.enhanced;\n }\n\n private getTickmarks(): Tickmark[] {\n const tickmarks: Tickmark[] = [];\n const skipAngles: number[] = [];\n\n const labelText = (angle: number): string | undefined => {\n if (!this.showLabels) return undefined;\n return angle <= 180 ? `${angle}` : `${angle - 360}`;\n };\n\n tickmarks.push({\n angle: 0,\n type: TickmarkType.zeroLineThick,\n text: this.showLabels ? '0' : undefined,\n color:\n this.isActive && this.isEnhanced\n ? 'var(--instrument-enhanced-tertiary-color)'\n : undefined,\n });\n skipAngles.push(0);\n\n const addInterval = (\n interval: number | undefined,\n type: TickmarkType,\n withLabels = false\n ) => {\n if (interval === undefined || interval <= 0 || !Number.isFinite(interval))\n return;\n for (let i = interval; i < 360; i += interval) {\n if (skipAngles.includes(i)) continue;\n tickmarks.push({\n angle: i,\n type,\n text: withLabels ? labelText(i) : undefined,\n });\n skipAngles.push(i);\n }\n };\n\n addInterval(this.primaryTickmarkInterval, TickmarkType.primary, true);\n addInterval(this.secondaryTickmarkInterval, TickmarkType.secondary);\n addInterval(this.tertiaryTickmarkInterval, TickmarkType.tertiary);\n\n return tickmarks;\n }\n\n private getBarAreas(): WatchBarArea[] {\n const areas: WatchBarArea[] = [\n {\n startAngle: 0,\n endAngle: FULL_CIRCLE_END_ANGLE,\n fillColor: 'var(--instrument-frame-secondary-color)',\n },\n ];\n const valueAngle = percentToAngle(this.primaryValue);\n if (this.isActive && Math.abs(valueAngle) > 0.1) {\n areas.push({\n startAngle: Math.min(0, valueAngle),\n endAngle: Math.max(0, valueAngle),\n fillColor: this.isEnhanced\n ? 'var(--instrument-enhanced-tertiary-color)'\n : 'var(--instrument-regular-tertiary-color)',\n innerRadius: this.isPitchRpm ? PRIMARY_SUBBAND_INNER_RADIUS : undefined,\n });\n }\n return areas;\n }\n\n private getNeedles(): WatchNeedle[] {\n const fill = !this.isActive\n ? 'var(--instrument-frame-tertiary-color)'\n : this.isEnhanced\n ? 'var(--instrument-enhanced-secondary-color)'\n : 'var(--instrument-regular-secondary-color)';\n const stroke = !this.isActive\n ? 'var(--border-silhouette-color)'\n : this.isEnhanced\n ? 'var(--instrument-enhanced-tertiary-color)'\n : 'var(--instrument-regular-tertiary-color)';\n return [\n {\n angle: percentToAngle(this.primaryValue),\n fillColor: fill,\n strokeColor: stroke,\n length: this.isPitchRpm ? PRIMARY_SUBBAND_NEEDLE_LENGTH : undefined,\n },\n ];\n }\n\n private get secondaryColor(): string {\n if (!this.isActive) {\n return 'var(--instrument-frame-tertiary-color)';\n }\n return this.isEnhanced\n ? 'var(--instrument-enhanced-secondary-color)'\n : 'var(--instrument-regular-secondary-color)';\n }\n\n private renderSecondaryArc() {\n if (!this.isPitchRpm) {\n return nothing;\n }\n const divider = svg`<circle\n r=${LANE_DIVIDER_RADIUS}\n fill=\"none\"\n stroke=\"var(--instrument-frame-primary-color)\"\n stroke-width=${LANE_DIVIDER_WIDTH}\n ></circle>`;\n const pitchAngle = this.isActive ? percentToAngle(this.pitch) : 0;\n return svg`\n ${divider}\n ${renderSecondaryLine({\n originAngle: 0,\n endAngle: pitchAngle,\n color: this.secondaryColor,\n })}\n `;\n }\n\n private renderLoadingArc() {\n if (this.state !== InstrumentState.loading || this.loading <= 0) {\n return nothing;\n }\n const endAngle = percentToAngle(Math.abs(this.loading)) * 2;\n return svg`<path\n d=${arcPath(LOADING_ARC_RADIUS, 0, Math.min(endAngle, FULL_CIRCLE_END_ANGLE))}\n fill=\"none\"\n stroke=${\n this.isEnhanced\n ? 'var(--instrument-enhanced-secondary-color)'\n : 'var(--instrument-regular-secondary-color)'\n }\n stroke-width=\"8\"\n stroke-linecap=\"round\"\n ></path>`;\n }\n\n /**\n * Thin outline on the track band's inner edge, always shown per the\n * design's track face. Drawn on the overlay because the watch paints its\n * band bars over the ring circles, which would swallow a watch-side line.\n */\n private renderInnerRingLine() {\n return svg`<circle\n r=${BAND_INNER_RADIUS}\n fill=\"none\"\n stroke=\"var(--instrument-frame-tertiary-color)\"\n stroke-width=\"1\"\n vector-effect=\"non-scaling-stroke\"\n ></circle>`;\n }\n\n private renderPropeller() {\n return svg`<g transform=\"scale(${PROPELLER_SCALE}) translate(-80 -80)\">${\n propellerImages[this.propeller]\n }</g>`;\n }\n\n override render() {\n const tickmarks = this.getTickmarks();\n\n const frame = computeRadialFrame({\n basePadding: this.hasLabelSpacer ? 24 : 16,\n labelWidthPx:\n this.hasLabelSpacer && !this.tickmarksInside\n ? estimateLabelWidthPx(tickmarks.map((t) => t.text))\n : 0,\n containerPx: measureContainerPx(this),\n faceDiameter: this.faceDiameter,\n });\n this._frame = frame;\n const shownTickmarks = frame.labelsHidden\n ? tickmarks.map((t) => ({...t, text: undefined}))\n : tickmarks;\n\n const setpointAngle =\n this.primarySetpoint !== undefined\n ? percentToAngle(this.primarySetpoint)\n : undefined;\n const newSetpointAngle =\n this.primaryNewSetpoint !== undefined\n ? percentToAngle(this.primaryNewSetpoint)\n : undefined;\n\n return html`\n <div class=\"container\">\n <obc-watch\n .touching=${this.touching}\n .arcFrame=${frame}\n .watchCircleType=${WatchCircleType.double}\n .tickmarks=${shownTickmarks}\n .state=${this.state}\n .priority=${this.priority}\n .barAreas=${this.getBarAreas()}\n .needles=${this.getNeedles()}\n .angleSetpoint=${setpointAngle}\n .newAngleSetpoint=${newSetpointAngle}\n .atAngleSetpoint=${this.primarySp.computeAtSetpoint(\n this.primaryValue\n )}\n .angleSetpointAtZeroDeadband=${this.primaryZeroDeadband * 1.8}\n .setpointOverride=${this.primarySetpointOverride}\n .animateSetpoint=${this.animateSetpoint}\n .tickmarksInside=${this.tickmarksInside}\n .tickmarkStyle=${this.tickmarkStyle}\n ></obc-watch>\n <svg viewBox=${frame.viewBox} xmlns=\"http://www.w3.org/2000/svg\">\n ${this.renderInnerRingLine()} ${this.renderLoadingArc()}\n ${this.renderSecondaryArc()} ${this.renderPropeller()}\n </svg>\n </div>\n `;\n }\n\n static override styles = unsafeCSS(componentStyle);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'obc-top-view-propulsion': ObcTopViewPropulsion;\n }\n}\n"],"names":["TopViewPropulsionType"],"mappings":"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"}
@@ -49,6 +49,14 @@ export declare const WIND_TRUE_BUCKETS: readonly [0, 1, 5, 10, 15, 20, 25, 30, 3
49
49
  * a sub-1 calm icon).
50
50
  */
51
51
  export declare const WIND_SHAFT_BUCKETS: readonly [0, 1, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100];
52
+ /**
53
+ * Radial overhang of the rendered (2×, 48-unit) wind icon box past the tip
54
+ * anchor toward the watch center: the glyph tip sits at y=22.4453 of the
55
+ * 24-unit box, so the scaled box extends `(24 − 22.4453) × 2 ≈ 3.11` units
56
+ * inside the anchor radius. Add it to a desired box inner-edge radius to get
57
+ * the `windSymbolRadius` that makes the box start exactly there.
58
+ */
59
+ export declare const WIND_ICON_TIP_TO_BOX_INNER: number;
52
60
  /**
53
61
  * Snap a wind speed in **knots** to the nearest available icon bucket.
54
62
  *
@@ -1 +1 @@
1
- {"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../../src/navigation-instruments/watch/environment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAM,iBAAiB,EAAC,MAAM,KAAK,CAAC;AAE3C,OAAO,iCAAiC,CAAC;AACzC,OAAO,iCAAiC,CAAC;AACzC,OAAO,iCAAiC,CAAC;AACzC,OAAO,kCAAkC,CAAC;AAC1C,OAAO,kCAAkC,CAAC;AAC1C,OAAO,kCAAkC,CAAC;AAC1C,OAAO,kCAAkC,CAAC;AAC1C,OAAO,kCAAkC,CAAC;AAC1C,OAAO,kCAAkC,CAAC;AAC1C,OAAO,kCAAkC,CAAC;AAC1C,OAAO,kCAAkC,CAAC;AAC1C,OAAO,kCAAkC,CAAC;AAC1C,OAAO,kCAAkC,CAAC;AAC1C,OAAO,kCAAkC,CAAC;AAC1C,OAAO,kCAAkC,CAAC;AAC1C,OAAO,mCAAmC,CAAC;AAC3C,OAAO,kCAAkC,CAAC;AAC1C,OAAO,kCAAkC,CAAC;AAC1C,OAAO,kCAAkC,CAAC;AAC1C,OAAO,mCAAmC,CAAC;AAC3C,OAAO,mCAAmC,CAAC;AAC3C,OAAO,mCAAmC,CAAC;AAC3C,OAAO,mCAAmC,CAAC;AAC3C,OAAO,mCAAmC,CAAC;AAC3C,OAAO,mCAAmC,CAAC;AAC3C,OAAO,mCAAmC,CAAC;AAC3C,OAAO,mCAAmC,CAAC;AAC3C,OAAO,mCAAmC,CAAC;AAC3C,OAAO,mCAAmC,CAAC;AAC3C,OAAO,mCAAmC,CAAC;AAC3C,OAAO,mCAAmC,CAAC;AAC3C,OAAO,mCAAmC,CAAC;AAC3C,OAAO,mCAAmC,CAAC;AAC3C,OAAO,mCAAmC,CAAC;AAC3C,OAAO,mCAAmC,CAAC;AAC3C,OAAO,mCAAmC,CAAC;AAC3C,OAAO,mCAAmC,CAAC;AAC3C,OAAO,oCAAoC,CAAC;AAE5C;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,yEAEpB,CAAC;AAEX;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,iGAGrB,CAAC;AAqCX;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAChC,OAAO,EAAE,SAAS,MAAM,EAAE,GACzB,MAAM,CAcR;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC/B,MAAM,CAER;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC/B,MAAM,CAER;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC/B,MAAM,CAiBR;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,iBAAiB,CAkBpB;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,iBAAiB,CAOpB;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,iBAAiB,CAUpB;AAiBD,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CA6B7D,CAAC"}
1
+ {"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../../src/navigation-instruments/watch/environment.ts"],"names":[],"mappings":"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"}
@@ -81,6 +81,8 @@ const WIND_SHAFT_BUCKETS = [
81
81
  100
82
82
  ];
83
83
  const WIND_ICON_SCALE = 2;
84
+ const WIND_ICON_TIP_Y = 22.4453;
85
+ const WIND_ICON_TIP_TO_BOX_INNER = (24 - WIND_ICON_TIP_Y) * WIND_ICON_SCALE;
84
86
  const windIconCache = /* @__PURE__ */ new Map();
85
87
  function getWindIconSvg(bucket) {
86
88
  const tagName = `obi-wind-true-${bucket}`;
@@ -215,6 +217,7 @@ const environmentSvgs = {
215
217
  <path fill-rule="evenodd" clip-rule="evenodd" d="M7 22.5858L12.2071 17.3787L17.4142 22.5858L16 24L12.2071 20.2071L8.41421 24L7 22.5858Z" fill="var(--instrument-regular-secondary-color)"/>`
216
218
  };
217
219
  export {
220
+ WIND_ICON_TIP_TO_BOX_INNER,
218
221
  WIND_SHAFT_BUCKETS,
219
222
  WIND_TRUE_BUCKETS,
220
223
  environmentSvgs,