@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.
Files changed (67) hide show
  1. package/dist/building-blocks/instrument-radial/instrument-radial.d.ts +3 -0
  2. package/dist/building-blocks/instrument-radial/instrument-radial.d.ts.map +1 -1
  3. package/dist/building-blocks/instrument-radial/instrument-radial.js +50 -22
  4. package/dist/building-blocks/instrument-radial/instrument-radial.js.map +1 -1
  5. package/dist/navigation-instruments/compass/arrow.d.ts +1 -1
  6. package/dist/navigation-instruments/compass/arrow.d.ts.map +1 -1
  7. package/dist/navigation-instruments/compass/arrow.js +3 -3
  8. package/dist/navigation-instruments/compass/arrow.js.map +1 -1
  9. package/dist/navigation-instruments/compass/compass.d.ts +12 -6
  10. package/dist/navigation-instruments/compass/compass.d.ts.map +1 -1
  11. package/dist/navigation-instruments/compass/compass.js +29 -24
  12. package/dist/navigation-instruments/compass/compass.js.map +1 -1
  13. package/dist/navigation-instruments/compass-flat/compass-flat.d.ts +37 -1
  14. package/dist/navigation-instruments/compass-flat/compass-flat.d.ts.map +1 -1
  15. package/dist/navigation-instruments/compass-flat/compass-flat.js +34 -3
  16. package/dist/navigation-instruments/compass-flat/compass-flat.js.map +1 -1
  17. package/dist/navigation-instruments/compass-sector/compass-sector.css.js +34 -0
  18. package/dist/navigation-instruments/compass-sector/compass-sector.css.js.map +1 -0
  19. package/dist/navigation-instruments/compass-sector/compass-sector.d.ts +101 -0
  20. package/dist/navigation-instruments/compass-sector/compass-sector.d.ts.map +1 -0
  21. package/dist/navigation-instruments/compass-sector/compass-sector.js +404 -0
  22. package/dist/navigation-instruments/compass-sector/compass-sector.js.map +1 -0
  23. package/dist/navigation-instruments/rate-of-turn/rate-of-turn.controller.d.ts +15 -2
  24. package/dist/navigation-instruments/rate-of-turn/rate-of-turn.controller.d.ts.map +1 -1
  25. package/dist/navigation-instruments/rate-of-turn/rate-of-turn.controller.js +50 -18
  26. package/dist/navigation-instruments/rate-of-turn/rate-of-turn.controller.js.map +1 -1
  27. package/dist/navigation-instruments/rate-of-turn/rate-of-turn.d.ts +40 -6
  28. package/dist/navigation-instruments/rate-of-turn/rate-of-turn.d.ts.map +1 -1
  29. package/dist/navigation-instruments/rate-of-turn/rate-of-turn.js +40 -47
  30. package/dist/navigation-instruments/rate-of-turn/rate-of-turn.js.map +1 -1
  31. package/dist/navigation-instruments/rate-of-turn/rot-renderer.d.ts +63 -0
  32. package/dist/navigation-instruments/rate-of-turn/rot-renderer.d.ts.map +1 -0
  33. package/dist/navigation-instruments/rate-of-turn/rot-renderer.js +211 -0
  34. package/dist/navigation-instruments/rate-of-turn/rot-renderer.js.map +1 -0
  35. package/dist/navigation-instruments/rot-sector/rot-sector.d.ts +10 -4
  36. package/dist/navigation-instruments/rot-sector/rot-sector.d.ts.map +1 -1
  37. package/dist/navigation-instruments/rot-sector/rot-sector.js +13 -3
  38. package/dist/navigation-instruments/rot-sector/rot-sector.js.map +1 -1
  39. package/dist/navigation-instruments/rudder/rudder.d.ts +4 -0
  40. package/dist/navigation-instruments/rudder/rudder.d.ts.map +1 -1
  41. package/dist/navigation-instruments/rudder/rudder.js +55 -19
  42. package/dist/navigation-instruments/rudder/rudder.js.map +1 -1
  43. package/dist/navigation-instruments/watch/advice.d.ts +3 -3
  44. package/dist/navigation-instruments/watch/advice.d.ts.map +1 -1
  45. package/dist/navigation-instruments/watch/advice.js +68 -16
  46. package/dist/navigation-instruments/watch/advice.js.map +1 -1
  47. package/dist/navigation-instruments/watch/tickmark.d.ts +2 -1
  48. package/dist/navigation-instruments/watch/tickmark.d.ts.map +1 -1
  49. package/dist/navigation-instruments/watch/tickmark.js +15 -13
  50. package/dist/navigation-instruments/watch/tickmark.js.map +1 -1
  51. package/dist/navigation-instruments/watch/watch.d.ts +29 -0
  52. package/dist/navigation-instruments/watch/watch.d.ts.map +1 -1
  53. package/dist/navigation-instruments/watch/watch.js +256 -44
  54. package/dist/navigation-instruments/watch/watch.js.map +1 -1
  55. package/dist/navigation-instruments/watch-flat/watch-flat.d.ts +29 -1
  56. package/dist/navigation-instruments/watch-flat/watch-flat.d.ts.map +1 -1
  57. package/dist/navigation-instruments/watch-flat/watch-flat.js +162 -17
  58. package/dist/navigation-instruments/watch-flat/watch-flat.js.map +1 -1
  59. package/dist/svghelpers/arc-frame.d.ts +42 -0
  60. package/dist/svghelpers/arc-frame.d.ts.map +1 -0
  61. package/dist/svghelpers/arc-frame.js +123 -0
  62. package/dist/svghelpers/arc-frame.js.map +1 -0
  63. package/package.json +1 -1
  64. package/dist/navigation-instruments/compass/rot.d.ts +0 -4
  65. package/dist/navigation-instruments/compass/rot.d.ts.map +0 -1
  66. package/dist/navigation-instruments/compass/rot.js +0 -11
  67. 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":"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"}
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;AAOvB,OAAO,EAAC,WAAW,EAAE,eAAe,EAAe,MAAM,aAAa,CAAC;AAGvE,OAAO,EAAC,WAAW,EAAE,eAAe,EAAC,CAAC;AAEtC,oBAAY,eAAe;IACzB,MAAM,WAAW;IACjB,MAAM,WAAW;IACjB,UAAU,eAAe;IACzB,MAAM,WAAW;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,OAAO,CAAC;IACzB,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,eAAe,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,WAAW,CAAC;CAC1B;AAED,eAAO,MAAM,iBAAiB,QAAU,CAAC;AAQzC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AACH,qBACa,QAAS,SAAQ,UAAU;IACtC,OAAO,CAAC,WAAW,CAA8D;IACjF,OAAO,CAAC,cAAc,CAAkE;IAE9D,KAAK,EAAE,eAAe,CAA0B;IAChD,QAAQ,EAAE,QAAQ,CAAoB;IACtC,eAAe,EAAE,eAAe,CACjC;IACE,UAAU,EAAE,OAAO,CAAS;IAC7B,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,eAAe,EAAE,OAAO,CAAS;IAClC,2BAA2B,EAAE,MAAM,CAAO;IACzC,gBAAgB,EAAE,OAAO,CAAS;IAClC,QAAQ,EAAE,OAAO,CAAS;IAE1B,eAAe,EAAE,OAAO,CAAS;IAEnD,OAAO,CAAC,0BAA0B,CAAqB;IAChE,OAAO,CAAC,eAAe,CAAC,CAAgC;IAExD;;;;OAIG;IACH,OAAO,CAAC,iBAAiB,CAAa;IAEtC,gGAAgG;IAChG,OAAO,CAAC,qBAAqB,CAAS;IACZ,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IACX,KAAK,EAAE,SAAS,EAAE,CAAM;IACxB,QAAQ,EAAE,YAAY,EAAE,CAAM;IAC9B,OAAO,EAAE,WAAW,EAAE,CAAM;IAC5B,SAAS,EAAE,QAAQ,EAAE,CAAM;IAC3C,eAAe,EAAE,OAAO,CAAS;IAClC,aAAa,EAAE,aAAa,CAC9B;IACmB,OAAO,EAAE,cAAc,EAAE,CAAM;IAC/C,gBAAgB,EAAE,OAAO,CAAS;IAClC,UAAU,EAAE,OAAO,CAAS;IACZ,OAAO,EAAE,WAAW,EAAE,CAAM;IAC7C,IAAI,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC3B,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC3C,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAQ;IACvC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC9B,uBAAuB,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC9C,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC1C,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,sBAAsB,EAAE,OAAO,CAAS;IACzC,OAAO,EAAE,MAAM,CAAK;IACpB,UAAU,EAAE,MAAM,CAAK;IACvB,aAAa,EAAE,MAAM,CAAK;IAC1B,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAIvD,OAAO,CAAC,iBAAiB,CAAkC;IAElD,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAiBzC,oBAAoB,IAAI,IAAI;IAKrC,OAAO,KAAK,eAAe,GAW1B;IAED,OAAO,CAAC,WAAW;IAmGnB,OAAO,CAAC,eAAe;IAkFvB,OAAO,CAAC,UAAU;IA2ClB,OAAO,CAAC,aAAa;IAmBrB,OAAO,CAAC,QAAQ;IAiBhB,OAAO,CAAC,UAAU;IAaT,MAAM;IAyGf,OAAO,CAAC,cAAc;IAsGtB,OAAO,CAAC,iBAAiB;IAuBzB,OAAO,CAAC,4BAA4B;IAoBpC,OAAgB,MAAM,0BAA2B;CAClD;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,WAAW,EAAE,QAAQ,CAAC;KACvB;CACF"}
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;AACvB,OAAO,EACL,OAAO,EACP,WAAW,EAKZ,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAC,OAAO,EAAE,WAAW,EAAC,CAAC;AAW9B,OAAO,EAAC,WAAW,EAAE,eAAe,EAAe,MAAM,aAAa,CAAC;AAGvE,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAC,WAAW,EAAE,eAAe,EAAC,CAAC;AAEtC,oBAAY,eAAe;IACzB,MAAM,WAAW;IACjB,MAAM,WAAW;IACjB,UAAU,eAAe;IACzB,MAAM,WAAW;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,OAAO,CAAC;IACzB,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,eAAe,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,WAAW,CAAC;CAC1B;AAED,eAAO,MAAM,iBAAiB,QAAU,CAAC;AAMzC,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,CAahE;AAID;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8DG;AACH,qBACa,QAAS,SAAQ,UAAU;IACtC,OAAO,CAAC,WAAW,CAA8D;IACjF,OAAO,CAAC,cAAc,CAAkE;IAE9D,KAAK,EAAE,eAAe,CAA0B;IAChD,QAAQ,EAAE,QAAQ,CAAoB;IACtC,eAAe,EAAE,eAAe,CACjC;IACE,UAAU,EAAE,OAAO,CAAS;IAC5B,gBAAgB,EAAE,OAAO,GAAG,SAAS,CAAC;IACvC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,eAAe,EAAE,OAAO,CAAS;IAClC,2BAA2B,EAAE,MAAM,CAAO;IACzC,gBAAgB,EAAE,OAAO,CAAS;IAClC,QAAQ,EAAE,OAAO,CAAS;IAE1B,eAAe,EAAE,OAAO,CAAS;IAEnD,OAAO,CAAC,0BAA0B,CAAqB;IAChE,OAAO,CAAC,eAAe,CAAC,CAAgC;IAExD;;;;OAIG;IACH,OAAO,CAAC,iBAAiB,CAAa;IAEtC,gGAAgG;IAChG,OAAO,CAAC,qBAAqB,CAAS;IACZ,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IACX,KAAK,EAAE,SAAS,EAAE,CAAM;IACxB,QAAQ,EAAE,YAAY,EAAE,CAAM;IAC9B,OAAO,EAAE,WAAW,EAAE,CAAM;IAC5B,SAAS,EAAE,QAAQ,EAAE,CAAM;IAC3C,eAAe,EAAE,OAAO,CAAS;IAClC,aAAa,EAAE,aAAa,CAC9B;IACmB,OAAO,EAAE,cAAc,EAAE,CAAM;IAC/C,gBAAgB,EAAE,OAAO,CAAS;IAClC,UAAU,EAAE,OAAO,CAAS;IACZ,OAAO,EAAE,WAAW,EAAE,CAAM;IAC7C,IAAI,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC3B,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC3C,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAQ;IACvC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC9B,uBAAuB,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC9C,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC1C,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,sBAAsB,EAAE,OAAO,CAAS;IACzC,OAAO,EAAE,MAAM,CAAK;IACpB,UAAU,EAAE,MAAM,CAAK;IACvB,aAAa,EAAE,MAAM,CAAK;IAC1B,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,YAAY,EAAE,OAAO,CAAS;IAC3B,QAAQ,EAAE,iBAAiB,GAAG,SAAS,CAAC;IAC5C,aAAa,EAAE,MAAM,CAAK;IAE1B,OAAO,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,WAAW,EAAE,WAAW,CAA2B;IACnD,aAAa,EAAE,MAAM,CAAK;IAC1B,WAAW,EAAE,MAAM,CAAK;IACxB,WAAW,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC5D,IACI,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAKnC;IACD,IAAI,kBAAkB,IANQ,MAAM,CAQnC;IACD,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,cAAc,CAAC,CAAuB;IAI9C,OAAO,CAAC,iBAAiB,CAAkC;IAElD,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAiBzC,oBAAoB,IAAI,IAAI;IAM5B,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAmB/C,OAAO,KAAK,eAAe,GAE1B;IAED,OAAO,CAAC,KAAK,CAAK;IAElB,OAAO,CAAC,WAAW;IAgHnB,OAAO,CAAC,mBAAmB;IAkD3B,OAAO,CAAC,eAAe;IAkFvB,OAAO,CAAC,UAAU;IA4ClB,OAAO,CAAC,aAAa;IAmBrB,OAAO,CAAC,QAAQ;IAiBhB,OAAO,CAAC,UAAU;IAaT,MAAM;IA+If,OAAO,CAAC,YAAY;IAyCpB,OAAO,CAAC,SAAS;IA8CjB,OAAO,CAAC,cAAc;IA0GtB,OAAO,CAAC,iBAAiB;IAuBzB,OAAO,CAAC,4BAA4B;IAoBpC,OAAgB,MAAM,0BAA2B;CAClD;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,WAAW,EAAE,QAAQ,CAAC;KACvB;CACF"}
@@ -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, RADIAL_SETPOINT_RADIUS } from "../../svghelpers/setpoint.js";
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
- get innerRingRadius() {
96
- if (this.watchCircleType === "single") {
97
- return RING2_RADIUS;
98
- } else if (this.watchCircleType === "double") {
99
- return RING3_RADIUS;
100
- } else if (this.watchCircleType === "doubleThin") {
101
- return RING3B_RADIUS;
102
- } else if (this.watchCircleType === "triple") {
103
- return RING4_RADIUS;
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
- throw new Error(`Invalid watch circle type: ${this.watchCircleType}`);
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="-200" y="-200" width="400" height="400" fill="black" />
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
- result = [mask, svg`<g mask="url(#cutMask)">${rings}</g>`];
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: 368 / 2,
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="-200" y="-200" width="400" height="400" fill="black" />
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: 200,
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="-160" width="8" height="48" rx="4"
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
- const width = (176 + this.getPadding()) * 2;
346
- const height = width * (1 - this.clipTop / 100 - this.clipBottom / 100);
347
- const top = -width / 2 + width * this.clipTop / 100;
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
- 184,
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
- ${wind} ${tickmarks} ${advices} ${angleSetpoint} ${labels}
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