@oicl/openbridge-webcomponents 0.0.20260407101310 → 0.0.20260407112816
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/building-blocks/instrument-radial/instrument-radial.d.ts +3 -0
- package/dist/building-blocks/instrument-radial/instrument-radial.d.ts.map +1 -1
- package/dist/building-blocks/instrument-radial/instrument-radial.js +50 -22
- package/dist/building-blocks/instrument-radial/instrument-radial.js.map +1 -1
- package/dist/navigation-instruments/compass/arrow.d.ts +1 -1
- package/dist/navigation-instruments/compass/arrow.d.ts.map +1 -1
- package/dist/navigation-instruments/compass/arrow.js +3 -3
- package/dist/navigation-instruments/compass/arrow.js.map +1 -1
- package/dist/navigation-instruments/compass/compass.d.ts +12 -6
- package/dist/navigation-instruments/compass/compass.d.ts.map +1 -1
- package/dist/navigation-instruments/compass/compass.js +29 -24
- package/dist/navigation-instruments/compass/compass.js.map +1 -1
- package/dist/navigation-instruments/compass-flat/compass-flat.d.ts +37 -1
- package/dist/navigation-instruments/compass-flat/compass-flat.d.ts.map +1 -1
- package/dist/navigation-instruments/compass-flat/compass-flat.js +34 -3
- package/dist/navigation-instruments/compass-flat/compass-flat.js.map +1 -1
- package/dist/navigation-instruments/compass-sector/compass-sector.css.js +34 -0
- package/dist/navigation-instruments/compass-sector/compass-sector.css.js.map +1 -0
- package/dist/navigation-instruments/compass-sector/compass-sector.d.ts +101 -0
- package/dist/navigation-instruments/compass-sector/compass-sector.d.ts.map +1 -0
- package/dist/navigation-instruments/compass-sector/compass-sector.js +404 -0
- package/dist/navigation-instruments/compass-sector/compass-sector.js.map +1 -0
- package/dist/navigation-instruments/rate-of-turn/rate-of-turn.controller.d.ts +15 -2
- package/dist/navigation-instruments/rate-of-turn/rate-of-turn.controller.d.ts.map +1 -1
- package/dist/navigation-instruments/rate-of-turn/rate-of-turn.controller.js +50 -18
- package/dist/navigation-instruments/rate-of-turn/rate-of-turn.controller.js.map +1 -1
- package/dist/navigation-instruments/rate-of-turn/rate-of-turn.d.ts +40 -6
- package/dist/navigation-instruments/rate-of-turn/rate-of-turn.d.ts.map +1 -1
- package/dist/navigation-instruments/rate-of-turn/rate-of-turn.js +40 -47
- package/dist/navigation-instruments/rate-of-turn/rate-of-turn.js.map +1 -1
- package/dist/navigation-instruments/rate-of-turn/rot-renderer.d.ts +63 -0
- package/dist/navigation-instruments/rate-of-turn/rot-renderer.d.ts.map +1 -0
- package/dist/navigation-instruments/rate-of-turn/rot-renderer.js +211 -0
- package/dist/navigation-instruments/rate-of-turn/rot-renderer.js.map +1 -0
- package/dist/navigation-instruments/rot-sector/rot-sector.d.ts +10 -4
- package/dist/navigation-instruments/rot-sector/rot-sector.d.ts.map +1 -1
- package/dist/navigation-instruments/rot-sector/rot-sector.js +13 -3
- package/dist/navigation-instruments/rot-sector/rot-sector.js.map +1 -1
- package/dist/navigation-instruments/rudder/rudder.d.ts +4 -0
- package/dist/navigation-instruments/rudder/rudder.d.ts.map +1 -1
- package/dist/navigation-instruments/rudder/rudder.js +55 -19
- package/dist/navigation-instruments/rudder/rudder.js.map +1 -1
- package/dist/navigation-instruments/watch/advice.d.ts +3 -3
- package/dist/navigation-instruments/watch/advice.d.ts.map +1 -1
- package/dist/navigation-instruments/watch/advice.js +68 -16
- package/dist/navigation-instruments/watch/advice.js.map +1 -1
- package/dist/navigation-instruments/watch/tickmark.d.ts +2 -1
- package/dist/navigation-instruments/watch/tickmark.d.ts.map +1 -1
- package/dist/navigation-instruments/watch/tickmark.js +15 -13
- package/dist/navigation-instruments/watch/tickmark.js.map +1 -1
- package/dist/navigation-instruments/watch/watch.d.ts +29 -0
- package/dist/navigation-instruments/watch/watch.d.ts.map +1 -1
- package/dist/navigation-instruments/watch/watch.js +256 -44
- package/dist/navigation-instruments/watch/watch.js.map +1 -1
- package/dist/navigation-instruments/watch-flat/watch-flat.d.ts +29 -1
- package/dist/navigation-instruments/watch-flat/watch-flat.d.ts.map +1 -1
- package/dist/navigation-instruments/watch-flat/watch-flat.js +162 -17
- package/dist/navigation-instruments/watch-flat/watch-flat.js.map +1 -1
- package/dist/svghelpers/arc-frame.d.ts +42 -0
- package/dist/svghelpers/arc-frame.d.ts.map +1 -0
- package/dist/svghelpers/arc-frame.js +123 -0
- package/dist/svghelpers/arc-frame.js.map +1 -0
- package/package.json +1 -1
- package/dist/navigation-instruments/compass/rot.d.ts +0 -4
- package/dist/navigation-instruments/compass/rot.d.ts.map +0 -1
- package/dist/navigation-instruments/compass/rot.js +0 -11
- package/dist/navigation-instruments/compass/rot.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tickmark.js","sources":["../../../src/navigation-instruments/watch/tickmark.ts"],"sourcesContent":["import {SVGTemplateResult, svg} from 'lit';\n\nexport interface Tickmark {\n angle: number;\n type: TickmarkType;\n text?: string;\n color?: string;\n}\n\nexport enum TickmarkType {\n zeroLineThick = 'zeroLineThick',\n zeroLine = 'zeroLine',\n main = 'main',\n primary = 'primary',\n secondary = 'secondary',\n tertiary = 'tertiary',\n textOnly = 'textOnly',\n}\n\nexport enum TickmarkStyle {\n regular = 'regular',\n enhanced = 'enhanced',\n}\n\nexport function tickmarkColor(\n style: TickmarkStyle,\n tickmarkType?: TickmarkType\n): string {\n if (style === TickmarkStyle.regular) {\n return 'var(--instrument-tick-mark-tertiary-color)';\n } else {\n if (tickmarkType === TickmarkType.tertiary) {\n return 'var(--instrument-tick-mark-secondary-color)';\n }\n return 'var(--instrument-tick-mark-primary-color)';\n }\n}\n\nexport function tickmark(\n angle: number,\n {\n size,\n style,\n scale,\n text,\n inside,\n textRadius,\n rotation,\n maxDigits,\n color,\n }: {\n size: TickmarkType;\n style: TickmarkStyle;\n scale: number;\n text?: string;\n inside: boolean;\n textRadius: number;\n rotation?: number;\n maxDigits: number;\n color?: string;\n }\n): SVGTemplateResult | SVGTemplateResult[] {\n // check if scale is not infinite\n if (scale === Infinity || scale < 0) {\n throw new Error('Tick scale is not valid');\n }\n let innerRadius: number;\n let outerRadius: number;\n textRadius = textRadius + (3 / scale + 3) * (inside ? -1 : 1);\n const rad = (angle * Math.PI) / 180;\n if (size === TickmarkType.primary) {\n innerRadius = 328 / 2;\n outerRadius = 368 / 2;\n } else if (size === TickmarkType.secondary) {\n innerRadius = 328 / 2;\n outerRadius = 344 / 2;\n } else if (size === TickmarkType.main || size === TickmarkType.zeroLine) {\n innerRadius = 320 / 2;\n outerRadius = 368 / 2;\n } else if (size === TickmarkType.zeroLineThick) {\n innerRadius = 224 / 2;\n outerRadius = 368 / 2;\n } else if (size === TickmarkType.tertiary) {\n innerRadius = 328 / 2;\n outerRadius = 336 / 2;\n } else {\n return [textSvg(text ?? '', angle, inside, scale, textRadius)];\n }\n\n // When inside, anchor ticks at the outer ring edge and grow inward,\n // preserving the same gap from the ring edge as the outside case.\n // Outside: gap = innerRadius - RING2 (320/2). E.g. secondary: 164 - 160 = 4px gap.\n // Inside: mirror that gap from the outer ring (368/2).\n if (inside) {\n const outerRingRadius = 368 / 2;\n const ring2Radius = 320 / 2;\n const tickLength = outerRadius - innerRadius;\n const gapFromRingEdge = Math.max(0, innerRadius - ring2Radius);\n outerRadius = outerRingRadius - gapFromRingEdge;\n innerRadius = outerRadius - tickLength;\n }\n const colorName = color ?? tickmarkColor(style, size);\n\n const x1 = Math.sin(rad) * innerRadius;\n const y1 = -Math.cos(rad) * innerRadius;\n const x2 = Math.sin(rad) * outerRadius;\n const y2 = -Math.cos(rad) * outerRadius;\n const strokeWidth =\n size === TickmarkType.zeroLine || size === TickmarkType.zeroLineThick\n ? 4\n : 1;\n const tick = svg`<line x1=${x1} y1=${y1} x2=${x2} y2=${y2} stroke=${colorName} stroke-width=${strokeWidth} vector-effect=\"non-scaling-stroke\"/>`;\n if (text) {\n if (rotation === undefined) {\n return [tick, textSvg(text, angle, inside, scale, textRadius)];\n } else {\n const newRadius =\n textRadius + ((4 / scale + 5) * (inside ? -1 : 1) * maxDigits) / 2;\n const textX = Math.sin(rad) * newRadius;\n const textY = -Math.cos(rad) * newRadius;\n return [\n tick,\n svg`<text x=${textX} y=${textY} class=\"label rotate ${inside ? 'inside' : ''}\" transform=\"rotate(${-rotation})\" transform-origin=\"${textX} ${textY}\">${text}</text>`,\n ];\n }\n }\n return tick;\n}\n\nfunction textSvg(\n text: string,\n angle: number,\n inside: boolean,\n scale: number,\n textRadius: number\n) {\n let positionClass;\n if (angle === 0) {\n positionClass = 'top';\n } else if (angle < 180 && angle > 0) {\n positionClass = 'right';\n } else if (angle === 180) {\n positionClass = 'bottom';\n } else {\n positionClass = 'left';\n }\n const rad = (angle * Math.PI) / 180;\n const insideGain = inside ? -1 : 1;\n const yOffset = (7 / scale) * insideGain;\n const xOffset = (6 / scale) * insideGain;\n\n let textX = Math.sin(rad) * (textRadius + xOffset);\n if (angle > 180) {\n textX += (4 / scale) * insideGain;\n } else if (angle < 180 && angle > 0) {\n textX -= (4 / scale) * insideGain;\n }\n const textY = -Math.cos(rad) * (textRadius + yOffset);\n return svg`<text x=${textX} y=${textY} class=\"label ${positionClass} ${inside ? 'inside' : ''}\">${text}</text>`;\n}\n"],"names":["TickmarkType","TickmarkStyle"],"mappings":";AASO,IAAK,iCAAAA,kBAAL;AACLA,gBAAA,eAAA,IAAgB;AAChBA,gBAAA,UAAA,IAAW;AACXA,gBAAA,MAAA,IAAO;AACPA,gBAAA,SAAA,IAAU;AACVA,gBAAA,WAAA,IAAY;AACZA,gBAAA,UAAA,IAAW;AACXA,gBAAA,UAAA,IAAW;AAPD,SAAAA;AAAA,GAAA,gBAAA,CAAA,CAAA;AAUL,IAAK,kCAAAC,mBAAL;AACLA,iBAAA,SAAA,IAAU;AACVA,iBAAA,UAAA,IAAW;AAFD,SAAAA;AAAA,GAAA,iBAAA,CAAA,CAAA;AAKL,SAAS,cACd,OACA,cACQ;AACR,MAAI,UAAU,WAAuB;AACnC,WAAO;AAAA,EACT,OAAO;AACL,QAAI,iBAAiB,YAAuB;AAC1C,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AACF;AAEO,SAAS,SACd,OACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;
|
|
1
|
+
{"version":3,"file":"tickmark.js","sources":["../../../src/navigation-instruments/watch/tickmark.ts"],"sourcesContent":["import {SVGTemplateResult, svg} from 'lit';\n\nexport interface Tickmark {\n angle: number;\n type: TickmarkType;\n text?: string;\n color?: string;\n}\n\nexport enum TickmarkType {\n zeroLineThick = 'zeroLineThick',\n zeroLine = 'zeroLine',\n main = 'main',\n primary = 'primary',\n secondary = 'secondary',\n tertiary = 'tertiary',\n textOnly = 'textOnly',\n}\n\nexport enum TickmarkStyle {\n regular = 'regular',\n enhanced = 'enhanced',\n}\n\nexport function tickmarkColor(\n style: TickmarkStyle,\n tickmarkType?: TickmarkType\n): string {\n if (style === TickmarkStyle.regular) {\n return 'var(--instrument-tick-mark-tertiary-color)';\n } else {\n if (tickmarkType === TickmarkType.tertiary) {\n return 'var(--instrument-tick-mark-secondary-color)';\n }\n return 'var(--instrument-tick-mark-primary-color)';\n }\n}\n\nexport function tickmark(\n angle: number,\n {\n size,\n style,\n scale,\n text,\n inside,\n textRadius,\n rotation,\n maxDigits,\n color,\n radiusOffset = 0,\n }: {\n size: TickmarkType;\n style: TickmarkStyle;\n scale: number;\n text?: string;\n inside: boolean;\n textRadius: number;\n rotation?: number;\n maxDigits: number;\n color?: string;\n radiusOffset?: number;\n }\n): SVGTemplateResult | SVGTemplateResult[] {\n // check if scale is not infinite\n if (scale === Infinity || scale < 0) {\n throw new Error('Tick scale is not valid');\n }\n const rOff = radiusOffset;\n let innerRadius: number;\n let outerRadius: number;\n textRadius = textRadius + (3 / scale + 3) * (inside ? -1 : 1);\n const rad = (angle * Math.PI) / 180;\n if (size === TickmarkType.primary) {\n innerRadius = 328 / 2 + rOff;\n outerRadius = 368 / 2 + rOff;\n } else if (size === TickmarkType.secondary) {\n innerRadius = 328 / 2 + rOff;\n outerRadius = 344 / 2 + rOff;\n } else if (size === TickmarkType.main || size === TickmarkType.zeroLine) {\n innerRadius = 320 / 2 + rOff;\n outerRadius = 368 / 2 + rOff;\n } else if (size === TickmarkType.zeroLineThick) {\n innerRadius = 224 / 2 + rOff;\n outerRadius = 368 / 2 + rOff;\n } else if (size === TickmarkType.tertiary) {\n innerRadius = 328 / 2 + rOff;\n outerRadius = 336 / 2 + rOff;\n } else {\n return [textSvg(text ?? '', angle, inside, scale, textRadius)];\n }\n\n // When inside, anchor ticks at the outer ring edge and grow inward,\n // preserving the same gap from the ring edge as the outside case.\n // Outside: gap = innerRadius - RING2 (320/2). E.g. secondary: 164 - 160 = 4px gap.\n // Inside: mirror that gap from the outer ring (368/2).\n if (inside) {\n const outerRingRadius = 368 / 2 + rOff;\n const ring2Radius = 320 / 2 + rOff;\n const tickLength = outerRadius - innerRadius;\n const gapFromRingEdge = Math.max(0, innerRadius - ring2Radius);\n outerRadius = outerRingRadius - gapFromRingEdge;\n innerRadius = outerRadius - tickLength;\n }\n const colorName = color ?? tickmarkColor(style, size);\n\n const x1 = Math.sin(rad) * innerRadius;\n const y1 = -Math.cos(rad) * innerRadius;\n const x2 = Math.sin(rad) * outerRadius;\n const y2 = -Math.cos(rad) * outerRadius;\n const strokeWidth =\n size === TickmarkType.zeroLine || size === TickmarkType.zeroLineThick\n ? 4\n : 1;\n const tick = svg`<line x1=${x1} y1=${y1} x2=${x2} y2=${y2} stroke=${colorName} stroke-width=${strokeWidth} vector-effect=\"non-scaling-stroke\"/>`;\n if (text) {\n if (rotation === undefined) {\n return [tick, textSvg(text, angle, inside, scale, textRadius)];\n } else {\n const newRadius =\n textRadius + ((4 / scale + 5) * (inside ? -1 : 1) * maxDigits) / 2;\n const textX = Math.sin(rad) * newRadius;\n const textY = -Math.cos(rad) * newRadius;\n return [\n tick,\n svg`<text x=${textX} y=${textY} class=\"label rotate ${inside ? 'inside' : ''}\" transform=\"rotate(${-rotation})\" transform-origin=\"${textX} ${textY}\">${text}</text>`,\n ];\n }\n }\n return tick;\n}\n\nfunction textSvg(\n text: string,\n angle: number,\n inside: boolean,\n scale: number,\n textRadius: number\n) {\n let positionClass;\n if (angle === 0) {\n positionClass = 'top';\n } else if (angle < 180 && angle > 0) {\n positionClass = 'right';\n } else if (angle === 180) {\n positionClass = 'bottom';\n } else {\n positionClass = 'left';\n }\n const rad = (angle * Math.PI) / 180;\n const insideGain = inside ? -1 : 1;\n const yOffset = (7 / scale) * insideGain;\n const xOffset = (6 / scale) * insideGain;\n\n let textX = Math.sin(rad) * (textRadius + xOffset);\n if (angle > 180) {\n textX += (4 / scale) * insideGain;\n } else if (angle < 180 && angle > 0) {\n textX -= (4 / scale) * insideGain;\n }\n const textY = -Math.cos(rad) * (textRadius + yOffset);\n return svg`<text x=${textX} y=${textY} class=\"label ${positionClass} ${inside ? 'inside' : ''}\">${text}</text>`;\n}\n"],"names":["TickmarkType","TickmarkStyle"],"mappings":"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"}
|
|
@@ -2,8 +2,11 @@ import { LitElement, PropertyValues } from 'lit';
|
|
|
2
2
|
import { InstrumentState, Priority } from '../types.js';
|
|
3
3
|
import { AngleAdviceRaw } from './advice.js';
|
|
4
4
|
import { Tickmark, TickmarkStyle } from './tickmark.js';
|
|
5
|
+
import { RotType, RotPosition } from '../rate-of-turn/rot-renderer.js';
|
|
5
6
|
import { VesselImage, VesselImageSize } from './vessel.js';
|
|
7
|
+
import { ZoomToFitArcFrame } from '../../svghelpers/arc-frame.js';
|
|
6
8
|
export { TickmarkStyle };
|
|
9
|
+
export { RotType, RotPosition };
|
|
7
10
|
export { VesselImage, VesselImageSize };
|
|
8
11
|
export declare enum WatchCircleType {
|
|
9
12
|
single = "single",
|
|
@@ -33,6 +36,7 @@ export interface WatchVessel {
|
|
|
33
36
|
vesselImage: VesselImage;
|
|
34
37
|
}
|
|
35
38
|
export declare const OUTER_RING_RADIUS: number;
|
|
39
|
+
export declare function innerRingRadiusFor(type: WatchCircleType): number;
|
|
36
40
|
/**
|
|
37
41
|
* `<obc-watch>` - Core SVG renderer for circular/radial watch-based instruments.
|
|
38
42
|
*
|
|
@@ -88,6 +92,13 @@ export declare const OUTER_RING_RADIUS: number;
|
|
|
88
92
|
* @property {boolean} atAngleSetpoint - Whether value matches setpoint (within deadband)
|
|
89
93
|
* @property {number} angleSetpointAtZeroDeadband - Deadband for zero detection (default 0.5°)
|
|
90
94
|
* @property {boolean} setpointOverride - Override to derive setpoint color from priority regardless of state
|
|
95
|
+
* @property {RotType|undefined} rotType - ROT visualization type: `'dots'` (spinning dots) or `'bar'` (arc bar with clipped dots). Undefined hides the ROT layer.
|
|
96
|
+
* @property {RotPosition} rotPosition - Track on which ROT elements are placed: `'scale'` (on the outer ring) or `'innerCircle'` (default, inside the inner ring)
|
|
97
|
+
* @property {number} rotStartAngle - Start angle of the ROT bar arc in degrees (0° = 12 o'clock, clockwise). Only used when `rotType` is `'bar'`.
|
|
98
|
+
* @property {number} rotEndAngle - End angle of the ROT bar arc in degrees. The bar is hidden when the difference from `rotStartAngle` is less than 0.1°.
|
|
99
|
+
* @property {Priority|undefined} rotPriority - Override priority for ROT color derivation. When set, ROT colors use this instead of the main `priority`. Useful when the ROT element has independent priority (e.g. compass per-element priority).
|
|
100
|
+
* @property {number} rotationsPerMinute - Spin speed of the ROT dot ring in rotations per minute. Sign controls direction (positive = clockwise).
|
|
101
|
+
* @property {ZoomToFitArcFrame|undefined} arcFrame - Pre-computed zoom-to-fit arc frame. When set, the watch skips its own `computeZoomToFitArcFrame()` call and uses these values directly. Consumer instruments (e.g. rudder, instrument-radial) should compute the frame once and pass it here to avoid redundant computation.
|
|
91
102
|
*/
|
|
92
103
|
export declare class ObcWatch extends LitElement {
|
|
93
104
|
private _setpointId;
|
|
@@ -96,6 +107,7 @@ export declare class ObcWatch extends LitElement {
|
|
|
96
107
|
priority: Priority;
|
|
97
108
|
watchCircleType: WatchCircleType;
|
|
98
109
|
northArrow: boolean;
|
|
110
|
+
northArrowInside: boolean | undefined;
|
|
99
111
|
angleSetpoint: number | undefined;
|
|
100
112
|
newAngleSetpoint: number | undefined;
|
|
101
113
|
atAngleSetpoint: boolean;
|
|
@@ -137,17 +149,34 @@ export declare class ObcWatch extends LitElement {
|
|
|
137
149
|
clipBottom: number;
|
|
138
150
|
scaleWindIcon: number;
|
|
139
151
|
rotation: number | undefined;
|
|
152
|
+
zoomToFitArc: boolean;
|
|
153
|
+
arcFrame: ZoomToFitArcFrame | undefined;
|
|
154
|
+
tickFadeAngle: number;
|
|
155
|
+
rotType: RotType | undefined;
|
|
156
|
+
rotPosition: RotPosition;
|
|
157
|
+
rotStartAngle: number;
|
|
158
|
+
rotEndAngle: number;
|
|
159
|
+
rotPriority: Priority | undefined;
|
|
160
|
+
set rotationsPerMinute(value: number);
|
|
161
|
+
get rotationsPerMinute(): number;
|
|
162
|
+
private _rotationsPerMinute;
|
|
163
|
+
private _rotController?;
|
|
140
164
|
private _resizeController;
|
|
141
165
|
willUpdate(changed: PropertyValues): void;
|
|
142
166
|
disconnectedCallback(): void;
|
|
167
|
+
updated(changed: PropertyValues): void;
|
|
143
168
|
private get innerRingRadius();
|
|
169
|
+
private _rOff;
|
|
144
170
|
private watchCircle;
|
|
171
|
+
private _renderTickFadeDefs;
|
|
145
172
|
private renderCrosshair;
|
|
146
173
|
private renderBars;
|
|
147
174
|
private renderNeedles;
|
|
148
175
|
private getScale;
|
|
149
176
|
private getPadding;
|
|
150
177
|
render(): import('lit-html').TemplateResult<1>;
|
|
178
|
+
private getRotColors;
|
|
179
|
+
private renderRot;
|
|
151
180
|
private renderSetpoint;
|
|
152
181
|
private renderVesselImage;
|
|
153
182
|
private renderStarboardPortIndicator;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../../src/navigation-instruments/watch/watch.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,cAAc,EAMf,MAAM,KAAK,CAAC;AAeb,OAAO,EAAC,eAAe,EAAE,QAAQ,EAAC,MAAM,aAAa,CAAC;AAGtD,OAAO,EAAa,cAAc,EAAe,MAAM,aAAa,CAAC;AACrE,OAAO,EAAC,QAAQ,EAAE,aAAa,EAAW,MAAM,eAAe,CAAC;AAChE,OAAO,EAAC,aAAa,EAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../../src/navigation-instruments/watch/watch.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,18 +1,21 @@
|
|
|
1
1
|
import { unsafeCSS, LitElement, svg, nothing, html } from "lit";
|
|
2
2
|
import { property, state } from "lit/decorators.js";
|
|
3
3
|
import { circle } from "../../svghelpers/circle.js";
|
|
4
|
-
import { getSetpointAnimationDurationMs, deriveRadialSetpointConfig, drawSetpointMarker, cssSafeAngle, SETPOINT_ANIMATION_CSS_VAR, SETPOINT_ANIMATION_DURATION_DEFAULT, getSetpointOutwardOffset, SetpointVisualState
|
|
4
|
+
import { getSetpointAnimationDurationMs, deriveRadialSetpointConfig, RADIAL_SETPOINT_RADIUS, drawSetpointMarker, cssSafeAngle, SETPOINT_ANIMATION_CSS_VAR, SETPOINT_ANIMATION_DURATION_DEFAULT, getSetpointOutwardOffset, SetpointVisualState } from "../../svghelpers/setpoint.js";
|
|
5
5
|
import { roundedArch } from "../../svghelpers/roundedArch.js";
|
|
6
6
|
import { InstrumentState, Priority } from "../types.js";
|
|
7
7
|
import compentStyle from "./watch.css.js";
|
|
8
8
|
import { ResizeController } from "@lit-labs/observers/resize-controller.js";
|
|
9
9
|
import { renderAdvice, adviceMask } from "./advice.js";
|
|
10
10
|
import { TickmarkStyle, tickmark } from "./tickmark.js";
|
|
11
|
+
import { RotPosition, RotType, shortestAngularDeltaDeg, renderRotBarStatic, renderRotBarDots, renderRotDots } from "../rate-of-turn/rot-renderer.js";
|
|
12
|
+
import { disposeRotController, RateOfTurnController } from "../rate-of-turn/rate-of-turn.controller.js";
|
|
11
13
|
import { getLabelPositions, renderLabels, renderNorthArrow } from "./label.js";
|
|
12
14
|
import { VesselImageSize, vesselImages } from "./vessel.js";
|
|
13
15
|
import { VesselImage } from "./vessel.js";
|
|
14
16
|
import { renderWind, renderCurrent } from "./environment.js";
|
|
15
17
|
import { customElement } from "../../decorator.js";
|
|
18
|
+
import { computeZoomToFitArcFrame } from "../../svghelpers/arc-frame.js";
|
|
16
19
|
var __defProp = Object.defineProperty;
|
|
17
20
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
18
21
|
var __decorateClass = (decorators, target, key, kind) => {
|
|
@@ -35,6 +38,20 @@ const RING2_RADIUS = 320 / 2;
|
|
|
35
38
|
const RING3_RADIUS = 224 / 2;
|
|
36
39
|
const RING3B_RADIUS = 272 / 2;
|
|
37
40
|
const RING4_RADIUS = 176 / 2;
|
|
41
|
+
function innerRingRadiusFor(type) {
|
|
42
|
+
switch (type) {
|
|
43
|
+
case "single":
|
|
44
|
+
return RING2_RADIUS;
|
|
45
|
+
case "double":
|
|
46
|
+
return RING3_RADIUS;
|
|
47
|
+
case "doubleThin":
|
|
48
|
+
return RING3B_RADIUS;
|
|
49
|
+
case "triple":
|
|
50
|
+
return RING4_RADIUS;
|
|
51
|
+
default:
|
|
52
|
+
throw new Error(`Unknown WatchCircleType: ${type}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
38
55
|
const RADIAL_SETPOINT_INWARD_ADJUST = 4;
|
|
39
56
|
let ObcWatch = class extends LitElement {
|
|
40
57
|
constructor() {
|
|
@@ -72,7 +89,23 @@ let ObcWatch = class extends LitElement {
|
|
|
72
89
|
this.clipTop = 0;
|
|
73
90
|
this.clipBottom = 0;
|
|
74
91
|
this.scaleWindIcon = 1;
|
|
92
|
+
this.zoomToFitArc = false;
|
|
93
|
+
this.tickFadeAngle = 0;
|
|
94
|
+
this.rotPosition = RotPosition.innerCircle;
|
|
95
|
+
this.rotStartAngle = 0;
|
|
96
|
+
this.rotEndAngle = 0;
|
|
97
|
+
this._rotationsPerMinute = 0;
|
|
75
98
|
this._resizeController = new ResizeController(this, {});
|
|
99
|
+
this._rOff = 0;
|
|
100
|
+
}
|
|
101
|
+
set rotationsPerMinute(value) {
|
|
102
|
+
this._rotationsPerMinute = value;
|
|
103
|
+
if (this._rotController) {
|
|
104
|
+
this._rotController.rotationsPerMinute = value;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
get rotationsPerMinute() {
|
|
108
|
+
return this._rotationsPerMinute;
|
|
76
109
|
}
|
|
77
110
|
willUpdate(changed) {
|
|
78
111
|
super.willUpdate(changed);
|
|
@@ -91,18 +124,26 @@ let ObcWatch = class extends LitElement {
|
|
|
91
124
|
disconnectedCallback() {
|
|
92
125
|
super.disconnectedCallback();
|
|
93
126
|
clearTimeout(this._animationTimer);
|
|
127
|
+
this._rotController = disposeRotController(this, this._rotController);
|
|
94
128
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
129
|
+
updated(changed) {
|
|
130
|
+
super.updated(changed);
|
|
131
|
+
const el = this.rotType ? this.renderRoot.querySelector("#rot-spinner") : null;
|
|
132
|
+
if (!el) {
|
|
133
|
+
this._rotController = disposeRotController(this, this._rotController);
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
if (!this._rotController || this._rotController.el !== el) {
|
|
137
|
+
this._rotController = disposeRotController(this, this._rotController);
|
|
138
|
+
this._rotController = new RateOfTurnController(
|
|
139
|
+
this,
|
|
140
|
+
el,
|
|
141
|
+
this._rotationsPerMinute
|
|
142
|
+
);
|
|
104
143
|
}
|
|
105
|
-
|
|
144
|
+
}
|
|
145
|
+
get innerRingRadius() {
|
|
146
|
+
return innerRingRadiusFor(this.watchCircleType);
|
|
106
147
|
}
|
|
107
148
|
watchCircle() {
|
|
108
149
|
const rings = [];
|
|
@@ -111,14 +152,14 @@ let ObcWatch = class extends LitElement {
|
|
|
111
152
|
<circle
|
|
112
153
|
cx="0"
|
|
113
154
|
cy="0"
|
|
114
|
-
r="172"
|
|
155
|
+
r="${172 + this._rOff}"
|
|
115
156
|
stroke="var(--instrument-frame-primary-color)"
|
|
116
157
|
fill="none"
|
|
117
158
|
stroke-width="24"
|
|
118
159
|
/>`);
|
|
119
160
|
if (this.watchCircleType !== "single") {
|
|
120
|
-
const r1 = RING2_RADIUS;
|
|
121
|
-
const r2 = this.watchCircleType === "doubleThin" ? RING3B_RADIUS : RING3_RADIUS;
|
|
161
|
+
const r1 = RING2_RADIUS + this._rOff;
|
|
162
|
+
const r2 = (this.watchCircleType === "doubleThin" ? RING3B_RADIUS : RING3_RADIUS) + this._rOff;
|
|
122
163
|
const r = (r1 + r2) / 2;
|
|
123
164
|
const strokeWidth = r1 - r2;
|
|
124
165
|
rings.push(
|
|
@@ -130,8 +171,8 @@ let ObcWatch = class extends LitElement {
|
|
|
130
171
|
);
|
|
131
172
|
}
|
|
132
173
|
if (this.watchCircleType === "triple") {
|
|
133
|
-
const r1 = RING3_RADIUS;
|
|
134
|
-
const r2 = RING4_RADIUS;
|
|
174
|
+
const r1 = RING3_RADIUS + this._rOff;
|
|
175
|
+
const r2 = RING4_RADIUS + this._rOff;
|
|
135
176
|
const r = (r1 + r2) / 2;
|
|
136
177
|
const strokeWidth = r1 - r2;
|
|
137
178
|
rings.push(
|
|
@@ -139,24 +180,35 @@ let ObcWatch = class extends LitElement {
|
|
|
139
180
|
);
|
|
140
181
|
}
|
|
141
182
|
}
|
|
183
|
+
const maskSize = Math.max(200, OUTER_RING_RADIUS + this._rOff + 50);
|
|
142
184
|
let result = rings;
|
|
143
185
|
if (this.areas.length > 0) {
|
|
144
186
|
const areas = this.areas.map((area) => {
|
|
145
187
|
const svgPath = roundedArch({
|
|
146
188
|
startAngle: area.startAngle,
|
|
147
189
|
endAngle: area.endAngle,
|
|
148
|
-
R: OUTER_RING_RADIUS,
|
|
149
|
-
r: this.innerRingRadius,
|
|
190
|
+
R: OUTER_RING_RADIUS + this._rOff,
|
|
191
|
+
r: this.innerRingRadius + this._rOff,
|
|
150
192
|
roundOutsideCut: area.roundOutsideCut,
|
|
151
193
|
roundInsideCut: area.roundInsideCut
|
|
152
194
|
});
|
|
153
195
|
return svgPath;
|
|
154
196
|
});
|
|
155
197
|
const mask = svg`<mask id="cutMask">
|
|
156
|
-
<rect x="-
|
|
198
|
+
<rect x="${-maskSize}" y="${-maskSize}" width="${maskSize * 2}" height="${maskSize * 2}" fill="black" />
|
|
157
199
|
${areas.map((area) => svg`<path d=${area} fill="white" vector-effect="non-scaling-stroke" stroke="white" stroke-width="1"/>`)}
|
|
158
200
|
</mask>`;
|
|
159
|
-
|
|
201
|
+
const rotClip = svg`<clipPath id="rot-arc-clip">${this.areas.map(
|
|
202
|
+
(area) => svg`<path d=${roundedArch({
|
|
203
|
+
startAngle: area.startAngle,
|
|
204
|
+
endAngle: area.endAngle,
|
|
205
|
+
R: OUTER_RING_RADIUS + this._rOff + 20,
|
|
206
|
+
r: 0,
|
|
207
|
+
roundOutsideCut: area.roundOutsideCut,
|
|
208
|
+
roundInsideCut: area.roundInsideCut
|
|
209
|
+
})} />`
|
|
210
|
+
)}</clipPath>`;
|
|
211
|
+
result = [mask, rotClip, svg`<g mask="url(#cutMask)">${rings}</g>`];
|
|
160
212
|
areas.forEach((area) => {
|
|
161
213
|
result.push(
|
|
162
214
|
svg`<path d=${area} fill="none" stroke="var(--instrument-frame-tertiary-color)" vector-effect="non-scaling-stroke"/>`
|
|
@@ -166,7 +218,7 @@ let ObcWatch = class extends LitElement {
|
|
|
166
218
|
if (this.state !== InstrumentState.off) {
|
|
167
219
|
result.push(
|
|
168
220
|
circle("outerRing", {
|
|
169
|
-
radius:
|
|
221
|
+
radius: OUTER_RING_RADIUS + this._rOff,
|
|
170
222
|
strokeWidth: 1,
|
|
171
223
|
strokeColor: "var(--instrument-frame-tertiary-color)",
|
|
172
224
|
strokePosition: "center",
|
|
@@ -175,7 +227,7 @@ let ObcWatch = class extends LitElement {
|
|
|
175
227
|
);
|
|
176
228
|
result.push(svg`
|
|
177
229
|
${circle("innerRing", {
|
|
178
|
-
radius: this.innerRingRadius,
|
|
230
|
+
radius: this.innerRingRadius + this._rOff,
|
|
179
231
|
strokeWidth: 1,
|
|
180
232
|
strokeColor: "var(--instrument-frame-tertiary-color)",
|
|
181
233
|
strokePosition: "center",
|
|
@@ -185,7 +237,7 @@ let ObcWatch = class extends LitElement {
|
|
|
185
237
|
} else {
|
|
186
238
|
result.push(svg`
|
|
187
239
|
${circle("innerRing", {
|
|
188
|
-
radius: OUTER_RING_RADIUS,
|
|
240
|
+
radius: OUTER_RING_RADIUS + this._rOff,
|
|
189
241
|
strokeWidth: 1,
|
|
190
242
|
strokeColor: "var(--instrument-frame-tertiary-color)",
|
|
191
243
|
strokePosition: "center",
|
|
@@ -196,6 +248,49 @@ let ObcWatch = class extends LitElement {
|
|
|
196
248
|
}
|
|
197
249
|
return result;
|
|
198
250
|
}
|
|
251
|
+
_renderTickFadeDefs() {
|
|
252
|
+
if (this.tickFadeAngle <= 0 || this.areas.length === 0) return nothing;
|
|
253
|
+
const area = this.areas[0];
|
|
254
|
+
const arcSpan = area.endAngle - area.startAngle;
|
|
255
|
+
const fade = Math.min(this.tickFadeAngle, arcSpan / 4);
|
|
256
|
+
if (fade < 0.5) return nothing;
|
|
257
|
+
const { startAngle, endAngle } = area;
|
|
258
|
+
const R = OUTER_RING_RADIUS + this._rOff + 200;
|
|
259
|
+
const toRad = (deg) => deg * Math.PI / 180;
|
|
260
|
+
const px = (deg) => R * Math.sin(toRad(deg));
|
|
261
|
+
const py = (deg) => -R * Math.cos(toRad(deg));
|
|
262
|
+
const pieSlice = (a, b) => {
|
|
263
|
+
const x1 = px(a), y1 = py(a);
|
|
264
|
+
const x2 = px(b), y2 = py(b);
|
|
265
|
+
const largeArc = b - a > 180 ? 1 : 0;
|
|
266
|
+
return `M 0 0 L ${x1} ${y1} A ${R} ${R} 0 ${largeArc} 1 ${x2} ${y2} Z`;
|
|
267
|
+
};
|
|
268
|
+
const Rm = (OUTER_RING_RADIUS + this.innerRingRadius) / 2 + this._rOff;
|
|
269
|
+
const gx = (deg) => Rm * Math.sin(toRad(deg));
|
|
270
|
+
const gy = (deg) => -Rm * Math.cos(toRad(deg));
|
|
271
|
+
return svg`
|
|
272
|
+
<defs>
|
|
273
|
+
<linearGradient id="tickFadeL" gradientUnits="userSpaceOnUse"
|
|
274
|
+
x1="${gx(startAngle)}" y1="${gy(startAngle)}"
|
|
275
|
+
x2="${gx(startAngle + fade)}" y2="${gy(startAngle + fade)}">
|
|
276
|
+
<stop offset="0" stop-color="black" />
|
|
277
|
+
<stop offset="1" stop-color="white" />
|
|
278
|
+
</linearGradient>
|
|
279
|
+
<linearGradient id="tickFadeR" gradientUnits="userSpaceOnUse"
|
|
280
|
+
x1="${gx(endAngle - fade)}" y1="${gy(endAngle - fade)}"
|
|
281
|
+
x2="${gx(endAngle)}" y2="${gy(endAngle)}">
|
|
282
|
+
<stop offset="0" stop-color="white" />
|
|
283
|
+
<stop offset="1" stop-color="black" />
|
|
284
|
+
</linearGradient>
|
|
285
|
+
<mask id="tickFadeMask" maskUnits="userSpaceOnUse"
|
|
286
|
+
x="${-R}" y="${-R}" width="${R * 2}" height="${R * 2}">
|
|
287
|
+
<path d="${pieSlice(startAngle + fade, endAngle - fade)}" fill="white" />
|
|
288
|
+
<path d="${pieSlice(startAngle, startAngle + fade)}" fill="url(#tickFadeL)" />
|
|
289
|
+
<path d="${pieSlice(endAngle - fade, endAngle)}" fill="url(#tickFadeR)" />
|
|
290
|
+
</mask>
|
|
291
|
+
</defs>
|
|
292
|
+
`;
|
|
293
|
+
}
|
|
199
294
|
renderCrosshair(radius, labelKnockouts) {
|
|
200
295
|
const hasMask = labelKnockouts && labelKnockouts.positions.length > 0;
|
|
201
296
|
const labelRadius = hasMask ? Math.max(
|
|
@@ -264,18 +359,19 @@ let ObcWatch = class extends LitElement {
|
|
|
264
359
|
const startAngle = Math.min(bar.startAngle, bar.endAngle);
|
|
265
360
|
const endAngle = Math.max(bar.startAngle, bar.endAngle);
|
|
266
361
|
const arc = roundedArch({
|
|
267
|
-
r: RING3_RADIUS,
|
|
268
|
-
R: RING2_RADIUS,
|
|
362
|
+
r: RING3_RADIUS + this._rOff,
|
|
363
|
+
R: RING2_RADIUS + this._rOff,
|
|
269
364
|
startAngle,
|
|
270
365
|
endAngle,
|
|
271
366
|
roundInsideCut: false,
|
|
272
367
|
roundOutsideCut: false
|
|
273
368
|
});
|
|
369
|
+
const barMaskR = RING2_RADIUS + this._rOff + 40;
|
|
274
370
|
const mask = svg`<mask id="barMask-${index}">
|
|
275
|
-
<rect x="-
|
|
371
|
+
<rect x="${-barMaskR}" y="${-barMaskR}" width="${barMaskR * 2}" height="${barMaskR * 2}" fill="black" />
|
|
276
372
|
<path d=${roundedArch({
|
|
277
373
|
r: 1,
|
|
278
|
-
R:
|
|
374
|
+
R: barMaskR,
|
|
279
375
|
startAngle,
|
|
280
376
|
endAngle,
|
|
281
377
|
roundInsideCut: false,
|
|
@@ -305,7 +401,7 @@ let ObcWatch = class extends LitElement {
|
|
|
305
401
|
return svg`
|
|
306
402
|
<rect
|
|
307
403
|
transform="rotate(${needle.angle})"
|
|
308
|
-
x="-4" y="-
|
|
404
|
+
x="-4" y="${-(RING2_RADIUS + this._rOff)}" width="8" height="48" rx="4"
|
|
309
405
|
fill=${needle.fillColor}
|
|
310
406
|
stroke=${needle.strokeColor}
|
|
311
407
|
stroke-width="1"
|
|
@@ -342,13 +438,39 @@ let ObcWatch = class extends LitElement {
|
|
|
342
438
|
return 24;
|
|
343
439
|
}
|
|
344
440
|
render() {
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
441
|
+
let width;
|
|
442
|
+
let height;
|
|
443
|
+
let viewBox;
|
|
444
|
+
if (this.arcFrame) {
|
|
445
|
+
this._rOff = this.arcFrame.radiusOffset;
|
|
446
|
+
width = this.arcFrame.width;
|
|
447
|
+
height = this.arcFrame.height;
|
|
448
|
+
viewBox = this.arcFrame.viewBox;
|
|
449
|
+
} else if (this.zoomToFitArc && this.areas.length > 0) {
|
|
450
|
+
const ext = this.getPadding();
|
|
451
|
+
const targetSize = (176 + ext) * 2;
|
|
452
|
+
const frame = computeZoomToFitArcFrame({
|
|
453
|
+
areas: this.areas,
|
|
454
|
+
outerRadius: OUTER_RING_RADIUS,
|
|
455
|
+
innerRadius: this.innerRingRadius,
|
|
456
|
+
extension: ext,
|
|
457
|
+
targetSize
|
|
458
|
+
});
|
|
459
|
+
this._rOff = frame.radiusOffset;
|
|
460
|
+
width = frame.width;
|
|
461
|
+
height = frame.height;
|
|
462
|
+
viewBox = frame.viewBox;
|
|
463
|
+
} else {
|
|
464
|
+
this._rOff = 0;
|
|
465
|
+
width = (176 + this.getPadding()) * 2;
|
|
466
|
+
height = width * (1 - this.clipTop / 100 - this.clipBottom / 100);
|
|
467
|
+
const top = -width / 2 + width * this.clipTop / 100;
|
|
468
|
+
viewBox = `-${width / 2} ${top} ${width} ${height}`;
|
|
469
|
+
}
|
|
470
|
+
const rOff = this._rOff;
|
|
348
471
|
const scale = this.getScale({ width, height });
|
|
349
|
-
const viewBox = `-${width / 2} ${top} ${width} ${height}`;
|
|
350
472
|
const angleSetpoint = this.renderSetpoint();
|
|
351
|
-
const textRadius = this.tickmarksInside ? this.innerRingRadius : OUTER_RING_RADIUS;
|
|
473
|
+
const textRadius = (this.tickmarksInside ? this.innerRingRadius : OUTER_RING_RADIUS) + rOff;
|
|
352
474
|
const maxDigits = Math.max(
|
|
353
475
|
...this.tickmarks.map((t) => t.text?.length ?? 0)
|
|
354
476
|
);
|
|
@@ -362,29 +484,30 @@ let ObcWatch = class extends LitElement {
|
|
|
362
484
|
textRadius,
|
|
363
485
|
rotation: this.rotation,
|
|
364
486
|
maxDigits,
|
|
365
|
-
color: t.color
|
|
487
|
+
color: t.color,
|
|
488
|
+
radiusOffset: rOff
|
|
366
489
|
})
|
|
367
490
|
);
|
|
368
|
-
const advices = this.advices ? this.advices.map((a) => renderAdvice(a)) : nothing;
|
|
491
|
+
const advices = this.advices ? this.advices.map((a) => renderAdvice(a, rOff)) : nothing;
|
|
369
492
|
const insideLabels = this.tickmarksInside && this.showLabels;
|
|
370
493
|
const includeNorth = !this.northArrow;
|
|
371
494
|
const labelPositions = this.showLabels ? getLabelPositions({
|
|
372
495
|
scale,
|
|
373
496
|
inside: this.tickmarksInside,
|
|
374
|
-
innerRadius: this.innerRingRadius,
|
|
497
|
+
innerRadius: this.innerRingRadius + rOff,
|
|
375
498
|
includeNorth
|
|
376
499
|
}) : void 0;
|
|
377
500
|
const labels = labelPositions ? renderLabels({
|
|
378
501
|
scale,
|
|
379
502
|
rotation: this.rotation,
|
|
380
503
|
inside: this.tickmarksInside,
|
|
381
|
-
innerRadius: this.innerRingRadius,
|
|
504
|
+
innerRadius: this.innerRingRadius + rOff,
|
|
382
505
|
includeNorth
|
|
383
506
|
}) : nothing;
|
|
384
507
|
const northArrowEl = this.northArrow ? renderNorthArrow({
|
|
385
508
|
scale,
|
|
386
509
|
rotation: this.rotation,
|
|
387
|
-
inside: this.tickmarksInside
|
|
510
|
+
inside: this.northArrowInside ?? this.tickmarksInside
|
|
388
511
|
}) : nothing;
|
|
389
512
|
const wind = this.wind != null && this.windFromDirectionDeg != null ? svg`<g transform="scale(${this.scaleWindIcon})">${renderWind({
|
|
390
513
|
wind: this.wind,
|
|
@@ -408,20 +531,76 @@ let ObcWatch = class extends LitElement {
|
|
|
408
531
|
>
|
|
409
532
|
${this.watchCircle()} ${this.renderBars()}
|
|
410
533
|
${this.crosshairEnabled ? this.renderCrosshair(
|
|
411
|
-
|
|
534
|
+
OUTER_RING_RADIUS + rOff,
|
|
412
535
|
insideLabels && labelPositions ? {
|
|
413
536
|
positions: labelPositions,
|
|
414
537
|
rotation: this.rotation,
|
|
415
538
|
scale,
|
|
416
|
-
innerRingRadius: this.innerRingRadius
|
|
539
|
+
innerRingRadius: this.innerRingRadius + rOff
|
|
417
540
|
} : void 0
|
|
418
541
|
) : nothing}
|
|
419
542
|
${northArrowEl} ${this.renderStarboardPortIndicator()} ${current}
|
|
420
|
-
${
|
|
543
|
+
${this._renderTickFadeDefs()} ${wind}
|
|
544
|
+
${this.tickFadeAngle > 0 && this.areas.length > 0 ? svg`<g mask="url(#tickFadeMask)">${tickmarks}</g>` : tickmarks}
|
|
545
|
+
${this.areas.length > 0 ? svg`<g clip-path="url(#rot-arc-clip)">${this.renderRot()}</g>` : this.renderRot()}
|
|
546
|
+
${advices} ${angleSetpoint}
|
|
547
|
+
${this.tickFadeAngle > 0 && this.areas.length > 0 ? svg`<g mask="url(#tickFadeMask)">${labels}</g>` : labels}
|
|
421
548
|
${this.renderVesselImage()} ${this.renderNeedles()}
|
|
422
549
|
</svg>
|
|
423
550
|
`;
|
|
424
551
|
}
|
|
552
|
+
getRotColors() {
|
|
553
|
+
const p = this.rotPriority ?? this.priority;
|
|
554
|
+
const isEnhanced = p === Priority.enhanced;
|
|
555
|
+
const isInner = this.rotPosition === RotPosition.innerCircle;
|
|
556
|
+
if (isInner) {
|
|
557
|
+
return {
|
|
558
|
+
dotColor: isEnhanced ? "var(--instrument-enhanced-tertiary-color)" : "var(--instrument-regular-tertiary-color)",
|
|
559
|
+
barBgColor: isEnhanced ? "var(--instrument-enhanced-secondary-color)" : "var(--instrument-regular-secondary-color)",
|
|
560
|
+
endDotFill: "var(--border-silhouette-color)",
|
|
561
|
+
endDotStroke: isEnhanced ? "var(--instrument-enhanced-secondary-color)" : "var(--instrument-regular-secondary-color)"
|
|
562
|
+
};
|
|
563
|
+
}
|
|
564
|
+
return {
|
|
565
|
+
dotColor: isEnhanced ? "var(--instrument-enhanced-secondary-color)" : "var(--instrument-regular-secondary-color)",
|
|
566
|
+
barBgColor: isEnhanced ? "var(--instrument-enhanced-tertiary-color)" : "var(--instrument-regular-tertiary-color)",
|
|
567
|
+
endDotFill: isEnhanced ? "var(--instrument-enhanced-secondary-color)" : "var(--border-silhouette-color)",
|
|
568
|
+
endDotStroke: isEnhanced ? "var(--instrument-frame-primary-color)" : "var(--instrument-regular-secondary-color)"
|
|
569
|
+
};
|
|
570
|
+
}
|
|
571
|
+
renderRot() {
|
|
572
|
+
if (!this.rotType) return nothing;
|
|
573
|
+
const { dotColor, barBgColor, endDotFill, endDotStroke } = this.getRotColors();
|
|
574
|
+
const rOff = this._rOff;
|
|
575
|
+
if (this.rotType === RotType.bar) {
|
|
576
|
+
const hasBar = shortestAngularDeltaDeg(this.rotStartAngle, this.rotEndAngle) >= 0.1;
|
|
577
|
+
return svg`
|
|
578
|
+
${renderRotBarStatic({
|
|
579
|
+
startAngle: this.rotStartAngle,
|
|
580
|
+
endAngle: this.rotEndAngle,
|
|
581
|
+
color: dotColor,
|
|
582
|
+
barColor: barBgColor,
|
|
583
|
+
position: this.rotPosition,
|
|
584
|
+
endDotFill,
|
|
585
|
+
endDotStroke,
|
|
586
|
+
maskId: "rot-bar-mask",
|
|
587
|
+
radiusOffset: rOff
|
|
588
|
+
})}
|
|
589
|
+
${hasBar ? svg`<g clip-path="url(#rot-bar-mask)">
|
|
590
|
+
<g id="rot-spinner">
|
|
591
|
+
${renderRotBarDots(dotColor, this.rotPosition, rOff)}
|
|
592
|
+
</g>
|
|
593
|
+
</g>` : nothing}
|
|
594
|
+
`;
|
|
595
|
+
}
|
|
596
|
+
const p = this.rotPriority ?? this.priority;
|
|
597
|
+
const dotsColor = p === Priority.enhanced ? "var(--instrument-enhanced-secondary-color)" : "var(--instrument-regular-secondary-color)";
|
|
598
|
+
return svg`
|
|
599
|
+
<g id="rot-spinner">
|
|
600
|
+
${renderRotDots(dotsColor, this.rotPosition, rOff)}
|
|
601
|
+
</g>
|
|
602
|
+
`;
|
|
603
|
+
}
|
|
425
604
|
renderSetpoint() {
|
|
426
605
|
if (this.angleSetpoint === void 0) {
|
|
427
606
|
return nothing;
|
|
@@ -438,7 +617,7 @@ let ObcWatch = class extends LitElement {
|
|
|
438
617
|
});
|
|
439
618
|
const { visualState, colorMode, disabled, hasNewSetpoint } = derived;
|
|
440
619
|
const outwardOffset = getSetpointOutwardOffset(visualState);
|
|
441
|
-
const radius = RADIAL_SETPOINT_RADIUS + outwardOffset - RADIAL_SETPOINT_INWARD_ADJUST;
|
|
620
|
+
const radius = RADIAL_SETPOINT_RADIUS + this._rOff + outwardOffset - RADIAL_SETPOINT_INWARD_ADJUST;
|
|
442
621
|
const opacity = hasNewSetpoint ? 0.75 : 1;
|
|
443
622
|
const originalMarker = drawSetpointMarker({
|
|
444
623
|
visualState,
|
|
@@ -471,7 +650,7 @@ let ObcWatch = class extends LitElement {
|
|
|
471
650
|
const focusOutwardOffset = getSetpointOutwardOffset(
|
|
472
651
|
SetpointVisualState.focus
|
|
473
652
|
);
|
|
474
|
-
const focusRadius = RADIAL_SETPOINT_RADIUS + focusOutwardOffset - RADIAL_SETPOINT_INWARD_ADJUST;
|
|
653
|
+
const focusRadius = RADIAL_SETPOINT_RADIUS + this._rOff + focusOutwardOffset - RADIAL_SETPOINT_INWARD_ADJUST;
|
|
475
654
|
const newMarker = drawSetpointMarker({
|
|
476
655
|
visualState: SetpointVisualState.focus,
|
|
477
656
|
colorMode,
|
|
@@ -550,6 +729,9 @@ __decorateClass([
|
|
|
550
729
|
__decorateClass([
|
|
551
730
|
property({ type: Boolean })
|
|
552
731
|
], ObcWatch.prototype, "northArrow", 2);
|
|
732
|
+
__decorateClass([
|
|
733
|
+
property({ type: Boolean })
|
|
734
|
+
], ObcWatch.prototype, "northArrowInside", 2);
|
|
553
735
|
__decorateClass([
|
|
554
736
|
property({ type: Number })
|
|
555
737
|
], ObcWatch.prototype, "angleSetpoint", 2);
|
|
@@ -646,15 +828,45 @@ __decorateClass([
|
|
|
646
828
|
__decorateClass([
|
|
647
829
|
property({ type: Number })
|
|
648
830
|
], ObcWatch.prototype, "rotation", 2);
|
|
831
|
+
__decorateClass([
|
|
832
|
+
property({ type: Boolean })
|
|
833
|
+
], ObcWatch.prototype, "zoomToFitArc", 2);
|
|
834
|
+
__decorateClass([
|
|
835
|
+
property({ attribute: false })
|
|
836
|
+
], ObcWatch.prototype, "arcFrame", 2);
|
|
837
|
+
__decorateClass([
|
|
838
|
+
property({ type: Number })
|
|
839
|
+
], ObcWatch.prototype, "tickFadeAngle", 2);
|
|
840
|
+
__decorateClass([
|
|
841
|
+
property({ type: String })
|
|
842
|
+
], ObcWatch.prototype, "rotType", 2);
|
|
843
|
+
__decorateClass([
|
|
844
|
+
property({ type: String })
|
|
845
|
+
], ObcWatch.prototype, "rotPosition", 2);
|
|
846
|
+
__decorateClass([
|
|
847
|
+
property({ type: Number })
|
|
848
|
+
], ObcWatch.prototype, "rotStartAngle", 2);
|
|
849
|
+
__decorateClass([
|
|
850
|
+
property({ type: Number })
|
|
851
|
+
], ObcWatch.prototype, "rotEndAngle", 2);
|
|
852
|
+
__decorateClass([
|
|
853
|
+
property({ type: String })
|
|
854
|
+
], ObcWatch.prototype, "rotPriority", 2);
|
|
855
|
+
__decorateClass([
|
|
856
|
+
property({ type: Number })
|
|
857
|
+
], ObcWatch.prototype, "rotationsPerMinute", 1);
|
|
649
858
|
ObcWatch = __decorateClass([
|
|
650
859
|
customElement("obc-watch")
|
|
651
860
|
], ObcWatch);
|
|
652
861
|
export {
|
|
653
862
|
OUTER_RING_RADIUS,
|
|
654
863
|
ObcWatch,
|
|
864
|
+
RotPosition,
|
|
865
|
+
RotType,
|
|
655
866
|
TickmarkStyle,
|
|
656
867
|
VesselImage,
|
|
657
868
|
VesselImageSize,
|
|
658
|
-
WatchCircleType
|
|
869
|
+
WatchCircleType,
|
|
870
|
+
innerRingRadiusFor
|
|
659
871
|
};
|
|
660
872
|
//# sourceMappingURL=watch.js.map
|