@oicl/openbridge-webcomponents 2.0.0-next.122 → 2.0.0-next.124

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.
@@ -32,6 +32,16 @@ const componentStyle = css`* {
32
32
  display: block;
33
33
  width: 100%;
34
34
  height: 100%;
35
+ /* Clips the rotated overlay <svg transform="rotate(...)">, whose corners
36
+ swing outside the host and leak arc pixels in wide layouts (same
37
+ protection obc-watch has had since #994). Known trade-off: the HDG/COG
38
+ arrow apexes previously painted 1-2px past the host's top edge and are
39
+ now shaved flat at the box edge — imperceptible at normal viewing.
40
+ TODO(designer): if the shave is unwanted, the frame needs headroom so
41
+ the arrow tips fit inside the box — see "Host clipping & the arrow-apex
42
+ shave" in docs/agents/watch-radial-instruments.md before changing
43
+ (interacts with the #1021/#1049 label-reserve geometry). */
44
+ overflow: hidden;
35
45
  }
36
46
  `;
37
47
  export {
@@ -1 +1 @@
1
- {"version":3,"file":"compass-sector.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"compass-sector.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"thruster.d.ts","sourceRoot":"","sources":["../../../src/navigation-instruments/thruster/thruster.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"thruster.d.ts","sourceRoot":"","sources":["../../../src/navigation-instruments/thruster/thruster.ts"],"names":[],"mappings":"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"}
@@ -65,6 +65,7 @@ ObcThruster.styles = css`
65
65
  }
66
66
 
67
67
  .container > svg {
68
+ display: block;
68
69
  height: 100%;
69
70
  width: 100%;
70
71
  }
@@ -1 +1 @@
1
- {"version":3,"file":"thruster.js","sources":["../../../src/navigation-instruments/thruster/thruster.ts"],"sourcesContent":["import {LitElement, svg, html, css, nothing, SVGTemplateResult} from 'lit';\nimport {property} from 'lit/decorators.js';\nimport {InstrumentState, Priority} from '../types.js';\nimport {LinearAdvice, LinearAdviceRaw, renderAdvice} from './advice.js';\nimport {AdviceState} from '../watch/advice.js';\nimport {TickmarkStyle} from '../watch/tickmark.js';\nimport {singleSidedTickmark} from './tickmark.js';\nimport {PropellerType, bottomPropeller, topPropeller} from './propeller.js';\nimport {SetpointMixin} from '../../svghelpers/setpoint-mixin.js';\nimport {\n drawSetpointMarker,\n getSetpointOutwardOffset,\n SetpointColorMode,\n SetpointVisualState,\n SETPOINT_ANIMATION_CSS_VAR,\n SETPOINT_ANIMATION_DURATION_DEFAULT,\n} from '../../svghelpers/setpoint.js';\nimport {customElement} from '../../decorator.js';\n\n/**\n * @element obc-thruster\n *\n * @prop {number} thrust - The thrust of the thruster in percent (-100 - +100)\n * @prop {boolean} touching - Highlight the thruster when the lever is being touched\n * @prop {Priority} priority - Color priority: `Priority.enhanced` uses the blue/enhanced color palette, `Priority.regular` (default) uses the standard palette.\n * @stable\n */\n@customElement('obc-thruster')\nexport class ObcThruster extends SetpointMixin(LitElement, {\n defaultDeadband: 1,\n}) {\n private _setpointId = `thruster-sp-${Math.random().toString(36).slice(2, 9)}`;\n\n @property({type: Number}) thrust: number = 0;\n @property({type: String}) state: InstrumentState = InstrumentState.active;\n @property({type: String}) priority: Priority = Priority.regular;\n @property({type: Boolean}) tunnel: boolean = false;\n @property({type: Boolean}) singleSided: boolean = false;\n @property({type: Boolean}) singleDirection: boolean = false;\n @property({type: Boolean}) singleDirectionHalfSize: boolean = false;\n @property({type: Array}) advices: LinearAdvice[] = [];\n @property({type: String}) topPropeller: PropellerType = PropellerType.none;\n @property({type: String}) bottomPropeller: PropellerType = PropellerType.none;\n\n override render() {\n return html`<div class=\"container\">\n ${thruster(this.thrust, this.setpoint, this.state, this.priority, {\n atSetpoint: this.atSetpoint,\n tunnel: this.tunnel,\n setpointAtZeroDeadband: this.setpointAtZeroDeadband,\n autoAtSetpoint: this.autoAtSetpoint,\n autoAtSetpointDeadband: this.autoAtSetpointDeadband,\n touching: this.touching,\n singleSided: this.singleSided,\n advices: this.advices,\n singleDirection: this.singleDirection,\n singleDirectionHalfSize: this.singleDirectionHalfSize,\n topPropeller: this.topPropeller,\n bottomPropeller: this.bottomPropeller,\n narrow: !this.tunnel,\n newSetpoint: this.newSetpoint,\n setpointId: this._setpointId,\n })}\n </div>`;\n }\n\n static override styles = css`\n .container {\n height: 100%;\n width: 100%;\n }\n\n .container > svg {\n height: 100%;\n width: 100%;\n }\n `;\n}\n\nexport function thrusterTop(\n height: number,\n value: number,\n colors: {box: string; container: string},\n options: {hideTicks: boolean; hideContainer: boolean; off: boolean}\n) {\n const container = svg`\n <path transform=\"translate(0 -2)\" d=\"M -44 0 v -${height - 8} a 8 8 0 0 1 8 -8 h 72 a 8 8 0 0 1 8 8 V 0 Z\" fill=${colors.container} stroke=\"var(--instrument-frame-tertiary-color)\" vector-effect=\"non-scaling-stroke\"/>\n `;\n const track = options.off\n ? null\n : svg`<rect width=\"40\" height=${height} x=\"-20\" y=${-2 - height} fill=\"var(--instrument-frame-secondary-color)\" stroke=\"var(--instrument-frame-tertiary-color)\" vector-effect=\"non-scaling-stroke\"/>`;\n\n const tickmarks = [];\n\n const nTicks = 2;\n const delta = height / nTicks;\n if (!options.hideTicks) {\n for (let i = 1; i < nTicks; i++) {\n tickmarks.push(\n svg`<line x1=\"-24\" x2=\"-44\" y1=${-i * delta - 2} y2=${\n -i * delta - 2\n } stroke=\"var(--instrument-frame-tertiary-color)\" stroke-width=\"1\" vector-effect=\"non-scaling-stroke\"/>`\n );\n tickmarks.push(\n svg`<line x1=\"24\" x2=\"44\" y1=${-i * delta - 2} y2=${\n -i * delta - 2\n } stroke=\"var(--instrument-frame-tertiary-color)\" stroke-width=\"1\" vector-effect=\"non-scaling-stroke\"/>`\n );\n }\n }\n\n const barHeight = (height * value) / 100;\n const barY = -2 - barHeight;\n const bar = svg`<rect width=\"40\" height=${barHeight} x=\"-20\" y=${barY} fill=${colors.box} stroke=${colors.box} vector-effect=\"non-scaling-stroke\"/>`;\n if (options.hideContainer) {\n return [track, tickmarks, bar];\n } else {\n return [container, track, tickmarks, bar];\n }\n}\n\n/**\n * @param height - The height of the thruster\n * @param value - The value of the thruster\n * @param colors - The colors of the thruster (box and container)\n * @param options - The options of the thruster\n * - hideTicks - Whether to hide the ticks\n * - flipAdicePattern - Whether to flip the advice pattern, to be used when the thruster is on the bottom\n * - hideContainer - Whether to not render the rounded container/wrapper around the thruster,\n * used by the main engine\n * - narrow - Whether to use the narrow version of the thruster\n * @param advice - The advice of the thruster\n * @returns - The thruster top single sided\n */\nexport function thrusterTopSingleSided(\n height: number,\n value: number,\n colors: {box: string; container: string},\n options: {\n hideTicks: boolean;\n flipAdicePattern: boolean;\n hideContainer: boolean;\n narrow: boolean;\n off: boolean;\n },\n advice: LinearAdviceRaw[]\n) {\n const container = options.narrow\n ? svg`\n <path transform=\"translate(0 -2)\" d=\"M -32 0 v -${height - 8} a 8 8 0 0 1 8 -8 h 48 a 8 8 0 0 1 8 8 V 0 Z\" fill=${colors.container} stroke=\"var(--instrument-frame-tertiary-color)\" vector-effect=\"non-scaling-stroke\"/>\n `\n : svg`\n <path transform=\"translate(0 -2)\" d=\"M -40 0 v -${height - 8} a 8 8 0 0 1 8 -8 h 56 a 8 8 0 0 1 8 8 V 0 Z\" fill=${colors.container} stroke=\"var(--instrument-frame-tertiary-color)\" vector-effect=\"non-scaling-stroke\"/>\n `;\n let track: SVGTemplateResult | null = options.narrow\n ? svg`\n <path transform=\"translate(0 -2)\" d=\"M -32 0 v -${height - 8} a 8 8 0 0 1 8 -8 h 32 V 0 Z\" fill=\"var(--instrument-frame-secondary-color)\" stroke=\"var(--instrument-frame-tertiary-color)\" vector-effect=\"non-scaling-stroke\"/>\n `\n : svg`\n <path transform=\"translate(0 -2)\" d=\"M -40 0 v -${height - 8} a 8 8 0 0 1 8 -8 h 40 V 0 Z\" fill=\"var(--instrument-frame-secondary-color)\" stroke=\"var(--instrument-frame-tertiary-color)\" vector-effect=\"non-scaling-stroke\"/>\n `;\n if (options.off) {\n track = null;\n }\n\n const tickmarks = options.hideTicks\n ? []\n : [singleSidedTickmark(height, 50, TickmarkStyle.regular)];\n\n const barHeight = (height * value) / 100;\n const barWidth = options.narrow ? 40 : 48;\n const barX = options.narrow ? -32 : -40;\n const barY = -2 - barHeight;\n const maskId = options.flipAdicePattern\n ? 'thrusterBarMask1'\n : 'thrusterBarMask2';\n // The mask is used to clip the bar to the container shape\n const mask = options.hideContainer\n ? nothing\n : svg`\n <defs>\n <mask id=${maskId}>\n <path transform=\"translate(0 -2)\" d=\"M ${barX} 0 v -${height - 8} a 8 8 0 0 1 8 -8 h ${barWidth} V 0 Z\" fill=\"white\" stroke=\"white\" vector-effect=\"non-scaling-stroke\"/>\n </defs>`;\n const maskAttr = options.hideContainer ? undefined : `url(#${maskId})`;\n const bar = svg`\n ${mask}\n <rect mask=${maskAttr} width=${barWidth} height=${barHeight} x=${barX} y=${barY} fill=${colors.box} stroke=${colors.box} vector-effect=\"non-scaling-stroke\"/>`;\n const advicesSvg = advice.map((a) =>\n renderAdvice(height, a, options.flipAdicePattern)\n );\n const all = [tickmarks, bar, advicesSvg];\n if (!options.hideContainer) {\n all.splice(0, 0, [container, track]);\n }\n if (!options.narrow) {\n return svg`<g transform=\"translate(4 0)\">${all}</g>`;\n } else {\n return all;\n }\n}\n\nexport function thrusterBottom(\n height: number,\n value: number,\n colors: {box: string; container: string},\n options: {hideTicks: boolean; hideContainer: boolean; off: boolean}\n) {\n const container = svg`\n <g transform=\"rotate(180)\">\n ${thrusterTop(height, value, colors, options)}\n </g>\n `;\n return container;\n}\n\nfunction thrusterBottomSingleSided(\n height: number,\n value: number,\n colors: {box: string; container: string},\n options: {\n hideTicks: boolean;\n flipAdicePattern: boolean;\n hideContainer: boolean;\n narrow: boolean;\n off: boolean;\n },\n advice: LinearAdviceRaw[]\n) {\n const container = svg`\n <g transform=\"rotate(180) scale(-1,1)\">\n ${thrusterTopSingleSided(height, value, colors, {hideTicks: options.hideTicks, flipAdicePattern: options.flipAdicePattern, hideContainer: options.hideContainer, narrow: options.narrow, off: options.off}, advice)}\n </g>\n `;\n return container;\n}\n\n// ============================================================================\n// Thruster Setpoint Configuration & Rendering (Unified)\n// ============================================================================\n\n/**\n * Fine-tune inward adjustment (px) for thruster setpoint markers.\n * Similar to `RADIAL_SETPOINT_INWARD_ADJUST` in watch.ts — nudges the marker\n * tip closer to the bar edge so it visually aligns with design specs.\n */\nconst THRUSTER_SETPOINT_INWARD_ADJUST = 4;\n\n/**\n * Configuration for rendering a thruster setpoint marker.\n */\nexport interface ThrusterSetpointConfig {\n /** Instrument state (determines disabled status) */\n state: InstrumentState;\n /** Color priority (determines enhanced vs regular color palette) */\n priority: Priority;\n /** Whether value is at the setpoint (within deadband) */\n atSetpoint: boolean;\n /** User is physically interacting (renders focus visual state) */\n touching: boolean;\n /** Deadband for zero detection */\n setpointAtZeroDeadband: number;\n /** Whether the thruster is single-sided (marker on right side only) */\n singleSided: boolean;\n /** Whether to use narrow layout */\n narrow: boolean;\n /** Pending setpoint during adjustment (shows dual markers) */\n newSetpoint?: number;\n /** Unique ID prefix for SVG defs (avoids collisions with multiple instances) */\n id: string;\n /** Enable CSS-animated confirm transition for setpoint markers. */\n animateSetpoint?: boolean;\n /** Value of departing new-setpoint during confirm animation fade-out. */\n departingNewSetpoint?: number;\n /** Override to derive color from priority regardless of instrument state. */\n setpointOverride?: boolean;\n}\n\n/**\n * Compute the Y coordinate for a thruster setpoint marker.\n *\n * @param height - Thruster bar height\n * @param value - Setpoint value (percent, -100 to +100)\n * @param isAtZero - Whether the value is within zero-snap deadband\n * @returns Y offset (negative = upward)\n */\nfunction thrusterSetpointY(\n height: number,\n value: number,\n isAtZero: boolean\n): number {\n return -(isAtZero\n ? 0\n : Math.sign(value) * ((height * Math.abs(value)) / 100 + 2));\n}\n\n/**\n * Derive visual state for a thruster setpoint, mirroring the radial and linear\n * derivation functions in setpoint.ts and external-scale.ts.\n */\nfunction deriveThrusterSetpointVisualState(config: {\n state: InstrumentState;\n priority: Priority;\n atSetpoint: boolean;\n touching: boolean;\n setpointAtZero: boolean;\n hasNewSetpoint: boolean;\n setpointOverride?: boolean;\n}): {\n visualState: SetpointVisualState;\n colorMode: SetpointColorMode;\n disabled: boolean;\n} {\n const isDisabledState =\n config.state === InstrumentState.loading ||\n config.state === InstrumentState.off;\n const disabled = isDisabledState && !config.setpointOverride;\n const colorMode =\n config.priority === Priority.enhanced\n ? SetpointColorMode.enhanced\n : SetpointColorMode.regular;\n\n if (isDisabledState) {\n return {\n visualState: SetpointVisualState.notEqual,\n colorMode,\n disabled,\n };\n }\n\n // Focus: touching without pending adjustment\n if (config.touching && !config.hasNewSetpoint) {\n return {visualState: SetpointVisualState.focus, colorMode, disabled: false};\n }\n\n // At zero\n if (config.atSetpoint && config.setpointAtZero) {\n return {\n visualState: SetpointVisualState.equalZero,\n colorMode,\n disabled: false,\n };\n }\n\n // At setpoint\n if (config.atSetpoint) {\n return {visualState: SetpointVisualState.equal, colorMode, disabled: false};\n }\n\n return {\n visualState: SetpointVisualState.notEqual,\n colorMode,\n disabled: false,\n };\n}\n\n/**\n * Render thruster setpoint marker(s) using the unified `drawSetpointMarker()`\n * system from `setpoint.ts`.\n *\n * Replaces the legacy `setpointSvg()` function with proper visual states\n * (focus, equalZero, equal, notEqual), themed colors, and sized markers.\n *\n * For double-sided thrusters, renders matching markers on both sides of the bar.\n * When `newSetpoint` is defined, renders dual markers (original dimmed + new in focus).\n *\n * @param height - Thruster bar height in SVG units\n * @param setpointValue - Setpoint value (percent, -100 to +100)\n * @param config - Setpoint rendering configuration\n * @returns SVG template with positioned setpoint marker(s)\n */\nexport function renderThrusterSetpoint(\n height: number,\n setpointValue: number,\n config: ThrusterSetpointConfig\n): SVGTemplateResult {\n const setpointAtZero =\n Math.abs(setpointValue) < config.setpointAtZeroDeadband;\n const hasNewSetpoint = config.newSetpoint !== undefined;\n const hasDepartingNewSetpoint = config.departingNewSetpoint !== undefined;\n const animate = config.animateSetpoint === true;\n\n const {visualState, colorMode, disabled} = deriveThrusterSetpointVisualState({\n state: config.state,\n priority: config.priority,\n atSetpoint: config.atSetpoint,\n touching: config.touching,\n setpointAtZero,\n hasNewSetpoint,\n setpointOverride: config.setpointOverride,\n });\n\n // Y position (matches legacy formula)\n const y = thrusterSetpointY(height, setpointValue, setpointAtZero);\n\n // X position: legacy base offset + visual state outward offset\n // Legacy base: 28 for double-sided, 16 for single-sided narrow, 20 for single-sided non-narrow\n const baseX = 28 + (config.singleSided ? -12 : 0) + (config.narrow ? 0 : 4);\n const outwardOffset = getSetpointOutwardOffset(visualState);\n const tipX = baseX + outwardOffset - THRUSTER_SETPOINT_INWARD_ADJUST;\n\n // Render original setpoint marker\n const opacity = hasNewSetpoint ? 0.75 : 1;\n\n // Right marker: rotate(90) makes tip point left (inward toward bar)\n const rightMarker = drawSetpointMarker({\n visualState,\n colorMode,\n disabled,\n id: `${config.id}-r`,\n });\n\n const result: SVGTemplateResult[] = [];\n\n if (animate) {\n const duration = `var(${SETPOINT_ANIMATION_CSS_VAR}, ${SETPOINT_ANIMATION_DURATION_DEFAULT})`;\n result.push(\n svg`<g style=\"transform: translate(${tipX}px, ${y}px) rotate(90deg); opacity: ${opacity}; transition: transform ${duration} ease-out, opacity ${duration} ease-out;\">${rightMarker}</g>`\n );\n if (!config.singleSided) {\n const leftMarker = drawSetpointMarker({\n visualState,\n colorMode,\n disabled,\n id: `${config.id}-l`,\n });\n result.push(\n svg`<g style=\"transform: translate(${-tipX}px, ${y}px) rotate(-90deg); opacity: ${opacity}; transition: transform ${duration} ease-out, opacity ${duration} ease-out;\">${leftMarker}</g>`\n );\n }\n } else {\n result.push(\n svg`<g transform=\"translate(${tipX}, ${y}) rotate(90)\" opacity=\"${opacity}\">${rightMarker}</g>`\n );\n if (!config.singleSided) {\n const leftMarker = drawSetpointMarker({\n visualState,\n colorMode,\n disabled,\n id: `${config.id}-l`,\n });\n result.push(\n svg`<g transform=\"translate(${-tipX}, ${y}) rotate(-90)\" opacity=\"${opacity}\">${leftMarker}</g>`\n );\n }\n }\n\n // New setpoint marker in focus state (dual-marker adjustment preview)\n // OR departing newSetpoint during confirm animation fade-out\n if (hasNewSetpoint || hasDepartingNewSetpoint) {\n const isActive = hasNewSetpoint;\n const newValue = isActive\n ? config.newSetpoint!\n : config.departingNewSetpoint!;\n const newAtZero = Math.abs(newValue) < config.setpointAtZeroDeadband;\n const newY = thrusterSetpointY(height, newValue, newAtZero);\n const focusOffset = getSetpointOutwardOffset(SetpointVisualState.focus);\n const newTipX = baseX + focusOffset - THRUSTER_SETPOINT_INWARD_ADJUST;\n const targetOpacity = isActive ? 1 : 0;\n\n const newRightMarker = drawSetpointMarker({\n visualState: SetpointVisualState.focus,\n colorMode,\n disabled: false,\n id: `${config.id}-nr`,\n });\n\n if (animate) {\n const duration = `var(${SETPOINT_ANIMATION_CSS_VAR}, ${SETPOINT_ANIMATION_DURATION_DEFAULT})`;\n result.push(\n svg`<g style=\"transform: translate(${newTipX}px, ${newY}px) rotate(90deg); opacity: ${targetOpacity}; transition: opacity ${duration} ease-out;\">${newRightMarker}</g>`\n );\n if (!config.singleSided) {\n const newLeftMarker = drawSetpointMarker({\n visualState: SetpointVisualState.focus,\n colorMode,\n disabled: false,\n id: `${config.id}-nl`,\n });\n result.push(\n svg`<g style=\"transform: translate(${-newTipX}px, ${newY}px) rotate(-90deg); opacity: ${targetOpacity}; transition: opacity ${duration} ease-out;\">${newLeftMarker}</g>`\n );\n }\n } else {\n result.push(\n svg`<g transform=\"translate(${newTipX}, ${newY}) rotate(90)\" opacity=\"${targetOpacity}\">${newRightMarker}</g>`\n );\n if (!config.singleSided) {\n const newLeftMarker = drawSetpointMarker({\n visualState: SetpointVisualState.focus,\n colorMode,\n disabled: false,\n id: `${config.id}-nl`,\n });\n result.push(\n svg`<g transform=\"translate(${-newTipX}, ${newY}) rotate(-90)\" opacity=\"${targetOpacity}\">${newLeftMarker}</g>`\n );\n }\n }\n }\n\n return svg`${result}`;\n}\n\n/**\n * @deprecated Use `renderThrusterSetpoint` instead, which supports\n * focus visual state, equalZero sizing, and the unified marker system.\n *\n * Legacy setpoint marker rendering with hardcoded SVG IDs.\n * Kept for backward compatibility only.\n */\nexport function setpointSvg(\n height: number,\n value: number,\n setpointAtZero: boolean,\n colors: {fill: string; stroke: string},\n options: {\n filled: boolean;\n singleSided: boolean;\n narrow: boolean;\n }\n) {\n const y = -(setpointAtZero\n ? 0\n : Math.sign(value) * ((height * Math.abs(value)) / 100 + 2));\n const extra = (options.singleSided ? -12 : 0) + (options.narrow ? 0 : 4);\n let path;\n if (options.filled) {\n path =\n 'M23.5119 8C24.6981 6.35191 23.5696 4 21.5926 4L2.39959 4C0.422598 4 -0.705911 6.35191 0.480283 8L11.9961 24L23.5119 8Z';\n } else {\n path =\n 'M18.5836 8L5.4086 8L11.9961 17.1526L18.5836 8ZM23.5119 8C24.6981 6.35191 23.5696 4 21.5926 4L2.39959 4C0.422598 4 -0.705911 6.35191 0.480283 8L11.9961 24L23.5119 8Z';\n }\n return svg`\n <defs>\n <g id=\"thrusterSetpoint\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" transform=\"translate(24 -12) rotate(90)\" d=${path} vector-effect=\"non-scaling-stroke\"/>\n </g>\n <mask id=\"thrusterSetpointMask\">\n <rect x=\"-20\" y=\"-20\" width=\"50\" height=\"50\" fill=\"white\" />\n <use href=\"#thrusterSetpoint\" fill=\"black\" />\n </mask>\n </defs>\n <g transform=\"translate(0 ${y})\">\n <use href=\"#thrusterSetpoint\" fill=${colors.fill} stroke=\"none\" transform=\"translate(${28 + extra} 0)\"/>\n <use href=\"#thrusterSetpoint\" mask=\"url(#thrusterSetpointMask)\" transform=\"translate(${28 + extra} 0)\" fill=\"none\" stroke=${colors.stroke} stroke-width=\"2\" stroke-linejoin=\"round\" vector-effect=\"non-scaling-stroke\"/>\n ${\n options.singleSided\n ? null\n : svg`\n <use href=\"#thrusterSetpoint\" transform=\"rotate(180) translate(28 0)\" fill=${colors.fill} stroke=\"none\"/>\n <use href=\"#thrusterSetpoint\" transform=\"rotate(180) translate(28 0)\" mask=\"url(#thrusterSetpointMask)\" fill=\"none\" stroke=${colors.stroke} stroke-width=\"2\" stroke-linejoin=\"round\" vector-effect=\"non-scaling-stroke\"/>\n `\n }\n </g>\n `;\n}\n\nexport function atSetpoint(\n thrust: number,\n setpoint: number | undefined,\n options: {\n autoAtSetpoint: boolean;\n autoAtSetpointDeadband: number;\n touching: boolean;\n atSetpoint: boolean;\n }\n): boolean {\n if (options.touching) {\n return false;\n }\n\n if (options.autoAtSetpoint && setpoint !== undefined) {\n return Math.abs(thrust - setpoint) < options.autoAtSetpointDeadband;\n }\n\n return options.atSetpoint;\n}\n\nexport function thruster(\n thrust: number,\n setpoint: number | undefined,\n state: InstrumentState,\n priority: Priority,\n options: {\n atSetpoint: boolean;\n tunnel: boolean;\n singleSided: boolean;\n singleDirection: boolean;\n singleDirectionHalfSize: boolean;\n setpointAtZeroDeadband: number;\n autoAtSetpoint: boolean;\n autoAtSetpointDeadband: number;\n touching: boolean;\n advices: LinearAdvice[];\n topPropeller: PropellerType;\n bottomPropeller: PropellerType;\n narrow: boolean;\n /** Pending setpoint during adjustment (shows dual markers) */\n newSetpoint?: number;\n /** Unique ID prefix for setpoint SVG defs. Falls back to legacy hardcoded IDs. */\n setpointId?: string;\n /** Enable CSS-animated confirm transition. */\n animateSetpoint?: boolean;\n /** Departing new-setpoint value during confirm animation fade-out. */\n departingNewSetpoint?: number;\n /** Override to derive color from priority regardless of instrument state. */\n setpointOverride?: boolean;\n }\n) {\n if (options.tunnel) {\n thrust = -thrust;\n setpoint = setpoint === undefined ? undefined : -setpoint;\n }\n\n if (!options.singleSided && options.advices.length > 0) {\n throw new Error('Double sided thruster does not support advice');\n }\n\n options.atSetpoint = atSetpoint(thrust, setpoint, options);\n\n const tc = thrusterColors(options, state, priority);\n\n let centerLine = svg`\n <rect x=\"-44\" y=\"-2\" width=\"88\" height=\"4\" stroke-width=\"1\" fill=${tc.zeroLineColor} stroke=${tc.zeroLineColor} vector-effect=\"non-scaling-stroke\"/>\n `;\n if (options.singleSided) {\n const width = options.narrow ? 64 : 72;\n const x = options.narrow ? -32 : -36;\n centerLine = svg`<rect x=${x} y=\"-2\" width=${width} height=\"4\" stroke-width=\"1\" fill=${tc.zeroLineColor} stroke=${tc.zeroLineColor} vector-effect=\"non-scaling-stroke\"/>`;\n }\n\n const setpointAtZero =\n Math.abs(setpoint || 0) < options.setpointAtZeroDeadband;\n\n const {topAdvices, bottomAdvices} = convertThrustAdvices(\n options.advices,\n setpoint\n );\n\n const thrusterSvg = [];\n const baseheight = options.topPropeller === PropellerType.none ? 134 : 106;\n const height = options.singleDirection ? baseheight * 2 : baseheight;\n if (options.singleSided) {\n thrusterSvg.push(\n thrusterTopSingleSided(\n height,\n Math.max(thrust, 0),\n {box: tc.boxColor, container: tc.containerBackgroundColor},\n {\n hideTicks: tc.hideTicks,\n flipAdicePattern: false,\n hideContainer: false,\n narrow: options.narrow,\n off: state === InstrumentState.off,\n },\n topAdvices\n )\n );\n if (!(options.singleDirection || options.singleDirectionHalfSize)) {\n thrusterSvg.push(\n thrusterBottomSingleSided(\n height,\n Math.max(-thrust, 0),\n {box: tc.boxColor, container: tc.containerBackgroundColor},\n {\n hideTicks: tc.hideTicks,\n flipAdicePattern: true,\n hideContainer: false,\n narrow: options.narrow,\n off: state === InstrumentState.off,\n },\n bottomAdvices\n )\n );\n }\n thrusterSvg.push(centerLine);\n } else {\n thrusterSvg.push(\n thrusterTop(\n height,\n Math.max(thrust, 0),\n {box: tc.boxColor, container: tc.containerBackgroundColor},\n {\n hideTicks: tc.hideTicks,\n hideContainer: false,\n off: state === InstrumentState.off,\n }\n )\n );\n if (!options.singleDirection) {\n thrusterSvg.push(\n thrusterBottom(\n height,\n Math.max(-thrust, 0),\n {box: tc.boxColor, container: tc.containerBackgroundColor},\n {\n hideTicks: tc.hideTicks,\n hideContainer: false,\n off: state === InstrumentState.off,\n }\n )\n );\n }\n thrusterSvg.push(centerLine);\n }\n if (setpoint !== undefined) {\n if (options.setpointId) {\n // Unified setpoint rendering with proper visual states\n thrusterSvg.push(\n renderThrusterSetpoint(height, setpoint, {\n state,\n priority,\n atSetpoint: options.atSetpoint,\n touching: options.touching,\n setpointAtZeroDeadband: options.setpointAtZeroDeadband,\n singleSided: options.singleSided,\n narrow: options.narrow,\n newSetpoint: options.newSetpoint,\n id: options.setpointId,\n animateSetpoint: options.animateSetpoint,\n departingNewSetpoint: options.departingNewSetpoint,\n setpointOverride: options.setpointOverride,\n })\n );\n } else {\n // Legacy fallback (deprecated — no focus/equalZero visual states)\n thrusterSvg.push(\n setpointSvg(\n height,\n setpoint,\n setpointAtZero,\n {\n fill: tc.setPointColor,\n stroke: 'var(--border-silhouette-color)',\n },\n {\n filled:\n priority === Priority.enhanced || state === InstrumentState.off,\n singleSided: options.singleSided,\n narrow: options.narrow,\n }\n )\n );\n }\n }\n\n if (options.tunnel) {\n return svg`\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-160 -64 320 128\" x=\"-160\" y=\"-64\">\n <g transform=\"rotate(-90)\">\n ${thrusterSvg}\n </g>\n </svg>`;\n } else {\n let viewBox = '-80 -160 160 320';\n let y = -160;\n if (options.singleDirection) {\n viewBox = '-80 -300 160 320';\n y = -320;\n }\n const top = topPropeller(height, tc.arrowColor, options.topPropeller);\n const bottom = bottomPropeller(\n options.singleDirectionHalfSize ? 0.5 : height,\n options.bottomPropeller\n );\n return svg`\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=${viewBox} x=\"-80\" y=${y} width=\"160\" height=\"320\">\n ${top}\n ${bottom}\n ${thrusterSvg}\n </svg>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'obc-thruster': ObcThruster;\n }\n}\n\nexport function convertThrustAdvices(\n advices: LinearAdvice[],\n thrustSetpoint: number | undefined\n): {topAdvices: LinearAdviceRaw[]; bottomAdvices: LinearAdviceRaw[]} {\n const rawAdvices: LinearAdviceRaw[] = advices.map((a) => {\n const triggered =\n thrustSetpoint !== undefined &&\n thrustSetpoint >= a.min &&\n thrustSetpoint <= a.max;\n let state: AdviceState;\n if (triggered) {\n state = AdviceState.triggered;\n } else if (a.hinted) {\n state = AdviceState.hinted;\n } else {\n state = AdviceState.regular;\n }\n return {\n min: a.min,\n max: a.max,\n type: a.type,\n state,\n hinted: a.hinted,\n };\n });\n\n const topAdvices = rawAdvices.filter((a) => a.min >= 0);\n const bottomAdvices = rawAdvices\n .filter((a) => a.max <= 0)\n .map((a) => ({...a, min: -a.max, max: -a.min}));\n return {topAdvices, bottomAdvices};\n}\n\nexport function thrusterColors(\n options: {atSetpoint: boolean; touching: boolean},\n state: InstrumentState,\n priority: Priority\n) {\n const isEnhanced = priority === Priority.enhanced;\n let boxColor = isEnhanced\n ? 'var(--instrument-enhanced-secondary-color)'\n : 'var(--instrument-regular-secondary-color)';\n let setPointColor = isEnhanced\n ? 'var(--instrument-enhanced-primary-color)'\n : 'var(--instrument-regular-primary-color)';\n let arrowColor = 'var(--instrument-regular-secondary-color)';\n let containerBackgroundColor = 'var(--instrument-frame-primary-color)';\n let zeroLineColor = isEnhanced\n ? 'var(--instrument-enhanced-secondary-color)'\n : 'var(--instrument-regular-secondary-color)';\n let hideTicks = false;\n if (options.atSetpoint) {\n setPointColor = boxColor;\n }\n if (state === InstrumentState.loading) {\n boxColor = 'transparent';\n setPointColor = 'var(--instrument-frame-tertiary-color)';\n zeroLineColor = 'var(--instrument-frame-tertiary-color)';\n arrowColor = 'var(--instrument-regular-secondary-color)';\n hideTicks = true;\n } else if (state === InstrumentState.off) {\n boxColor = 'transparent';\n setPointColor = 'var(--instrument-frame-tertiary-color)';\n arrowColor = 'var(--instrument-frame-tertiary-color)';\n zeroLineColor = 'var(--instrument-frame-tertiary-color)';\n hideTicks = true;\n containerBackgroundColor = 'transparent';\n }\n return {\n zeroLineColor,\n boxColor,\n containerBackgroundColor,\n hideTicks,\n setPointColor,\n arrowColor,\n };\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AA4BO,IAAM,cAAN,cAA0B,cAAc,YAAY;AAAA,EACzD,iBAAiB;AACnB,CAAC,EAAE;AAAA,EAFI,cAAA;AAAA,UAAA,GAAA,SAAA;AAGL,SAAQ,cAAc,eAAe,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAEjD,SAAA,SAAiB;AACjB,SAAA,QAAyB,gBAAgB;AACzC,SAAA,WAAqB,SAAS;AAC7B,SAAA,SAAkB;AAClB,SAAA,cAAuB;AACvB,SAAA,kBAA2B;AAC3B,SAAA,0BAAmC;AACrC,SAAA,UAA0B,CAAA;AACzB,SAAA,eAA8B,cAAc;AAC5C,SAAA,kBAAiC,cAAc;AAAA,EAAA;AAAA,EAEhE,SAAS;AAChB,WAAO;AAAA,QACH,SAAS,KAAK,QAAQ,KAAK,UAAU,KAAK,OAAO,KAAK,UAAU;AAAA,MAChE,YAAY,KAAK;AAAA,MACjB,QAAQ,KAAK;AAAA,MACb,wBAAwB,KAAK;AAAA,MAC7B,gBAAgB,KAAK;AAAA,MACrB,wBAAwB,KAAK;AAAA,MAC7B,UAAU,KAAK;AAAA,MACf,aAAa,KAAK;AAAA,MAClB,SAAS,KAAK;AAAA,MACd,iBAAiB,KAAK;AAAA,MACtB,yBAAyB,KAAK;AAAA,MAC9B,cAAc,KAAK;AAAA,MACnB,iBAAiB,KAAK;AAAA,MACtB,QAAQ,CAAC,KAAK;AAAA,MACd,aAAa,KAAK;AAAA,MAClB,YAAY,KAAK;AAAA,IAAA,CAClB,CAAC;AAAA;AAAA,EAEN;AAaF;AAjDa,YAsCK,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAjCC,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GALb,YAKe,WAAA,UAAA,CAAA;AACA,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GANb,YAMe,WAAA,SAAA,CAAA;AACA,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GAPb,YAOe,WAAA,YAAA,CAAA;AACC,gBAAA;AAAA,EAA1B,SAAS,EAAC,MAAM,QAAA,CAAQ;AAAA,GARd,YAQgB,WAAA,UAAA,CAAA;AACA,gBAAA;AAAA,EAA1B,SAAS,EAAC,MAAM,QAAA,CAAQ;AAAA,GATd,YASgB,WAAA,eAAA,CAAA;AACA,gBAAA;AAAA,EAA1B,SAAS,EAAC,MAAM,QAAA,CAAQ;AAAA,GAVd,YAUgB,WAAA,mBAAA,CAAA;AACA,gBAAA;AAAA,EAA1B,SAAS,EAAC,MAAM,QAAA,CAAQ;AAAA,GAXd,YAWgB,WAAA,2BAAA,CAAA;AACF,gBAAA;AAAA,EAAxB,SAAS,EAAC,MAAM,MAAA,CAAM;AAAA,GAZZ,YAYc,WAAA,WAAA,CAAA;AACC,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GAbb,YAae,WAAA,gBAAA,CAAA;AACA,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GAdb,YAce,WAAA,mBAAA,CAAA;AAdf,cAAN,gBAAA;AAAA,EADN,cAAc,cAAc;AAAA,GAChB,WAAA;AAmDN,SAAS,YACd,QACA,OACA,QACA,SACA;AACA,QAAM,YAAY;AAAA,yDACqC,SAAS,CAAC,uDAAuD,OAAO,SAAS;AAAA;AAExI,QAAM,QAAQ,QAAQ,MAClB,OACA,8BAA8B,MAAM,mBAAmB,MAAM;AAEjE,QAAM,YAAY,CAAA;AAElB,QAAM,SAAS;AACf,QAAM,QAAQ,SAAS;AACvB,MAAI,CAAC,QAAQ,WAAW;AACtB,aAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC/B,gBAAU;AAAA,QACR,iCAAiC,CAAC,IAAI,QAAQ,CAAC,QAC7C,CAAC,IAAI,QAAQ,CACf;AAAA,MAAA;AAEF,gBAAU;AAAA,QACR,iCAAiC,CAAC,IAAI,QAAQ,CAAC,QAC7C,CAAC,IAAI,QAAQ,CACf;AAAA,MAAA;AAAA,IAEJ;AAAA,EACF;AAEA,QAAM,YAAa,SAAS,QAAS;AACrC,QAAM,OAAO,KAAK;AAClB,QAAM,MAAM,8BAA8B,SAAS,cAAc,IAAI,SAAS,OAAO,GAAG,WAAW,OAAO,GAAG;AAC7G,MAAI,QAAQ,eAAe;AACzB,WAAO,CAAC,OAAO,WAAW,GAAG;AAAA,EAC/B,OAAO;AACL,WAAO,CAAC,WAAW,OAAO,WAAW,GAAG;AAAA,EAC1C;AACF;AAeO,SAAS,uBACd,QACA,OACA,QACA,SAOA,QACA;AACA,QAAM,YAAY,QAAQ,SACtB;AAAA,yDACmD,SAAS,CAAC,uDAAuD,OAAO,SAAS;AAAA,MAEpI;AAAA,yDACmD,SAAS,CAAC,uDAAuD,OAAO,SAAS;AAAA;AAExI,MAAI,QAAkC,QAAQ,SAC1C;AAAA,yDACmD,SAAS,CAAC;AAAA,MAE7D;AAAA,yDACmD,SAAS,CAAC;AAAA;AAEjE,MAAI,QAAQ,KAAK;AACf,YAAQ;AAAA,EACV;AAEA,QAAM,YAAY,QAAQ,YACtB,KACA,CAAC,oBAAoB,QAAQ,IAAI,cAAc,OAAO,CAAC;AAE3D,QAAM,YAAa,SAAS,QAAS;AACrC,QAAM,WAAW,QAAQ,SAAS,KAAK;AACvC,QAAM,OAAO,QAAQ,SAAS,MAAM;AACpC,QAAM,OAAO,KAAK;AAClB,QAAM,SAAS,QAAQ,mBACnB,qBACA;AAEJ,QAAM,OAAO,QAAQ,gBACjB,UACA;AAAA;AAAA,aAEO,MAAM;AAAA,2CACwB,IAAI,UAAU,SAAS,CAAC,wBAAwB,QAAQ;AAAA;AAEjG,QAAM,WAAW,QAAQ,gBAAgB,SAAY,QAAQ,MAAM;AACnE,QAAM,MAAM;AAAA,MACR,IAAI;AAAA,iBACO,QAAQ,UAAU,QAAQ,WAAW,SAAS,MAAM,IAAI,MAAM,IAAI,SAAS,OAAO,GAAG,WAAW,OAAO,GAAG;AACzH,QAAM,aAAa,OAAO;AAAA,IAAI,CAAC,MAC7B,aAAa,QAAQ,GAAG,QAAQ,gBAAgB;AAAA,EAAA;AAElD,QAAM,MAAM,CAAC,WAAW,KAAK,UAAU;AACvC,MAAI,CAAC,QAAQ,eAAe;AAC1B,QAAI,OAAO,GAAG,GAAG,CAAC,WAAW,KAAK,CAAC;AAAA,EACrC;AACA,MAAI,CAAC,QAAQ,QAAQ;AACnB,WAAO,oCAAoC,GAAG;AAAA,EAChD,OAAO;AACL,WAAO;AAAA,EACT;AACF;AAEO,SAAS,eACd,QACA,OACA,QACA,SACA;AACA,QAAM,YAAY;AAAA;AAAA,UAEV,YAAY,QAAQ,OAAO,QAAQ,OAAO,CAAC;AAAA;AAAA;AAGnD,SAAO;AACT;AAEA,SAAS,0BACP,QACA,OACA,QACA,SAOA,QACA;AACA,QAAM,YAAY;AAAA;AAAA,UAEV,uBAAuB,QAAQ,OAAO,QAAQ,EAAC,WAAW,QAAQ,WAAW,kBAAkB,QAAQ,kBAAkB,eAAe,QAAQ,eAAe,QAAQ,QAAQ,QAAQ,KAAK,QAAQ,IAAA,GAAM,MAAM,CAAC;AAAA;AAAA;AAGzN,SAAO;AACT;AAWA,MAAM,kCAAkC;AAwCxC,SAAS,kBACP,QACA,OACA,UACQ;AACR,SAAO,EAAE,WACL,IACA,KAAK,KAAK,KAAK,KAAM,SAAS,KAAK,IAAI,KAAK,IAAK,MAAM;AAC7D;AAMA,SAAS,kCAAkC,QAYzC;AACA,QAAM,kBACJ,OAAO,UAAU,gBAAgB,WACjC,OAAO,UAAU,gBAAgB;AACnC,QAAM,WAAW,mBAAmB,CAAC,OAAO;AAC5C,QAAM,YACJ,OAAO,aAAa,SAAS,WACzB,kBAAkB,WAClB,kBAAkB;AAExB,MAAI,iBAAiB;AACnB,WAAO;AAAA,MACL,aAAa,oBAAoB;AAAA,MACjC;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AAGA,MAAI,OAAO,YAAY,CAAC,OAAO,gBAAgB;AAC7C,WAAO,EAAC,aAAa,oBAAoB,OAAO,WAAW,UAAU,MAAA;AAAA,EACvE;AAGA,MAAI,OAAO,cAAc,OAAO,gBAAgB;AAC9C,WAAO;AAAA,MACL,aAAa,oBAAoB;AAAA,MACjC;AAAA,MACA,UAAU;AAAA,IAAA;AAAA,EAEd;AAGA,MAAI,OAAO,YAAY;AACrB,WAAO,EAAC,aAAa,oBAAoB,OAAO,WAAW,UAAU,MAAA;AAAA,EACvE;AAEA,SAAO;AAAA,IACL,aAAa,oBAAoB;AAAA,IACjC;AAAA,IACA,UAAU;AAAA,EAAA;AAEd;AAiBO,SAAS,uBACd,QACA,eACA,QACmB;AACnB,QAAM,iBACJ,KAAK,IAAI,aAAa,IAAI,OAAO;AACnC,QAAM,iBAAiB,OAAO,gBAAgB;AAC9C,QAAM,0BAA0B,OAAO,yBAAyB;AAChE,QAAM,UAAU,OAAO,oBAAoB;AAE3C,QAAM,EAAC,aAAa,WAAW,SAAA,IAAY,kCAAkC;AAAA,IAC3E,OAAO,OAAO;AAAA,IACd,UAAU,OAAO;AAAA,IACjB,YAAY,OAAO;AAAA,IACnB,UAAU,OAAO;AAAA,IACjB;AAAA,IACA;AAAA,IACA,kBAAkB,OAAO;AAAA,EAAA,CAC1B;AAGD,QAAM,IAAI,kBAAkB,QAAQ,eAAe,cAAc;AAIjE,QAAM,QAAQ,MAAM,OAAO,cAAc,MAAM,MAAM,OAAO,SAAS,IAAI;AACzE,QAAM,gBAAgB,yBAAyB,WAAW;AAC1D,QAAM,OAAO,QAAQ,gBAAgB;AAGrC,QAAM,UAAU,iBAAiB,OAAO;AAGxC,QAAM,cAAc,mBAAmB;AAAA,IACrC;AAAA,IACA;AAAA,IACA;AAAA,IACA,IAAI,GAAG,OAAO,EAAE;AAAA,EAAA,CACjB;AAED,QAAM,SAA8B,CAAA;AAEpC,MAAI,SAAS;AACX,UAAM,WAAW,OAAO,0BAA0B,KAAK,mCAAmC;AAC1F,WAAO;AAAA,MACL,qCAAqC,IAAI,OAAO,CAAC,+BAA+B,OAAO,2BAA2B,QAAQ,sBAAsB,QAAQ,eAAe,WAAW;AAAA,IAAA;AAEpL,QAAI,CAAC,OAAO,aAAa;AACvB,YAAM,aAAa,mBAAmB;AAAA,QACpC;AAAA,QACA;AAAA,QACA;AAAA,QACA,IAAI,GAAG,OAAO,EAAE;AAAA,MAAA,CACjB;AACD,aAAO;AAAA,QACL,qCAAqC,CAAC,IAAI,OAAO,CAAC,gCAAgC,OAAO,2BAA2B,QAAQ,sBAAsB,QAAQ,eAAe,UAAU;AAAA,MAAA;AAAA,IAEvL;AAAA,EACF,OAAO;AACL,WAAO;AAAA,MACL,8BAA8B,IAAI,KAAK,CAAC,0BAA0B,OAAO,KAAK,WAAW;AAAA,IAAA;AAE3F,QAAI,CAAC,OAAO,aAAa;AACvB,YAAM,aAAa,mBAAmB;AAAA,QACpC;AAAA,QACA;AAAA,QACA;AAAA,QACA,IAAI,GAAG,OAAO,EAAE;AAAA,MAAA,CACjB;AACD,aAAO;AAAA,QACL,8BAA8B,CAAC,IAAI,KAAK,CAAC,2BAA2B,OAAO,KAAK,UAAU;AAAA,MAAA;AAAA,IAE9F;AAAA,EACF;AAIA,MAAI,kBAAkB,yBAAyB;AAC7C,UAAM,WAAW;AACjB,UAAM,WAAW,WACb,OAAO,cACP,OAAO;AACX,UAAM,YAAY,KAAK,IAAI,QAAQ,IAAI,OAAO;AAC9C,UAAM,OAAO,kBAAkB,QAAQ,UAAU,SAAS;AAC1D,UAAM,cAAc,yBAAyB,oBAAoB,KAAK;AACtE,UAAM,UAAU,QAAQ,cAAc;AACtC,UAAM,gBAAgB,WAAW,IAAI;AAErC,UAAM,iBAAiB,mBAAmB;AAAA,MACxC,aAAa,oBAAoB;AAAA,MACjC;AAAA,MACA,UAAU;AAAA,MACV,IAAI,GAAG,OAAO,EAAE;AAAA,IAAA,CACjB;AAED,QAAI,SAAS;AACX,YAAM,WAAW,OAAO,0BAA0B,KAAK,mCAAmC;AAC1F,aAAO;AAAA,QACL,qCAAqC,OAAO,OAAO,IAAI,+BAA+B,aAAa,yBAAyB,QAAQ,eAAe,cAAc;AAAA,MAAA;AAEnK,UAAI,CAAC,OAAO,aAAa;AACvB,cAAM,gBAAgB,mBAAmB;AAAA,UACvC,aAAa,oBAAoB;AAAA,UACjC;AAAA,UACA,UAAU;AAAA,UACV,IAAI,GAAG,OAAO,EAAE;AAAA,QAAA,CACjB;AACD,eAAO;AAAA,UACL,qCAAqC,CAAC,OAAO,OAAO,IAAI,gCAAgC,aAAa,yBAAyB,QAAQ,eAAe,aAAa;AAAA,QAAA;AAAA,MAEtK;AAAA,IACF,OAAO;AACL,aAAO;AAAA,QACL,8BAA8B,OAAO,KAAK,IAAI,0BAA0B,aAAa,KAAK,cAAc;AAAA,MAAA;AAE1G,UAAI,CAAC,OAAO,aAAa;AACvB,cAAM,gBAAgB,mBAAmB;AAAA,UACvC,aAAa,oBAAoB;AAAA,UACjC;AAAA,UACA,UAAU;AAAA,UACV,IAAI,GAAG,OAAO,EAAE;AAAA,QAAA,CACjB;AACD,eAAO;AAAA,UACL,8BAA8B,CAAC,OAAO,KAAK,IAAI,2BAA2B,aAAa,KAAK,aAAa;AAAA,QAAA;AAAA,MAE7G;AAAA,IACF;AAAA,EACF;AAEA,SAAO,MAAM,MAAM;AACrB;AASO,SAAS,YACd,QACA,OACA,gBACA,QACA,SAKA;AACA,QAAM,IAAI,EAAE,iBACR,IACA,KAAK,KAAK,KAAK,KAAM,SAAS,KAAK,IAAI,KAAK,IAAK,MAAM;AAC3D,QAAM,SAAS,QAAQ,cAAc,MAAM,MAAM,QAAQ,SAAS,IAAI;AACtE,MAAI;AACJ,MAAI,QAAQ,QAAQ;AAClB,WACE;AAAA,EACJ,OAAO;AACL,WACE;AAAA,EACJ;AACA,SAAO;AAAA;AAAA;AAAA,mGAG0F,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAOzE,CAAC;AAAA,yCACU,OAAO,IAAI,uCAAuC,KAAK,KAAK;AAAA,2FACV,KAAK,KAAK,2BAA2B,OAAO,MAAM;AAAA,MAEvI,QAAQ,cACJ,OACA;AAAA,iFACuE,OAAO,IAAI;AAAA,iIACqC,OAAO,MAAM;AAAA,OAE1I;AAAA;AAAA;AAGJ;AAEO,SAAS,WACd,QACA,UACA,SAMS;AACT,MAAI,QAAQ,UAAU;AACpB,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,kBAAkB,aAAa,QAAW;AACpD,WAAO,KAAK,IAAI,SAAS,QAAQ,IAAI,QAAQ;AAAA,EAC/C;AAEA,SAAO,QAAQ;AACjB;AAEO,SAAS,SACd,QACA,UACA,OACA,UACA,SAyBA;AACA,MAAI,QAAQ,QAAQ;AAClB,aAAS,CAAC;AACV,eAAW,aAAa,SAAY,SAAY,CAAC;AAAA,EACnD;AAEA,MAAI,CAAC,QAAQ,eAAe,QAAQ,QAAQ,SAAS,GAAG;AACtD,UAAM,IAAI,MAAM,+CAA+C;AAAA,EACjE;AAEA,UAAQ,aAAa,WAAW,QAAQ,UAAU,OAAO;AAEzD,QAAM,KAAK,eAAe,SAAS,OAAO,QAAQ;AAElD,MAAI,aAAa;AAAA,uEACoD,GAAG,aAAa,WAAW,GAAG,aAAa;AAAA;AAEhH,MAAI,QAAQ,aAAa;AACvB,UAAM,QAAQ,QAAQ,SAAS,KAAK;AACpC,UAAM,IAAI,QAAQ,SAAS,MAAM;AACjC,iBAAa,cAAc,CAAC,iBAAiB,KAAK,qCAAqC,GAAG,aAAa,WAAW,GAAG,aAAa;AAAA,EACpI;AAEA,QAAM,iBACJ,KAAK,IAAI,YAAY,CAAC,IAAI,QAAQ;AAEpC,QAAM,EAAC,YAAY,cAAA,IAAiB;AAAA,IAClC,QAAQ;AAAA,IACR;AAAA,EAAA;AAGF,QAAM,cAAc,CAAA;AACpB,QAAM,aAAa,QAAQ,iBAAiB,cAAc,OAAO,MAAM;AACvE,QAAM,SAAS,QAAQ,kBAAkB,aAAa,IAAI;AAC1D,MAAI,QAAQ,aAAa;AACvB,gBAAY;AAAA,MACV;AAAA,QACE;AAAA,QACA,KAAK,IAAI,QAAQ,CAAC;AAAA,QAClB,EAAC,KAAK,GAAG,UAAU,WAAW,GAAG,yBAAA;AAAA,QACjC;AAAA,UACE,WAAW,GAAG;AAAA,UACd,kBAAkB;AAAA,UAClB,eAAe;AAAA,UACf,QAAQ,QAAQ;AAAA,UAChB,KAAK,UAAU,gBAAgB;AAAA,QAAA;AAAA,QAEjC;AAAA,MAAA;AAAA,IACF;AAEF,QAAI,EAAE,QAAQ,mBAAmB,QAAQ,0BAA0B;AACjE,kBAAY;AAAA,QACV;AAAA,UACE;AAAA,UACA,KAAK,IAAI,CAAC,QAAQ,CAAC;AAAA,UACnB,EAAC,KAAK,GAAG,UAAU,WAAW,GAAG,yBAAA;AAAA,UACjC;AAAA,YACE,WAAW,GAAG;AAAA,YACd,kBAAkB;AAAA,YAClB,eAAe;AAAA,YACf,QAAQ,QAAQ;AAAA,YAChB,KAAK,UAAU,gBAAgB;AAAA,UAAA;AAAA,UAEjC;AAAA,QAAA;AAAA,MACF;AAAA,IAEJ;AACA,gBAAY,KAAK,UAAU;AAAA,EAC7B,OAAO;AACL,gBAAY;AAAA,MACV;AAAA,QACE;AAAA,QACA,KAAK,IAAI,QAAQ,CAAC;AAAA,QAClB,EAAC,KAAK,GAAG,UAAU,WAAW,GAAG,yBAAA;AAAA,QACjC;AAAA,UACE,WAAW,GAAG;AAAA,UACd,eAAe;AAAA,UACf,KAAK,UAAU,gBAAgB;AAAA,QAAA;AAAA,MACjC;AAAA,IACF;AAEF,QAAI,CAAC,QAAQ,iBAAiB;AAC5B,kBAAY;AAAA,QACV;AAAA,UACE;AAAA,UACA,KAAK,IAAI,CAAC,QAAQ,CAAC;AAAA,UACnB,EAAC,KAAK,GAAG,UAAU,WAAW,GAAG,yBAAA;AAAA,UACjC;AAAA,YACE,WAAW,GAAG;AAAA,YACd,eAAe;AAAA,YACf,KAAK,UAAU,gBAAgB;AAAA,UAAA;AAAA,QACjC;AAAA,MACF;AAAA,IAEJ;AACA,gBAAY,KAAK,UAAU;AAAA,EAC7B;AACA,MAAI,aAAa,QAAW;AAC1B,QAAI,QAAQ,YAAY;AAEtB,kBAAY;AAAA,QACV,uBAAuB,QAAQ,UAAU;AAAA,UACvC;AAAA,UACA;AAAA,UACA,YAAY,QAAQ;AAAA,UACpB,UAAU,QAAQ;AAAA,UAClB,wBAAwB,QAAQ;AAAA,UAChC,aAAa,QAAQ;AAAA,UACrB,QAAQ,QAAQ;AAAA,UAChB,aAAa,QAAQ;AAAA,UACrB,IAAI,QAAQ;AAAA,UACZ,iBAAiB,QAAQ;AAAA,UACzB,sBAAsB,QAAQ;AAAA,UAC9B,kBAAkB,QAAQ;AAAA,QAAA,CAC3B;AAAA,MAAA;AAAA,IAEL,OAAO;AAEL,kBAAY;AAAA,QACV;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,YACE,MAAM,GAAG;AAAA,YACT,QAAQ;AAAA,UAAA;AAAA,UAEV;AAAA,YACE,QACE,aAAa,SAAS,YAAY,UAAU,gBAAgB;AAAA,YAC9D,aAAa,QAAQ;AAAA,YACrB,QAAQ,QAAQ;AAAA,UAAA;AAAA,QAClB;AAAA,MACF;AAAA,IAEJ;AAAA,EACF;AAEA,MAAI,QAAQ,QAAQ;AAClB,WAAO;AAAA;AAAA;AAAA,YAGC,WAAW;AAAA;AAAA;AAAA,EAGrB,OAAO;AACL,QAAI,UAAU;AACd,QAAI,IAAI;AACR,QAAI,QAAQ,iBAAiB;AAC3B,gBAAU;AACV,UAAI;AAAA,IACN;AACA,UAAM,MAAM,aAAa,QAAQ,GAAG,YAAY,QAAQ,YAAY;AACpE,UAAM,SAAS;AAAA,MACb,QAAQ,0BAA0B,MAAM;AAAA,MACxC,QAAQ;AAAA,IAAA;AAEV,WAAO;AAAA,sDAC2C,OAAO,cAAc,CAAC;AAAA,QACpE,GAAG;AAAA,QACH,MAAM;AAAA,QACN,WAAW;AAAA;AAAA;AAAA,EAGjB;AACF;AAQO,SAAS,qBACd,SACA,gBACmE;AACnE,QAAM,aAAgC,QAAQ,IAAI,CAAC,MAAM;AACvD,UAAM,YACJ,mBAAmB,UACnB,kBAAkB,EAAE,OACpB,kBAAkB,EAAE;AACtB,QAAI;AACJ,QAAI,WAAW;AACb,cAAQ,YAAY;AAAA,IACtB,WAAW,EAAE,QAAQ;AACnB,cAAQ,YAAY;AAAA,IACtB,OAAO;AACL,cAAQ,YAAY;AAAA,IACtB;AACA,WAAO;AAAA,MACL,KAAK,EAAE;AAAA,MACP,KAAK,EAAE;AAAA,MACP,MAAM,EAAE;AAAA,MACR;AAAA,MACA,QAAQ,EAAE;AAAA,IAAA;AAAA,EAEd,CAAC;AAED,QAAM,aAAa,WAAW,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC;AACtD,QAAM,gBAAgB,WACnB,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,EACxB,IAAI,CAAC,OAAO,EAAC,GAAG,GAAG,KAAK,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,IAAA,EAAK;AAChD,SAAO,EAAC,YAAY,cAAA;AACtB;AAEO,SAAS,eACd,SACA,OACA,UACA;AACA,QAAM,aAAa,aAAa,SAAS;AACzC,MAAI,WAAW,aACX,+CACA;AACJ,MAAI,gBAAgB,aAChB,6CACA;AACJ,MAAI,aAAa;AACjB,MAAI,2BAA2B;AAC/B,MAAI,gBAAgB,aAChB,+CACA;AACJ,MAAI,YAAY;AAChB,MAAI,QAAQ,YAAY;AACtB,oBAAgB;AAAA,EAClB;AACA,MAAI,UAAU,gBAAgB,SAAS;AACrC,eAAW;AACX,oBAAgB;AAChB,oBAAgB;AAChB,iBAAa;AACb,gBAAY;AAAA,EACd,WAAW,UAAU,gBAAgB,KAAK;AACxC,eAAW;AACX,oBAAgB;AAChB,iBAAa;AACb,oBAAgB;AAChB,gBAAY;AACZ,+BAA2B;AAAA,EAC7B;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;"}
1
+ {"version":3,"file":"thruster.js","sources":["../../../src/navigation-instruments/thruster/thruster.ts"],"sourcesContent":["import {LitElement, svg, html, css, nothing, SVGTemplateResult} from 'lit';\nimport {property} from 'lit/decorators.js';\nimport {InstrumentState, Priority} from '../types.js';\nimport {LinearAdvice, LinearAdviceRaw, renderAdvice} from './advice.js';\nimport {AdviceState} from '../watch/advice.js';\nimport {TickmarkStyle} from '../watch/tickmark.js';\nimport {singleSidedTickmark} from './tickmark.js';\nimport {PropellerType, bottomPropeller, topPropeller} from './propeller.js';\nimport {SetpointMixin} from '../../svghelpers/setpoint-mixin.js';\nimport {\n drawSetpointMarker,\n getSetpointOutwardOffset,\n SetpointColorMode,\n SetpointVisualState,\n SETPOINT_ANIMATION_CSS_VAR,\n SETPOINT_ANIMATION_DURATION_DEFAULT,\n} from '../../svghelpers/setpoint.js';\nimport {customElement} from '../../decorator.js';\n\n/**\n * @element obc-thruster\n *\n * @prop {number} thrust - The thrust of the thruster in percent (-100 - +100)\n * @prop {boolean} touching - Highlight the thruster when the lever is being touched\n * @prop {Priority} priority - Color priority: `Priority.enhanced` uses the blue/enhanced color palette, `Priority.regular` (default) uses the standard palette.\n * @stable\n */\n@customElement('obc-thruster')\nexport class ObcThruster extends SetpointMixin(LitElement, {\n defaultDeadband: 1,\n}) {\n private _setpointId = `thruster-sp-${Math.random().toString(36).slice(2, 9)}`;\n\n @property({type: Number}) thrust: number = 0;\n @property({type: String}) state: InstrumentState = InstrumentState.active;\n @property({type: String}) priority: Priority = Priority.regular;\n @property({type: Boolean}) tunnel: boolean = false;\n @property({type: Boolean}) singleSided: boolean = false;\n @property({type: Boolean}) singleDirection: boolean = false;\n @property({type: Boolean}) singleDirectionHalfSize: boolean = false;\n @property({type: Array}) advices: LinearAdvice[] = [];\n @property({type: String}) topPropeller: PropellerType = PropellerType.none;\n @property({type: String}) bottomPropeller: PropellerType = PropellerType.none;\n\n override render() {\n return html`<div class=\"container\">\n ${thruster(this.thrust, this.setpoint, this.state, this.priority, {\n atSetpoint: this.atSetpoint,\n tunnel: this.tunnel,\n setpointAtZeroDeadband: this.setpointAtZeroDeadband,\n autoAtSetpoint: this.autoAtSetpoint,\n autoAtSetpointDeadband: this.autoAtSetpointDeadband,\n touching: this.touching,\n singleSided: this.singleSided,\n advices: this.advices,\n singleDirection: this.singleDirection,\n singleDirectionHalfSize: this.singleDirectionHalfSize,\n topPropeller: this.topPropeller,\n bottomPropeller: this.bottomPropeller,\n narrow: !this.tunnel,\n newSetpoint: this.newSetpoint,\n setpointId: this._setpointId,\n })}\n </div>`;\n }\n\n static override styles = css`\n .container {\n height: 100%;\n width: 100%;\n }\n\n .container > svg {\n display: block;\n height: 100%;\n width: 100%;\n }\n `;\n}\n\nexport function thrusterTop(\n height: number,\n value: number,\n colors: {box: string; container: string},\n options: {hideTicks: boolean; hideContainer: boolean; off: boolean}\n) {\n const container = svg`\n <path transform=\"translate(0 -2)\" d=\"M -44 0 v -${height - 8} a 8 8 0 0 1 8 -8 h 72 a 8 8 0 0 1 8 8 V 0 Z\" fill=${colors.container} stroke=\"var(--instrument-frame-tertiary-color)\" vector-effect=\"non-scaling-stroke\"/>\n `;\n const track = options.off\n ? null\n : svg`<rect width=\"40\" height=${height} x=\"-20\" y=${-2 - height} fill=\"var(--instrument-frame-secondary-color)\" stroke=\"var(--instrument-frame-tertiary-color)\" vector-effect=\"non-scaling-stroke\"/>`;\n\n const tickmarks = [];\n\n const nTicks = 2;\n const delta = height / nTicks;\n if (!options.hideTicks) {\n for (let i = 1; i < nTicks; i++) {\n tickmarks.push(\n svg`<line x1=\"-24\" x2=\"-44\" y1=${-i * delta - 2} y2=${\n -i * delta - 2\n } stroke=\"var(--instrument-frame-tertiary-color)\" stroke-width=\"1\" vector-effect=\"non-scaling-stroke\"/>`\n );\n tickmarks.push(\n svg`<line x1=\"24\" x2=\"44\" y1=${-i * delta - 2} y2=${\n -i * delta - 2\n } stroke=\"var(--instrument-frame-tertiary-color)\" stroke-width=\"1\" vector-effect=\"non-scaling-stroke\"/>`\n );\n }\n }\n\n const barHeight = (height * value) / 100;\n const barY = -2 - barHeight;\n const bar = svg`<rect width=\"40\" height=${barHeight} x=\"-20\" y=${barY} fill=${colors.box} stroke=${colors.box} vector-effect=\"non-scaling-stroke\"/>`;\n if (options.hideContainer) {\n return [track, tickmarks, bar];\n } else {\n return [container, track, tickmarks, bar];\n }\n}\n\n/**\n * @param height - The height of the thruster\n * @param value - The value of the thruster\n * @param colors - The colors of the thruster (box and container)\n * @param options - The options of the thruster\n * - hideTicks - Whether to hide the ticks\n * - flipAdicePattern - Whether to flip the advice pattern, to be used when the thruster is on the bottom\n * - hideContainer - Whether to not render the rounded container/wrapper around the thruster,\n * used by the main engine\n * - narrow - Whether to use the narrow version of the thruster\n * @param advice - The advice of the thruster\n * @returns - The thruster top single sided\n */\nexport function thrusterTopSingleSided(\n height: number,\n value: number,\n colors: {box: string; container: string},\n options: {\n hideTicks: boolean;\n flipAdicePattern: boolean;\n hideContainer: boolean;\n narrow: boolean;\n off: boolean;\n },\n advice: LinearAdviceRaw[]\n) {\n const container = options.narrow\n ? svg`\n <path transform=\"translate(0 -2)\" d=\"M -32 0 v -${height - 8} a 8 8 0 0 1 8 -8 h 48 a 8 8 0 0 1 8 8 V 0 Z\" fill=${colors.container} stroke=\"var(--instrument-frame-tertiary-color)\" vector-effect=\"non-scaling-stroke\"/>\n `\n : svg`\n <path transform=\"translate(0 -2)\" d=\"M -40 0 v -${height - 8} a 8 8 0 0 1 8 -8 h 56 a 8 8 0 0 1 8 8 V 0 Z\" fill=${colors.container} stroke=\"var(--instrument-frame-tertiary-color)\" vector-effect=\"non-scaling-stroke\"/>\n `;\n let track: SVGTemplateResult | null = options.narrow\n ? svg`\n <path transform=\"translate(0 -2)\" d=\"M -32 0 v -${height - 8} a 8 8 0 0 1 8 -8 h 32 V 0 Z\" fill=\"var(--instrument-frame-secondary-color)\" stroke=\"var(--instrument-frame-tertiary-color)\" vector-effect=\"non-scaling-stroke\"/>\n `\n : svg`\n <path transform=\"translate(0 -2)\" d=\"M -40 0 v -${height - 8} a 8 8 0 0 1 8 -8 h 40 V 0 Z\" fill=\"var(--instrument-frame-secondary-color)\" stroke=\"var(--instrument-frame-tertiary-color)\" vector-effect=\"non-scaling-stroke\"/>\n `;\n if (options.off) {\n track = null;\n }\n\n const tickmarks = options.hideTicks\n ? []\n : [singleSidedTickmark(height, 50, TickmarkStyle.regular)];\n\n const barHeight = (height * value) / 100;\n const barWidth = options.narrow ? 40 : 48;\n const barX = options.narrow ? -32 : -40;\n const barY = -2 - barHeight;\n const maskId = options.flipAdicePattern\n ? 'thrusterBarMask1'\n : 'thrusterBarMask2';\n // The mask is used to clip the bar to the container shape\n const mask = options.hideContainer\n ? nothing\n : svg`\n <defs>\n <mask id=${maskId}>\n <path transform=\"translate(0 -2)\" d=\"M ${barX} 0 v -${height - 8} a 8 8 0 0 1 8 -8 h ${barWidth} V 0 Z\" fill=\"white\" stroke=\"white\" vector-effect=\"non-scaling-stroke\"/>\n </defs>`;\n const maskAttr = options.hideContainer ? undefined : `url(#${maskId})`;\n const bar = svg`\n ${mask}\n <rect mask=${maskAttr} width=${barWidth} height=${barHeight} x=${barX} y=${barY} fill=${colors.box} stroke=${colors.box} vector-effect=\"non-scaling-stroke\"/>`;\n const advicesSvg = advice.map((a) =>\n renderAdvice(height, a, options.flipAdicePattern)\n );\n const all = [tickmarks, bar, advicesSvg];\n if (!options.hideContainer) {\n all.splice(0, 0, [container, track]);\n }\n if (!options.narrow) {\n return svg`<g transform=\"translate(4 0)\">${all}</g>`;\n } else {\n return all;\n }\n}\n\nexport function thrusterBottom(\n height: number,\n value: number,\n colors: {box: string; container: string},\n options: {hideTicks: boolean; hideContainer: boolean; off: boolean}\n) {\n const container = svg`\n <g transform=\"rotate(180)\">\n ${thrusterTop(height, value, colors, options)}\n </g>\n `;\n return container;\n}\n\nfunction thrusterBottomSingleSided(\n height: number,\n value: number,\n colors: {box: string; container: string},\n options: {\n hideTicks: boolean;\n flipAdicePattern: boolean;\n hideContainer: boolean;\n narrow: boolean;\n off: boolean;\n },\n advice: LinearAdviceRaw[]\n) {\n const container = svg`\n <g transform=\"rotate(180) scale(-1,1)\">\n ${thrusterTopSingleSided(height, value, colors, {hideTicks: options.hideTicks, flipAdicePattern: options.flipAdicePattern, hideContainer: options.hideContainer, narrow: options.narrow, off: options.off}, advice)}\n </g>\n `;\n return container;\n}\n\n// ============================================================================\n// Thruster Setpoint Configuration & Rendering (Unified)\n// ============================================================================\n\n/**\n * Fine-tune inward adjustment (px) for thruster setpoint markers.\n * Similar to `RADIAL_SETPOINT_INWARD_ADJUST` in watch.ts — nudges the marker\n * tip closer to the bar edge so it visually aligns with design specs.\n */\nconst THRUSTER_SETPOINT_INWARD_ADJUST = 4;\n\n/**\n * Configuration for rendering a thruster setpoint marker.\n */\nexport interface ThrusterSetpointConfig {\n /** Instrument state (determines disabled status) */\n state: InstrumentState;\n /** Color priority (determines enhanced vs regular color palette) */\n priority: Priority;\n /** Whether value is at the setpoint (within deadband) */\n atSetpoint: boolean;\n /** User is physically interacting (renders focus visual state) */\n touching: boolean;\n /** Deadband for zero detection */\n setpointAtZeroDeadband: number;\n /** Whether the thruster is single-sided (marker on right side only) */\n singleSided: boolean;\n /** Whether to use narrow layout */\n narrow: boolean;\n /** Pending setpoint during adjustment (shows dual markers) */\n newSetpoint?: number;\n /** Unique ID prefix for SVG defs (avoids collisions with multiple instances) */\n id: string;\n /** Enable CSS-animated confirm transition for setpoint markers. */\n animateSetpoint?: boolean;\n /** Value of departing new-setpoint during confirm animation fade-out. */\n departingNewSetpoint?: number;\n /** Override to derive color from priority regardless of instrument state. */\n setpointOverride?: boolean;\n}\n\n/**\n * Compute the Y coordinate for a thruster setpoint marker.\n *\n * @param height - Thruster bar height\n * @param value - Setpoint value (percent, -100 to +100)\n * @param isAtZero - Whether the value is within zero-snap deadband\n * @returns Y offset (negative = upward)\n */\nfunction thrusterSetpointY(\n height: number,\n value: number,\n isAtZero: boolean\n): number {\n return -(isAtZero\n ? 0\n : Math.sign(value) * ((height * Math.abs(value)) / 100 + 2));\n}\n\n/**\n * Derive visual state for a thruster setpoint, mirroring the radial and linear\n * derivation functions in setpoint.ts and external-scale.ts.\n */\nfunction deriveThrusterSetpointVisualState(config: {\n state: InstrumentState;\n priority: Priority;\n atSetpoint: boolean;\n touching: boolean;\n setpointAtZero: boolean;\n hasNewSetpoint: boolean;\n setpointOverride?: boolean;\n}): {\n visualState: SetpointVisualState;\n colorMode: SetpointColorMode;\n disabled: boolean;\n} {\n const isDisabledState =\n config.state === InstrumentState.loading ||\n config.state === InstrumentState.off;\n const disabled = isDisabledState && !config.setpointOverride;\n const colorMode =\n config.priority === Priority.enhanced\n ? SetpointColorMode.enhanced\n : SetpointColorMode.regular;\n\n if (isDisabledState) {\n return {\n visualState: SetpointVisualState.notEqual,\n colorMode,\n disabled,\n };\n }\n\n // Focus: touching without pending adjustment\n if (config.touching && !config.hasNewSetpoint) {\n return {visualState: SetpointVisualState.focus, colorMode, disabled: false};\n }\n\n // At zero\n if (config.atSetpoint && config.setpointAtZero) {\n return {\n visualState: SetpointVisualState.equalZero,\n colorMode,\n disabled: false,\n };\n }\n\n // At setpoint\n if (config.atSetpoint) {\n return {visualState: SetpointVisualState.equal, colorMode, disabled: false};\n }\n\n return {\n visualState: SetpointVisualState.notEqual,\n colorMode,\n disabled: false,\n };\n}\n\n/**\n * Render thruster setpoint marker(s) using the unified `drawSetpointMarker()`\n * system from `setpoint.ts`.\n *\n * Replaces the legacy `setpointSvg()` function with proper visual states\n * (focus, equalZero, equal, notEqual), themed colors, and sized markers.\n *\n * For double-sided thrusters, renders matching markers on both sides of the bar.\n * When `newSetpoint` is defined, renders dual markers (original dimmed + new in focus).\n *\n * @param height - Thruster bar height in SVG units\n * @param setpointValue - Setpoint value (percent, -100 to +100)\n * @param config - Setpoint rendering configuration\n * @returns SVG template with positioned setpoint marker(s)\n */\nexport function renderThrusterSetpoint(\n height: number,\n setpointValue: number,\n config: ThrusterSetpointConfig\n): SVGTemplateResult {\n const setpointAtZero =\n Math.abs(setpointValue) < config.setpointAtZeroDeadband;\n const hasNewSetpoint = config.newSetpoint !== undefined;\n const hasDepartingNewSetpoint = config.departingNewSetpoint !== undefined;\n const animate = config.animateSetpoint === true;\n\n const {visualState, colorMode, disabled} = deriveThrusterSetpointVisualState({\n state: config.state,\n priority: config.priority,\n atSetpoint: config.atSetpoint,\n touching: config.touching,\n setpointAtZero,\n hasNewSetpoint,\n setpointOverride: config.setpointOverride,\n });\n\n // Y position (matches legacy formula)\n const y = thrusterSetpointY(height, setpointValue, setpointAtZero);\n\n // X position: legacy base offset + visual state outward offset\n // Legacy base: 28 for double-sided, 16 for single-sided narrow, 20 for single-sided non-narrow\n const baseX = 28 + (config.singleSided ? -12 : 0) + (config.narrow ? 0 : 4);\n const outwardOffset = getSetpointOutwardOffset(visualState);\n const tipX = baseX + outwardOffset - THRUSTER_SETPOINT_INWARD_ADJUST;\n\n // Render original setpoint marker\n const opacity = hasNewSetpoint ? 0.75 : 1;\n\n // Right marker: rotate(90) makes tip point left (inward toward bar)\n const rightMarker = drawSetpointMarker({\n visualState,\n colorMode,\n disabled,\n id: `${config.id}-r`,\n });\n\n const result: SVGTemplateResult[] = [];\n\n if (animate) {\n const duration = `var(${SETPOINT_ANIMATION_CSS_VAR}, ${SETPOINT_ANIMATION_DURATION_DEFAULT})`;\n result.push(\n svg`<g style=\"transform: translate(${tipX}px, ${y}px) rotate(90deg); opacity: ${opacity}; transition: transform ${duration} ease-out, opacity ${duration} ease-out;\">${rightMarker}</g>`\n );\n if (!config.singleSided) {\n const leftMarker = drawSetpointMarker({\n visualState,\n colorMode,\n disabled,\n id: `${config.id}-l`,\n });\n result.push(\n svg`<g style=\"transform: translate(${-tipX}px, ${y}px) rotate(-90deg); opacity: ${opacity}; transition: transform ${duration} ease-out, opacity ${duration} ease-out;\">${leftMarker}</g>`\n );\n }\n } else {\n result.push(\n svg`<g transform=\"translate(${tipX}, ${y}) rotate(90)\" opacity=\"${opacity}\">${rightMarker}</g>`\n );\n if (!config.singleSided) {\n const leftMarker = drawSetpointMarker({\n visualState,\n colorMode,\n disabled,\n id: `${config.id}-l`,\n });\n result.push(\n svg`<g transform=\"translate(${-tipX}, ${y}) rotate(-90)\" opacity=\"${opacity}\">${leftMarker}</g>`\n );\n }\n }\n\n // New setpoint marker in focus state (dual-marker adjustment preview)\n // OR departing newSetpoint during confirm animation fade-out\n if (hasNewSetpoint || hasDepartingNewSetpoint) {\n const isActive = hasNewSetpoint;\n const newValue = isActive\n ? config.newSetpoint!\n : config.departingNewSetpoint!;\n const newAtZero = Math.abs(newValue) < config.setpointAtZeroDeadband;\n const newY = thrusterSetpointY(height, newValue, newAtZero);\n const focusOffset = getSetpointOutwardOffset(SetpointVisualState.focus);\n const newTipX = baseX + focusOffset - THRUSTER_SETPOINT_INWARD_ADJUST;\n const targetOpacity = isActive ? 1 : 0;\n\n const newRightMarker = drawSetpointMarker({\n visualState: SetpointVisualState.focus,\n colorMode,\n disabled: false,\n id: `${config.id}-nr`,\n });\n\n if (animate) {\n const duration = `var(${SETPOINT_ANIMATION_CSS_VAR}, ${SETPOINT_ANIMATION_DURATION_DEFAULT})`;\n result.push(\n svg`<g style=\"transform: translate(${newTipX}px, ${newY}px) rotate(90deg); opacity: ${targetOpacity}; transition: opacity ${duration} ease-out;\">${newRightMarker}</g>`\n );\n if (!config.singleSided) {\n const newLeftMarker = drawSetpointMarker({\n visualState: SetpointVisualState.focus,\n colorMode,\n disabled: false,\n id: `${config.id}-nl`,\n });\n result.push(\n svg`<g style=\"transform: translate(${-newTipX}px, ${newY}px) rotate(-90deg); opacity: ${targetOpacity}; transition: opacity ${duration} ease-out;\">${newLeftMarker}</g>`\n );\n }\n } else {\n result.push(\n svg`<g transform=\"translate(${newTipX}, ${newY}) rotate(90)\" opacity=\"${targetOpacity}\">${newRightMarker}</g>`\n );\n if (!config.singleSided) {\n const newLeftMarker = drawSetpointMarker({\n visualState: SetpointVisualState.focus,\n colorMode,\n disabled: false,\n id: `${config.id}-nl`,\n });\n result.push(\n svg`<g transform=\"translate(${-newTipX}, ${newY}) rotate(-90)\" opacity=\"${targetOpacity}\">${newLeftMarker}</g>`\n );\n }\n }\n }\n\n return svg`${result}`;\n}\n\n/**\n * @deprecated Use `renderThrusterSetpoint` instead, which supports\n * focus visual state, equalZero sizing, and the unified marker system.\n *\n * Legacy setpoint marker rendering with hardcoded SVG IDs.\n * Kept for backward compatibility only.\n */\nexport function setpointSvg(\n height: number,\n value: number,\n setpointAtZero: boolean,\n colors: {fill: string; stroke: string},\n options: {\n filled: boolean;\n singleSided: boolean;\n narrow: boolean;\n }\n) {\n const y = -(setpointAtZero\n ? 0\n : Math.sign(value) * ((height * Math.abs(value)) / 100 + 2));\n const extra = (options.singleSided ? -12 : 0) + (options.narrow ? 0 : 4);\n let path;\n if (options.filled) {\n path =\n 'M23.5119 8C24.6981 6.35191 23.5696 4 21.5926 4L2.39959 4C0.422598 4 -0.705911 6.35191 0.480283 8L11.9961 24L23.5119 8Z';\n } else {\n path =\n 'M18.5836 8L5.4086 8L11.9961 17.1526L18.5836 8ZM23.5119 8C24.6981 6.35191 23.5696 4 21.5926 4L2.39959 4C0.422598 4 -0.705911 6.35191 0.480283 8L11.9961 24L23.5119 8Z';\n }\n return svg`\n <defs>\n <g id=\"thrusterSetpoint\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" transform=\"translate(24 -12) rotate(90)\" d=${path} vector-effect=\"non-scaling-stroke\"/>\n </g>\n <mask id=\"thrusterSetpointMask\">\n <rect x=\"-20\" y=\"-20\" width=\"50\" height=\"50\" fill=\"white\" />\n <use href=\"#thrusterSetpoint\" fill=\"black\" />\n </mask>\n </defs>\n <g transform=\"translate(0 ${y})\">\n <use href=\"#thrusterSetpoint\" fill=${colors.fill} stroke=\"none\" transform=\"translate(${28 + extra} 0)\"/>\n <use href=\"#thrusterSetpoint\" mask=\"url(#thrusterSetpointMask)\" transform=\"translate(${28 + extra} 0)\" fill=\"none\" stroke=${colors.stroke} stroke-width=\"2\" stroke-linejoin=\"round\" vector-effect=\"non-scaling-stroke\"/>\n ${\n options.singleSided\n ? null\n : svg`\n <use href=\"#thrusterSetpoint\" transform=\"rotate(180) translate(28 0)\" fill=${colors.fill} stroke=\"none\"/>\n <use href=\"#thrusterSetpoint\" transform=\"rotate(180) translate(28 0)\" mask=\"url(#thrusterSetpointMask)\" fill=\"none\" stroke=${colors.stroke} stroke-width=\"2\" stroke-linejoin=\"round\" vector-effect=\"non-scaling-stroke\"/>\n `\n }\n </g>\n `;\n}\n\nexport function atSetpoint(\n thrust: number,\n setpoint: number | undefined,\n options: {\n autoAtSetpoint: boolean;\n autoAtSetpointDeadband: number;\n touching: boolean;\n atSetpoint: boolean;\n }\n): boolean {\n if (options.touching) {\n return false;\n }\n\n if (options.autoAtSetpoint && setpoint !== undefined) {\n return Math.abs(thrust - setpoint) < options.autoAtSetpointDeadband;\n }\n\n return options.atSetpoint;\n}\n\nexport function thruster(\n thrust: number,\n setpoint: number | undefined,\n state: InstrumentState,\n priority: Priority,\n options: {\n atSetpoint: boolean;\n tunnel: boolean;\n singleSided: boolean;\n singleDirection: boolean;\n singleDirectionHalfSize: boolean;\n setpointAtZeroDeadband: number;\n autoAtSetpoint: boolean;\n autoAtSetpointDeadband: number;\n touching: boolean;\n advices: LinearAdvice[];\n topPropeller: PropellerType;\n bottomPropeller: PropellerType;\n narrow: boolean;\n /** Pending setpoint during adjustment (shows dual markers) */\n newSetpoint?: number;\n /** Unique ID prefix for setpoint SVG defs. Falls back to legacy hardcoded IDs. */\n setpointId?: string;\n /** Enable CSS-animated confirm transition. */\n animateSetpoint?: boolean;\n /** Departing new-setpoint value during confirm animation fade-out. */\n departingNewSetpoint?: number;\n /** Override to derive color from priority regardless of instrument state. */\n setpointOverride?: boolean;\n }\n) {\n if (options.tunnel) {\n thrust = -thrust;\n setpoint = setpoint === undefined ? undefined : -setpoint;\n }\n\n if (!options.singleSided && options.advices.length > 0) {\n throw new Error('Double sided thruster does not support advice');\n }\n\n options.atSetpoint = atSetpoint(thrust, setpoint, options);\n\n const tc = thrusterColors(options, state, priority);\n\n let centerLine = svg`\n <rect x=\"-44\" y=\"-2\" width=\"88\" height=\"4\" stroke-width=\"1\" fill=${tc.zeroLineColor} stroke=${tc.zeroLineColor} vector-effect=\"non-scaling-stroke\"/>\n `;\n if (options.singleSided) {\n const width = options.narrow ? 64 : 72;\n const x = options.narrow ? -32 : -36;\n centerLine = svg`<rect x=${x} y=\"-2\" width=${width} height=\"4\" stroke-width=\"1\" fill=${tc.zeroLineColor} stroke=${tc.zeroLineColor} vector-effect=\"non-scaling-stroke\"/>`;\n }\n\n const setpointAtZero =\n Math.abs(setpoint || 0) < options.setpointAtZeroDeadband;\n\n const {topAdvices, bottomAdvices} = convertThrustAdvices(\n options.advices,\n setpoint\n );\n\n const thrusterSvg = [];\n const baseheight = options.topPropeller === PropellerType.none ? 134 : 106;\n const height = options.singleDirection ? baseheight * 2 : baseheight;\n if (options.singleSided) {\n thrusterSvg.push(\n thrusterTopSingleSided(\n height,\n Math.max(thrust, 0),\n {box: tc.boxColor, container: tc.containerBackgroundColor},\n {\n hideTicks: tc.hideTicks,\n flipAdicePattern: false,\n hideContainer: false,\n narrow: options.narrow,\n off: state === InstrumentState.off,\n },\n topAdvices\n )\n );\n if (!(options.singleDirection || options.singleDirectionHalfSize)) {\n thrusterSvg.push(\n thrusterBottomSingleSided(\n height,\n Math.max(-thrust, 0),\n {box: tc.boxColor, container: tc.containerBackgroundColor},\n {\n hideTicks: tc.hideTicks,\n flipAdicePattern: true,\n hideContainer: false,\n narrow: options.narrow,\n off: state === InstrumentState.off,\n },\n bottomAdvices\n )\n );\n }\n thrusterSvg.push(centerLine);\n } else {\n thrusterSvg.push(\n thrusterTop(\n height,\n Math.max(thrust, 0),\n {box: tc.boxColor, container: tc.containerBackgroundColor},\n {\n hideTicks: tc.hideTicks,\n hideContainer: false,\n off: state === InstrumentState.off,\n }\n )\n );\n if (!options.singleDirection) {\n thrusterSvg.push(\n thrusterBottom(\n height,\n Math.max(-thrust, 0),\n {box: tc.boxColor, container: tc.containerBackgroundColor},\n {\n hideTicks: tc.hideTicks,\n hideContainer: false,\n off: state === InstrumentState.off,\n }\n )\n );\n }\n thrusterSvg.push(centerLine);\n }\n if (setpoint !== undefined) {\n if (options.setpointId) {\n // Unified setpoint rendering with proper visual states\n thrusterSvg.push(\n renderThrusterSetpoint(height, setpoint, {\n state,\n priority,\n atSetpoint: options.atSetpoint,\n touching: options.touching,\n setpointAtZeroDeadband: options.setpointAtZeroDeadband,\n singleSided: options.singleSided,\n narrow: options.narrow,\n newSetpoint: options.newSetpoint,\n id: options.setpointId,\n animateSetpoint: options.animateSetpoint,\n departingNewSetpoint: options.departingNewSetpoint,\n setpointOverride: options.setpointOverride,\n })\n );\n } else {\n // Legacy fallback (deprecated — no focus/equalZero visual states)\n thrusterSvg.push(\n setpointSvg(\n height,\n setpoint,\n setpointAtZero,\n {\n fill: tc.setPointColor,\n stroke: 'var(--border-silhouette-color)',\n },\n {\n filled:\n priority === Priority.enhanced || state === InstrumentState.off,\n singleSided: options.singleSided,\n narrow: options.narrow,\n }\n )\n );\n }\n }\n\n if (options.tunnel) {\n return svg`\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-160 -64 320 128\" x=\"-160\" y=\"-64\">\n <g transform=\"rotate(-90)\">\n ${thrusterSvg}\n </g>\n </svg>`;\n } else {\n let viewBox = '-80 -160 160 320';\n let y = -160;\n if (options.singleDirection) {\n viewBox = '-80 -300 160 320';\n y = -320;\n }\n const top = topPropeller(height, tc.arrowColor, options.topPropeller);\n const bottom = bottomPropeller(\n options.singleDirectionHalfSize ? 0.5 : height,\n options.bottomPropeller\n );\n return svg`\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=${viewBox} x=\"-80\" y=${y} width=\"160\" height=\"320\">\n ${top}\n ${bottom}\n ${thrusterSvg}\n </svg>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'obc-thruster': ObcThruster;\n }\n}\n\nexport function convertThrustAdvices(\n advices: LinearAdvice[],\n thrustSetpoint: number | undefined\n): {topAdvices: LinearAdviceRaw[]; bottomAdvices: LinearAdviceRaw[]} {\n const rawAdvices: LinearAdviceRaw[] = advices.map((a) => {\n const triggered =\n thrustSetpoint !== undefined &&\n thrustSetpoint >= a.min &&\n thrustSetpoint <= a.max;\n let state: AdviceState;\n if (triggered) {\n state = AdviceState.triggered;\n } else if (a.hinted) {\n state = AdviceState.hinted;\n } else {\n state = AdviceState.regular;\n }\n return {\n min: a.min,\n max: a.max,\n type: a.type,\n state,\n hinted: a.hinted,\n };\n });\n\n const topAdvices = rawAdvices.filter((a) => a.min >= 0);\n const bottomAdvices = rawAdvices\n .filter((a) => a.max <= 0)\n .map((a) => ({...a, min: -a.max, max: -a.min}));\n return {topAdvices, bottomAdvices};\n}\n\nexport function thrusterColors(\n options: {atSetpoint: boolean; touching: boolean},\n state: InstrumentState,\n priority: Priority\n) {\n const isEnhanced = priority === Priority.enhanced;\n let boxColor = isEnhanced\n ? 'var(--instrument-enhanced-secondary-color)'\n : 'var(--instrument-regular-secondary-color)';\n let setPointColor = isEnhanced\n ? 'var(--instrument-enhanced-primary-color)'\n : 'var(--instrument-regular-primary-color)';\n let arrowColor = 'var(--instrument-regular-secondary-color)';\n let containerBackgroundColor = 'var(--instrument-frame-primary-color)';\n let zeroLineColor = isEnhanced\n ? 'var(--instrument-enhanced-secondary-color)'\n : 'var(--instrument-regular-secondary-color)';\n let hideTicks = false;\n if (options.atSetpoint) {\n setPointColor = boxColor;\n }\n if (state === InstrumentState.loading) {\n boxColor = 'transparent';\n setPointColor = 'var(--instrument-frame-tertiary-color)';\n zeroLineColor = 'var(--instrument-frame-tertiary-color)';\n arrowColor = 'var(--instrument-regular-secondary-color)';\n hideTicks = true;\n } else if (state === InstrumentState.off) {\n boxColor = 'transparent';\n setPointColor = 'var(--instrument-frame-tertiary-color)';\n arrowColor = 'var(--instrument-frame-tertiary-color)';\n zeroLineColor = 'var(--instrument-frame-tertiary-color)';\n hideTicks = true;\n containerBackgroundColor = 'transparent';\n }\n return {\n zeroLineColor,\n boxColor,\n containerBackgroundColor,\n hideTicks,\n setPointColor,\n arrowColor,\n };\n}\n"],"names":[],"mappings":"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"}
@@ -11,6 +11,10 @@ const compentStyle = css`* {
11
11
  overflow: hidden;
12
12
  }
13
13
 
14
+ svg {
15
+ display: block;
16
+ }
17
+
14
18
  .label {
15
19
  font-family: var(--global-typography-font-family);
16
20
  font-weight: var(--global-typography-ui-body-font-weight);
@@ -1 +1 @@
1
- {"version":3,"file":"watch.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"watch.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -7,6 +7,10 @@ const compentStyle = css`* {
7
7
  box-sizing: border-box;
8
8
  }
9
9
 
10
+ svg {
11
+ display: block;
12
+ }
13
+
10
14
  .label {
11
15
  font-family: var(--global-typography-font-family);
12
16
  font-weight: var(--global-typography-ui-body-font-weight);
@@ -1 +1 @@
1
- {"version":3,"file":"watch-flat.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"watch-flat.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oicl/openbridge-webcomponents",
3
- "version": "2.0.0-next.122",
3
+ "version": "2.0.0-next.124",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "type": "git",