@oicl/openbridge-webcomponents 2.0.0-next.102 → 2.0.0-next.103
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundle/openbridge-webcomponents.bundle.js +579 -143
- package/bundle/openbridge-webcomponents.bundle.js.map +1 -1
- package/custom-elements.json +338 -8
- package/dist/building-blocks/instrument-radial/instrument-radial.d.ts +22 -2
- package/dist/building-blocks/instrument-radial/instrument-radial.d.ts.map +1 -1
- package/dist/building-blocks/instrument-radial/instrument-radial.js +61 -37
- package/dist/building-blocks/instrument-radial/instrument-radial.js.map +1 -1
- package/dist/navigation-instruments/azimuth-thruster/azimuth-thruster.d.ts +14 -0
- package/dist/navigation-instruments/azimuth-thruster/azimuth-thruster.d.ts.map +1 -1
- package/dist/navigation-instruments/azimuth-thruster/azimuth-thruster.js +30 -11
- package/dist/navigation-instruments/azimuth-thruster/azimuth-thruster.js.map +1 -1
- package/dist/navigation-instruments/compass/compass.d.ts +21 -1
- package/dist/navigation-instruments/compass/compass.d.ts.map +1 -1
- package/dist/navigation-instruments/compass/compass.js +36 -16
- package/dist/navigation-instruments/compass/compass.js.map +1 -1
- package/dist/navigation-instruments/compass-sector/compass-sector.d.ts.map +1 -1
- package/dist/navigation-instruments/compass-sector/compass-sector.js.map +1 -1
- package/dist/navigation-instruments/gauge-radial/gauge-radial.css.js +34 -2
- package/dist/navigation-instruments/gauge-radial/gauge-radial.css.js.map +1 -1
- package/dist/navigation-instruments/gauge-radial/gauge-radial.d.ts +15 -0
- package/dist/navigation-instruments/gauge-radial/gauge-radial.d.ts.map +1 -1
- package/dist/navigation-instruments/gauge-radial/gauge-radial.js +35 -1
- package/dist/navigation-instruments/gauge-radial/gauge-radial.js.map +1 -1
- package/dist/navigation-instruments/heading/heading.d.ts +19 -1
- package/dist/navigation-instruments/heading/heading.d.ts.map +1 -1
- package/dist/navigation-instruments/heading/heading.js +34 -16
- package/dist/navigation-instruments/heading/heading.js.map +1 -1
- package/dist/navigation-instruments/rudder/rudder.d.ts +15 -2
- package/dist/navigation-instruments/rudder/rudder.d.ts.map +1 -1
- package/dist/navigation-instruments/rudder/rudder.js +36 -26
- package/dist/navigation-instruments/rudder/rudder.js.map +1 -1
- package/dist/navigation-instruments/speed-gauge/speed-gauge.d.ts +15 -1
- package/dist/navigation-instruments/speed-gauge/speed-gauge.d.ts.map +1 -1
- package/dist/navigation-instruments/speed-gauge/speed-gauge.js +31 -3
- package/dist/navigation-instruments/speed-gauge/speed-gauge.js.map +1 -1
- package/dist/navigation-instruments/watch/watch.d.ts +29 -1
- package/dist/navigation-instruments/watch/watch.d.ts.map +1 -1
- package/dist/navigation-instruments/watch/watch.js +52 -38
- package/dist/navigation-instruments/watch/watch.js.map +1 -1
- package/dist/svghelpers/radial-frame.d.ts +122 -0
- package/dist/svghelpers/radial-frame.d.ts.map +1 -0
- package/dist/svghelpers/radial-frame.js +259 -0
- package/dist/svghelpers/radial-frame.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { LitElement, html, nothing, svg, css } from "lit";
|
|
2
2
|
import { property } from "lit/decorators.js";
|
|
3
|
+
import { ResizeController } from "@lit-labs/observers/resize-controller.js";
|
|
3
4
|
import { customElement } from "../../decorator.js";
|
|
4
5
|
import { AdviceState } from "../../navigation-instruments/watch/advice.js";
|
|
5
|
-
import { WatchCircleType, innerRingRadiusFor
|
|
6
|
+
import { WatchCircleType, innerRingRadiusFor } from "../../navigation-instruments/watch/watch.js";
|
|
6
7
|
import { TickmarkStyle, TickmarkType } from "../../navigation-instruments/watch/tickmark.js";
|
|
7
8
|
import { InstrumentState, Priority } from "../../navigation-instruments/types.js";
|
|
8
9
|
import { SetpointMixin } from "../../svghelpers/setpoint-mixin.js";
|
|
9
|
-
import {
|
|
10
|
+
import { observeInnerBox, applyPinnedHostSize, computeRadialFrame, END_MAXMIN_LABEL_DROP_PX, SIDE_LABEL_DROP_PX, measureContainerPx, estimateLabelWidthPx } from "../../svghelpers/radial-frame.js";
|
|
10
11
|
var __defProp = Object.defineProperty;
|
|
11
12
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
12
13
|
var __decorateClass = (decorators, target, key, kind) => {
|
|
@@ -17,7 +18,6 @@ var __decorateClass = (decorators, target, key, kind) => {
|
|
|
17
18
|
if (kind && result) __defProp(target, key, result);
|
|
18
19
|
return result;
|
|
19
20
|
};
|
|
20
|
-
const WATCH_DEFAULT_VIEWBOX = 448;
|
|
21
21
|
var ObcGaugeRadialType = /* @__PURE__ */ ((ObcGaugeRadialType2) => {
|
|
22
22
|
ObcGaugeRadialType2["filled"] = "filled";
|
|
23
23
|
ObcGaugeRadialType2["bar"] = "bar";
|
|
@@ -92,6 +92,36 @@ let ObcInstrumentRadial = class extends SetpointMixin(LitElement) {
|
|
|
92
92
|
this.endLabelsMaxMin = false;
|
|
93
93
|
this.zoomToFitArc = false;
|
|
94
94
|
this._radiusOffset = 0;
|
|
95
|
+
this._lastFrameKey = "";
|
|
96
|
+
this._resizeController = new ResizeController(this, {});
|
|
97
|
+
this._hostSizePinned = false;
|
|
98
|
+
}
|
|
99
|
+
firstUpdated(changed) {
|
|
100
|
+
super.firstUpdated(changed);
|
|
101
|
+
observeInnerBox(this._resizeController, this.renderRoot);
|
|
102
|
+
}
|
|
103
|
+
/** The frame computed for the current render (viewBox, label reserve …). */
|
|
104
|
+
get frame() {
|
|
105
|
+
return this._frame;
|
|
106
|
+
}
|
|
107
|
+
updated(changed) {
|
|
108
|
+
super.updated(changed);
|
|
109
|
+
this._hostSizePinned = applyPinnedHostSize(
|
|
110
|
+
this,
|
|
111
|
+
this._frame,
|
|
112
|
+
this._hostSizePinned
|
|
113
|
+
);
|
|
114
|
+
const frame = this._frame;
|
|
115
|
+
if (!frame) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
const key = `${frame.viewBox}|${frame.labelsHidden}|${frame.hostWidthPx ?? ""}|${frame.hostHeightPx ?? ""}`;
|
|
119
|
+
if (key !== this._lastFrameKey) {
|
|
120
|
+
this._lastFrameKey = key;
|
|
121
|
+
this.dispatchEvent(
|
|
122
|
+
new CustomEvent("frame-changed", { detail: frame })
|
|
123
|
+
);
|
|
124
|
+
}
|
|
95
125
|
}
|
|
96
126
|
get clampedValue() {
|
|
97
127
|
const lowerBound = Math.min(this.minValue, this.maxValue);
|
|
@@ -158,31 +188,28 @@ let ObcInstrumentRadial = class extends SetpointMixin(LitElement) {
|
|
|
158
188
|
}
|
|
159
189
|
];
|
|
160
190
|
const watchCircleType = this.type === "needle" ? WatchCircleType.single : WatchCircleType.double;
|
|
161
|
-
const
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
const
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
this.
|
|
174
|
-
|
|
175
|
-
this.
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
const top = -full / 2 + full * clips.top / 100;
|
|
184
|
-
viewBox = `${left} ${top} ${w} ${h}`;
|
|
185
|
-
}
|
|
191
|
+
const tickmarks = this.tickmarks;
|
|
192
|
+
const hasHorizontalEndLabels = tickmarks.some((t) => {
|
|
193
|
+
if (t.text === void 0) {
|
|
194
|
+
return false;
|
|
195
|
+
}
|
|
196
|
+
const angle = (t.angle % 360 + 360) % 360;
|
|
197
|
+
return Math.abs(angle - 90) < 1 || Math.abs(angle - 270) < 1;
|
|
198
|
+
});
|
|
199
|
+
const frame = computeRadialFrame({
|
|
200
|
+
basePadding: 48,
|
|
201
|
+
labelWidthPx: this.tickmarksInside ? 0 : estimateLabelWidthPx(tickmarks.map((t) => t.text)),
|
|
202
|
+
labelDropPx: this.tickmarksInside || !hasHorizontalEndLabels ? 0 : this.endLabelsMaxMin ? END_MAXMIN_LABEL_DROP_PX : SIDE_LABEL_DROP_PX,
|
|
203
|
+
clips: this.zoomToFitArc ? void 0 : this.safeClips,
|
|
204
|
+
containerPx: measureContainerPx(this),
|
|
205
|
+
faceDiameter: this.faceDiameter,
|
|
206
|
+
zoomToFitArc: this.zoomToFitArc,
|
|
207
|
+
areas,
|
|
208
|
+
innerRadius: innerRingRadiusFor(watchCircleType)
|
|
209
|
+
});
|
|
210
|
+
this._radiusOffset = frame.radiusOffset;
|
|
211
|
+
this._frame = frame;
|
|
212
|
+
const shownTickmarks = frame.labelsHidden ? tickmarks.map((t) => ({ ...t, text: void 0 })) : tickmarks;
|
|
186
213
|
return html`
|
|
187
214
|
<div class="container">
|
|
188
215
|
<obc-watch
|
|
@@ -194,23 +221,17 @@ let ObcInstrumentRadial = class extends SetpointMixin(LitElement) {
|
|
|
194
221
|
.angleSetpointAtZeroDeadband=${this.setpointAtZeroDeadband}
|
|
195
222
|
.setpointOverride=${this.setpointOverride}
|
|
196
223
|
.animateSetpoint=${this.animateSetpoint}
|
|
197
|
-
.
|
|
198
|
-
.tickmarks=${this.tickmarks}
|
|
224
|
+
.tickmarks=${shownTickmarks}
|
|
199
225
|
.tickmarksInside=${this.tickmarksInside}
|
|
200
226
|
.tickmarkStyle=${this.tickmarkStyle}
|
|
201
227
|
.advices=${this._advices}
|
|
202
228
|
.areas=${areas}
|
|
203
229
|
.watchCircleType=${watchCircleType}
|
|
204
230
|
.barAreas=${barAreas}
|
|
205
|
-
.clipTop=${this.zoomToFitArc ? 0 : clips.top}
|
|
206
|
-
.clipBottom=${this.zoomToFitArc ? 0 : clips.bottom}
|
|
207
|
-
.clipLeft=${this.zoomToFitArc ? 0 : clips.left}
|
|
208
|
-
.clipRight=${this.zoomToFitArc ? 0 : clips.right}
|
|
209
231
|
.endLabelsMaxMin=${this.endLabelsMaxMin}
|
|
210
|
-
.
|
|
211
|
-
.arcFrame=${this._arcFrame}
|
|
232
|
+
.arcFrame=${frame}
|
|
212
233
|
></obc-watch>
|
|
213
|
-
<svg class="gauge-radial" viewBox=${viewBox}>${this._needle}</svg>
|
|
234
|
+
<svg class="gauge-radial" viewBox=${frame.viewBox}>${this._needle}</svg>
|
|
214
235
|
</div>
|
|
215
236
|
`;
|
|
216
237
|
}
|
|
@@ -434,6 +455,9 @@ __decorateClass([
|
|
|
434
455
|
__decorateClass([
|
|
435
456
|
property({ type: Boolean })
|
|
436
457
|
], ObcInstrumentRadial.prototype, "zoomToFitArc", 2);
|
|
458
|
+
__decorateClass([
|
|
459
|
+
property({ type: Number, attribute: "face-diameter" })
|
|
460
|
+
], ObcInstrumentRadial.prototype, "faceDiameter", 2);
|
|
437
461
|
ObcInstrumentRadial = __decorateClass([
|
|
438
462
|
customElement("obc-instrument-radial")
|
|
439
463
|
], ObcInstrumentRadial);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrument-radial.js","sources":["../../../src/building-blocks/instrument-radial/instrument-radial.ts"],"sourcesContent":["import {css, LitElement, html, svg, nothing} from 'lit';\nimport {property} from 'lit/decorators.js';\nimport {customElement} from '../../decorator.js';\nimport {\n AdviceState,\n AdviceType,\n AngleAdviceRaw,\n} from '../../navigation-instruments/watch/advice.js';\nimport {WatchCircleType} from '../../navigation-instruments/watch/watch.js';\nimport {Tickmark} from '../../navigation-instruments/watch/tickmark.js';\nimport {TickmarkType} from '../../navigation-instruments/watch/tickmark.js';\nimport {TickmarkStyle} from '../../navigation-instruments/watch/tickmark.js';\nimport {InstrumentState, Priority} from '../../navigation-instruments/types.js';\nimport {SetpointMixin} from '../../svghelpers/setpoint-mixin.js';\nimport {\n OUTER_RING_RADIUS,\n innerRingRadiusFor,\n} from '../../navigation-instruments/watch/watch.js';\nimport {\n computeZoomToFitArcFrame,\n type ZoomToFitArcFrame,\n} from '../../svghelpers/arc-frame.js';\n\n// Must match obc-watch's un-zoomed viewBox `(176 + getPadding()) * 2`\n// (default padding 48 → 448); instrument-radial overlays obc-watch 1:1.\nconst WATCH_DEFAULT_VIEWBOX = 448;\n\nexport enum ObcGaugeRadialType {\n filled = 'filled',\n bar = 'bar',\n needle = 'needle',\n}\n\nexport interface GaugeRadialAdvice {\n minValue: number;\n maxValue: number;\n type: AdviceType;\n hinted: boolean;\n}\n\nconst NEEDLE_TIP_RADIUS = 160;\nconst NEEDLE_TIP_GAP = 5; // tip stops this far short of the scale\nconst NEEDLE_WIDTH = 8;\nconst NEEDLE_HUB_RADIUS = 16;\n\nfunction rangeIncludesZero(minValue: number, maxValue: number): boolean {\n return minValue <= 0 && maxValue >= 0;\n}\n\nfunction strongerTickmarkType(\n existing: TickmarkType,\n candidate: TickmarkType\n): TickmarkType {\n const priority: Record<TickmarkType, number> = {\n [TickmarkType.zeroLineThick]: 6,\n [TickmarkType.zeroLine]: 5,\n [TickmarkType.main]: 4,\n [TickmarkType.primary]: 3,\n [TickmarkType.secondary]: 2,\n [TickmarkType.tertiary]: 1,\n [TickmarkType.textOnly]: 0,\n };\n\n return priority[candidate] > priority[existing] ? candidate : existing;\n}\n\ninterface Clips {\n top: number;\n bottom: number;\n left: number;\n right: number;\n}\n\n/** Clamp a clip percentage to [0, 100]; non-finite returns 0. */\nfunction clampClipPercent(n: number): number {\n return Number.isFinite(n) ? Math.min(Math.max(n, 0), 100) : 0;\n}\n\n/**\n * Clamp the four clips to [0, 100] and drop any opposite pair that would\n * collapse the viewBox (sum >= 100), so a bad clip can't produce a zero- or\n * negative-size box. Valid clips pass through unchanged.\n */\nfunction normalizeClips(clips: Clips): Clips {\n let top = clampClipPercent(clips.top);\n let bottom = clampClipPercent(clips.bottom);\n let left = clampClipPercent(clips.left);\n let right = clampClipPercent(clips.right);\n if (top + bottom >= 100) {\n top = 0;\n bottom = 0;\n }\n if (left + right >= 100) {\n left = 0;\n right = 0;\n }\n return {top, bottom, left, right};\n}\n\n/**\n * Fallback value-to-angle mapping when no `getAngle` is supplied: linear over\n * the historical 270° sweep (-135 to 135). Returns -135 for a non-positive or\n * non-finite span.\n */\nfunction defaultGaugeAngle(\n value: number,\n minValue: number,\n maxValue: number\n): number {\n const span = maxValue - minValue;\n if (!Number.isFinite(span) || span <= 0) {\n return -135;\n }\n return ((value - minValue) / span) * 270 - 135;\n}\n\n/**\n * @experimental\n */\n@customElement('obc-instrument-radial')\nexport class ObcInstrumentRadial extends SetpointMixin(LitElement) {\n // setpoint, newSetpoint, atSetpoint, touching, autoAtSetpoint,\n // autoAtSetpointDeadband, setpointAtZeroDeadband, setpointOverride\n // — all inherited from SetpointMixin\n\n @property({type: String}) state: InstrumentState = InstrumentState.active;\n @property({type: String}) priority: Priority = Priority.regular;\n\n @property({type: Number}) value = 0;\n @property({type: Number}) maxValue = 100;\n @property({type: Number}) minValue = 0;\n @property({attribute: false}) getAngle!: (v: number) => number;\n /** @availableWhen type!=filled */\n @property({type: String}) needleColor: string | undefined;\n /** @availableWhen type!=needle */\n @property({type: String}) barColor: string | undefined;\n @property({type: Boolean}) showLabels: boolean = false;\n /**\n * Interval for primary tickmarks in value units.\n * When undefined or <= 0, no primary tickmarks are shown.\n */\n @property({type: Number}) primaryTickmarkInterval: number | undefined = 50;\n /**\n * Interval for secondary tickmarks in value units.\n * When undefined or <= 0, no secondary tickmarks are shown.\n */\n @property({type: Number}) secondaryTickmarkInterval: number | undefined = 10;\n /**\n * Interval for tertiary tickmarks in value units.\n * When undefined or <= 0, no tertiary tickmarks are shown.\n */\n @property({type: Number}) tertiaryTickmarkInterval: number | undefined =\n undefined;\n @property({type: String}) type: ObcGaugeRadialType =\n ObcGaugeRadialType.filled;\n @property({type: String}) needleType: ObcGaugeRadialType =\n ObcGaugeRadialType.filled;\n @property({type: Boolean}) tickmarksInside: boolean = false;\n @property({type: String}) tickmarkStyle: TickmarkStyle =\n TickmarkStyle.regular;\n @property({type: Array, attribute: false}) advices: GaugeRadialAdvice[] = [];\n /** @availableWhen zoomToFitArc==false */\n @property({type: Number}) clipTop: number = 0; // in percent of height\n /** @availableWhen zoomToFitArc==false */\n @property({type: Number}) clipBottom: number = 0; // in percent of height\n /** @availableWhen zoomToFitArc==false */\n @property({type: Number}) clipLeft: number = 0; // in percent of width\n /** @availableWhen zoomToFitArc==false */\n @property({type: Number}) clipRight: number = 0; // in percent of width\n /**\n * Place the horizontal end labels (±90°, e.g. min/max) below the tick instead\n * of beside it — the \"Max-min\" placement from the radial label model\n * (External / Internal / Max-min). See PR #903 / design discussion.\n */\n @property({type: Boolean}) endLabelsMaxMin: boolean = false;\n @property({type: Boolean}) zoomToFitArc: boolean = false;\n\n private _radiusOffset = 0;\n private _arcFrame: ZoomToFitArcFrame | undefined;\n\n private get clampedValue(): number {\n const lowerBound = Math.min(this.minValue, this.maxValue);\n const upperBound = Math.max(this.minValue, this.maxValue);\n return Math.max(lowerBound, Math.min(this.value, upperBound));\n }\n\n private get minAngle(): number {\n return this.mapAngle(this.minValue);\n }\n\n private get maxAngle(): number {\n return this.mapAngle(this.maxValue);\n }\n\n // Map a value to an angle via the consumer's `getAngle`, guarding a missing\n // or non-finite mapping so a misconfigured consumer can't emit NaN geometry.\n private mapAngle(value: number): number {\n const fn = this.getAngle;\n const angle =\n typeof fn === 'function'\n ? fn(value)\n : defaultGaugeAngle(value, this.minValue, this.maxValue);\n return Number.isFinite(angle) ? angle : 0;\n }\n\n // Clamped clips, reused for the overlay viewBox and the clips forwarded to\n // obc-watch.\n private get safeClips(): Clips {\n return normalizeClips({\n top: this.clipTop,\n bottom: this.clipBottom,\n left: this.clipLeft,\n right: this.clipRight,\n });\n }\n\n private get _derivedNeedleColor(): string {\n if (\n this.state === InstrumentState.loading ||\n this.state === InstrumentState.off\n ) {\n return 'transparent';\n }\n return this.priority === Priority.enhanced\n ? 'var(--instrument-enhanced-secondary-color)'\n : 'var(--instrument-regular-secondary-color)';\n }\n\n private get _derivedBarColor(): string {\n if (\n this.state === InstrumentState.loading ||\n this.state === InstrumentState.off\n ) {\n return 'transparent';\n }\n if (this.type === ObcGaugeRadialType.filled) {\n return this.priority === Priority.enhanced\n ? 'var(--instrument-enhanced-secondary-color)'\n : 'var(--instrument-regular-secondary-color)';\n }\n return this.priority === Priority.enhanced\n ? 'var(--instrument-enhanced-tertiary-color)'\n : 'var(--instrument-regular-tertiary-color)';\n }\n\n override render() {\n const barColor = this.barColor ?? this._derivedBarColor;\n const barStartValue = Math.max(this.minValue, Math.min(0, this.maxValue));\n const value = this.clampedValue;\n const setpointAngle =\n this.setpoint !== undefined ? this.mapAngle(this.setpoint) : undefined;\n const newSetpointAngle =\n this.newSetpoint !== undefined\n ? this.mapAngle(this.newSetpoint)\n : undefined;\n\n const barAreas =\n this.type === ObcGaugeRadialType.needle\n ? []\n : [\n {\n startAngle: this.mapAngle(barStartValue),\n endAngle: this.mapAngle(value),\n fillColor: barColor,\n },\n ];\n\n const areas = [\n {\n startAngle: this.minAngle,\n endAngle: this.maxAngle,\n roundInsideCut: true,\n roundOutsideCut: true,\n },\n ];\n\n const watchCircleType =\n this.type === ObcGaugeRadialType.needle\n ? WatchCircleType.single\n : WatchCircleType.double;\n\n const clips = this.safeClips;\n let viewBox: string;\n if (this.zoomToFitArc) {\n const ext = 48;\n const targetSize = (176 + ext) * 2;\n const frame = computeZoomToFitArcFrame({\n areas,\n outerRadius: OUTER_RING_RADIUS,\n innerRadius: innerRingRadiusFor(watchCircleType),\n extension: ext,\n targetSize,\n });\n this._radiusOffset = frame.radiusOffset;\n viewBox = frame.viewBox;\n this._arcFrame = frame;\n } else {\n this._radiusOffset = 0;\n this._arcFrame = undefined;\n const full = WATCH_DEFAULT_VIEWBOX;\n const w = full * (1 - clips.left / 100 - clips.right / 100);\n const h = full * (1 - clips.top / 100 - clips.bottom / 100);\n const left = -full / 2 + (full * clips.left) / 100;\n const top = -full / 2 + (full * clips.top) / 100;\n viewBox = `${left} ${top} ${w} ${h}`;\n }\n\n return html`\n <div class=\"container\">\n <obc-watch\n .state=${this.state}\n .priority=${this.priority}\n .angleSetpoint=${setpointAngle}\n .newAngleSetpoint=${newSetpointAngle}\n .atAngleSetpoint=${this.computeAtSetpoint(value)}\n .angleSetpointAtZeroDeadband=${this.setpointAtZeroDeadband}\n .setpointOverride=${this.setpointOverride}\n .animateSetpoint=${this.animateSetpoint}\n .padding=${48}\n .tickmarks=${this.tickmarks}\n .tickmarksInside=${this.tickmarksInside}\n .tickmarkStyle=${this.tickmarkStyle}\n .advices=${this._advices}\n .areas=${areas}\n .watchCircleType=${watchCircleType}\n .barAreas=${barAreas}\n .clipTop=${this.zoomToFitArc ? 0 : clips.top}\n .clipBottom=${this.zoomToFitArc ? 0 : clips.bottom}\n .clipLeft=${this.zoomToFitArc ? 0 : clips.left}\n .clipRight=${this.zoomToFitArc ? 0 : clips.right}\n .endLabelsMaxMin=${this.endLabelsMaxMin}\n .zoomToFitArc=${this.zoomToFitArc}\n .arcFrame=${this._arcFrame}\n ></obc-watch>\n <svg class=\"gauge-radial\" viewBox=${viewBox}>${this._needle}</svg>\n </div>\n `;\n }\n\n private get _needle() {\n if (this.type === ObcGaugeRadialType.filled) {\n return nothing;\n }\n const needleColor = this.needleColor ?? this._derivedNeedleColor;\n const rOff = this._radiusOffset;\n const value = this.clampedValue;\n if (this.type === ObcGaugeRadialType.needle) {\n // Rod runs from the value tip down to the center hub. Width is constant;\n // the tip shifts outward additively under zoom.\n const tipY = 256 - (NEEDLE_TIP_RADIUS - NEEDLE_TIP_GAP) - rOff;\n return svg`<g transform=\"rotate(${this.mapAngle(value)}) translate(-256, -256)\">\n <rect x=\"${256 - NEEDLE_WIDTH / 2}\" y=\"${tipY}\" width=\"${NEEDLE_WIDTH}\" height=\"${256 - tipY}\" rx=\"${NEEDLE_WIDTH / 2}\" fill=${needleColor} stroke=${needleColor}/>\n <circle cx=\"256\" cy=\"256\" r=\"${NEEDLE_HUB_RADIUS}\" fill=${needleColor}/>\n </g>\n`;\n } else {\n return svg`<g transform=\"rotate(${this.mapAngle(value)}) translate(-256, -256)\">\n<rect x=\"252\" y=\"${96 - rOff}\" width=\"8\" height=\"48\" rx=\"4\" fill=${needleColor} stroke=\"var(--border-silhouette-color)\"/>\n</g>\n `;\n }\n }\n\n get tickmarks(): Tickmark[] {\n const tickmarksByValue = new Map<number, Tickmark>();\n const normalizeValue = (value: number) =>\n Math.abs(value) < 1e-9 ? 0 : Number(value.toFixed(6));\n\n const upsertTickmark = (\n value: number,\n type: TickmarkType,\n text?: string\n ) => {\n if (\n !Number.isFinite(value) ||\n value < this.minValue ||\n value > this.maxValue\n ) {\n return;\n }\n\n const normalizedValue = normalizeValue(value);\n const existing = tickmarksByValue.get(normalizedValue);\n if (existing) {\n existing.type = strongerTickmarkType(existing.type, type);\n if (text !== undefined) {\n existing.text = text;\n }\n return;\n }\n\n tickmarksByValue.set(normalizedValue, {\n angle: this.mapAngle(normalizedValue),\n type,\n text,\n });\n };\n\n const addTickmarksAtInterval = (\n interval: number | undefined,\n type: TickmarkType,\n withLabels = false\n ) => {\n if (\n interval === undefined ||\n interval <= 0 ||\n !Number.isFinite(interval)\n ) {\n return;\n }\n\n const epsilon = Math.abs(interval) * 1e-6;\n const startValue =\n Math.ceil((this.minValue - epsilon) / interval) * interval;\n\n for (\n let value = startValue;\n value < this.maxValue - epsilon;\n value += interval\n ) {\n const normalizedValue = normalizeValue(value);\n if (\n normalizedValue <= this.minValue + epsilon ||\n normalizedValue >= this.maxValue - epsilon\n ) {\n continue;\n }\n\n upsertTickmark(\n normalizedValue,\n type,\n withLabels && this.showLabels ? normalizedValue.toString() : undefined\n );\n }\n };\n\n addTickmarksAtInterval(\n this.primaryTickmarkInterval,\n TickmarkType.primary,\n true\n );\n addTickmarksAtInterval(\n this.secondaryTickmarkInterval,\n TickmarkType.secondary\n );\n addTickmarksAtInterval(\n this.tertiaryTickmarkInterval,\n TickmarkType.tertiary\n );\n\n if (rangeIncludesZero(this.minValue, this.maxValue)) {\n upsertTickmark(\n 0,\n this.minValue < 0 ? TickmarkType.main : TickmarkType.textOnly,\n this.showLabels ? '0' : undefined\n );\n }\n\n if (this.showLabels) {\n upsertTickmark(\n this.minValue,\n TickmarkType.textOnly,\n this.minValue.toString()\n );\n upsertTickmark(\n this.maxValue,\n TickmarkType.textOnly,\n this.maxValue.toString()\n );\n }\n\n return [...tickmarksByValue.values()].sort((a, b) => a.angle - b.angle);\n }\n\n private get _advices(): AngleAdviceRaw[] {\n const value = this.clampedValue;\n\n return this.advices.map((advice) => {\n const minAngle = this.mapAngle(advice.minValue);\n const maxAngle = this.mapAngle(advice.maxValue);\n let state = advice.hinted ? AdviceState.hinted : AdviceState.regular;\n if (value >= advice.minValue && value <= advice.maxValue) {\n state = AdviceState.triggered;\n }\n\n return {\n minAngle,\n maxAngle,\n type: advice.type,\n state,\n hideMinTickmark: advice.minValue === this.minValue,\n hideMaxTickmark: advice.maxValue === this.maxValue,\n };\n });\n }\n\n static override styles = css`\n * {\n box-sizing: border-box;\n }\n\n .container {\n position: relative;\n width: 100%;\n height: 100%;\n }\n\n .container > * {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n }\n\n obc-watch {\n anchor-name: --watch;\n }\n\n .speed-gauge-value {\n position: absolute;\n top: clamp(\n 70%,\n calc(80% - (anchor-size(--watch height) - 200px) * 0.2),\n 80%\n );\n left: 50%;\n transform: translateX(-50%);\n width: fit-content;\n height: fit-content;\n }\n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'obc-instrument-radial': ObcInstrumentRadial;\n }\n}\n"],"names":["ObcGaugeRadialType"],"mappings":";;;;;;;;;;;;;;;;;;;AAyBA,MAAM,wBAAwB;AAEvB,IAAK,uCAAAA,wBAAL;AACLA,sBAAA,QAAA,IAAS;AACTA,sBAAA,KAAA,IAAM;AACNA,sBAAA,QAAA,IAAS;AAHC,SAAAA;AAAA,GAAA,sBAAA,CAAA,CAAA;AAaZ,MAAM,oBAAoB;AAC1B,MAAM,iBAAiB;AACvB,MAAM,eAAe;AACrB,MAAM,oBAAoB;AAE1B,SAAS,kBAAkB,UAAkB,UAA2B;AACtE,SAAO,YAAY,KAAK,YAAY;AACtC;AAEA,SAAS,qBACP,UACA,WACc;AACd,QAAM,WAAyC;AAAA,IAC7C,CAAC,aAAa,aAAa,GAAG;AAAA,IAC9B,CAAC,aAAa,QAAQ,GAAG;AAAA,IACzB,CAAC,aAAa,IAAI,GAAG;AAAA,IACrB,CAAC,aAAa,OAAO,GAAG;AAAA,IACxB,CAAC,aAAa,SAAS,GAAG;AAAA,IAC1B,CAAC,aAAa,QAAQ,GAAG;AAAA,IACzB,CAAC,aAAa,QAAQ,GAAG;AAAA,EAAA;AAG3B,SAAO,SAAS,SAAS,IAAI,SAAS,QAAQ,IAAI,YAAY;AAChE;AAUA,SAAS,iBAAiB,GAAmB;AAC3C,SAAO,OAAO,SAAS,CAAC,IAAI,KAAK,IAAI,KAAK,IAAI,GAAG,CAAC,GAAG,GAAG,IAAI;AAC9D;AAOA,SAAS,eAAe,OAAqB;AAC3C,MAAI,MAAM,iBAAiB,MAAM,GAAG;AACpC,MAAI,SAAS,iBAAiB,MAAM,MAAM;AAC1C,MAAI,OAAO,iBAAiB,MAAM,IAAI;AACtC,MAAI,QAAQ,iBAAiB,MAAM,KAAK;AACxC,MAAI,MAAM,UAAU,KAAK;AACvB,UAAM;AACN,aAAS;AAAA,EACX;AACA,MAAI,OAAO,SAAS,KAAK;AACvB,WAAO;AACP,YAAQ;AAAA,EACV;AACA,SAAO,EAAC,KAAK,QAAQ,MAAM,MAAA;AAC7B;AAOA,SAAS,kBACP,OACA,UACA,UACQ;AACR,QAAM,OAAO,WAAW;AACxB,MAAI,CAAC,OAAO,SAAS,IAAI,KAAK,QAAQ,GAAG;AACvC,WAAO;AAAA,EACT;AACA,UAAS,QAAQ,YAAY,OAAQ,MAAM;AAC7C;AAMO,IAAM,sBAAN,cAAkC,cAAc,UAAU,EAAE;AAAA,EAA5D,cAAA;AAAA,UAAA,GAAA,SAAA;AAKqB,SAAA,QAAyB,gBAAgB;AACzC,SAAA,WAAqB,SAAS;AAE9B,SAAA,QAAQ;AACR,SAAA,WAAW;AACX,SAAA,WAAW;AAMV,SAAA,aAAsB;AAKvB,SAAA,0BAA8C;AAK9C,SAAA,4BAAgD;AAKhD,SAAA,2BACxB;AACwB,SAAA,OACxB;AACwB,SAAA,aACxB;AACyB,SAAA,kBAA2B;AAC5B,SAAA,gBACxB,cAAc;AAC2B,SAAA,UAA+B,CAAA;AAEhD,SAAA,UAAkB;AAElB,SAAA,aAAqB;AAErB,SAAA,WAAmB;AAEnB,SAAA,YAAoB;AAMnB,SAAA,kBAA2B;AAC3B,SAAA,eAAwB;AAEnD,SAAQ,gBAAgB;AAAA,EAAA;AAAA,EAGxB,IAAY,eAAuB;AACjC,UAAM,aAAa,KAAK,IAAI,KAAK,UAAU,KAAK,QAAQ;AACxD,UAAM,aAAa,KAAK,IAAI,KAAK,UAAU,KAAK,QAAQ;AACxD,WAAO,KAAK,IAAI,YAAY,KAAK,IAAI,KAAK,OAAO,UAAU,CAAC;AAAA,EAC9D;AAAA,EAEA,IAAY,WAAmB;AAC7B,WAAO,KAAK,SAAS,KAAK,QAAQ;AAAA,EACpC;AAAA,EAEA,IAAY,WAAmB;AAC7B,WAAO,KAAK,SAAS,KAAK,QAAQ;AAAA,EACpC;AAAA;AAAA;AAAA,EAIQ,SAAS,OAAuB;AACtC,UAAM,KAAK,KAAK;AAChB,UAAM,QACJ,OAAO,OAAO,aACV,GAAG,KAAK,IACR,kBAAkB,OAAO,KAAK,UAAU,KAAK,QAAQ;AAC3D,WAAO,OAAO,SAAS,KAAK,IAAI,QAAQ;AAAA,EAC1C;AAAA;AAAA;AAAA,EAIA,IAAY,YAAmB;AAC7B,WAAO,eAAe;AAAA,MACpB,KAAK,KAAK;AAAA,MACV,QAAQ,KAAK;AAAA,MACb,MAAM,KAAK;AAAA,MACX,OAAO,KAAK;AAAA,IAAA,CACb;AAAA,EACH;AAAA,EAEA,IAAY,sBAA8B;AACxC,QACE,KAAK,UAAU,gBAAgB,WAC/B,KAAK,UAAU,gBAAgB,KAC/B;AACA,aAAO;AAAA,IACT;AACA,WAAO,KAAK,aAAa,SAAS,WAC9B,+CACA;AAAA,EACN;AAAA,EAEA,IAAY,mBAA2B;AACrC,QACE,KAAK,UAAU,gBAAgB,WAC/B,KAAK,UAAU,gBAAgB,KAC/B;AACA,aAAO;AAAA,IACT;AACA,QAAI,KAAK,SAAS,UAA2B;AAC3C,aAAO,KAAK,aAAa,SAAS,WAC9B,+CACA;AAAA,IACN;AACA,WAAO,KAAK,aAAa,SAAS,WAC9B,8CACA;AAAA,EACN;AAAA,EAES,SAAS;AAChB,UAAM,WAAW,KAAK,YAAY,KAAK;AACvC,UAAM,gBAAgB,KAAK,IAAI,KAAK,UAAU,KAAK,IAAI,GAAG,KAAK,QAAQ,CAAC;AACxE,UAAM,QAAQ,KAAK;AACnB,UAAM,gBACJ,KAAK,aAAa,SAAY,KAAK,SAAS,KAAK,QAAQ,IAAI;AAC/D,UAAM,mBACJ,KAAK,gBAAgB,SACjB,KAAK,SAAS,KAAK,WAAW,IAC9B;AAEN,UAAM,WACJ,KAAK,SAAS,WACV,CAAA,IACA;AAAA,MACE;AAAA,QACE,YAAY,KAAK,SAAS,aAAa;AAAA,QACvC,UAAU,KAAK,SAAS,KAAK;AAAA,QAC7B,WAAW;AAAA,MAAA;AAAA,IACb;AAGR,UAAM,QAAQ;AAAA,MACZ;AAAA,QACE,YAAY,KAAK;AAAA,QACjB,UAAU,KAAK;AAAA,QACf,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,MAAA;AAAA,IACnB;AAGF,UAAM,kBACJ,KAAK,SAAS,WACV,gBAAgB,SAChB,gBAAgB;AAEtB,UAAM,QAAQ,KAAK;AACnB,QAAI;AACJ,QAAI,KAAK,cAAc;AACrB,YAAM,MAAM;AACZ,YAAM,cAAc,MAAM,OAAO;AACjC,YAAM,QAAQ,yBAAyB;AAAA,QACrC;AAAA,QACA,aAAa;AAAA,QACb,aAAa,mBAAmB,eAAe;AAAA,QAC/C,WAAW;AAAA,QACX;AAAA,MAAA,CACD;AACD,WAAK,gBAAgB,MAAM;AAC3B,gBAAU,MAAM;AAChB,WAAK,YAAY;AAAA,IACnB,OAAO;AACL,WAAK,gBAAgB;AACrB,WAAK,YAAY;AACjB,YAAM,OAAO;AACb,YAAM,IAAI,QAAQ,IAAI,MAAM,OAAO,MAAM,MAAM,QAAQ;AACvD,YAAM,IAAI,QAAQ,IAAI,MAAM,MAAM,MAAM,MAAM,SAAS;AACvD,YAAM,OAAO,CAAC,OAAO,IAAK,OAAO,MAAM,OAAQ;AAC/C,YAAM,MAAM,CAAC,OAAO,IAAK,OAAO,MAAM,MAAO;AAC7C,gBAAU,GAAG,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;AAAA,IACpC;AAEA,WAAO;AAAA;AAAA;AAAA,mBAGQ,KAAK,KAAK;AAAA,sBACP,KAAK,QAAQ;AAAA,2BACR,aAAa;AAAA,8BACV,gBAAgB;AAAA,6BACjB,KAAK,kBAAkB,KAAK,CAAC;AAAA,yCACjB,KAAK,sBAAsB;AAAA,8BACtC,KAAK,gBAAgB;AAAA,6BACtB,KAAK,eAAe;AAAA,qBAC5B,EAAE;AAAA,uBACA,KAAK,SAAS;AAAA,6BACR,KAAK,eAAe;AAAA,2BACtB,KAAK,aAAa;AAAA,qBACxB,KAAK,QAAQ;AAAA,mBACf,KAAK;AAAA,6BACK,eAAe;AAAA,sBACtB,QAAQ;AAAA,qBACT,KAAK,eAAe,IAAI,MAAM,GAAG;AAAA,wBAC9B,KAAK,eAAe,IAAI,MAAM,MAAM;AAAA,sBACtC,KAAK,eAAe,IAAI,MAAM,IAAI;AAAA,uBACjC,KAAK,eAAe,IAAI,MAAM,KAAK;AAAA,6BAC7B,KAAK,eAAe;AAAA,0BACvB,KAAK,YAAY;AAAA,sBACrB,KAAK,SAAS;AAAA;AAAA,4CAEQ,OAAO,IAAI,KAAK,OAAO;AAAA;AAAA;AAAA,EAGjE;AAAA,EAEA,IAAY,UAAU;AACpB,QAAI,KAAK,SAAS,UAA2B;AAC3C,aAAO;AAAA,IACT;AACA,UAAM,cAAc,KAAK,eAAe,KAAK;AAC7C,UAAM,OAAO,KAAK;AAClB,UAAM,QAAQ,KAAK;AACnB,QAAI,KAAK,SAAS,UAA2B;AAG3C,YAAM,OAAO,OAAO,oBAAoB,kBAAkB;AAC1D,aAAO,2BAA2B,KAAK,SAAS,KAAK,CAAC;AAAA,iBAC3C,MAAM,eAAe,CAAC,QAAQ,IAAI,YAAY,YAAY,aAAa,MAAM,IAAI,SAAS,eAAe,CAAC,UAAU,WAAW,WAAW,WAAW;AAAA,qCACjI,iBAAiB,UAAU,WAAW;AAAA;AAAA;AAAA,IAGvE,OAAO;AACL,aAAO,2BAA2B,KAAK,SAAS,KAAK,CAAC;AAAA,mBACzC,KAAK,IAAI,uCAAuC,WAAW;AAAA;AAAA;AAAA,IAG1E;AAAA,EACF;AAAA,EAEA,IAAI,YAAwB;AAC1B,UAAM,uCAAuB,IAAA;AAC7B,UAAM,iBAAiB,CAAC,UACtB,KAAK,IAAI,KAAK,IAAI,OAAO,IAAI,OAAO,MAAM,QAAQ,CAAC,CAAC;AAEtD,UAAM,iBAAiB,CACrB,OACA,MACA,SACG;AACH,UACE,CAAC,OAAO,SAAS,KAAK,KACtB,QAAQ,KAAK,YACb,QAAQ,KAAK,UACb;AACA;AAAA,MACF;AAEA,YAAM,kBAAkB,eAAe,KAAK;AAC5C,YAAM,WAAW,iBAAiB,IAAI,eAAe;AACrD,UAAI,UAAU;AACZ,iBAAS,OAAO,qBAAqB,SAAS,MAAM,IAAI;AACxD,YAAI,SAAS,QAAW;AACtB,mBAAS,OAAO;AAAA,QAClB;AACA;AAAA,MACF;AAEA,uBAAiB,IAAI,iBAAiB;AAAA,QACpC,OAAO,KAAK,SAAS,eAAe;AAAA,QACpC;AAAA,QACA;AAAA,MAAA,CACD;AAAA,IACH;AAEA,UAAM,yBAAyB,CAC7B,UACA,MACA,aAAa,UACV;AACH,UACE,aAAa,UACb,YAAY,KACZ,CAAC,OAAO,SAAS,QAAQ,GACzB;AACA;AAAA,MACF;AAEA,YAAM,UAAU,KAAK,IAAI,QAAQ,IAAI;AACrC,YAAM,aACJ,KAAK,MAAM,KAAK,WAAW,WAAW,QAAQ,IAAI;AAEpD,eACM,QAAQ,YACZ,QAAQ,KAAK,WAAW,SACxB,SAAS,UACT;AACA,cAAM,kBAAkB,eAAe,KAAK;AAC5C,YACE,mBAAmB,KAAK,WAAW,WACnC,mBAAmB,KAAK,WAAW,SACnC;AACA;AAAA,QACF;AAEA;AAAA,UACE;AAAA,UACA;AAAA,UACA,cAAc,KAAK,aAAa,gBAAgB,aAAa;AAAA,QAAA;AAAA,MAEjE;AAAA,IACF;AAEA;AAAA,MACE,KAAK;AAAA,MACL,aAAa;AAAA,MACb;AAAA,IAAA;AAEF;AAAA,MACE,KAAK;AAAA,MACL,aAAa;AAAA,IAAA;AAEf;AAAA,MACE,KAAK;AAAA,MACL,aAAa;AAAA,IAAA;AAGf,QAAI,kBAAkB,KAAK,UAAU,KAAK,QAAQ,GAAG;AACnD;AAAA,QACE;AAAA,QACA,KAAK,WAAW,IAAI,aAAa,OAAO,aAAa;AAAA,QACrD,KAAK,aAAa,MAAM;AAAA,MAAA;AAAA,IAE5B;AAEA,QAAI,KAAK,YAAY;AACnB;AAAA,QACE,KAAK;AAAA,QACL,aAAa;AAAA,QACb,KAAK,SAAS,SAAA;AAAA,MAAS;AAEzB;AAAA,QACE,KAAK;AAAA,QACL,aAAa;AAAA,QACb,KAAK,SAAS,SAAA;AAAA,MAAS;AAAA,IAE3B;AAEA,WAAO,CAAC,GAAG,iBAAiB,OAAA,CAAQ,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAAA,EACxE;AAAA,EAEA,IAAY,WAA6B;AACvC,UAAM,QAAQ,KAAK;AAEnB,WAAO,KAAK,QAAQ,IAAI,CAAC,WAAW;AAClC,YAAM,WAAW,KAAK,SAAS,OAAO,QAAQ;AAC9C,YAAM,WAAW,KAAK,SAAS,OAAO,QAAQ;AAC9C,UAAI,QAAQ,OAAO,SAAS,YAAY,SAAS,YAAY;AAC7D,UAAI,SAAS,OAAO,YAAY,SAAS,OAAO,UAAU;AACxD,gBAAQ,YAAY;AAAA,MACtB;AAEA,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,MAAM,OAAO;AAAA,QACb;AAAA,QACA,iBAAiB,OAAO,aAAa,KAAK;AAAA,QAC1C,iBAAiB,OAAO,aAAa,KAAK;AAAA,MAAA;AAAA,IAE9C,CAAC;AAAA,EACH;AAsCF;AA5Za,oBAwXK,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAnXC,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GALb,oBAKe,WAAA,SAAA,CAAA;AACA,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GANb,oBAMe,WAAA,YAAA,CAAA;AAEA,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GARb,oBAQe,WAAA,SAAA,CAAA;AACA,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GATb,oBASe,WAAA,YAAA,CAAA;AACA,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GAVb,oBAUe,WAAA,YAAA,CAAA;AACI,gBAAA;AAAA,EAA7B,SAAS,EAAC,WAAW,MAAA,CAAM;AAAA,GAXjB,oBAWmB,WAAA,YAAA,CAAA;AAEJ,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GAbb,oBAae,WAAA,eAAA,CAAA;AAEA,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GAfb,oBAee,WAAA,YAAA,CAAA;AACC,gBAAA;AAAA,EAA1B,SAAS,EAAC,MAAM,QAAA,CAAQ;AAAA,GAhBd,oBAgBgB,WAAA,cAAA,CAAA;AAKD,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GArBb,oBAqBe,WAAA,2BAAA,CAAA;AAKA,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GA1Bb,oBA0Be,WAAA,6BAAA,CAAA;AAKA,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GA/Bb,oBA+Be,WAAA,4BAAA,CAAA;AAEA,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GAjCb,oBAiCe,WAAA,QAAA,CAAA;AAEA,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GAnCb,oBAmCe,WAAA,cAAA,CAAA;AAEC,gBAAA;AAAA,EAA1B,SAAS,EAAC,MAAM,QAAA,CAAQ;AAAA,GArCd,oBAqCgB,WAAA,mBAAA,CAAA;AACD,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GAtCb,oBAsCe,WAAA,iBAAA,CAAA;AAEiB,gBAAA;AAAA,EAA1C,SAAS,EAAC,MAAM,OAAO,WAAW,OAAM;AAAA,GAxC9B,oBAwCgC,WAAA,WAAA,CAAA;AAEjB,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GA1Cb,oBA0Ce,WAAA,WAAA,CAAA;AAEA,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GA5Cb,oBA4Ce,WAAA,cAAA,CAAA;AAEA,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GA9Cb,oBA8Ce,WAAA,YAAA,CAAA;AAEA,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GAhDb,oBAgDe,WAAA,aAAA,CAAA;AAMC,gBAAA;AAAA,EAA1B,SAAS,EAAC,MAAM,QAAA,CAAQ;AAAA,GAtDd,oBAsDgB,WAAA,mBAAA,CAAA;AACA,gBAAA;AAAA,EAA1B,SAAS,EAAC,MAAM,QAAA,CAAQ;AAAA,GAvDd,oBAuDgB,WAAA,gBAAA,CAAA;AAvDhB,sBAAN,gBAAA;AAAA,EADN,cAAc,uBAAuB;AAAA,GACzB,mBAAA;"}
|
|
1
|
+
{"version":3,"file":"instrument-radial.js","sources":["../../../src/building-blocks/instrument-radial/instrument-radial.ts"],"sourcesContent":["import {css, LitElement, PropertyValues, html, svg, nothing} from 'lit';\nimport {property} from 'lit/decorators.js';\nimport {ResizeController} from '@lit-labs/observers/resize-controller.js';\nimport {customElement} from '../../decorator.js';\nimport {\n AdviceState,\n AdviceType,\n AngleAdviceRaw,\n} from '../../navigation-instruments/watch/advice.js';\nimport {WatchCircleType} from '../../navigation-instruments/watch/watch.js';\nimport {Tickmark} from '../../navigation-instruments/watch/tickmark.js';\nimport {TickmarkType} from '../../navigation-instruments/watch/tickmark.js';\nimport {TickmarkStyle} from '../../navigation-instruments/watch/tickmark.js';\nimport {InstrumentState, Priority} from '../../navigation-instruments/types.js';\nimport {SetpointMixin} from '../../svghelpers/setpoint-mixin.js';\nimport {innerRingRadiusFor} from '../../navigation-instruments/watch/watch.js';\nimport {\n applyPinnedHostSize,\n computeRadialFrame,\n END_MAXMIN_LABEL_DROP_PX,\n estimateLabelWidthPx,\n measureContainerPx,\n observeInnerBox,\n SIDE_LABEL_DROP_PX,\n type RadialFrame,\n} from '../../svghelpers/radial-frame.js';\n\nexport enum ObcGaugeRadialType {\n filled = 'filled',\n bar = 'bar',\n needle = 'needle',\n}\n\nexport interface GaugeRadialAdvice {\n minValue: number;\n maxValue: number;\n type: AdviceType;\n hinted: boolean;\n}\n\nconst NEEDLE_TIP_RADIUS = 160;\nconst NEEDLE_TIP_GAP = 5; // tip stops this far short of the scale\nconst NEEDLE_WIDTH = 8;\nconst NEEDLE_HUB_RADIUS = 16;\n\nfunction rangeIncludesZero(minValue: number, maxValue: number): boolean {\n return minValue <= 0 && maxValue >= 0;\n}\n\nfunction strongerTickmarkType(\n existing: TickmarkType,\n candidate: TickmarkType\n): TickmarkType {\n const priority: Record<TickmarkType, number> = {\n [TickmarkType.zeroLineThick]: 6,\n [TickmarkType.zeroLine]: 5,\n [TickmarkType.main]: 4,\n [TickmarkType.primary]: 3,\n [TickmarkType.secondary]: 2,\n [TickmarkType.tertiary]: 1,\n [TickmarkType.textOnly]: 0,\n };\n\n return priority[candidate] > priority[existing] ? candidate : existing;\n}\n\ninterface Clips {\n top: number;\n bottom: number;\n left: number;\n right: number;\n}\n\n/** Clamp a clip percentage to [0, 100]; non-finite returns 0. */\nfunction clampClipPercent(n: number): number {\n return Number.isFinite(n) ? Math.min(Math.max(n, 0), 100) : 0;\n}\n\n/**\n * Clamp the four clips to [0, 100] and drop any opposite pair that would\n * collapse the viewBox (sum >= 100), so a bad clip can't produce a zero- or\n * negative-size box. Valid clips pass through unchanged.\n */\nfunction normalizeClips(clips: Clips): Clips {\n let top = clampClipPercent(clips.top);\n let bottom = clampClipPercent(clips.bottom);\n let left = clampClipPercent(clips.left);\n let right = clampClipPercent(clips.right);\n if (top + bottom >= 100) {\n top = 0;\n bottom = 0;\n }\n if (left + right >= 100) {\n left = 0;\n right = 0;\n }\n return {top, bottom, left, right};\n}\n\n/**\n * Fallback value-to-angle mapping when no `getAngle` is supplied: linear over\n * the historical 270° sweep (-135 to 135). Returns -135 for a non-positive or\n * non-finite span.\n */\nfunction defaultGaugeAngle(\n value: number,\n minValue: number,\n maxValue: number\n): number {\n const span = maxValue - minValue;\n if (!Number.isFinite(span) || span <= 0) {\n return -135;\n }\n return ((value - minValue) / span) * 270 - 135;\n}\n\n/**\n * @fires frame-changed {CustomEvent<RadialFrame>} Fired after render when the\n * computed radial frame changed (viewBox, label visibility, or pinned host\n * size). Wrappers use it to align sibling overlays/readouts with the dial.\n * @experimental\n */\n@customElement('obc-instrument-radial')\nexport class ObcInstrumentRadial extends SetpointMixin(LitElement) {\n // setpoint, newSetpoint, atSetpoint, touching, autoAtSetpoint,\n // autoAtSetpointDeadband, setpointAtZeroDeadband, setpointOverride\n // — all inherited from SetpointMixin\n\n @property({type: String}) state: InstrumentState = InstrumentState.active;\n @property({type: String}) priority: Priority = Priority.regular;\n\n @property({type: Number}) value = 0;\n @property({type: Number}) maxValue = 100;\n @property({type: Number}) minValue = 0;\n @property({attribute: false}) getAngle!: (v: number) => number;\n /** @availableWhen type!=filled */\n @property({type: String}) needleColor: string | undefined;\n /** @availableWhen type!=needle */\n @property({type: String}) barColor: string | undefined;\n @property({type: Boolean}) showLabels: boolean = false;\n /**\n * Interval for primary tickmarks in value units.\n * When undefined or <= 0, no primary tickmarks are shown.\n */\n @property({type: Number}) primaryTickmarkInterval: number | undefined = 50;\n /**\n * Interval for secondary tickmarks in value units.\n * When undefined or <= 0, no secondary tickmarks are shown.\n */\n @property({type: Number}) secondaryTickmarkInterval: number | undefined = 10;\n /**\n * Interval for tertiary tickmarks in value units.\n * When undefined or <= 0, no tertiary tickmarks are shown.\n */\n @property({type: Number}) tertiaryTickmarkInterval: number | undefined =\n undefined;\n @property({type: String}) type: ObcGaugeRadialType =\n ObcGaugeRadialType.filled;\n @property({type: String}) needleType: ObcGaugeRadialType =\n ObcGaugeRadialType.filled;\n @property({type: Boolean}) tickmarksInside: boolean = false;\n @property({type: String}) tickmarkStyle: TickmarkStyle =\n TickmarkStyle.regular;\n @property({type: Array, attribute: false}) advices: GaugeRadialAdvice[] = [];\n /** @availableWhen zoomToFitArc==false */\n @property({type: Number}) clipTop: number = 0; // in percent of height\n /** @availableWhen zoomToFitArc==false */\n @property({type: Number}) clipBottom: number = 0; // in percent of height\n /** @availableWhen zoomToFitArc==false */\n @property({type: Number}) clipLeft: number = 0; // in percent of width\n /** @availableWhen zoomToFitArc==false */\n @property({type: Number}) clipRight: number = 0; // in percent of width\n /**\n * Place the horizontal end labels (±90°, e.g. min/max) below the tick instead\n * of beside it — the \"Max-min\" placement from the radial label model\n * (External / Internal / Max-min). See PR #903 / design discussion.\n */\n @property({type: Boolean}) endLabelsMaxMin: boolean = false;\n @property({type: Boolean}) zoomToFitArc: boolean = false;\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 _radiusOffset = 0;\n private _frame: RadialFrame | undefined;\n private _lastFrameKey = '';\n\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 /** The frame computed for the current render (viewBox, label reserve …). */\n get frame(): RadialFrame | undefined {\n return this._frame;\n }\n\n /** Whether the host size styles were set by applyPinnedHostSize. */\n private _hostSizePinned = false;\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 const frame = this._frame;\n if (!frame) {\n return;\n }\n const key = `${frame.viewBox}|${frame.labelsHidden}|${frame.hostWidthPx ?? ''}|${frame.hostHeightPx ?? ''}`;\n if (key !== this._lastFrameKey) {\n this._lastFrameKey = key;\n this.dispatchEvent(\n new CustomEvent<RadialFrame>('frame-changed', {detail: frame})\n );\n }\n }\n\n private get clampedValue(): number {\n const lowerBound = Math.min(this.minValue, this.maxValue);\n const upperBound = Math.max(this.minValue, this.maxValue);\n return Math.max(lowerBound, Math.min(this.value, upperBound));\n }\n\n private get minAngle(): number {\n return this.mapAngle(this.minValue);\n }\n\n private get maxAngle(): number {\n return this.mapAngle(this.maxValue);\n }\n\n // Map a value to an angle via the consumer's `getAngle`, guarding a missing\n // or non-finite mapping so a misconfigured consumer can't emit NaN geometry.\n private mapAngle(value: number): number {\n const fn = this.getAngle;\n const angle =\n typeof fn === 'function'\n ? fn(value)\n : defaultGaugeAngle(value, this.minValue, this.maxValue);\n return Number.isFinite(angle) ? angle : 0;\n }\n\n // Clamped clips, reused for the overlay viewBox and the clips forwarded to\n // obc-watch.\n private get safeClips(): Clips {\n return normalizeClips({\n top: this.clipTop,\n bottom: this.clipBottom,\n left: this.clipLeft,\n right: this.clipRight,\n });\n }\n\n private get _derivedNeedleColor(): string {\n if (\n this.state === InstrumentState.loading ||\n this.state === InstrumentState.off\n ) {\n return 'transparent';\n }\n return this.priority === Priority.enhanced\n ? 'var(--instrument-enhanced-secondary-color)'\n : 'var(--instrument-regular-secondary-color)';\n }\n\n private get _derivedBarColor(): string {\n if (\n this.state === InstrumentState.loading ||\n this.state === InstrumentState.off\n ) {\n return 'transparent';\n }\n if (this.type === ObcGaugeRadialType.filled) {\n return this.priority === Priority.enhanced\n ? 'var(--instrument-enhanced-secondary-color)'\n : 'var(--instrument-regular-secondary-color)';\n }\n return this.priority === Priority.enhanced\n ? 'var(--instrument-enhanced-tertiary-color)'\n : 'var(--instrument-regular-tertiary-color)';\n }\n\n override render() {\n const barColor = this.barColor ?? this._derivedBarColor;\n const barStartValue = Math.max(this.minValue, Math.min(0, this.maxValue));\n const value = this.clampedValue;\n const setpointAngle =\n this.setpoint !== undefined ? this.mapAngle(this.setpoint) : undefined;\n const newSetpointAngle =\n this.newSetpoint !== undefined\n ? this.mapAngle(this.newSetpoint)\n : undefined;\n\n const barAreas =\n this.type === ObcGaugeRadialType.needle\n ? []\n : [\n {\n startAngle: this.mapAngle(barStartValue),\n endAngle: this.mapAngle(value),\n fillColor: barColor,\n },\n ];\n\n const areas = [\n {\n startAngle: this.minAngle,\n endAngle: this.maxAngle,\n roundInsideCut: true,\n roundOutsideCut: true,\n },\n ];\n\n const watchCircleType =\n this.type === ObcGaugeRadialType.needle\n ? WatchCircleType.single\n : WatchCircleType.double;\n\n const tickmarks = this.tickmarks;\n // Labels hang past the ±90° line only when a labeled tick actually sits\n // there (e.g. the 180°/90° sector ends) — a ±60° sector like rot-sector\n // must not reserve a drop it never uses.\n const hasHorizontalEndLabels = tickmarks.some((t) => {\n if (t.text === undefined) {\n return false;\n }\n const angle = ((t.angle % 360) + 360) % 360;\n return Math.abs(angle - 90) < 1 || Math.abs(angle - 270) < 1;\n });\n const frame = computeRadialFrame({\n basePadding: 48,\n labelWidthPx: this.tickmarksInside\n ? 0\n : estimateLabelWidthPx(tickmarks.map((t) => t.text)),\n labelDropPx:\n this.tickmarksInside || !hasHorizontalEndLabels\n ? 0\n : this.endLabelsMaxMin\n ? END_MAXMIN_LABEL_DROP_PX\n : SIDE_LABEL_DROP_PX,\n clips: this.zoomToFitArc ? undefined : this.safeClips,\n containerPx: measureContainerPx(this),\n faceDiameter: this.faceDiameter,\n zoomToFitArc: this.zoomToFitArc,\n areas,\n innerRadius: innerRingRadiusFor(watchCircleType),\n });\n this._radiusOffset = frame.radiusOffset;\n this._frame = frame;\n const shownTickmarks = frame.labelsHidden\n ? tickmarks.map((t) => ({...t, text: undefined}))\n : tickmarks;\n\n return html`\n <div class=\"container\">\n <obc-watch\n .state=${this.state}\n .priority=${this.priority}\n .angleSetpoint=${setpointAngle}\n .newAngleSetpoint=${newSetpointAngle}\n .atAngleSetpoint=${this.computeAtSetpoint(value)}\n .angleSetpointAtZeroDeadband=${this.setpointAtZeroDeadband}\n .setpointOverride=${this.setpointOverride}\n .animateSetpoint=${this.animateSetpoint}\n .tickmarks=${shownTickmarks}\n .tickmarksInside=${this.tickmarksInside}\n .tickmarkStyle=${this.tickmarkStyle}\n .advices=${this._advices}\n .areas=${areas}\n .watchCircleType=${watchCircleType}\n .barAreas=${barAreas}\n .endLabelsMaxMin=${this.endLabelsMaxMin}\n .arcFrame=${frame}\n ></obc-watch>\n <svg class=\"gauge-radial\" viewBox=${frame.viewBox}>${this._needle}</svg>\n </div>\n `;\n }\n\n private get _needle() {\n if (this.type === ObcGaugeRadialType.filled) {\n return nothing;\n }\n const needleColor = this.needleColor ?? this._derivedNeedleColor;\n const rOff = this._radiusOffset;\n const value = this.clampedValue;\n if (this.type === ObcGaugeRadialType.needle) {\n // Rod runs from the value tip down to the center hub. Width is constant;\n // the tip shifts outward additively under zoom.\n const tipY = 256 - (NEEDLE_TIP_RADIUS - NEEDLE_TIP_GAP) - rOff;\n return svg`<g transform=\"rotate(${this.mapAngle(value)}) translate(-256, -256)\">\n <rect x=\"${256 - NEEDLE_WIDTH / 2}\" y=\"${tipY}\" width=\"${NEEDLE_WIDTH}\" height=\"${256 - tipY}\" rx=\"${NEEDLE_WIDTH / 2}\" fill=${needleColor} stroke=${needleColor}/>\n <circle cx=\"256\" cy=\"256\" r=\"${NEEDLE_HUB_RADIUS}\" fill=${needleColor}/>\n </g>\n`;\n } else {\n return svg`<g transform=\"rotate(${this.mapAngle(value)}) translate(-256, -256)\">\n<rect x=\"252\" y=\"${96 - rOff}\" width=\"8\" height=\"48\" rx=\"4\" fill=${needleColor} stroke=\"var(--border-silhouette-color)\"/>\n</g>\n `;\n }\n }\n\n get tickmarks(): Tickmark[] {\n const tickmarksByValue = new Map<number, Tickmark>();\n const normalizeValue = (value: number) =>\n Math.abs(value) < 1e-9 ? 0 : Number(value.toFixed(6));\n\n const upsertTickmark = (\n value: number,\n type: TickmarkType,\n text?: string\n ) => {\n if (\n !Number.isFinite(value) ||\n value < this.minValue ||\n value > this.maxValue\n ) {\n return;\n }\n\n const normalizedValue = normalizeValue(value);\n const existing = tickmarksByValue.get(normalizedValue);\n if (existing) {\n existing.type = strongerTickmarkType(existing.type, type);\n if (text !== undefined) {\n existing.text = text;\n }\n return;\n }\n\n tickmarksByValue.set(normalizedValue, {\n angle: this.mapAngle(normalizedValue),\n type,\n text,\n });\n };\n\n const addTickmarksAtInterval = (\n interval: number | undefined,\n type: TickmarkType,\n withLabels = false\n ) => {\n if (\n interval === undefined ||\n interval <= 0 ||\n !Number.isFinite(interval)\n ) {\n return;\n }\n\n const epsilon = Math.abs(interval) * 1e-6;\n const startValue =\n Math.ceil((this.minValue - epsilon) / interval) * interval;\n\n for (\n let value = startValue;\n value < this.maxValue - epsilon;\n value += interval\n ) {\n const normalizedValue = normalizeValue(value);\n if (\n normalizedValue <= this.minValue + epsilon ||\n normalizedValue >= this.maxValue - epsilon\n ) {\n continue;\n }\n\n upsertTickmark(\n normalizedValue,\n type,\n withLabels && this.showLabels ? normalizedValue.toString() : undefined\n );\n }\n };\n\n addTickmarksAtInterval(\n this.primaryTickmarkInterval,\n TickmarkType.primary,\n true\n );\n addTickmarksAtInterval(\n this.secondaryTickmarkInterval,\n TickmarkType.secondary\n );\n addTickmarksAtInterval(\n this.tertiaryTickmarkInterval,\n TickmarkType.tertiary\n );\n\n if (rangeIncludesZero(this.minValue, this.maxValue)) {\n upsertTickmark(\n 0,\n this.minValue < 0 ? TickmarkType.main : TickmarkType.textOnly,\n this.showLabels ? '0' : undefined\n );\n }\n\n if (this.showLabels) {\n upsertTickmark(\n this.minValue,\n TickmarkType.textOnly,\n this.minValue.toString()\n );\n upsertTickmark(\n this.maxValue,\n TickmarkType.textOnly,\n this.maxValue.toString()\n );\n }\n\n return [...tickmarksByValue.values()].sort((a, b) => a.angle - b.angle);\n }\n\n private get _advices(): AngleAdviceRaw[] {\n const value = this.clampedValue;\n\n return this.advices.map((advice) => {\n const minAngle = this.mapAngle(advice.minValue);\n const maxAngle = this.mapAngle(advice.maxValue);\n let state = advice.hinted ? AdviceState.hinted : AdviceState.regular;\n if (value >= advice.minValue && value <= advice.maxValue) {\n state = AdviceState.triggered;\n }\n\n return {\n minAngle,\n maxAngle,\n type: advice.type,\n state,\n hideMinTickmark: advice.minValue === this.minValue,\n hideMaxTickmark: advice.maxValue === this.maxValue,\n };\n });\n }\n\n static override styles = css`\n * {\n box-sizing: border-box;\n }\n\n .container {\n position: relative;\n width: 100%;\n height: 100%;\n }\n\n .container > * {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n }\n\n obc-watch {\n anchor-name: --watch;\n }\n\n .speed-gauge-value {\n position: absolute;\n top: clamp(\n 70%,\n calc(80% - (anchor-size(--watch height) - 200px) * 0.2),\n 80%\n );\n left: 50%;\n transform: translateX(-50%);\n width: fit-content;\n height: fit-content;\n }\n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'obc-instrument-radial': ObcInstrumentRadial;\n }\n}\n"],"names":["ObcGaugeRadialType"],"mappings":"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"}
|
|
@@ -74,6 +74,20 @@ export declare class ObcAzimuthThruster extends LitElement {
|
|
|
74
74
|
bottomPropeller: PropellerType;
|
|
75
75
|
tickmarkStyle: TickmarkStyle;
|
|
76
76
|
starboardPortIndicator: boolean;
|
|
77
|
+
/**
|
|
78
|
+
* Outer-ring diameter in CSS pixels. When set, the instrument renders at a
|
|
79
|
+
* fixed intrinsic size derived from the ring, arc shape and label reserve —
|
|
80
|
+
* so instruments sharing the same value have identical ring circumference
|
|
81
|
+
* regardless of label width or arc extent (like obc-donut-chart's
|
|
82
|
+
* fixedHeight). When unset (default), the instrument fills its container.
|
|
83
|
+
*/
|
|
84
|
+
faceDiameter: number | undefined;
|
|
85
|
+
private _frame;
|
|
86
|
+
/** Whether the host size styles were set by applyPinnedHostSize. */
|
|
87
|
+
private _hostSizePinned;
|
|
88
|
+
private _resizeController;
|
|
89
|
+
firstUpdated(changed: PropertyValues): void;
|
|
90
|
+
updated(changed: PropertyValues): void;
|
|
77
91
|
private get angleAdviceRaw();
|
|
78
92
|
private getTickmarks;
|
|
79
93
|
render(): import('lit-html').TemplateResult<1>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"azimuth-thruster.d.ts","sourceRoot":"","sources":["../../../src/navigation-instruments/azimuth-thruster/azimuth-thruster.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,UAAU,EAAY,MAAM,KAAK,CAAC;AAEhD,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"azimuth-thruster.d.ts","sourceRoot":"","sources":["../../../src/navigation-instruments/azimuth-thruster/azimuth-thruster.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,UAAU,EAAY,MAAM,KAAK,CAAC;AAEhD,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,KAAK,CAAC;AAUxC,OAAO,EAAC,eAAe,EAAE,QAAQ,EAAC,MAAM,aAAa,CAAC;AAGtD,OAAO,mBAAmB,CAAC;AAE3B,OAAO,EAAc,WAAW,EAAiB,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAW,aAAa,EAAe,MAAM,sBAAsB,CAAC;AAC3E,OAAO,EAAC,YAAY,EAAC,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAC,aAAa,EAAC,MAAM,0BAA0B,CAAC;AAYvD;;GAEG;AACH,qBACa,kBAAmB,SAAQ,UAAU;IAChD,OAAO,CAAC,iBAAiB,CAAiE;IAEhE,KAAK,SAAK;IACV,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5D,8CAA8C;IACpB,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/D,4EAA4E;IAE5E,eAAe,EAAE,OAAO,CAAS;IACjC,8CAA8C;IACpB,2BAA2B,EAAE,MAAM,CAAO;IACpE,8CAA8C;IACnB,qBAAqB,EAAE,OAAO,CAAS;IAClE,2EAA2E;IAChD,QAAQ,EAAE,OAAO,CAAS;IACrD,8CAA8C;IACD,mBAAmB,EAAE,OAAO,CAClE;IACP,2EAA2E;IACjD,2BAA2B,EAAE,MAAM,CAAK;IAClE,2EAA2E;IAChD,eAAe,EAAE,OAAO,CAAS;IAC5D;;;;OAIG;IACuB,uBAAuB,EAAE,MAAM,GAAG,SAAS,CAAM;IAC3E;;;OAGG;IACuB,yBAAyB,EAAE,MAAM,GAAG,SAAS,CAC3D;IACZ;;;OAGG;IACuB,wBAAwB,EAAE,MAAM,GAAG,SAAS,CAC1D;IACe,UAAU,EAAE,OAAO,CAAS;IAC5B,eAAe,EAAE,OAAO,CAAS;IAClC,MAAM,SAAK;IACX,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7D,+CAA+C;IACrB,iBAAiB,EAAE,MAAM,GAAG,SAAS,CAAC;IAChE,8EAA8E;IAE9E,gBAAgB,EAAE,OAAO,CAAS;IAClC,+CAA+C;IACrB,4BAA4B,EAAE,MAAM,CAAO;IACrE,+CAA+C;IACpB,sBAAsB,EAAE,OAAO,CAAS;IACnE,+CAA+C;IACF,oBAAoB,EAAE,OAAO,CACnE;IACP,6EAA6E;IACnD,4BAA4B,EAAE,MAAM,CAAK;IACzC,KAAK,EAAE,eAAe,CAA0B;IAChD,QAAQ,EAAE,QAAQ,CAAoB;IAEhE,OAAO,CAAC,QAAQ,CAGb;IACH,OAAO,CAAC,SAAS,CAId;IAEM,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IA0BxB,OAAO,EAAE,MAAM,CAAK;IACD,cAAc,EAAE,OAAO,CAAQ;IACjC,YAAY,EAAE,WAAW,EAAE,CAAM;IACjC,aAAa,EAAE,YAAY,EAAE,CAAM;IACnD,eAAe,EAAE,OAAO,CAAS;IAClC,YAAY,EAAE,aAAa,CAAsB;IACjD,eAAe,EAAE,aAAa,CAAsB;IACpD,aAAa,EAAE,aAAa,CAC9B;IACG,sBAAsB,EAAE,OAAO,CAAS;IACnE;;;;;;OAMG;IAEH,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IAEjC,OAAO,CAAC,MAAM,CAA0B;IAExC,oEAAoE;IACpE,OAAO,CAAC,eAAe,CAAS;IAEhC,OAAO,CAAC,iBAAiB,CAAkC;IAElD,YAAY,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAK3C,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAS/C,OAAO,KAAK,cAAc,GAqBzB;IAED,OAAO,CAAC,YAAY;IAyEX,MAAM;IAyEf,OAAgB,MAAM,0BAA6B;IAE1C,oBAAoB,IAAI,IAAI;CAKtC;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,sBAAsB,EAAE,kBAAkB,CAAC;KAC5C;CACF"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { unsafeCSS, LitElement, html } from "lit";
|
|
2
2
|
import { property } from "lit/decorators.js";
|
|
3
|
+
import { ResizeController } from "@lit-labs/observers/resize-controller.js";
|
|
4
|
+
import { observeInnerBox, applyPinnedHostSize, computeRadialFrame, measureContainerPx, estimateLabelWidthPx } from "../../svghelpers/radial-frame.js";
|
|
3
5
|
import { InstrumentState, Priority } from "../types.js";
|
|
4
6
|
import { SetpointBundle } from "../../svghelpers/setpoint-bundle.js";
|
|
5
7
|
import { thruster } from "../thruster/thruster.js";
|
|
6
8
|
import "../watch/watch.js";
|
|
7
9
|
import componentStyle from "./azimuth-thruster.css.js";
|
|
8
|
-
import { ifDefined } from "lit/directives/if-defined.js";
|
|
9
10
|
import { AdviceState } from "../watch/advice.js";
|
|
10
11
|
import { TickmarkStyle, TickmarkType } from "../watch/tickmark.js";
|
|
11
12
|
import { PropellerType } from "../thruster/propeller.js";
|
|
@@ -71,6 +72,8 @@ let ObcAzimuthThruster = class extends LitElement {
|
|
|
71
72
|
this.bottomPropeller = PropellerType.none;
|
|
72
73
|
this.tickmarkStyle = TickmarkStyle.regular;
|
|
73
74
|
this.starboardPortIndicator = false;
|
|
75
|
+
this._hostSizePinned = false;
|
|
76
|
+
this._resizeController = new ResizeController(this, {});
|
|
74
77
|
}
|
|
75
78
|
willUpdate(changed) {
|
|
76
79
|
super.willUpdate(changed);
|
|
@@ -97,6 +100,18 @@ let ObcAzimuthThruster = class extends LitElement {
|
|
|
97
100
|
animateSetpoint: this.animateSetpoint
|
|
98
101
|
});
|
|
99
102
|
}
|
|
103
|
+
firstUpdated(changed) {
|
|
104
|
+
super.firstUpdated(changed);
|
|
105
|
+
observeInnerBox(this._resizeController, this.renderRoot);
|
|
106
|
+
}
|
|
107
|
+
updated(changed) {
|
|
108
|
+
super.updated(changed);
|
|
109
|
+
this._hostSizePinned = applyPinnedHostSize(
|
|
110
|
+
this,
|
|
111
|
+
this._frame,
|
|
112
|
+
this._hostSizePinned
|
|
113
|
+
);
|
|
114
|
+
}
|
|
100
115
|
get angleAdviceRaw() {
|
|
101
116
|
return this.angleAdvices.map((advice) => {
|
|
102
117
|
const triggered = this.angleSetpoint !== void 0 && mapAngle0to360(this.angleSetpoint - advice.minAngle) < 180 && mapAngle0to360(this.angleSetpoint - advice.maxAngle) > 180;
|
|
@@ -168,19 +183,21 @@ let ObcAzimuthThruster = class extends LitElement {
|
|
|
168
183
|
render() {
|
|
169
184
|
const rotateAngle = this.angle;
|
|
170
185
|
const tickmarks = this.getTickmarks();
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
}
|
|
186
|
+
const frame = computeRadialFrame({
|
|
187
|
+
basePadding: this.hasLabelSpacer ? 24 : 16,
|
|
188
|
+
labelWidthPx: this.hasLabelSpacer && !this.tickmarksInside ? estimateLabelWidthPx(tickmarks.map((t) => t.text)) : 0,
|
|
189
|
+
containerPx: measureContainerPx(this),
|
|
190
|
+
faceDiameter: this.faceDiameter
|
|
191
|
+
});
|
|
192
|
+
this._frame = frame;
|
|
193
|
+
const shownTickmarks = frame.labelsHidden ? tickmarks.map((t) => ({ ...t, text: void 0 })) : tickmarks;
|
|
194
|
+
const viewBox = frame.viewBox;
|
|
179
195
|
return html`
|
|
180
196
|
<div class="container">
|
|
181
197
|
<obc-watch
|
|
182
198
|
.touching=${this.touching}
|
|
183
|
-
.
|
|
199
|
+
.arcFrame=${frame}
|
|
200
|
+
.tickmarks=${shownTickmarks}
|
|
184
201
|
.state=${this.state}
|
|
185
202
|
.priority=${this.priority}
|
|
186
203
|
.angleSetpoint=${this.angleSetpoint}
|
|
@@ -191,7 +208,6 @@ let ObcAzimuthThruster = class extends LitElement {
|
|
|
191
208
|
.animateSetpoint=${this.animateSetpoint}
|
|
192
209
|
.tickmarksInside=${this.tickmarksInside}
|
|
193
210
|
.tickmarkStyle=${this.tickmarkStyle}
|
|
194
|
-
padding=${ifDefined(!this.hasLabelSpacer ? 16 : void 0)}
|
|
195
211
|
.advices=${this.angleAdviceRaw}
|
|
196
212
|
.starboardPortIndicator=${this.starboardPortIndicator}
|
|
197
213
|
></obc-watch>
|
|
@@ -337,6 +353,9 @@ __decorateClass([
|
|
|
337
353
|
__decorateClass([
|
|
338
354
|
property({ type: Boolean })
|
|
339
355
|
], ObcAzimuthThruster.prototype, "starboardPortIndicator", 2);
|
|
356
|
+
__decorateClass([
|
|
357
|
+
property({ type: Number, attribute: "face-diameter" })
|
|
358
|
+
], ObcAzimuthThruster.prototype, "faceDiameter", 2);
|
|
340
359
|
ObcAzimuthThruster = __decorateClass([
|
|
341
360
|
customElement("obc-azimuth-thruster")
|
|
342
361
|
], ObcAzimuthThruster);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"azimuth-thruster.js","sources":["../../../src/navigation-instruments/azimuth-thruster/azimuth-thruster.ts"],"sourcesContent":["import {html, LitElement, unsafeCSS} from 'lit';\nimport {property} from 'lit/decorators.js';\nimport type {PropertyValues} from 'lit';\nimport {InstrumentState, Priority} from '../types.js';\nimport {SetpointBundle} from '../../svghelpers/setpoint-bundle.js';\nimport {thruster} from '../thruster/thruster.js';\nimport '../watch/watch.js';\nimport componentStyle from './azimuth-thruster.css?inline';\nimport {ifDefined} from 'lit/directives/if-defined.js';\nimport {AdviceState, AngleAdvice, AngleAdviceRaw} from '../watch/advice.js';\nimport {Tickmark, TickmarkStyle, TickmarkType} from '../watch/tickmark.js';\nimport {LinearAdvice} from '../thruster/advice.js';\nimport {PropellerType} from '../thruster/propeller.js';\nimport {customElement} from '../../decorator.js';\n\nfunction mapAngle0to360(angle: number): number {\n const a = angle % 360;\n if (a >= 0) {\n return a;\n } else {\n return a + 360;\n }\n}\n\n/**\n * @stable\n */\n@customElement('obc-azimuth-thruster')\nexport class ObcAzimuthThruster extends LitElement {\n private _thrustSetpointId = `azimuth-thrust-sp-${Math.random().toString(36).slice(2, 9)}`;\n\n @property({type: Number}) angle = 0;\n @property({type: Number}) angleSetpoint: number | undefined;\n /** @availableWhen angleSetpoint!=undefined */\n @property({type: Number}) newAngleSetpoint: number | undefined;\n /** @availableWhen angleSetpoint!=undefined && autoAtAngleSetpoint==false */\n @property({type: Boolean})\n atAngleSetpoint: boolean = false;\n /** @availableWhen angleSetpoint!=undefined */\n @property({type: Number}) angleSetpointAtZeroDeadband: number = 0.5;\n /** @availableWhen angleSetpoint!=undefined */\n @property({type: Boolean}) angleSetpointOverride: boolean = false;\n /** @availableWhen angleSetpoint!=undefined || thrustSetpoint!=undefined */\n @property({type: Boolean}) touching: boolean = false;\n /** @availableWhen angleSetpoint!=undefined */\n @property({type: Boolean, attribute: false}) autoAtAngleSetpoint: boolean =\n true;\n /** @availableWhen angleSetpoint!=undefined && autoAtAngleSetpoint==true */\n @property({type: Number}) autoAtAngleSetpointDeadband: number = 2;\n /** @availableWhen angleSetpoint!=undefined || thrustSetpoint!=undefined */\n @property({type: Boolean}) animateSetpoint: boolean = false;\n /**\n * Interval (in degrees) for primary tickmarks.\n * When undefined or <= 0, no primary tickmarks are shown (only the zero line).\n * Default 90 gives ticks at 0°, 90°, 180°, 270°.\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: boolean = false;\n @property({type: Boolean}) tickmarksInside: boolean = false;\n @property({type: Number}) thrust = 0;\n @property({type: Number}) thrustSetpoint: number | undefined;\n /** @availableWhen thrustSetpoint!=undefined */\n @property({type: Number}) newThrustSetpoint: number | undefined;\n /** @availableWhen thrustSetpoint!=undefined && autoAtThrustSetpoint==false */\n @property({type: Boolean})\n atThrustSetpoint: boolean = false;\n /** @availableWhen thrustSetpoint!=undefined */\n @property({type: Number}) thrustSetpointAtZeroDeadband: number = 0.1;\n /** @availableWhen thrustSetpoint!=undefined */\n @property({type: Boolean}) thrustSetpointOverride: boolean = false;\n /** @availableWhen thrustSetpoint!=undefined */\n @property({type: Boolean, attribute: false}) autoAtThrustSetpoint: boolean =\n true;\n /** @availableWhen thrustSetpoint!=undefined && autoAtThrustSetpoint==true */\n @property({type: Number}) autoAtThrustSetpointDeadband: number = 1;\n @property({type: String}) state: InstrumentState = InstrumentState.active;\n @property({type: String}) priority: Priority = Priority.regular;\n\n private _angleSp = new SetpointBundle({\n angularWraparound: true,\n onAnimationEnd: () => this.requestUpdate(),\n });\n private _thrustSp = new SetpointBundle({\n defaultDeadband: 1,\n defaultZeroDeadband: 0.1,\n onAnimationEnd: () => this.requestUpdate(),\n });\n\n override willUpdate(changed: PropertyValues): void {\n super.willUpdate(changed);\n // Sync public prefixed props → bundles\n this._angleSp.sync({\n setpoint: this.angleSetpoint,\n newSetpoint: this.newAngleSetpoint,\n atSetpoint: this.atAngleSetpoint,\n touching: this.touching,\n autoAtSetpoint: this.autoAtAngleSetpoint,\n autoAtSetpointDeadband: this.autoAtAngleSetpointDeadband,\n setpointAtZeroDeadband: this.angleSetpointAtZeroDeadband,\n setpointOverride: this.angleSetpointOverride,\n animateSetpoint: this.animateSetpoint,\n });\n this._thrustSp.sync({\n setpoint: this.thrustSetpoint,\n newSetpoint: this.newThrustSetpoint,\n touching: this.touching,\n atSetpoint: this.atThrustSetpoint,\n autoAtSetpoint: this.autoAtThrustSetpoint,\n autoAtSetpointDeadband: this.autoAtThrustSetpointDeadband,\n setpointAtZeroDeadband: this.thrustSetpointAtZeroDeadband,\n setpointOverride: this.thrustSetpointOverride,\n animateSetpoint: this.animateSetpoint,\n });\n }\n @property({type: Number}) loading: number = 0;\n @property({type: Boolean, attribute: false}) hasLabelSpacer: boolean = true;\n @property({type: Array, attribute: false}) angleAdvices: AngleAdvice[] = [];\n @property({type: Array, attribute: false}) thrustAdvices: LinearAdvice[] = [];\n @property({type: Boolean}) singleDirection: boolean = false;\n @property({type: String}) topPropeller: PropellerType = PropellerType.none;\n @property({type: String}) bottomPropeller: PropellerType = PropellerType.none;\n @property({type: String}) tickmarkStyle: TickmarkStyle =\n TickmarkStyle.regular;\n @property({type: Boolean}) starboardPortIndicator: boolean = false;\n\n private get angleAdviceRaw(): AngleAdviceRaw[] {\n return this.angleAdvices.map((advice) => {\n const triggered =\n this.angleSetpoint !== undefined &&\n mapAngle0to360(this.angleSetpoint - advice.minAngle) < 180 &&\n mapAngle0to360(this.angleSetpoint - advice.maxAngle) > 180;\n let state: AdviceState;\n if (triggered) {\n state = AdviceState.triggered;\n } else if (advice.hinted) {\n state = AdviceState.hinted;\n } else {\n state = AdviceState.regular;\n }\n return {\n minAngle: advice.minAngle,\n maxAngle: advice.maxAngle,\n type: advice.type,\n state,\n };\n });\n }\n\n private getTickmarks(): Tickmark[] {\n const tickmarks: Tickmark[] = [];\n const skipAngles: number[] = [];\n\n // Helper for signed label text (0-180 positive, 181-359 negative)\n const labelText = (angle: number): string | undefined => {\n if (!this.showLabels) return undefined;\n return angle <= 180 ? `${angle}` : `${angle - 360}`;\n };\n\n // Always add the zero line\n tickmarks.push({\n angle: 0,\n type: TickmarkType.zeroLine,\n text: this.showLabels ? '0' : undefined,\n });\n skipAngles.push(0);\n\n // Primary tickmarks — skip when undefined or <= 0 to prevent infinite loops\n const primaryInterval = this.primaryTickmarkInterval;\n if (\n primaryInterval !== undefined &&\n primaryInterval > 0 &&\n Number.isFinite(primaryInterval)\n ) {\n for (let i = primaryInterval; i < 360; i += primaryInterval) {\n if (skipAngles.includes(i)) continue;\n tickmarks.push({\n angle: i,\n type: TickmarkType.primary,\n text: labelText(i),\n });\n skipAngles.push(i);\n }\n }\n\n // Secondary tickmarks — skip when undefined or <= 0\n const secondaryInterval = this.secondaryTickmarkInterval;\n if (\n secondaryInterval !== undefined &&\n secondaryInterval > 0 &&\n Number.isFinite(secondaryInterval)\n ) {\n for (let i = 0; i < 360; i += secondaryInterval) {\n if (skipAngles.includes(i)) continue;\n tickmarks.push({\n angle: i,\n type: TickmarkType.secondary,\n });\n skipAngles.push(i);\n }\n }\n\n // Tertiary tickmarks — skip when undefined or <= 0\n const tertiaryInterval = this.tertiaryTickmarkInterval;\n if (\n tertiaryInterval !== undefined &&\n tertiaryInterval > 0 &&\n Number.isFinite(tertiaryInterval)\n ) {\n for (let i = 0; i < 360; i += tertiaryInterval) {\n if (skipAngles.includes(i)) continue;\n tickmarks.push({\n angle: i,\n type: TickmarkType.tertiary,\n });\n skipAngles.push(i);\n }\n }\n\n return tickmarks;\n }\n\n override render() {\n const rotateAngle = this.angle;\n\n const tickmarks = this.getTickmarks();\n\n let viewBox: string;\n if (!this.hasLabelSpacer) {\n viewBox = '-192 -192 384 384';\n } else if (this.showLabels && !this.tickmarksInside) {\n viewBox = '-236 -236 472 472';\n } else {\n viewBox = '-200 -200 400 400';\n }\n\n return html`\n <div class=\"container\">\n <obc-watch\n .touching=${this.touching}\n .tickmarks=${tickmarks}\n .state=${this.state}\n .priority=${this.priority}\n .angleSetpoint=${this.angleSetpoint}\n .newAngleSetpoint=${this.newAngleSetpoint}\n .atAngleSetpoint=${this._angleSp.computeAtSetpoint(this.angle)}\n .angleSetpointAtZeroDeadband=${this.angleSetpointAtZeroDeadband}\n .setpointOverride=${this.angleSetpointOverride}\n .animateSetpoint=${this.animateSetpoint}\n .tickmarksInside=${this.tickmarksInside}\n .tickmarkStyle=${this.tickmarkStyle}\n padding=${ifDefined(!this.hasLabelSpacer ? 16 : undefined)}\n .advices=${this.angleAdviceRaw}\n .starboardPortIndicator=${this.starboardPortIndicator}\n ></obc-watch>\n <svg viewBox=${viewBox} xmlns=\"http://www.w3.org/2000/svg\">\n <g transform=\"rotate(${rotateAngle})\">\n ${thruster(\n this.thrust,\n this.thrustSetpoint,\n this.state,\n this.priority,\n {\n atSetpoint: this.atThrustSetpoint,\n singleSided: true,\n singleDirection: false,\n singleDirectionHalfSize: this.singleDirection,\n tunnel: false,\n autoAtSetpoint: this.autoAtThrustSetpoint,\n autoAtSetpointDeadband: this.autoAtThrustSetpointDeadband,\n setpointAtZeroDeadband: this.thrustSetpointAtZeroDeadband,\n touching: this.touching,\n advices: this.thrustAdvices,\n topPropeller: this.topPropeller,\n bottomPropeller: this.bottomPropeller,\n narrow: true,\n newSetpoint: this.newThrustSetpoint,\n setpointId: this._thrustSetpointId,\n animateSetpoint: this.animateSetpoint,\n departingNewSetpoint: this._thrustSp.departingNewSetpoint,\n setpointOverride: this.thrustSetpointOverride,\n }\n )}\n </g>\n </svg>\n </div>\n `;\n }\n\n static override styles = unsafeCSS(componentStyle);\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this._angleSp.dispose();\n this._thrustSp.dispose();\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'obc-azimuth-thruster': ObcAzimuthThruster;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"azimuth-thruster.js","sources":["../../../src/navigation-instruments/azimuth-thruster/azimuth-thruster.ts"],"sourcesContent":["import {html, LitElement, 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 {thruster} from '../thruster/thruster.js';\nimport '../watch/watch.js';\nimport componentStyle from './azimuth-thruster.css?inline';\nimport {AdviceState, AngleAdvice, AngleAdviceRaw} from '../watch/advice.js';\nimport {Tickmark, TickmarkStyle, TickmarkType} from '../watch/tickmark.js';\nimport {LinearAdvice} from '../thruster/advice.js';\nimport {PropellerType} from '../thruster/propeller.js';\nimport {customElement} from '../../decorator.js';\n\nfunction mapAngle0to360(angle: number): number {\n const a = angle % 360;\n if (a >= 0) {\n return a;\n } else {\n return a + 360;\n }\n}\n\n/**\n * @stable\n */\n@customElement('obc-azimuth-thruster')\nexport class ObcAzimuthThruster extends LitElement {\n private _thrustSetpointId = `azimuth-thrust-sp-${Math.random().toString(36).slice(2, 9)}`;\n\n @property({type: Number}) angle = 0;\n @property({type: Number}) angleSetpoint: number | undefined;\n /** @availableWhen angleSetpoint!=undefined */\n @property({type: Number}) newAngleSetpoint: number | undefined;\n /** @availableWhen angleSetpoint!=undefined && autoAtAngleSetpoint==false */\n @property({type: Boolean})\n atAngleSetpoint: boolean = false;\n /** @availableWhen angleSetpoint!=undefined */\n @property({type: Number}) angleSetpointAtZeroDeadband: number = 0.5;\n /** @availableWhen angleSetpoint!=undefined */\n @property({type: Boolean}) angleSetpointOverride: boolean = false;\n /** @availableWhen angleSetpoint!=undefined || thrustSetpoint!=undefined */\n @property({type: Boolean}) touching: boolean = false;\n /** @availableWhen angleSetpoint!=undefined */\n @property({type: Boolean, attribute: false}) autoAtAngleSetpoint: boolean =\n true;\n /** @availableWhen angleSetpoint!=undefined && autoAtAngleSetpoint==true */\n @property({type: Number}) autoAtAngleSetpointDeadband: number = 2;\n /** @availableWhen angleSetpoint!=undefined || thrustSetpoint!=undefined */\n @property({type: Boolean}) animateSetpoint: boolean = false;\n /**\n * Interval (in degrees) for primary tickmarks.\n * When undefined or <= 0, no primary tickmarks are shown (only the zero line).\n * Default 90 gives ticks at 0°, 90°, 180°, 270°.\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: boolean = false;\n @property({type: Boolean}) tickmarksInside: boolean = false;\n @property({type: Number}) thrust = 0;\n @property({type: Number}) thrustSetpoint: number | undefined;\n /** @availableWhen thrustSetpoint!=undefined */\n @property({type: Number}) newThrustSetpoint: number | undefined;\n /** @availableWhen thrustSetpoint!=undefined && autoAtThrustSetpoint==false */\n @property({type: Boolean})\n atThrustSetpoint: boolean = false;\n /** @availableWhen thrustSetpoint!=undefined */\n @property({type: Number}) thrustSetpointAtZeroDeadband: number = 0.1;\n /** @availableWhen thrustSetpoint!=undefined */\n @property({type: Boolean}) thrustSetpointOverride: boolean = false;\n /** @availableWhen thrustSetpoint!=undefined */\n @property({type: Boolean, attribute: false}) autoAtThrustSetpoint: boolean =\n true;\n /** @availableWhen thrustSetpoint!=undefined && autoAtThrustSetpoint==true */\n @property({type: Number}) autoAtThrustSetpointDeadband: number = 1;\n @property({type: String}) state: InstrumentState = InstrumentState.active;\n @property({type: String}) priority: Priority = Priority.regular;\n\n private _angleSp = new SetpointBundle({\n angularWraparound: true,\n onAnimationEnd: () => this.requestUpdate(),\n });\n private _thrustSp = new SetpointBundle({\n defaultDeadband: 1,\n defaultZeroDeadband: 0.1,\n onAnimationEnd: () => this.requestUpdate(),\n });\n\n override willUpdate(changed: PropertyValues): void {\n super.willUpdate(changed);\n // Sync public prefixed props → bundles\n this._angleSp.sync({\n setpoint: this.angleSetpoint,\n newSetpoint: this.newAngleSetpoint,\n atSetpoint: this.atAngleSetpoint,\n touching: this.touching,\n autoAtSetpoint: this.autoAtAngleSetpoint,\n autoAtSetpointDeadband: this.autoAtAngleSetpointDeadband,\n setpointAtZeroDeadband: this.angleSetpointAtZeroDeadband,\n setpointOverride: this.angleSetpointOverride,\n animateSetpoint: this.animateSetpoint,\n });\n this._thrustSp.sync({\n setpoint: this.thrustSetpoint,\n newSetpoint: this.newThrustSetpoint,\n touching: this.touching,\n atSetpoint: this.atThrustSetpoint,\n autoAtSetpoint: this.autoAtThrustSetpoint,\n autoAtSetpointDeadband: this.autoAtThrustSetpointDeadband,\n setpointAtZeroDeadband: this.thrustSetpointAtZeroDeadband,\n setpointOverride: this.thrustSetpointOverride,\n animateSetpoint: this.animateSetpoint,\n });\n }\n @property({type: Number}) loading: number = 0;\n @property({type: Boolean, attribute: false}) hasLabelSpacer: boolean = true;\n @property({type: Array, attribute: false}) angleAdvices: AngleAdvice[] = [];\n @property({type: Array, attribute: false}) thrustAdvices: LinearAdvice[] = [];\n @property({type: Boolean}) singleDirection: boolean = false;\n @property({type: String}) topPropeller: PropellerType = PropellerType.none;\n @property({type: String}) bottomPropeller: PropellerType = PropellerType.none;\n @property({type: String}) tickmarkStyle: TickmarkStyle =\n TickmarkStyle.regular;\n @property({type: Boolean}) starboardPortIndicator: boolean = false;\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 _frame: RadialFrame | undefined;\n\n /** Whether the host size styles were set by applyPinnedHostSize. */\n private _hostSizePinned = false;\n\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 updated(changed: PropertyValues): void {\n super.updated(changed);\n this._hostSizePinned = applyPinnedHostSize(\n this,\n this._frame,\n this._hostSizePinned\n );\n }\n\n private get angleAdviceRaw(): AngleAdviceRaw[] {\n return this.angleAdvices.map((advice) => {\n const triggered =\n this.angleSetpoint !== undefined &&\n mapAngle0to360(this.angleSetpoint - advice.minAngle) < 180 &&\n mapAngle0to360(this.angleSetpoint - advice.maxAngle) > 180;\n let state: AdviceState;\n if (triggered) {\n state = AdviceState.triggered;\n } else if (advice.hinted) {\n state = AdviceState.hinted;\n } else {\n state = AdviceState.regular;\n }\n return {\n minAngle: advice.minAngle,\n maxAngle: advice.maxAngle,\n type: advice.type,\n state,\n };\n });\n }\n\n private getTickmarks(): Tickmark[] {\n const tickmarks: Tickmark[] = [];\n const skipAngles: number[] = [];\n\n // Helper for signed label text (0-180 positive, 181-359 negative)\n const labelText = (angle: number): string | undefined => {\n if (!this.showLabels) return undefined;\n return angle <= 180 ? `${angle}` : `${angle - 360}`;\n };\n\n // Always add the zero line\n tickmarks.push({\n angle: 0,\n type: TickmarkType.zeroLine,\n text: this.showLabels ? '0' : undefined,\n });\n skipAngles.push(0);\n\n // Primary tickmarks — skip when undefined or <= 0 to prevent infinite loops\n const primaryInterval = this.primaryTickmarkInterval;\n if (\n primaryInterval !== undefined &&\n primaryInterval > 0 &&\n Number.isFinite(primaryInterval)\n ) {\n for (let i = primaryInterval; i < 360; i += primaryInterval) {\n if (skipAngles.includes(i)) continue;\n tickmarks.push({\n angle: i,\n type: TickmarkType.primary,\n text: labelText(i),\n });\n skipAngles.push(i);\n }\n }\n\n // Secondary tickmarks — skip when undefined or <= 0\n const secondaryInterval = this.secondaryTickmarkInterval;\n if (\n secondaryInterval !== undefined &&\n secondaryInterval > 0 &&\n Number.isFinite(secondaryInterval)\n ) {\n for (let i = 0; i < 360; i += secondaryInterval) {\n if (skipAngles.includes(i)) continue;\n tickmarks.push({\n angle: i,\n type: TickmarkType.secondary,\n });\n skipAngles.push(i);\n }\n }\n\n // Tertiary tickmarks — skip when undefined or <= 0\n const tertiaryInterval = this.tertiaryTickmarkInterval;\n if (\n tertiaryInterval !== undefined &&\n tertiaryInterval > 0 &&\n Number.isFinite(tertiaryInterval)\n ) {\n for (let i = 0; i < 360; i += tertiaryInterval) {\n if (skipAngles.includes(i)) continue;\n tickmarks.push({\n angle: i,\n type: TickmarkType.tertiary,\n });\n skipAngles.push(i);\n }\n }\n\n return tickmarks;\n }\n\n override render() {\n const rotateAngle = this.angle;\n\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 const viewBox = frame.viewBox;\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 .angleSetpoint=${this.angleSetpoint}\n .newAngleSetpoint=${this.newAngleSetpoint}\n .atAngleSetpoint=${this._angleSp.computeAtSetpoint(this.angle)}\n .angleSetpointAtZeroDeadband=${this.angleSetpointAtZeroDeadband}\n .setpointOverride=${this.angleSetpointOverride}\n .animateSetpoint=${this.animateSetpoint}\n .tickmarksInside=${this.tickmarksInside}\n .tickmarkStyle=${this.tickmarkStyle}\n .advices=${this.angleAdviceRaw}\n .starboardPortIndicator=${this.starboardPortIndicator}\n ></obc-watch>\n <svg viewBox=${viewBox} xmlns=\"http://www.w3.org/2000/svg\">\n <g transform=\"rotate(${rotateAngle})\">\n ${thruster(\n this.thrust,\n this.thrustSetpoint,\n this.state,\n this.priority,\n {\n atSetpoint: this.atThrustSetpoint,\n singleSided: true,\n singleDirection: false,\n singleDirectionHalfSize: this.singleDirection,\n tunnel: false,\n autoAtSetpoint: this.autoAtThrustSetpoint,\n autoAtSetpointDeadband: this.autoAtThrustSetpointDeadband,\n setpointAtZeroDeadband: this.thrustSetpointAtZeroDeadband,\n touching: this.touching,\n advices: this.thrustAdvices,\n topPropeller: this.topPropeller,\n bottomPropeller: this.bottomPropeller,\n narrow: true,\n newSetpoint: this.newThrustSetpoint,\n setpointId: this._thrustSetpointId,\n animateSetpoint: this.animateSetpoint,\n departingNewSetpoint: this._thrustSp.departingNewSetpoint,\n setpointOverride: this.thrustSetpointOverride,\n }\n )}\n </g>\n </svg>\n </div>\n `;\n }\n\n static override styles = unsafeCSS(componentStyle);\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this._angleSp.dispose();\n this._thrustSp.dispose();\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'obc-azimuth-thruster': ObcAzimuthThruster;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -196,6 +196,14 @@ export declare class ObcCompass extends LitElement {
|
|
|
196
196
|
showLabels: boolean;
|
|
197
197
|
/** When true, labels and north arrow are placed inside the outer ring. */
|
|
198
198
|
tickmarksInside: boolean;
|
|
199
|
+
/**
|
|
200
|
+
* Outer-ring diameter in CSS pixels. When set, the instrument renders at a
|
|
201
|
+
* fixed intrinsic size derived from the ring, arc shape and label reserve —
|
|
202
|
+
* so instruments sharing the same value have identical ring circumference
|
|
203
|
+
* regardless of label width or arc extent (like obc-donut-chart's
|
|
204
|
+
* fixedHeight). When unset (default), the instrument fills its container.
|
|
205
|
+
*/
|
|
206
|
+
faceDiameter: number | undefined;
|
|
199
207
|
private _headingSp;
|
|
200
208
|
willUpdate(changed: PropertyValues): void;
|
|
201
209
|
disconnectedCallback(): void;
|
|
@@ -207,7 +215,19 @@ export declare class ObcCompass extends LitElement {
|
|
|
207
215
|
* the deprecation window.
|
|
208
216
|
*/
|
|
209
217
|
private get _effectiveRotDegPerMin();
|
|
210
|
-
|
|
218
|
+
/**
|
|
219
|
+
* Pixel cost of the outside decor: the always-rendered north-arrow glyph
|
|
220
|
+
* plus, only while shown, the NSWE labels (both keep a constant on-screen
|
|
221
|
+
* size via `1/scale` terms). Feeds the frame's width-aware reserve,
|
|
222
|
+
* replacing the former empirical `72 + delta(clientSize)` padding.
|
|
223
|
+
* Wind/current symbols at their default radius are covered by the base
|
|
224
|
+
* padding of 72.
|
|
225
|
+
*/
|
|
226
|
+
private getOutsideDecorPx;
|
|
227
|
+
/** Whether the host size styles were set by applyPinnedHostSize. */
|
|
228
|
+
private _hostSizePinned;
|
|
229
|
+
private _frame;
|
|
230
|
+
updated(changed: PropertyValues): void;
|
|
211
231
|
private get angleAdviceRaw();
|
|
212
232
|
private priorityFor;
|
|
213
233
|
private colorFor;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compass.d.ts","sourceRoot":"","sources":["../../../src/navigation-instruments/compass/compass.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAE,cAAc,EAAY,MAAM,KAAK,CAAC;AAE1D,OAAO,mBAAmB,CAAC;AAG3B,OAAO,EAAc,WAAW,EAAiB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"compass.d.ts","sourceRoot":"","sources":["../../../src/navigation-instruments/compass/compass.ts"],"names":[],"mappings":"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"}
|