@oicl/openbridge-webcomponents 0.0.20260407101310 → 0.0.20260408055359

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 (73) 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/components/sequence-loading-spinner/sequence-loading-spinner.css.js +88 -78
  6. package/dist/components/sequence-loading-spinner/sequence-loading-spinner.css.js.map +1 -1
  7. package/dist/components/sequence-loading-spinner/sequence-loading-spinner.d.ts +18 -7
  8. package/dist/components/sequence-loading-spinner/sequence-loading-spinner.d.ts.map +1 -1
  9. package/dist/components/sequence-loading-spinner/sequence-loading-spinner.js +122 -21
  10. package/dist/components/sequence-loading-spinner/sequence-loading-spinner.js.map +1 -1
  11. package/dist/navigation-instruments/compass/arrow.d.ts +1 -1
  12. package/dist/navigation-instruments/compass/arrow.d.ts.map +1 -1
  13. package/dist/navigation-instruments/compass/arrow.js +3 -3
  14. package/dist/navigation-instruments/compass/arrow.js.map +1 -1
  15. package/dist/navigation-instruments/compass/compass.d.ts +12 -6
  16. package/dist/navigation-instruments/compass/compass.d.ts.map +1 -1
  17. package/dist/navigation-instruments/compass/compass.js +29 -24
  18. package/dist/navigation-instruments/compass/compass.js.map +1 -1
  19. package/dist/navigation-instruments/compass-flat/compass-flat.d.ts +37 -1
  20. package/dist/navigation-instruments/compass-flat/compass-flat.d.ts.map +1 -1
  21. package/dist/navigation-instruments/compass-flat/compass-flat.js +34 -3
  22. package/dist/navigation-instruments/compass-flat/compass-flat.js.map +1 -1
  23. package/dist/navigation-instruments/compass-sector/compass-sector.css.js +34 -0
  24. package/dist/navigation-instruments/compass-sector/compass-sector.css.js.map +1 -0
  25. package/dist/navigation-instruments/compass-sector/compass-sector.d.ts +101 -0
  26. package/dist/navigation-instruments/compass-sector/compass-sector.d.ts.map +1 -0
  27. package/dist/navigation-instruments/compass-sector/compass-sector.js +404 -0
  28. package/dist/navigation-instruments/compass-sector/compass-sector.js.map +1 -0
  29. package/dist/navigation-instruments/rate-of-turn/rate-of-turn.controller.d.ts +15 -2
  30. package/dist/navigation-instruments/rate-of-turn/rate-of-turn.controller.d.ts.map +1 -1
  31. package/dist/navigation-instruments/rate-of-turn/rate-of-turn.controller.js +50 -18
  32. package/dist/navigation-instruments/rate-of-turn/rate-of-turn.controller.js.map +1 -1
  33. package/dist/navigation-instruments/rate-of-turn/rate-of-turn.d.ts +40 -6
  34. package/dist/navigation-instruments/rate-of-turn/rate-of-turn.d.ts.map +1 -1
  35. package/dist/navigation-instruments/rate-of-turn/rate-of-turn.js +40 -47
  36. package/dist/navigation-instruments/rate-of-turn/rate-of-turn.js.map +1 -1
  37. package/dist/navigation-instruments/rate-of-turn/rot-renderer.d.ts +63 -0
  38. package/dist/navigation-instruments/rate-of-turn/rot-renderer.d.ts.map +1 -0
  39. package/dist/navigation-instruments/rate-of-turn/rot-renderer.js +211 -0
  40. package/dist/navigation-instruments/rate-of-turn/rot-renderer.js.map +1 -0
  41. package/dist/navigation-instruments/rot-sector/rot-sector.d.ts +10 -4
  42. package/dist/navigation-instruments/rot-sector/rot-sector.d.ts.map +1 -1
  43. package/dist/navigation-instruments/rot-sector/rot-sector.js +13 -3
  44. package/dist/navigation-instruments/rot-sector/rot-sector.js.map +1 -1
  45. package/dist/navigation-instruments/rudder/rudder.d.ts +4 -0
  46. package/dist/navigation-instruments/rudder/rudder.d.ts.map +1 -1
  47. package/dist/navigation-instruments/rudder/rudder.js +55 -19
  48. package/dist/navigation-instruments/rudder/rudder.js.map +1 -1
  49. package/dist/navigation-instruments/watch/advice.d.ts +3 -3
  50. package/dist/navigation-instruments/watch/advice.d.ts.map +1 -1
  51. package/dist/navigation-instruments/watch/advice.js +68 -16
  52. package/dist/navigation-instruments/watch/advice.js.map +1 -1
  53. package/dist/navigation-instruments/watch/tickmark.d.ts +2 -1
  54. package/dist/navigation-instruments/watch/tickmark.d.ts.map +1 -1
  55. package/dist/navigation-instruments/watch/tickmark.js +15 -13
  56. package/dist/navigation-instruments/watch/tickmark.js.map +1 -1
  57. package/dist/navigation-instruments/watch/watch.d.ts +29 -0
  58. package/dist/navigation-instruments/watch/watch.d.ts.map +1 -1
  59. package/dist/navigation-instruments/watch/watch.js +256 -44
  60. package/dist/navigation-instruments/watch/watch.js.map +1 -1
  61. package/dist/navigation-instruments/watch-flat/watch-flat.d.ts +29 -1
  62. package/dist/navigation-instruments/watch-flat/watch-flat.d.ts.map +1 -1
  63. package/dist/navigation-instruments/watch-flat/watch-flat.js +162 -17
  64. package/dist/navigation-instruments/watch-flat/watch-flat.js.map +1 -1
  65. package/dist/svghelpers/arc-frame.d.ts +42 -0
  66. package/dist/svghelpers/arc-frame.d.ts.map +1 -0
  67. package/dist/svghelpers/arc-frame.js +123 -0
  68. package/dist/svghelpers/arc-frame.js.map +1 -0
  69. package/package.json +1 -1
  70. package/dist/navigation-instruments/compass/rot.d.ts +0 -4
  71. package/dist/navigation-instruments/compass/rot.d.ts.map +0 -1
  72. package/dist/navigation-instruments/compass/rot.js +0 -11
  73. package/dist/navigation-instruments/compass/rot.js.map +0 -1
@@ -1,9 +1,12 @@
1
1
  import { LitElement } from 'lit';
2
2
  import { Priority } from '../types.js';
3
+ import { RotType } from '../rate-of-turn/rot-renderer.js';
3
4
  import '../watch-flat/watch-flat.js';
5
+ export { RotType };
4
6
  export declare enum CompassFlatPriorityElement {
5
7
  hdg = "hdg",
6
- cog = "cog"
8
+ cog = "cog",
9
+ rot = "rot"
7
10
  }
8
11
  export declare enum LabelPosition {
9
12
  top = -45,
@@ -18,6 +21,35 @@ export interface Label {
18
21
  text: string;
19
22
  }
20
23
  /**
24
+ * `<obc-compass-flat>` — Horizontal strip compass with HDG/COG arrows and optional rate-of-turn indicator.
25
+ *
26
+ * Renders a flat (non-circular) compass strip that scrolls horizontally to
27
+ * display the current heading. A filled HDG arrow sits at the center while a
28
+ * hollow COG arrow is positioned at the angular difference. The strip
29
+ * auto-scales its field of view so both arrows remain visible. Cardinal
30
+ * labels (N, S, E, W) and tickmarks are generated at densities responsive to
31
+ * the strip width.
32
+ *
33
+ * ## Features
34
+ *
35
+ * - **Auto-scaling FOV**: The visible compass range widens to keep both HDG
36
+ * and COG arrows in view, bounded by `minFOV` / `maxFOV`.
37
+ * - **HDG / COG arrows**: Filled (HDG) and hollow (COG) arrow SVGs positioned
38
+ * along the strip.
39
+ * - **FOV indicator**: Optional numeric labels showing the port/starboard
40
+ * bearing range and current heading.
41
+ * - **Rate of turn**: Animated linear ROT indicator (spinning dots or
42
+ * horizontal bar) via `rotType`. When enabled, a bottom bar is added to
43
+ * the strip to house the indicator.
44
+ * - **Color priority**: Per-element priority for HDG, COG, and ROT via
45
+ * `priorityElements`.
46
+ *
47
+ * @property {number} heading - Current heading in degrees.
48
+ * @property {number} courseOverGround - Current COG in degrees.
49
+ * @property {RotType|undefined} rotType - ROT display mode: `'dots'`, `'bar'`, or `undefined` (hidden).
50
+ * @property {number} rotationsPerMinute - ROT spin speed; sign controls direction.
51
+ * @property {number} rotMaxValue - Maximum ROT value for bar-extent mapping.
52
+ * @property {number} rotArcExtent - Degrees of bar arc per max-value ROT (default 60).
21
53
  *
22
54
  * @ignition-base-height: 170px
23
55
  * @ignition-base-width: 512px
@@ -32,6 +64,10 @@ export declare class ObcCompassFlat extends LitElement {
32
64
  maxFOV: number;
33
65
  priority: Priority;
34
66
  priorityElements: CompassFlatPriorityElement[];
67
+ rotType: RotType | undefined;
68
+ rotationsPerMinute: number;
69
+ rotMaxValue: number;
70
+ rotArcExtent: number;
35
71
  private containerWidth;
36
72
  private maxContainerWidth;
37
73
  private resizeObserver;
@@ -1 +1 @@
1
- {"version":3,"file":"compass-flat.d.ts","sourceRoot":"","sources":["../../../src/navigation-instruments/compass-flat/compass-flat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAA0C,MAAM,KAAK,CAAC;AAIxE,OAAO,6BAA6B,CAAC;AAErC,OAAO,EAAC,QAAQ,EAAC,MAAM,aAAa,CAAC;AAErC,oBAAY,0BAA0B;IACpC,GAAG,QAAQ;IACX,GAAG,QAAQ;CACZ;AAED,oBAAY,aAAa;IACvB,GAAG,MAAM;IACT,MAAM,KAAK;CACZ;AAED,oBAAY,UAAU;IACpB,OAAO,gDAAgD;CACxD;AAED,MAAM,WAAW,KAAK;IACpB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,aAAa,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;GAIG;AACH,qBACa,cAAe,SAAQ,UAAU;IACjB,YAAY,EAAE,OAAO,CAAS;IAC/B,OAAO,SAAK;IACZ,gBAAgB,SAAK;IACrB,YAAY,SAAK;IACjB,GAAG,SAAM;IACT,MAAM,SAAM;IACZ,MAAM,SAAO;IACb,QAAQ,EAAE,QAAQ,CAAoB;IAEhE,gBAAgB,EAAE,0BAA0B,EAAE,CAE5C;IAEO,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,iBAAiB,CAAK;IAEvC,OAAO,CAAC,cAAc,CASnB;IAEM,iBAAiB;IAKjB,oBAAoB;IAK7B,cAAc;;;;;IAsCd,OAAO,CAAC,yBAAyB;IAiCjC,OAAO,CAAC,yBAAyB;IAajC,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,kBAAkB;IAmC1B,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,aAAa;IAMrB,OAAO,KAAK,MAAM,GAIjB;IAED,OAAO,CAAC,MAAM;IAQL,MAAM;IAwCf,OAAgB,MAAM,0BAA6B;CACpD;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,kBAAkB,EAAE,cAAc,CAAC;KACpC;CACF"}
1
+ {"version":3,"file":"compass-flat.d.ts","sourceRoot":"","sources":["../../../src/navigation-instruments/compass-flat/compass-flat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAA0C,MAAM,KAAK,CAAC;AAIxE,OAAO,6BAA6B,CAAC;AAErC,OAAO,EAAC,QAAQ,EAAC,MAAM,aAAa,CAAC;AACrC,OAAO,EACL,OAAO,EAER,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAC,OAAO,EAAC,CAAC;AAEjB,oBAAY,0BAA0B;IACpC,GAAG,QAAQ;IACX,GAAG,QAAQ;IACX,GAAG,QAAQ;CACZ;AAED,oBAAY,aAAa;IACvB,GAAG,MAAM;IACT,MAAM,KAAK;CACZ;AAED,oBAAY,UAAU;IACpB,OAAO,gDAAgD;CACxD;AAED,MAAM,WAAW,KAAK;IACpB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,aAAa,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,qBACa,cAAe,SAAQ,UAAU;IACjB,YAAY,EAAE,OAAO,CAAS;IAC/B,OAAO,SAAK;IACZ,gBAAgB,SAAK;IACrB,YAAY,SAAK;IACjB,GAAG,SAAM;IACT,MAAM,SAAM;IACZ,MAAM,SAAO;IACb,QAAQ,EAAE,QAAQ,CAAoB;IAEhE,gBAAgB,EAAE,0BAA0B,EAAE,CAE5C;IACwB,OAAO,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,kBAAkB,EAAE,MAAM,CAAK;IAC/B,WAAW,EAAE,MAAM,CAAM;IACzB,YAAY,EAAE,MAAM,CAAM;IAE3C,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,iBAAiB,CAAK;IAEvC,OAAO,CAAC,cAAc,CASnB;IAEM,iBAAiB;IAKjB,oBAAoB;IAK7B,cAAc;;;;;IAsCd,OAAO,CAAC,yBAAyB;IAiCjC,OAAO,CAAC,yBAAyB;IAajC,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,kBAAkB;IAmC1B,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,aAAa;IAMrB,OAAO,KAAK,MAAM,GAIjB;IAED,OAAO,CAAC,MAAM;IAQL,MAAM;IAqDf,OAAgB,MAAM,0BAA6B;CACpD;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,kBAAkB,EAAE,cAAc,CAAC;KACpC;CACF"}
@@ -5,6 +5,8 @@ import { TickmarkType } from "../watch-flat/tickmark-flat.js";
5
5
  import "../watch-flat/watch-flat.js";
6
6
  import { customElement } from "../../decorator.js";
7
7
  import { Priority } from "../types.js";
8
+ import { LINEAR_DOT_ANGLE_SPACING } from "../rate-of-turn/rot-renderer.js";
9
+ import { RotType } from "../rate-of-turn/rot-renderer.js";
8
10
  var __defProp = Object.defineProperty;
9
11
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
10
12
  var __decorateClass = (decorators, target, key, kind) => {
@@ -18,6 +20,7 @@ var __decorateClass = (decorators, target, key, kind) => {
18
20
  var CompassFlatPriorityElement = /* @__PURE__ */ ((CompassFlatPriorityElement2) => {
19
21
  CompassFlatPriorityElement2["hdg"] = "hdg";
20
22
  CompassFlatPriorityElement2["cog"] = "cog";
23
+ CompassFlatPriorityElement2["rot"] = "rot";
21
24
  return CompassFlatPriorityElement2;
22
25
  })(CompassFlatPriorityElement || {});
23
26
  var LabelPosition = /* @__PURE__ */ ((LabelPosition2) => {
@@ -44,6 +47,9 @@ let ObcCompassFlat = class extends LitElement {
44
47
  "hdg"
45
48
  /* hdg */
46
49
  ];
50
+ this.rotationsPerMinute = 1;
51
+ this.rotMaxValue = 10;
52
+ this.rotArcExtent = 60;
47
53
  this.containerWidth = 0;
48
54
  this.maxContainerWidth = 0;
49
55
  this.resizeObserver = new ResizeObserver((entries) => {
@@ -144,7 +150,7 @@ let ObcCompassFlat = class extends LitElement {
144
150
  const scaleFactor = (maxContainerWidth - this.containerWidth) / widthRange;
145
151
  yAdjustment = scaleFactor * maxAdjustment;
146
152
  }
147
- const y = 50 + yAdjustment;
153
+ const y = 50 + yAdjustment + (this.rotType ? 12 : 0);
148
154
  indicators.push(svg`
149
155
  <text x="-175" y=${y} class="label left" fill=${"var(--instrument-tick-mark-secondary-color)"}>
150
156
  ${-this.FOV}\u00B0
@@ -201,7 +207,9 @@ let ObcCompassFlat = class extends LitElement {
201
207
  ...l,
202
208
  x: l.x * translationScale
203
209
  }));
204
- const viewBox = "-192 -128 384 128";
210
+ const hasBottomBar = !!this.rotType;
211
+ const arrowViewBoxY = hasBottomBar ? -128 + Math.round(12 * 384 / 352) : -128;
212
+ const viewBox = `-192 ${arrowViewBoxY} 384 128`;
205
213
  return html`
206
214
  <div class="container" style="max-width:${this.maxContainerWidth}px">
207
215
  <obc-watch-flat
@@ -210,6 +218,16 @@ let ObcCompassFlat = class extends LitElement {
210
218
  .rotation=${this.heading}
211
219
  .tickmarks=${tickmarks}
212
220
  .tickmarkSpacing=${translationScale}
221
+ .bottomBar=${!!this.rotType}
222
+ .rotType=${this.rotType}
223
+ .rotStartX=${0}
224
+ .rotEndX=${this.rotationsPerMinute / (this.rotMaxValue || 1) * this.rotArcExtent * translationScale}
225
+ .rotDotSpacing=${LINEAR_DOT_ANGLE_SPACING * translationScale}
226
+ .rotationsPerMinute=${this.rotationsPerMinute}
227
+ .rotPriority=${this.priorityFor(
228
+ "rot"
229
+ /* rot */
230
+ )}
213
231
  ></obc-watch-flat>
214
232
  <svg viewBox=${viewBox} xmlns="http://www.w3.org/2000/svg">
215
233
  ${this.HDGSvg}${this.COGSvg(translation)}
@@ -246,6 +264,18 @@ __decorateClass([
246
264
  __decorateClass([
247
265
  property({ type: Array, attribute: false })
248
266
  ], ObcCompassFlat.prototype, "priorityElements", 2);
267
+ __decorateClass([
268
+ property({ type: String })
269
+ ], ObcCompassFlat.prototype, "rotType", 2);
270
+ __decorateClass([
271
+ property({ type: Number })
272
+ ], ObcCompassFlat.prototype, "rotationsPerMinute", 2);
273
+ __decorateClass([
274
+ property({ type: Number })
275
+ ], ObcCompassFlat.prototype, "rotMaxValue", 2);
276
+ __decorateClass([
277
+ property({ type: Number })
278
+ ], ObcCompassFlat.prototype, "rotArcExtent", 2);
249
279
  __decorateClass([
250
280
  state()
251
281
  ], ObcCompassFlat.prototype, "containerWidth", 2);
@@ -259,6 +289,7 @@ export {
259
289
  CompassFlatPriorityElement,
260
290
  LabelPosition,
261
291
  LabelStyle,
262
- ObcCompassFlat
292
+ ObcCompassFlat,
293
+ RotType
263
294
  };
264
295
  //# sourceMappingURL=compass-flat.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"compass-flat.js","sources":["../../../src/navigation-instruments/compass-flat/compass-flat.ts"],"sourcesContent":["import {LitElement, html, svg, SVGTemplateResult, unsafeCSS} from 'lit';\nimport componentStyle from './compass-flat.css?inline';\nimport {property, state} from 'lit/decorators.js';\nimport {Tickmark, TickmarkType} from '../watch-flat/tickmark-flat.js';\nimport '../watch-flat/watch-flat.js';\nimport {customElement} from '../../decorator.js';\nimport {Priority} from '../types.js';\n\nexport enum CompassFlatPriorityElement {\n hdg = 'hdg',\n cog = 'cog',\n}\n\nexport enum LabelPosition {\n top = -45,\n bottom = 50,\n}\n\nexport enum LabelStyle {\n regular = 'var(--instrument-tick-mark-secondary-color)',\n}\n\nexport interface Label {\n x: number;\n y: LabelPosition;\n text: string;\n}\n\n/**\n *\n * @ignition-base-height: 170px\n * @ignition-base-width: 512px\n */\n@customElement('obc-compass-flat')\nexport class ObcCompassFlat extends LitElement {\n @property({type: Boolean}) FOVIndicator: boolean = false;\n @property({type: Number}) heading = 0;\n @property({type: Number}) courseOverGround = 0;\n @property({type: Number}) tickInterval = 5;\n @property({type: Number}) FOV = 45;\n @property({type: Number}) minFOV = 45;\n @property({type: Number}) maxFOV = 180;\n @property({type: String}) priority: Priority = Priority.regular;\n @property({type: Array, attribute: false})\n priorityElements: CompassFlatPriorityElement[] = [\n CompassFlatPriorityElement.hdg,\n ];\n\n @state() private containerWidth = 0;\n @state() private maxContainerWidth = 0;\n\n private resizeObserver: ResizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n // Made by chatGPT so that the text is inside the wrapper\n this.maxContainerWidth = -125.36 + 3.79 * entry.contentRect.height;\n this.containerWidth = Math.min(\n entry.contentRect.width,\n this.maxContainerWidth\n );\n }\n });\n\n override connectedCallback() {\n super.connectedCallback();\n this.resizeObserver.observe(this);\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n this.resizeObserver.unobserve(this);\n }\n\n generateLabels() {\n if (this.containerWidth < 192) {\n return [];\n } else if (this.containerWidth <= 300) {\n return [\n {x: -180, y: LabelPosition.top, text: 'S'},\n {x: -90, y: LabelPosition.top, text: 'W'},\n {x: 0, y: LabelPosition.top, text: 'N'},\n {x: 90, y: LabelPosition.top, text: 'E'},\n {x: 180, y: LabelPosition.top, text: 'S'},\n {x: 270, y: LabelPosition.top, text: 'W'},\n {x: 360, y: LabelPosition.top, text: 'N'},\n {x: 450, y: LabelPosition.top, text: 'E'},\n {x: 540, y: LabelPosition.top, text: 'S'},\n ];\n } else {\n return [\n {x: -180, y: LabelPosition.top, text: 'S'},\n {x: -135, y: LabelPosition.top, text: 'SW'},\n {x: -90, y: LabelPosition.top, text: 'W'},\n {x: -45, y: LabelPosition.top, text: 'NW'},\n {x: 0, y: LabelPosition.top, text: 'N'},\n {x: 45, y: LabelPosition.top, text: 'NE'},\n {x: 90, y: LabelPosition.top, text: 'E'},\n {x: 135, y: LabelPosition.top, text: 'SE'},\n {x: 180, y: LabelPosition.top, text: 'S'},\n {x: 225, y: LabelPosition.top, text: 'SW'},\n {x: 270, y: LabelPosition.top, text: 'W'},\n {x: 315, y: LabelPosition.top, text: 'NW'},\n {x: 360, y: LabelPosition.top, text: 'N'},\n {x: 405, y: LabelPosition.top, text: 'NE'},\n {x: 450, y: LabelPosition.top, text: 'E'},\n {x: 495, y: LabelPosition.top, text: 'SE'},\n {x: 540, y: LabelPosition.top, text: 'S'},\n ];\n }\n }\n\n private generateIntervalTickmarks(scale: number): Tickmark[] {\n const tickmarks: Tickmark[] = [];\n let cardinalInterval = 90;\n\n if (this.containerWidth > 300) {\n cardinalInterval = 45;\n } else if (this.containerWidth < 192) {\n cardinalInterval = 0;\n }\n\n // Guard against zero/negative/non-finite interval to prevent infinite loops\n if (\n !this.tickInterval ||\n this.tickInterval <= 0 ||\n !Number.isFinite(this.tickInterval)\n ) {\n return tickmarks;\n }\n\n for (\n let angle = -180;\n angle < this.maxFOV * 3;\n angle += this.tickInterval\n ) {\n if (cardinalInterval !== 0 && angle % cardinalInterval === 0) {\n continue;\n }\n tickmarks.push({angle: angle * scale, type: TickmarkType.secondary});\n }\n\n return tickmarks;\n }\n\n private generateCardinalTickmarks(\n scale: number,\n labels: Label[]\n ): Tickmark[] {\n const tickmarks: Tickmark[] = [];\n\n for (const label of labels) {\n tickmarks.push({angle: label.x * scale, type: TickmarkType.main});\n }\n\n return tickmarks;\n }\n\n private generateTickmarks(scale: number, labels: Label[]): Tickmark[] {\n return [\n ...this.generateCardinalTickmarks(scale, labels),\n ...this.generateIntervalTickmarks(scale),\n ];\n }\n\n private renderFOVIndicator(): SVGTemplateResult[] {\n const indicators: SVGTemplateResult[] = [];\n\n const maxAdjustment = 10;\n const minContainerWidth = 300;\n const maxContainerWidth = 512;\n\n let yAdjustment = 0;\n if (this.containerWidth < maxContainerWidth) {\n const widthRange = maxContainerWidth - minContainerWidth;\n const scaleFactor =\n (maxContainerWidth - this.containerWidth) / widthRange;\n yAdjustment = scaleFactor * maxAdjustment;\n }\n\n const y = LabelPosition.bottom + yAdjustment;\n\n indicators.push(svg`\n <text x=\"-175\" y=${y} class=\"label left\" fill=${LabelStyle.regular}>\n ${-this.FOV}\\u00B0\n </text>`);\n\n indicators.push(svg`\n <text x=\"0\" y=${y} class=\"label\" fill=${LabelStyle.regular}>\n ${this.heading}\\u00B0\n </text>`);\n\n indicators.push(svg`\n <text x=\"175\" y=${y} class=\"label right\" fill=${LabelStyle.regular}>\n ${this.FOV}\\u00B0\n </text>`);\n\n return indicators;\n }\n\n private priorityFor(element: CompassFlatPriorityElement): Priority {\n const selected = Array.isArray(this.priorityElements)\n ? this.priorityElements\n : [];\n return selected.includes(element) ? this.priority : Priority.regular;\n }\n\n private arrowColorFor(element: CompassFlatPriorityElement): string {\n return this.priorityFor(element) === Priority.enhanced\n ? 'var(--instrument-enhanced-secondary-color)'\n : 'var(--instrument-regular-secondary-color)';\n }\n\n private get HDGSvg(): SVGTemplateResult {\n return svg`<g transform=\"translate(-24, -74)\">\n <path d=\"M36.7011 44.1445L36.6898 44.1379L36.6781 44.1318L24.2301 37.6823L24.0001 37.5631L23.7701 37.6823L11.3221 44.1318L11.3104 44.1379L11.2991 44.1445C9.25497 45.3438 6.78661 43.308 7.68828 41.0919L22.6036 4.43285C23.1096 3.18905 24.8906 3.18905 25.3967 4.43284L40.3119 41.0919C41.2136 43.308 38.7452 45.3438 36.7011 44.1445Z\" fill=\"${this.arrowColorFor(CompassFlatPriorityElement.hdg)}\" stroke=\"var(--border-silhouette-color)\"/>\n </g>`;\n }\n\n private COGSvg(translation: number): SVGTemplateResult {\n return svg`\n <g transform=\"translate(${-24 + translation}, -74)\">\n <path d=\"M31.9025 36.0262L33.1068 36.6502L32.5956 35.3938L24.4632 15.406L24.0001 14.2677L23.537 15.406L15.4046 35.3938L14.8935 36.6502L16.0978 36.0262L24.0001 31.9319L31.9025 36.0262ZM36.7011 44.1445L36.6898 44.1379L36.6781 44.1318L24.2301 37.6823L24.0001 37.5631L23.7701 37.6823L11.3221 44.1318L11.3104 44.1379L11.2991 44.1445C9.25497 45.3438 6.78661 43.308 7.68828 41.0919L22.6036 4.43285C23.1096 3.18905 24.8906 3.18905 25.3967 4.43284L40.3119 41.0919C41.2136 43.308 38.7452 45.3438 36.7011 44.1445Z\" fill=\"${this.arrowColorFor(CompassFlatPriorityElement.cog)}\" stroke=\"var(--border-silhouette-color)\"/>\n </g>\n `;\n }\n\n override render() {\n let angleDiff = this.courseOverGround - this.heading;\n\n if (angleDiff > this.maxFOV) {\n angleDiff -= 360;\n } else if (angleDiff < -this.maxFOV) {\n angleDiff += 360;\n }\n\n this.FOV = Math.max(this.minFOV, Math.abs(angleDiff));\n\n const baseOffset = 5;\n const translationScale = (baseOffset * 35) / this.FOV;\n\n const translation = angleDiff * translationScale;\n const labels = this.generateLabels();\n const tickmarks = this.generateTickmarks(translationScale, labels);\n const scaledLabels = labels.map((l) => ({\n ...l,\n x: l.x * translationScale,\n }));\n\n const viewBox = '-192 -128 384 128';\n\n return html`\n <div class=\"container\" style=\"max-width:${this.maxContainerWidth}px\">\n <obc-watch-flat\n .FOVIndicator=${this.FOVIndicator ? this.renderFOVIndicator() : []}\n .labels=${scaledLabels}\n .rotation=${this.heading}\n .tickmarks=${tickmarks}\n .tickmarkSpacing=${translationScale}\n ></obc-watch-flat>\n <svg viewBox=${viewBox} xmlns=\"http://www.w3.org/2000/svg\">\n ${this.HDGSvg}${this.COGSvg(translation)}\n </svg>\n </div>\n `;\n }\n\n static override styles = unsafeCSS(componentStyle);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'obc-compass-flat': ObcCompassFlat;\n }\n}\n"],"names":["CompassFlatPriorityElement","LabelPosition","LabelStyle"],"mappings":";;;;;;;;;;;;;;;;;AAQO,IAAK,+CAAAA,gCAAL;AACLA,8BAAA,KAAA,IAAM;AACNA,8BAAA,KAAA,IAAM;AAFI,SAAAA;AAAA,GAAA,8BAAA,CAAA,CAAA;AAKL,IAAK,kCAAAC,mBAAL;AACLA,iBAAAA,eAAA,SAAM,GAAA,IAAN;AACAA,iBAAAA,eAAA,YAAS,EAAA,IAAT;AAFU,SAAAA;AAAA,GAAA,iBAAA,CAAA,CAAA;AAKL,IAAK,+BAAAC,gBAAL;AACLA,cAAA,SAAA,IAAU;AADA,SAAAA;AAAA,GAAA,cAAA,CAAA,CAAA;AAgBL,IAAM,iBAAN,cAA6B,WAAW;AAAA,EAAxC,cAAA;AAAA,UAAA,GAAA,SAAA;AACsB,SAAA,eAAwB;AACzB,SAAA,UAAU;AACV,SAAA,mBAAmB;AACnB,SAAA,eAAe;AACf,SAAA,MAAM;AACN,SAAA,SAAS;AACT,SAAA,SAAS;AACT,SAAA,WAAqB,SAAS;AAExD,SAAA,mBAAiD;AAAA,MAC/C;AAAA;AAAA,IAAA;AAGO,SAAQ,iBAAiB;AACzB,SAAQ,oBAAoB;AAErC,SAAQ,iBAAiC,IAAI,eAAe,CAAC,YAAY;AACvE,iBAAW,SAAS,SAAS;AAE3B,aAAK,oBAAoB,UAAU,OAAO,MAAM,YAAY;AAC5D,aAAK,iBAAiB,KAAK;AAAA,UACzB,MAAM,YAAY;AAAA,UAClB,KAAK;AAAA,QAAA;AAAA,MAET;AAAA,IACF,CAAC;AAAA,EAAA;AAAA,EAEQ,oBAAoB;AAC3B,UAAM,kBAAA;AACN,SAAK,eAAe,QAAQ,IAAI;AAAA,EAClC;AAAA,EAES,uBAAuB;AAC9B,UAAM,qBAAA;AACN,SAAK,eAAe,UAAU,IAAI;AAAA,EACpC;AAAA,EAEA,iBAAiB;AACf,QAAI,KAAK,iBAAiB,KAAK;AAC7B,aAAO,CAAA;AAAA,IACT,WAAW,KAAK,kBAAkB,KAAK;AACrC,aAAO;AAAA,QACL,EAAC,GAAG,MAAM,GAAG,KAAmB,MAAM,IAAA;AAAA,QACtC,EAAC,GAAG,KAAK,GAAG,KAAmB,MAAM,IAAA;AAAA,QACrC,EAAC,GAAG,GAAG,GAAG,KAAmB,MAAM,IAAA;AAAA,QACnC,EAAC,GAAG,IAAI,GAAG,KAAmB,MAAM,IAAA;AAAA,QACpC,EAAC,GAAG,KAAK,GAAG,KAAmB,MAAM,IAAA;AAAA,QACrC,EAAC,GAAG,KAAK,GAAG,KAAmB,MAAM,IAAA;AAAA,QACrC,EAAC,GAAG,KAAK,GAAG,KAAmB,MAAM,IAAA;AAAA,QACrC,EAAC,GAAG,KAAK,GAAG,KAAmB,MAAM,IAAA;AAAA,QACrC,EAAC,GAAG,KAAK,GAAG,KAAmB,MAAM,IAAA;AAAA,MAAG;AAAA,IAE5C,OAAO;AACL,aAAO;AAAA,QACL,EAAC,GAAG,MAAM,GAAG,KAAmB,MAAM,IAAA;AAAA,QACtC,EAAC,GAAG,MAAM,GAAG,KAAmB,MAAM,KAAA;AAAA,QACtC,EAAC,GAAG,KAAK,GAAG,KAAmB,MAAM,IAAA;AAAA,QACrC,EAAC,GAAG,KAAK,GAAG,KAAmB,MAAM,KAAA;AAAA,QACrC,EAAC,GAAG,GAAG,GAAG,KAAmB,MAAM,IAAA;AAAA,QACnC,EAAC,GAAG,IAAI,GAAG,KAAmB,MAAM,KAAA;AAAA,QACpC,EAAC,GAAG,IAAI,GAAG,KAAmB,MAAM,IAAA;AAAA,QACpC,EAAC,GAAG,KAAK,GAAG,KAAmB,MAAM,KAAA;AAAA,QACrC,EAAC,GAAG,KAAK,GAAG,KAAmB,MAAM,IAAA;AAAA,QACrC,EAAC,GAAG,KAAK,GAAG,KAAmB,MAAM,KAAA;AAAA,QACrC,EAAC,GAAG,KAAK,GAAG,KAAmB,MAAM,IAAA;AAAA,QACrC,EAAC,GAAG,KAAK,GAAG,KAAmB,MAAM,KAAA;AAAA,QACrC,EAAC,GAAG,KAAK,GAAG,KAAmB,MAAM,IAAA;AAAA,QACrC,EAAC,GAAG,KAAK,GAAG,KAAmB,MAAM,KAAA;AAAA,QACrC,EAAC,GAAG,KAAK,GAAG,KAAmB,MAAM,IAAA;AAAA,QACrC,EAAC,GAAG,KAAK,GAAG,KAAmB,MAAM,KAAA;AAAA,QACrC,EAAC,GAAG,KAAK,GAAG,KAAmB,MAAM,IAAA;AAAA,MAAG;AAAA,IAE5C;AAAA,EACF;AAAA,EAEQ,0BAA0B,OAA2B;AAC3D,UAAM,YAAwB,CAAA;AAC9B,QAAI,mBAAmB;AAEvB,QAAI,KAAK,iBAAiB,KAAK;AAC7B,yBAAmB;AAAA,IACrB,WAAW,KAAK,iBAAiB,KAAK;AACpC,yBAAmB;AAAA,IACrB;AAGA,QACE,CAAC,KAAK,gBACN,KAAK,gBAAgB,KACrB,CAAC,OAAO,SAAS,KAAK,YAAY,GAClC;AACA,aAAO;AAAA,IACT;AAEA,aACM,QAAQ,MACZ,QAAQ,KAAK,SAAS,GACtB,SAAS,KAAK,cACd;AACA,UAAI,qBAAqB,KAAK,QAAQ,qBAAqB,GAAG;AAC5D;AAAA,MACF;AACA,gBAAU,KAAK,EAAC,OAAO,QAAQ,OAAO,MAAM,aAAa,WAAU;AAAA,IACrE;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,0BACN,OACA,QACY;AACZ,UAAM,YAAwB,CAAA;AAE9B,eAAW,SAAS,QAAQ;AAC1B,gBAAU,KAAK,EAAC,OAAO,MAAM,IAAI,OAAO,MAAM,aAAa,MAAK;AAAA,IAClE;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,kBAAkB,OAAe,QAA6B;AACpE,WAAO;AAAA,MACL,GAAG,KAAK,0BAA0B,OAAO,MAAM;AAAA,MAC/C,GAAG,KAAK,0BAA0B,KAAK;AAAA,IAAA;AAAA,EAE3C;AAAA,EAEQ,qBAA0C;AAChD,UAAM,aAAkC,CAAA;AAExC,UAAM,gBAAgB;AACtB,UAAM,oBAAoB;AAC1B,UAAM,oBAAoB;AAE1B,QAAI,cAAc;AAClB,QAAI,KAAK,iBAAiB,mBAAmB;AAC3C,YAAM,aAAa,oBAAoB;AACvC,YAAM,eACH,oBAAoB,KAAK,kBAAkB;AAC9C,oBAAc,cAAc;AAAA,IAC9B;AAEA,UAAM,IAAI,KAAuB;AAEjC,eAAW,KAAK;AAAA,6BACS,CAAC,4BAA4B,6CAAA;AAAA,cAC5C,CAAC,KAAK,GAAG;AAAA,kBACL;AAEd,eAAW,KAAK;AAAA,0BACM,CAAC,uBAAuB,6CAAA;AAAA,cACpC,KAAK,OAAO;AAAA,kBACR;AAEd,eAAW,KAAK;AAAA,4BACQ,CAAC,6BAA6B,6CAAA;AAAA,cAC5C,KAAK,GAAG;AAAA,kBACJ;AAEd,WAAO;AAAA,EACT;AAAA,EAEQ,YAAY,SAA+C;AACjE,UAAM,WAAW,MAAM,QAAQ,KAAK,gBAAgB,IAChD,KAAK,mBACL,CAAA;AACJ,WAAO,SAAS,SAAS,OAAO,IAAI,KAAK,WAAW,SAAS;AAAA,EAC/D;AAAA,EAEQ,cAAc,SAA6C;AACjE,WAAO,KAAK,YAAY,OAAO,MAAM,SAAS,WAC1C,+CACA;AAAA,EACN;AAAA,EAEA,IAAY,SAA4B;AACtC,WAAO;AAAA,4VACiV,KAAK;AAAA,MAAc;AAAA;AAAA,KAA+B;AAAA;AAAA,EAE5Y;AAAA,EAEQ,OAAO,aAAwC;AACrD,WAAO;AAAA,gCACqB,MAAM,WAAW;AAAA,wgBACud,KAAK;AAAA,MAAc;AAAA;AAAA,KAA+B;AAAA;AAAA;AAAA,EAGxjB;AAAA,EAES,SAAS;AAChB,QAAI,YAAY,KAAK,mBAAmB,KAAK;AAE7C,QAAI,YAAY,KAAK,QAAQ;AAC3B,mBAAa;AAAA,IACf,WAAW,YAAY,CAAC,KAAK,QAAQ;AACnC,mBAAa;AAAA,IACf;AAEA,SAAK,MAAM,KAAK,IAAI,KAAK,QAAQ,KAAK,IAAI,SAAS,CAAC;AAEpD,UAAM,aAAa;AACnB,UAAM,mBAAoB,aAAa,KAAM,KAAK;AAElD,UAAM,cAAc,YAAY;AAChC,UAAM,SAAS,KAAK,eAAA;AACpB,UAAM,YAAY,KAAK,kBAAkB,kBAAkB,MAAM;AACjE,UAAM,eAAe,OAAO,IAAI,CAAC,OAAO;AAAA,MACtC,GAAG;AAAA,MACH,GAAG,EAAE,IAAI;AAAA,IAAA,EACT;AAEF,UAAM,UAAU;AAEhB,WAAO;AAAA,gDACqC,KAAK,iBAAiB;AAAA;AAAA,0BAE5C,KAAK,eAAe,KAAK,mBAAA,IAAuB,CAAA,CAAE;AAAA,oBACxD,YAAY;AAAA,sBACV,KAAK,OAAO;AAAA,uBACX,SAAS;AAAA,6BACH,gBAAgB;AAAA;AAAA,uBAEtB,OAAO;AAAA,YAClB,KAAK,MAAM,GAAG,KAAK,OAAO,WAAW,CAAC;AAAA;AAAA;AAAA;AAAA,EAIhD;AAGF;AAxOa,eAuOK,SAAS,UAAU,cAAc;AAtOtB,gBAAA;AAAA,EAA1B,SAAS,EAAC,MAAM,QAAA,CAAQ;AAAA,GADd,eACgB,WAAA,gBAAA,CAAA;AACD,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GAFb,eAEe,WAAA,WAAA,CAAA;AACA,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GAHb,eAGe,WAAA,oBAAA,CAAA;AACA,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GAJb,eAIe,WAAA,gBAAA,CAAA;AACA,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GALb,eAKe,WAAA,OAAA,CAAA;AACA,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GANb,eAMe,WAAA,UAAA,CAAA;AACA,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GAPb,eAOe,WAAA,UAAA,CAAA;AACA,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,OAAA,CAAO;AAAA,GARb,eAQe,WAAA,YAAA,CAAA;AAE1B,gBAAA;AAAA,EADC,SAAS,EAAC,MAAM,OAAO,WAAW,OAAM;AAAA,GAT9B,eAUX,WAAA,oBAAA,CAAA;AAIiB,gBAAA;AAAA,EAAhB,MAAA;AAAM,GAdI,eAcM,WAAA,kBAAA,CAAA;AACA,gBAAA;AAAA,EAAhB,MAAA;AAAM,GAfI,eAeM,WAAA,qBAAA,CAAA;AAfN,iBAAN,gBAAA;AAAA,EADN,cAAc,kBAAkB;AAAA,GACpB,cAAA;"}
1
+ {"version":3,"file":"compass-flat.js","sources":["../../../src/navigation-instruments/compass-flat/compass-flat.ts"],"sourcesContent":["import {LitElement, html, svg, SVGTemplateResult, unsafeCSS} from 'lit';\nimport componentStyle from './compass-flat.css?inline';\nimport {property, state} from 'lit/decorators.js';\nimport {Tickmark, TickmarkType} from '../watch-flat/tickmark-flat.js';\nimport '../watch-flat/watch-flat.js';\nimport {customElement} from '../../decorator.js';\nimport {Priority} from '../types.js';\nimport {\n RotType,\n LINEAR_DOT_ANGLE_SPACING,\n} from '../rate-of-turn/rot-renderer.js';\n\nexport {RotType};\n\nexport enum CompassFlatPriorityElement {\n hdg = 'hdg',\n cog = 'cog',\n rot = 'rot',\n}\n\nexport enum LabelPosition {\n top = -45,\n bottom = 50,\n}\n\nexport enum LabelStyle {\n regular = 'var(--instrument-tick-mark-secondary-color)',\n}\n\nexport interface Label {\n x: number;\n y: LabelPosition;\n text: string;\n}\n\n/**\n * `<obc-compass-flat>` — Horizontal strip compass with HDG/COG arrows and optional rate-of-turn indicator.\n *\n * Renders a flat (non-circular) compass strip that scrolls horizontally to\n * display the current heading. A filled HDG arrow sits at the center while a\n * hollow COG arrow is positioned at the angular difference. The strip\n * auto-scales its field of view so both arrows remain visible. Cardinal\n * labels (N, S, E, W) and tickmarks are generated at densities responsive to\n * the strip width.\n *\n * ## Features\n *\n * - **Auto-scaling FOV**: The visible compass range widens to keep both HDG\n * and COG arrows in view, bounded by `minFOV` / `maxFOV`.\n * - **HDG / COG arrows**: Filled (HDG) and hollow (COG) arrow SVGs positioned\n * along the strip.\n * - **FOV indicator**: Optional numeric labels showing the port/starboard\n * bearing range and current heading.\n * - **Rate of turn**: Animated linear ROT indicator (spinning dots or\n * horizontal bar) via `rotType`. When enabled, a bottom bar is added to\n * the strip to house the indicator.\n * - **Color priority**: Per-element priority for HDG, COG, and ROT via\n * `priorityElements`.\n *\n * @property {number} heading - Current heading in degrees.\n * @property {number} courseOverGround - Current COG in degrees.\n * @property {RotType|undefined} rotType - ROT display mode: `'dots'`, `'bar'`, or `undefined` (hidden).\n * @property {number} rotationsPerMinute - ROT spin speed; sign controls direction.\n * @property {number} rotMaxValue - Maximum ROT value for bar-extent mapping.\n * @property {number} rotArcExtent - Degrees of bar arc per max-value ROT (default 60).\n *\n * @ignition-base-height: 170px\n * @ignition-base-width: 512px\n */\n@customElement('obc-compass-flat')\nexport class ObcCompassFlat extends LitElement {\n @property({type: Boolean}) FOVIndicator: boolean = false;\n @property({type: Number}) heading = 0;\n @property({type: Number}) courseOverGround = 0;\n @property({type: Number}) tickInterval = 5;\n @property({type: Number}) FOV = 45;\n @property({type: Number}) minFOV = 45;\n @property({type: Number}) maxFOV = 180;\n @property({type: String}) priority: Priority = Priority.regular;\n @property({type: Array, attribute: false})\n priorityElements: CompassFlatPriorityElement[] = [\n CompassFlatPriorityElement.hdg,\n ];\n @property({type: String}) rotType: RotType | undefined;\n @property({type: Number}) rotationsPerMinute: number = 1;\n @property({type: Number}) rotMaxValue: number = 10;\n @property({type: Number}) rotArcExtent: number = 60;\n\n @state() private containerWidth = 0;\n @state() private maxContainerWidth = 0;\n\n private resizeObserver: ResizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n // Made by chatGPT so that the text is inside the wrapper\n this.maxContainerWidth = -125.36 + 3.79 * entry.contentRect.height;\n this.containerWidth = Math.min(\n entry.contentRect.width,\n this.maxContainerWidth\n );\n }\n });\n\n override connectedCallback() {\n super.connectedCallback();\n this.resizeObserver.observe(this);\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n this.resizeObserver.unobserve(this);\n }\n\n generateLabels() {\n if (this.containerWidth < 192) {\n return [];\n } else if (this.containerWidth <= 300) {\n return [\n {x: -180, y: LabelPosition.top, text: 'S'},\n {x: -90, y: LabelPosition.top, text: 'W'},\n {x: 0, y: LabelPosition.top, text: 'N'},\n {x: 90, y: LabelPosition.top, text: 'E'},\n {x: 180, y: LabelPosition.top, text: 'S'},\n {x: 270, y: LabelPosition.top, text: 'W'},\n {x: 360, y: LabelPosition.top, text: 'N'},\n {x: 450, y: LabelPosition.top, text: 'E'},\n {x: 540, y: LabelPosition.top, text: 'S'},\n ];\n } else {\n return [\n {x: -180, y: LabelPosition.top, text: 'S'},\n {x: -135, y: LabelPosition.top, text: 'SW'},\n {x: -90, y: LabelPosition.top, text: 'W'},\n {x: -45, y: LabelPosition.top, text: 'NW'},\n {x: 0, y: LabelPosition.top, text: 'N'},\n {x: 45, y: LabelPosition.top, text: 'NE'},\n {x: 90, y: LabelPosition.top, text: 'E'},\n {x: 135, y: LabelPosition.top, text: 'SE'},\n {x: 180, y: LabelPosition.top, text: 'S'},\n {x: 225, y: LabelPosition.top, text: 'SW'},\n {x: 270, y: LabelPosition.top, text: 'W'},\n {x: 315, y: LabelPosition.top, text: 'NW'},\n {x: 360, y: LabelPosition.top, text: 'N'},\n {x: 405, y: LabelPosition.top, text: 'NE'},\n {x: 450, y: LabelPosition.top, text: 'E'},\n {x: 495, y: LabelPosition.top, text: 'SE'},\n {x: 540, y: LabelPosition.top, text: 'S'},\n ];\n }\n }\n\n private generateIntervalTickmarks(scale: number): Tickmark[] {\n const tickmarks: Tickmark[] = [];\n let cardinalInterval = 90;\n\n if (this.containerWidth > 300) {\n cardinalInterval = 45;\n } else if (this.containerWidth < 192) {\n cardinalInterval = 0;\n }\n\n // Guard against zero/negative/non-finite interval to prevent infinite loops\n if (\n !this.tickInterval ||\n this.tickInterval <= 0 ||\n !Number.isFinite(this.tickInterval)\n ) {\n return tickmarks;\n }\n\n for (\n let angle = -180;\n angle < this.maxFOV * 3;\n angle += this.tickInterval\n ) {\n if (cardinalInterval !== 0 && angle % cardinalInterval === 0) {\n continue;\n }\n tickmarks.push({angle: angle * scale, type: TickmarkType.secondary});\n }\n\n return tickmarks;\n }\n\n private generateCardinalTickmarks(\n scale: number,\n labels: Label[]\n ): Tickmark[] {\n const tickmarks: Tickmark[] = [];\n\n for (const label of labels) {\n tickmarks.push({angle: label.x * scale, type: TickmarkType.main});\n }\n\n return tickmarks;\n }\n\n private generateTickmarks(scale: number, labels: Label[]): Tickmark[] {\n return [\n ...this.generateCardinalTickmarks(scale, labels),\n ...this.generateIntervalTickmarks(scale),\n ];\n }\n\n private renderFOVIndicator(): SVGTemplateResult[] {\n const indicators: SVGTemplateResult[] = [];\n\n const maxAdjustment = 10;\n const minContainerWidth = 300;\n const maxContainerWidth = 512;\n\n let yAdjustment = 0;\n if (this.containerWidth < maxContainerWidth) {\n const widthRange = maxContainerWidth - minContainerWidth;\n const scaleFactor =\n (maxContainerWidth - this.containerWidth) / widthRange;\n yAdjustment = scaleFactor * maxAdjustment;\n }\n\n const y = LabelPosition.bottom + yAdjustment + (this.rotType ? 12 : 0);\n\n indicators.push(svg`\n <text x=\"-175\" y=${y} class=\"label left\" fill=${LabelStyle.regular}>\n ${-this.FOV}\\u00B0\n </text>`);\n\n indicators.push(svg`\n <text x=\"0\" y=${y} class=\"label\" fill=${LabelStyle.regular}>\n ${this.heading}\\u00B0\n </text>`);\n\n indicators.push(svg`\n <text x=\"175\" y=${y} class=\"label right\" fill=${LabelStyle.regular}>\n ${this.FOV}\\u00B0\n </text>`);\n\n return indicators;\n }\n\n private priorityFor(element: CompassFlatPriorityElement): Priority {\n const selected = Array.isArray(this.priorityElements)\n ? this.priorityElements\n : [];\n return selected.includes(element) ? this.priority : Priority.regular;\n }\n\n private arrowColorFor(element: CompassFlatPriorityElement): string {\n return this.priorityFor(element) === Priority.enhanced\n ? 'var(--instrument-enhanced-secondary-color)'\n : 'var(--instrument-regular-secondary-color)';\n }\n\n private get HDGSvg(): SVGTemplateResult {\n return svg`<g transform=\"translate(-24, -74)\">\n <path d=\"M36.7011 44.1445L36.6898 44.1379L36.6781 44.1318L24.2301 37.6823L24.0001 37.5631L23.7701 37.6823L11.3221 44.1318L11.3104 44.1379L11.2991 44.1445C9.25497 45.3438 6.78661 43.308 7.68828 41.0919L22.6036 4.43285C23.1096 3.18905 24.8906 3.18905 25.3967 4.43284L40.3119 41.0919C41.2136 43.308 38.7452 45.3438 36.7011 44.1445Z\" fill=\"${this.arrowColorFor(CompassFlatPriorityElement.hdg)}\" stroke=\"var(--border-silhouette-color)\"/>\n </g>`;\n }\n\n private COGSvg(translation: number): SVGTemplateResult {\n return svg`\n <g transform=\"translate(${-24 + translation}, -74)\">\n <path d=\"M31.9025 36.0262L33.1068 36.6502L32.5956 35.3938L24.4632 15.406L24.0001 14.2677L23.537 15.406L15.4046 35.3938L14.8935 36.6502L16.0978 36.0262L24.0001 31.9319L31.9025 36.0262ZM36.7011 44.1445L36.6898 44.1379L36.6781 44.1318L24.2301 37.6823L24.0001 37.5631L23.7701 37.6823L11.3221 44.1318L11.3104 44.1379L11.2991 44.1445C9.25497 45.3438 6.78661 43.308 7.68828 41.0919L22.6036 4.43285C23.1096 3.18905 24.8906 3.18905 25.3967 4.43284L40.3119 41.0919C41.2136 43.308 38.7452 45.3438 36.7011 44.1445Z\" fill=\"${this.arrowColorFor(CompassFlatPriorityElement.cog)}\" stroke=\"var(--border-silhouette-color)\"/>\n </g>\n `;\n }\n\n override render() {\n let angleDiff = this.courseOverGround - this.heading;\n\n if (angleDiff > this.maxFOV) {\n angleDiff -= 360;\n } else if (angleDiff < -this.maxFOV) {\n angleDiff += 360;\n }\n\n this.FOV = Math.max(this.minFOV, Math.abs(angleDiff));\n\n const baseOffset = 5;\n const translationScale = (baseOffset * 35) / this.FOV;\n\n const translation = angleDiff * translationScale;\n const labels = this.generateLabels();\n const tickmarks = this.generateTickmarks(translationScale, labels);\n const scaledLabels = labels.map((l) => ({\n ...l,\n x: l.x * translationScale,\n }));\n\n const hasBottomBar = !!this.rotType;\n const arrowViewBoxY = hasBottomBar\n ? -128 + Math.round((12 * 384) / 352)\n : -128;\n const viewBox = `-192 ${arrowViewBoxY} 384 128`;\n\n return html`\n <div class=\"container\" style=\"max-width:${this.maxContainerWidth}px\">\n <obc-watch-flat\n .FOVIndicator=${this.FOVIndicator ? this.renderFOVIndicator() : []}\n .labels=${scaledLabels}\n .rotation=${this.heading}\n .tickmarks=${tickmarks}\n .tickmarkSpacing=${translationScale}\n .bottomBar=${!!this.rotType}\n .rotType=${this.rotType}\n .rotStartX=${0}\n .rotEndX=${(this.rotationsPerMinute / (this.rotMaxValue || 1)) *\n this.rotArcExtent *\n translationScale}\n .rotDotSpacing=${LINEAR_DOT_ANGLE_SPACING * translationScale}\n .rotationsPerMinute=${this.rotationsPerMinute}\n .rotPriority=${this.priorityFor(CompassFlatPriorityElement.rot)}\n ></obc-watch-flat>\n <svg viewBox=${viewBox} xmlns=\"http://www.w3.org/2000/svg\">\n ${this.HDGSvg}${this.COGSvg(translation)}\n </svg>\n </div>\n `;\n }\n\n static override styles = unsafeCSS(componentStyle);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'obc-compass-flat': ObcCompassFlat;\n }\n}\n"],"names":["CompassFlatPriorityElement","LabelPosition","LabelStyle"],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { css } from "lit";
2
+ const componentStyle = css`
3
+ * {
4
+ -webkit-tap-highlight-color: transparent;
5
+ }
6
+
7
+ * {
8
+ box-sizing: border-box;
9
+ }
10
+
11
+ .container {
12
+ position: relative;
13
+ width: 100%;
14
+ height: 100%;
15
+ }
16
+
17
+ .container > * {
18
+ position: absolute;
19
+ top: 0;
20
+ left: 0;
21
+ width: 100%;
22
+ height: 100%;
23
+ }
24
+
25
+ :host {
26
+ display: block;
27
+ width: 100%;
28
+ height: 100%;
29
+ }
30
+ `;
31
+ export {
32
+ componentStyle as default
33
+ };
34
+ //# sourceMappingURL=compass-sector.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compass-sector.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,101 @@
1
+ import { LitElement, PropertyValues } from 'lit';
2
+ import { AngleAdvice } from '../watch/advice.js';
3
+ import { RotType, RotPosition } from '../watch/watch.js';
4
+ import { InstrumentState, Priority } from '../types.js';
5
+ import '../watch/watch.js';
6
+ export { RotType, RotPosition };
7
+ export declare enum CompassSectorPriorityElement {
8
+ hdg = "hdg",
9
+ cog = "cog",
10
+ rot = "rot"
11
+ }
12
+ /**
13
+ * `<obc-compass-sector>` — Curved compass strip that auto‑scales to keep HDG and COG visible.
14
+ *
15
+ * Renders a fixed 120° arc of a triple‑ring compass face. The visible
16
+ * compass range (field of view) adjusts automatically so that both the
17
+ * heading (HDG) and course‑over‑ground (COG) arrows are always in view.
18
+ * This is the radial equivalent of `<obc-compass-flat>`: the arc shape
19
+ * never changes — only the scale (compass‑degrees per arc‑degree) changes.
20
+ *
21
+ * ## Features
22
+ *
23
+ * - **Fixed 120° arc**: The watch face is always a 120° sector (±60° from
24
+ * center), identical in shape to `<obc-rot-sector>`.
25
+ * - **FOV auto‑scaling**: The field of view widens when the HDG–COG
26
+ * angular difference grows, compressing more compass degrees into the
27
+ * fixed arc. Tickmark density adjusts automatically.
28
+ * - **HDG / COG arrows**: Solid (HDG) arrow is always at the arc center.
29
+ * Hollow (COG) arrow is positioned proportionally within the arc.
30
+ * - **North arrow**: A gray triangle in the outer scale band indicates
31
+ * north when it falls within the visible FOV.
32
+ * - **Heading setpoint**: Optional setpoint marker with auto at‑setpoint
33
+ * detection and confirm animation, positioned at the mapped arc angle.
34
+ * - **Advice zones**: Pass `headingAdvices` to render caution/alert arcs,
35
+ * mapped into the scaled arc.
36
+ * - **Rate of turn**: Animated ROT indicator (dots or bar) spanning from
37
+ * HDG to the mapped COG position, clipped to the arc.
38
+ * - **Zoom to fit**: When `zoomToFitArc` is `true`, the fixed 120° arc is
39
+ * enlarged to fill the available space.
40
+ *
41
+ * ## Usage Guidelines
42
+ *
43
+ * - Set `heading` and `courseOverGround` to sensor values in degrees.
44
+ * - Adjust `minFOV` to control the minimum zoom level (default 30°).
45
+ * - Enable `zoomToFitArc` to enlarge the arc to fill the viewport.
46
+ * - For a full‑circle compass, use `<obc-compass>` instead.
47
+ *
48
+ * @fires None
49
+ */
50
+ export declare class ObcCompassSector extends LitElement {
51
+ heading: number;
52
+ courseOverGround: number;
53
+ headingSetpoint: number | null;
54
+ newHeadingSetpoint: number | undefined;
55
+ atHeadingSetpoint: boolean;
56
+ headingSetpointAtZeroDeadband: number;
57
+ headingSetpointOverride: boolean;
58
+ autoAtHeadingSetpoint: boolean;
59
+ autoAtHeadingSetpointDeadband: number;
60
+ animateSetpoint: boolean;
61
+ touching: boolean;
62
+ headingAdvices: AngleAdvice[];
63
+ minFOV: number;
64
+ rotType: RotType | undefined;
65
+ rotPosition: RotPosition;
66
+ rotationsPerMinute: number;
67
+ rotMaxValue: number;
68
+ state: InstrumentState;
69
+ priority: Priority;
70
+ priorityElements: CompassSectorPriorityElement[];
71
+ tickmarksInside: boolean;
72
+ zoomToFitArc: boolean;
73
+ private _headingSp;
74
+ private _halfFOV;
75
+ private _arcHalfExtent;
76
+ private _scale;
77
+ private _radiusOffset;
78
+ private _cachedViewBox;
79
+ private _cachedArcFrame;
80
+ private _cachedAreas;
81
+ private _cachedTickmarks;
82
+ private _cachedAdvices;
83
+ willUpdate(changed: PropertyValues): void;
84
+ disconnectedCallback(): void;
85
+ private _mapAngle;
86
+ private _buildTickmarks;
87
+ private _computeViewBox;
88
+ private _renderNorthArrow;
89
+ private _angleInRange;
90
+ private _buildAdvices;
91
+ private get _rotEndAngle();
92
+ private priorityFor;
93
+ render(): import('lit-html').TemplateResult<1>;
94
+ static styles: import('lit').CSSResult;
95
+ }
96
+ declare global {
97
+ interface HTMLElementTagNameMap {
98
+ 'obc-compass-sector': ObcCompassSector;
99
+ }
100
+ }
101
+ //# sourceMappingURL=compass-sector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compass-sector.d.ts","sourceRoot":"","sources":["../../../src/navigation-instruments/compass-sector/compass-sector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAE,cAAc,EAAgC,MAAM,KAAK,CAAC;AAG9E,OAAO,mBAAmB,CAAC;AAG3B,OAAO,EAAc,WAAW,EAAiB,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAKL,OAAO,EACP,WAAW,EACZ,MAAM,mBAAmB,CAAC;AAO3B,OAAO,EAAC,eAAe,EAAE,QAAQ,EAAC,MAAM,aAAa,CAAC;AACtD,OAAO,EAAC,OAAO,EAAE,WAAW,EAAC,CAAC;AAE9B,oBAAY,4BAA4B;IACtC,GAAG,QAAQ;IACX,GAAG,QAAQ;IACX,GAAG,QAAQ;CACZ;AA8BD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,qBACa,gBAAiB,SAAQ,UAAU;IACpB,OAAO,SAAK;IACZ,gBAAgB,SAAK;IAErB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAQ;IACtC,kBAAkB,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,iBAAiB,EAAE,OAAO,CAAS;IACpC,6BAA6B,EAAE,MAAM,CAAO;IAC3C,uBAAuB,EAAE,OAAO,CAAS;IACvB,qBAAqB,UAAQ;IAChD,6BAA6B,EAAE,MAAM,CAAK;IACzC,eAAe,EAAE,OAAO,CAAS;IACjC,QAAQ,EAAE,OAAO,CAAS;IACV,cAAc,EAAE,WAAW,EAAE,CAAM;IAEpD,MAAM,EAAE,MAAM,CAAM;IAEpB,OAAO,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,WAAW,EAAE,WAAW,CAA2B;IACnD,kBAAkB,EAAE,MAAM,CAAK;IAC/B,WAAW,EAAE,MAAM,CAAM;IAEzB,KAAK,EAAE,eAAe,CAA0B;IAChD,QAAQ,EAAE,QAAQ,CAAoB;IAEhE,gBAAgB,EAAE,4BAA4B,EAAE,CAE9C;IACyB,eAAe,EAAE,OAAO,CAAS;IACjC,YAAY,EAAE,OAAO,CAAS;IAEzD,OAAO,CAAC,UAAU,CAGf;IAGH,OAAO,CAAC,QAAQ,CAAM;IACtB,OAAO,CAAC,cAAc,CAAmB;IACzC,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,cAAc,CAAM;IAC5B,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,YAAY,CAAmB;IACvC,OAAO,CAAC,gBAAgB,CAAkB;IAC1C,OAAO,CAAC,cAAc,CAAwB;IAErC,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IA8DzC,oBAAoB,IAAI,IAAI;IASrC,OAAO,CAAC,SAAS;IAejB,OAAO,CAAC,eAAe;IAmDvB,OAAO,CAAC,eAAe;IAyBvB,OAAO,CAAC,iBAAiB;IAqBzB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,aAAa;IAgBrB,OAAO,KAAK,YAAY,GAIvB;IAED,OAAO,CAAC,WAAW;IAWV,MAAM;IAkEf,OAAgB,MAAM,0BAA6B;CACpD;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,oBAAoB,EAAE,gBAAgB,CAAC;KACxC;CACF"}