@oicl/openbridge-webcomponents 2.0.0-next.105 → 2.0.0-next.106

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.
@@ -1 +1 @@
1
- {"version":3,"file":"pitch-roll.js","sources":["../../../src/navigation-instruments/pitch-roll/pitch-roll.ts"],"sourcesContent":["import {LitElement, css, html, nothing, svg} from 'lit';\nimport {property} from 'lit/decorators.js';\nimport '../watch/watch.js';\nimport {\n VesselImage,\n VesselImageSize,\n WatchCircleType,\n type WatchArea,\n OUTER_RING_RADIUS,\n innerRingRadiusFor,\n vesselImages,\n} from '../watch/watch.js';\nimport {arcTickmarks, TickmarkType} from '../watch/tickmark.js';\nimport {AdviceState, AdviceType, AngleAdviceRaw} from '../watch/advice.js';\nimport {customElement} from '../../decorator.js';\nimport {Priority} from '../types.js';\nimport {\n centerReadoutStyles,\n renderCenterReadouts,\n} from '../readout/center-readout.js';\nimport {ReadoutSize} from '../readout/readout.js';\nimport {\n computeZoomToFitArcFrame,\n normalizeArcAngle,\n shiftArcFrameToOuterEdge,\n} from '../../svghelpers/arc-frame.js';\n\nexport enum PitchRollPriorityElement {\n pitch = 'pitch',\n roll = 'roll',\n}\n\n/** Half-side of the centre overlay viewBox in SVG units. */\nconst CENTRE_HALF = 200;\n\n/**\n * Minimum diagonal Euclidean distance (in central-layer / display\n * pixels on the default 400 px container) required between adjacent\n * zoomed arc bands' nearest corners (inner-to-inner and outer-to-outer\n * checked, the smaller binds). When two adjacent requested arcs would\n * sit closer than this — or actually overlap — both axes' visible arcs\n * are shortened (ratio-preserving so `aP : aR = pitchReq : rollReq`)\n * just enough to reach this clearance. The frame itself stays\n * unchanged so band thickness, position and zoom level keep matching\n * the standalone `obc-pitch` / `obc-roll` instruments.\n */\nconst CORNER_GAP_PX = 32;\n\n/** Numerical safety floor when an axis arc has to collapse for clearance. */\nconst MIN_ARC_HALF_DEG = 2;\n\n/**\n * @stable\n */\n@customElement('obc-pitch-roll')\nexport class ObcPitchRoll extends LitElement {\n @property({type: Number}) pitch = 0;\n @property({type: Number}) roll = 0;\n @property({type: Number}) minAvgPitch = 0;\n @property({type: Number}) maxAvgPitch = 0;\n @property({type: Number}) minAvgRoll = 0;\n @property({type: Number}) maxAvgRoll = 0;\n @property({type: String}) vesselImageFore: VesselImage = VesselImage.psvFore;\n @property({type: String}) vesselImageSide: VesselImage = VesselImage.psvSide;\n @property({type: Number}) scaleForeImage = 1;\n @property({type: Number}) maxPitchAdvice: number | undefined = undefined;\n @property({type: Number}) maxRollAdvice: number | undefined = undefined;\n /** @availableWhen maxPitchAdvice!=undefined */\n @property({type: Boolean}) triggerPitchAdvice = false;\n /** @availableWhen maxRollAdvice!=undefined */\n @property({type: Boolean}) triggerRollAdvice = false;\n @property({type: String}) priority: Priority = Priority.regular;\n @property({type: Array, attribute: false})\n priorityElements: PitchRollPriorityElement[] = [\n PitchRollPriorityElement.pitch,\n PitchRollPriorityElement.roll,\n ];\n /**\n * When `true`, the centre shows two stacked `<obc-readout>`s (pitch above\n * roll) instead of the vessel images. Default `false`.\n */\n @property({type: Boolean}) hasReadout: boolean = false;\n /**\n * Label for the pitch readout. Default `Pitch`.\n * @availableWhen hasReadout==true\n */\n @property({type: String}) pitchLabel = 'Pitch';\n /**\n * Label for the roll readout. Default `Roll`.\n * @availableWhen hasReadout==true\n */\n @property({type: String}) rollLabel = 'Roll';\n /**\n * Unit shown in both readouts. Default `DEG`.\n * @availableWhen hasReadout==true\n */\n @property({type: String}) unit = 'DEG';\n /**\n * Number of fraction digits shown in both readouts. Default `0`.\n * @availableWhen hasReadout==true\n */\n @property({type: Number}) fractionDigits = 0;\n @property({type: Boolean}) zoomToFitArc: boolean = false;\n /**\n * Half-extent of each of the four watch arcs in degrees, measured from the\n * arc's natural center (0°/90°/180°/270°). Each arc spans\n * `center ± arcAngle`. Default `30` reproduces the historical 60°-wide\n * arcs; smaller values produce narrower arcs that, combined with\n * `zoomToFitArc`, reveal more detail in the relevant motion range.\n */\n @property({type: Number}) arcAngle: number = 30;\n /**\n * Optional per-axis override for the pitch arcs (top + bottom). Falls\n * back to {@link arcAngle} when undefined. Useful for rectangular layouts\n * where pitch and roll need different angular extents.\n */\n @property({type: Number}) pitchArcAngle?: number;\n /**\n * Optional per-axis override for the roll arcs (left + right). Falls\n * back to {@link arcAngle} when undefined.\n */\n @property({type: Number}) rollArcAngle?: number;\n\n private priorityFor(element: PitchRollPriorityElement): 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 needleColor(element: PitchRollPriorityElement): string {\n return this.priorityFor(element) === Priority.enhanced\n ? 'var(--instrument-enhanced-secondary-color)'\n : 'var(--instrument-regular-secondary-color)';\n }\n\n private barColor(element: PitchRollPriorityElement): string {\n return this.priorityFor(element) === Priority.enhanced\n ? 'var(--instrument-enhanced-tertiary-color)'\n : 'var(--instrument-regular-tertiary-color)';\n }\n\n private get normalizedScaleForeImage(): number {\n if (!Number.isFinite(this.scaleForeImage)) {\n return 1;\n }\n return Math.max(0, Math.min(2, this.scaleForeImage));\n }\n\n /** Requested (clamped to a minimum) half-extent for each axis. */\n private get requestedPitchArcAngle(): number {\n return normalizeArcAngle(this.pitchArcAngle ?? this.arcAngle, 30);\n }\n private get requestedRollArcAngle(): number {\n return normalizeArcAngle(this.rollArcAngle ?? this.arcAngle, 30);\n }\n\n override render() {\n const pitchReq = this.requestedPitchArcAngle;\n const rollReq = this.requestedRollArcAngle;\n const areas = [\n {\n startAngle: 90 - pitchReq,\n endAngle: 90 + pitchReq,\n roundOutsideCut: true,\n roundInsideCut: true,\n },\n {\n startAngle: 270 - pitchReq,\n endAngle: 270 + pitchReq,\n roundOutsideCut: true,\n roundInsideCut: true,\n },\n {\n startAngle: 360 - rollReq,\n endAngle: rollReq,\n roundOutsideCut: true,\n roundInsideCut: true,\n },\n {\n startAngle: 180 - rollReq,\n endAngle: 180 + rollReq,\n roundOutsideCut: true,\n roundInsideCut: true,\n },\n ];\n\n const overlayViewBox = `-${CENTRE_HALF} -${CENTRE_HALF} ${CENTRE_HALF * 2} ${CENTRE_HALF * 2}`;\n const vesselScale = 224 / 160;\n\n return html`\n <div class=\"container\">\n <svg viewBox=\"${overlayViewBox}\">\n ${this.hasReadout\n ? nothing\n : svg`\n <line\n x1=\"-150\"\n y1=\"0\"\n x2=\"150\"\n y2=\"0\"\n stroke=\"var(--instrument-frame-tertiary-color)\"\n />\n <g\n style=\"transform: rotate(${this.pitch}deg) scale(${vesselScale}) translate(-80px, -80px);\"\n >\n ${this.zoomToFitArc ? vesselImages[this.vesselImageSide] : nothing}\n </g>\n <g\n style=\"transform: rotate(${this.roll}deg) scale(${vesselScale * this.normalizedScaleForeImage}) translate(-80px, -80px);\"\n >\n ${this.zoomToFitArc ? vesselImages[this.vesselImageFore] : nothing}\n </g>\n `}\n </svg>\n ${this.zoomToFitArc\n ? this.renderZoomedArcs(pitchReq, rollReq)\n : this.renderFullWatch(areas)}\n ${this.hasReadout\n ? html`<div class=\"readout\">\n ${renderCenterReadouts([\n {\n value: this.pitch,\n label: this.pitchLabel,\n unit: this.unit,\n fractionDigits: this.fractionDigits,\n size: ReadoutSize.large,\n priority: this.priorityFor(PitchRollPriorityElement.pitch),\n },\n {\n value: this.roll,\n label: this.rollLabel,\n unit: this.unit,\n fractionDigits: this.fractionDigits,\n size: ReadoutSize.large,\n priority: this.priorityFor(PitchRollPriorityElement.roll),\n },\n ])}\n </div>`\n : nothing}\n </div>\n `;\n }\n\n /**\n * Zoomed-arc layer: four CSS-rotated `<obc-watch>` instances, each\n * containing a single arc rendered at the watch's natural top\n * (`0° ± arcAngle`). Each watch handles its own `zoomToFitArc` framing\n * so each visible arc spans almost the full container — exactly like the\n * pitch and roll narrow stories. The four are rotated 0 / 90 / 180 / 270\n * to land at top / right / bottom / left. Top + bottom carry pitch data,\n * left + right carry roll data.\n *\n * Each axis can request its own half-extent via `pitchArcAngle` /\n * `rollArcAngle`. The zoom-fit frame for each axis is computed with the\n * EXACT same math as `obc-pitch` / `obc-roll` at the requested\n * half-extent (same band thickness, same zoom level, same position) so\n * each cardinal sub-watch matches its standalone equivalent. With the\n * frames left untouched, two requested arcs may overlap at the\n * diagonals; to avoid that, both arcs are shortened (ratio-preserving:\n * `aP : aR = pitchReq : rollReq`) just enough that the diagonal\n * Euclidean distance between adjacent inner BBOX corners equals\n * {@link CORNER_GAP_PX}. The shortened half-extent is passed only to\n * the band's `areas` (and clamped advices) so the sub-watch renders a\n * shorter band with its native rounded end-caps; the frame itself is\n * unchanged.\n */\n private renderZoomedArcs(pitchReq: number, rollReq: number) {\n // ---- Per-axis zoom-fit frames (requested half-extents) -------------\n const ext = 48;\n const targetSize = (176 + ext) * 2;\n const innerNat = innerRingRadiusFor(WatchCircleType.double);\n const buildFrame = (halfDeg: number) => {\n const areas: WatchArea[] = [\n {\n startAngle: -halfDeg,\n endAngle: halfDeg,\n roundOutsideCut: true,\n roundInsideCut: true,\n },\n ];\n const baseFrame = computeZoomToFitArcFrame({\n areas,\n outerRadius: OUTER_RING_RADIUS,\n innerRadius: innerNat,\n extension: ext,\n targetSize,\n });\n const subArcFrame = shiftArcFrameToOuterEdge(\n baseFrame,\n OUTER_RING_RADIUS + baseFrame.radiusOffset,\n OUTER_RING_RADIUS,\n CENTRE_HALF\n );\n // Display scale: how many container px per obc-watch SVG unit.\n const scale = (CENTRE_HALF * 2) / subArcFrame.width;\n // Outer- and inner-arc circle radii of the band, in central\n // (container) px. The watch renders the area between\n // (OUTER_RING_RADIUS + radiusOffset) and (innerRingRadius +\n // radiusOffset), so radiusOffset shifts BOTH radii (band\n // thickness stays constant). Both arcs are centred at the watch's\n // SVG origin; that origin sits at central-coords (0, outerR-OR)\n // along the band's cardinal direction (= outerR-OR below centre\n // for the top band).\n const outerR = (OUTER_RING_RADIUS + baseFrame.radiusOffset) * scale;\n const innerR = (innerNat + baseFrame.radiusOffset) * scale;\n return {subArcFrame, outerR, innerR};\n };\n // Frames are built at the REQUESTED half-extents — identical to\n // what `obc-pitch` / `obc-roll` produce when `zoomToFitArc=true`.\n // Each cardinal sub-watch therefore matches its standalone\n // equivalent (band thickness, length, position, zoom level).\n const pitchFrame = buildFrame(pitchReq);\n const rollFrame = buildFrame(rollReq);\n\n // ---- Method A: shorten visible arc to clear adjacent corners --------\n // The frames stay UNCHANGED; only the half-extent passed to the\n // band's `areas` shrinks. obc-watch then renders a shorter arc with\n // its native rounded end-caps — same band thickness, same position,\n // same zoom level.\n //\n // Geometry of one band (top, cardinal = -y in container coords):\n // outer-edge endpoint at angle θ from cardinal\n // P_out(θ) = (outerR·sin θ, (outerR − OR) − outerR·cos θ)\n // inner-edge endpoint at angle θ\n // P_in(θ) = (innerR·sin θ, (outerR − OR) − innerR·cos θ)\n // The right band is the same template rotated 90° CW\n // (CSS rotate(90deg)): (x, y) → (−y, x).\n //\n // For pitch–roll layout the binding constraint is the diagonal\n // gap between the top band's right corners and the right band's\n // top corners (and analogously for the other three diagonals). Two\n // pairs need to clear each other:\n // (a) inner-corner vs inner-corner (P1 = P_in_top(+aP),\n // Q1 = rotate(P_in_right(−aR)))\n // (b) outer-corner vs outer-corner (P2 = P_out_top(+aP),\n // Q2 = rotate(P_out_right(−aR)))\n // Cap-line endpoints lie on the same arcs so any other point on\n // the cap is at least as far away.\n //\n // Define a SIGNED diagonal gap: positive when the two corners are\n // diagonally clear (both Δx > 0 AND Δy > 0), negative when either\n // projection has crossed (i.e. the bands overlap). Its magnitude\n // is the Euclidean distance between the corner pair. We bisect on\n // a scalar s ∈ [0, 1] (aP = pitchReq·s, aR = rollReq·s) so the\n // requested pitch:roll RATIO is preserved, until the MIN of the\n // inner and outer signed gaps equals CORNER_GAP_PX.\n const OR = OUTER_RING_RADIUS;\n const aPreqRad = (pitchReq * Math.PI) / 180;\n const aRreqRad = (rollReq * Math.PI) / 180;\n const signedDist = (\n px: number,\n py: number,\n qx: number,\n qy: number\n ): number => {\n const dx = qx - px;\n const dy = qy - py;\n const mag = Math.hypot(dx, dy);\n return dx > 0 && dy > 0 ? mag : -mag;\n };\n const cornerGaps = (\n apRad: number,\n arRad: number\n ): {inner: number; outer: number} => {\n const cosP = Math.cos(apRad);\n const sinP = Math.sin(apRad);\n const cosR = Math.cos(arRad);\n const sinR = Math.sin(arRad);\n // Top band's right corners (container coords).\n const p1x = pitchFrame.innerR * sinP;\n const p1y = pitchFrame.outerR - OR - pitchFrame.innerR * cosP;\n const p2x = pitchFrame.outerR * sinP;\n const p2y = pitchFrame.outerR - OR - pitchFrame.outerR * cosP;\n // Right band's top corners = top template's left corners rotated\n // 90° CW: (x, y) → (−y, x).\n // Top template's −aR inner corner: (−innerR·sin aR,\n // (outerR−OR) − innerR·cos aR) → rotated:\n // (OR − outerR + innerR·cos aR, −innerR·sin aR)\n const q1x = OR - rollFrame.outerR + rollFrame.innerR * cosR;\n const q1y = -rollFrame.innerR * sinR;\n const q2x = OR - rollFrame.outerR + rollFrame.outerR * cosR;\n const q2y = -rollFrame.outerR * sinR;\n return {\n inner: signedDist(p1x, p1y, q1x, q1y),\n outer: signedDist(p2x, p2y, q2x, q2y),\n };\n };\n const minGap = (apRad: number, arRad: number): number => {\n const g = cornerGaps(apRad, arRad);\n return Math.min(g.inner, g.outer);\n };\n let aP = aPreqRad;\n let aR = aRreqRad;\n if (minGap(aPreqRad, aRreqRad) < CORNER_GAP_PX) {\n let lo = 0;\n let hi = 1;\n for (let i = 0; i < 40; i++) {\n const mid = (lo + hi) / 2;\n if (minGap(aPreqRad * mid, aRreqRad * mid) >= CORNER_GAP_PX) {\n lo = mid;\n } else {\n hi = mid;\n }\n }\n aP = aPreqRad * lo;\n aR = aRreqRad * lo;\n }\n const pitchClampedDeg = Math.max(MIN_ARC_HALF_DEG, (aP * 180) / Math.PI);\n const rollClampedDeg = Math.max(MIN_ARC_HALF_DEG, (aR * 180) / Math.PI);\n\n const subAreas = (halfDeg: number): WatchArea[] => [\n {\n startAngle: -halfDeg,\n endAngle: halfDeg,\n roundOutsideCut: true,\n roundInsideCut: true,\n },\n ];\n const pitchAreas = subAreas(pitchClampedDeg);\n const rollAreas = subAreas(rollClampedDeg);\n\n const pitchAdvices = this.subAdvices('pitch', pitchClampedDeg);\n const rollAdvices = this.subAdvices('roll', rollClampedDeg);\n\n // Ladders span the CLAMPED extent so ticks never fall outside the band\n // that is actually drawn (or outside the sector clip below).\n const pitchTickmarks = [\n {angle: 0, type: TickmarkType.main},\n ...arcTickmarks(0, pitchClampedDeg),\n ];\n const rollTickmarks = [\n {angle: 0, type: TickmarkType.main},\n ...arcTickmarks(0, rollClampedDeg),\n ];\n\n // Clip each sub-watch to the angular sector actually covered by the\n // (possibly shortened) arc so the indicator pill and bar end-of-range\n // limit lines cannot leak past the visible band when the value falls\n // outside the clamped range. Advices are clamped to the band extent\n // in `subAdvices` so they fit naturally and are not affected by this\n // clip. The clip is a triangle in the element's CSS box, with one\n // vertex at the watch origin (SVG 0,0 mapped to CSS px) and two\n // vertices at the intersection of the sector edges with the top edge\n // of the box. Applied in unrotated local coords; CSS rotation then\n // carries it to the correct cardinal side.\n const sectorClip = (\n halfDeg: number,\n frame: typeof rollFrame.subArcFrame\n ): string => {\n // Watch origin (SVG 0,0) in CSS percentages of the element box.\n // Element fills the 100% × 100% .container; obc-watch fills it with\n // viewBox = frame.{x,y,width,height}, so SVG (0,0) sits at:\n // (-frame.x / frame.width, -frame.y / frame.height)\n const oxPct = (-frame.x / frame.width) * 100;\n const oyPct = (-frame.y / frame.height) * 100;\n // Sector half-angle, expressed as the horizontal offset (in pct)\n // a ray reaches when traveling from the origin up to the top edge.\n const dxPct = oyPct * Math.tan((halfDeg * Math.PI) / 180);\n // Clamp to box bounds so half-angles ≥ 45° still produce a polygon\n // that reaches the corners instead of going off-canvas.\n const lx = Math.max(0, oxPct - dxPct);\n const rx = Math.min(100, oxPct + dxPct);\n return `polygon(${oxPct}% ${oyPct}%, ${lx}% 0%, ${rx}% 0%)`;\n };\n const pitchClip = sectorClip(pitchClampedDeg, pitchFrame.subArcFrame);\n const rollClip = sectorClip(rollClampedDeg, rollFrame.subArcFrame);\n\n const rollNeedles = [\n {\n angle: this.roll,\n fillColor: this.needleColor(PitchRollPriorityElement.roll),\n strokeColor: 'var(--border-silhouette-color)',\n },\n ];\n const pitchNeedles = [\n {\n angle: this.pitch,\n fillColor: this.needleColor(PitchRollPriorityElement.pitch),\n strokeColor: 'var(--border-silhouette-color)',\n },\n ];\n const rollBars = [\n {\n startAngle: this.minAvgRoll,\n endAngle: this.maxAvgRoll,\n fillColor: this.barColor(PitchRollPriorityElement.roll),\n },\n ];\n const pitchBars = [\n {\n startAngle: this.minAvgPitch,\n endAngle: this.maxAvgPitch,\n fillColor: this.barColor(PitchRollPriorityElement.pitch),\n },\n ];\n\n const subWatch = (\n rotation: number,\n arcFrame: typeof rollFrame.subArcFrame,\n areas: WatchArea[],\n barAreas: typeof rollBars,\n needles: typeof rollNeedles,\n advices: AngleAdviceRaw[],\n clipPath: string,\n tickmarks: typeof rollTickmarks\n ) => html`\n <obc-watch\n class=\"sub-watch\"\n style=\"transform: rotate(${rotation}deg); clip-path: ${clipPath};\"\n .watchCircleType=${WatchCircleType.double}\n .zoomToFitArc=${true}\n .arcFrame=${arcFrame}\n .areas=${areas}\n .barAreas=${barAreas}\n .needles=${needles}\n .vessels=${[]}\n .tickmarks=${tickmarks}\n .advices=${advices}\n ></obc-watch>\n `;\n\n return html`\n ${subWatch(\n 0,\n rollFrame.subArcFrame,\n rollAreas,\n rollBars,\n rollNeedles,\n rollAdvices,\n rollClip,\n rollTickmarks\n )}\n ${subWatch(\n 90,\n pitchFrame.subArcFrame,\n pitchAreas,\n pitchBars,\n pitchNeedles,\n pitchAdvices,\n pitchClip,\n pitchTickmarks\n )}\n ${subWatch(\n 180,\n rollFrame.subArcFrame,\n rollAreas,\n rollBars,\n rollNeedles,\n rollAdvices,\n rollClip,\n rollTickmarks\n )}\n ${subWatch(\n 270,\n pitchFrame.subArcFrame,\n pitchAreas,\n pitchBars,\n pitchNeedles,\n pitchAdvices,\n pitchClip,\n pitchTickmarks\n )}\n `;\n }\n\n /**\n * Caution advices for a single sub-watch axis, emitted at sub-watch local\n * angles (centred on 0°). The outer extent is clamped to the actually\n * rendered band half-extent (`halfDeg`) so advices fit naturally inside\n * the visible arc and are not visually cropped by the sub-watch's sector\n * clip-path. The clip-path itself remains in place to crop the needle.\n */\n private subAdvices(\n axis: 'pitch' | 'roll',\n halfDeg: number\n ): AngleAdviceRaw[] {\n const advices: AngleAdviceRaw[] = [];\n const max = axis === 'pitch' ? this.maxPitchAdvice : this.maxRollAdvice;\n if (max === undefined) return advices;\n const trigger =\n axis === 'pitch' ? this.triggerPitchAdvice : this.triggerRollAdvice;\n const cap = axis === 'pitch' ? 30 : 45;\n const outer = Math.min(halfDeg, cap);\n const inner = Math.min(max, outer);\n const state = trigger ? AdviceState.triggered : AdviceState.regular;\n advices.push({\n minAngle: -outer,\n maxAngle: -inner,\n type: AdviceType.caution,\n state,\n hideMinTickmark: true,\n });\n advices.push({\n minAngle: inner,\n maxAngle: outer,\n type: AdviceType.caution,\n state,\n hideMaxTickmark: true,\n });\n return advices;\n }\n\n /** Full unzoomed watch — original single-instance render. */\n private renderFullWatch(areas: WatchArea[]) {\n return html`\n <obc-watch\n .watchCircleType=${WatchCircleType.double}\n .zoomToFitArc=${false}\n .areas=${areas}\n .barAreas=${[\n {\n startAngle: this.minAvgRoll,\n endAngle: this.maxAvgRoll,\n fillColor: this.barColor(PitchRollPriorityElement.roll),\n },\n {\n startAngle: 180 + this.minAvgRoll,\n endAngle: 180 + this.maxAvgRoll,\n fillColor: this.barColor(PitchRollPriorityElement.roll),\n },\n {\n startAngle: 90 + this.minAvgPitch,\n endAngle: 90 + this.maxAvgPitch,\n fillColor: this.barColor(PitchRollPriorityElement.pitch),\n },\n {\n startAngle: 270 + this.minAvgPitch,\n endAngle: 270 + this.maxAvgPitch,\n fillColor: this.barColor(PitchRollPriorityElement.pitch),\n },\n ]}\n .needles=${[\n {\n angle: this.roll,\n fillColor: this.needleColor(PitchRollPriorityElement.roll),\n strokeColor: 'var(--border-silhouette-color)',\n },\n {\n angle: 180 + this.roll,\n fillColor: this.needleColor(PitchRollPriorityElement.roll),\n strokeColor: 'var(--border-silhouette-color)',\n },\n {\n angle: 90 + this.pitch,\n fillColor: this.needleColor(PitchRollPriorityElement.pitch),\n strokeColor: 'var(--border-silhouette-color)',\n },\n {\n angle: 270 + this.pitch,\n fillColor: this.needleColor(PitchRollPriorityElement.pitch),\n strokeColor: 'var(--border-silhouette-color)',\n },\n ]}\n .vessels=${this.hasReadout\n ? []\n : [\n {\n size: VesselImageSize.large,\n vesselImage: this.vesselImageSide,\n transform: `rotate(${this.pitch}deg)`,\n },\n {\n size: VesselImageSize.large,\n vesselImage: this.vesselImageFore,\n transform: `rotate(${this.roll}deg) scale(${this.normalizedScaleForeImage})`,\n },\n ]}\n .tickmarks=${[\n {angle: 0, type: TickmarkType.main},\n {angle: 90, type: TickmarkType.main},\n {angle: 180, type: TickmarkType.main},\n {angle: 270, type: TickmarkType.main},\n ...arcTickmarks(0, this.requestedRollArcAngle),\n ...arcTickmarks(180, this.requestedRollArcAngle),\n ...arcTickmarks(90, this.requestedPitchArcAngle),\n ...arcTickmarks(270, this.requestedPitchArcAngle),\n ]}\n .advices=${this.advices}\n ></obc-watch>\n `;\n }\n\n private get advices(): AngleAdviceRaw[] {\n const pitchReq = this.requestedPitchArcAngle;\n const rollReq = this.requestedRollArcAngle;\n const advices = [];\n if (this.maxPitchAdvice !== undefined) {\n const outer = Math.min(pitchReq, 30);\n const inner = Math.min(this.maxPitchAdvice, outer);\n const state = this.triggerPitchAdvice\n ? AdviceState.triggered\n : AdviceState.regular;\n advices.push({\n minAngle: 90 - outer,\n maxAngle: 90 - inner,\n type: AdviceType.caution,\n state: state,\n hideMinTickmark: true,\n });\n advices.push({\n minAngle: 90 + inner,\n maxAngle: 90 + outer,\n type: AdviceType.caution,\n state: state,\n hideMaxTickmark: true,\n });\n advices.push({\n minAngle: 270 - outer,\n maxAngle: 270 - inner,\n type: AdviceType.caution,\n state: state,\n hideMinTickmark: true,\n });\n advices.push({\n minAngle: 270 + inner,\n maxAngle: 270 + outer,\n type: AdviceType.caution,\n state: state,\n hideMaxTickmark: true,\n });\n }\n if (this.maxRollAdvice !== undefined) {\n const outer = Math.min(rollReq, 45);\n const inner = Math.min(this.maxRollAdvice, outer);\n const state = this.triggerRollAdvice\n ? AdviceState.triggered\n : AdviceState.regular;\n advices.push({\n minAngle: -outer,\n maxAngle: -inner,\n type: AdviceType.caution,\n state: state,\n hideMinTickmark: true,\n });\n advices.push({\n minAngle: inner,\n maxAngle: outer,\n type: AdviceType.caution,\n state: state,\n hideMaxTickmark: true,\n });\n advices.push({\n minAngle: 180 - outer,\n maxAngle: 180 - inner,\n type: AdviceType.caution,\n state: state,\n hideMinTickmark: true,\n });\n advices.push({\n minAngle: 180 + inner,\n maxAngle: 180 + outer,\n type: AdviceType.caution,\n state: state,\n hideMaxTickmark: true,\n });\n }\n return advices;\n }\n\n static override styles = [\n centerReadoutStyles,\n css`\n * {\n box-sizing: border-box;\n }\n\n .container {\n position: relative;\n width: 100%;\n height: 100%;\n }\n\n .container > * {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n }\n\n .readout {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n `,\n ];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'obc-pitch-roll': ObcPitchRoll;\n }\n}\n"],"names":["PitchRollPriorityElement"],"mappings":"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"}
1
+ {"version":3,"file":"pitch-roll.js","sources":["../../../src/navigation-instruments/pitch-roll/pitch-roll.ts"],"sourcesContent":["import {LitElement, css, html, nothing, svg} from 'lit';\nimport {property} from 'lit/decorators.js';\nimport '../watch/watch.js';\nimport {\n VesselImage,\n VesselImageSize,\n WatchCircleType,\n type WatchArea,\n OUTER_RING_RADIUS,\n innerRingRadiusFor,\n vesselImages,\n} from '../watch/watch.js';\nimport {arcTickmarks, TickmarkType} from '../watch/tickmark.js';\nimport {AdviceState, AdviceType, AngleAdviceRaw} from '../watch/advice.js';\nimport {customElement} from '../../decorator.js';\nimport {Priority} from '../types.js';\nimport {\n centerReadoutStyles,\n renderCenterReadouts,\n} from '../readout/center-readout.js';\nimport {ReadoutSize} from '../readout/readout.js';\nimport {\n computeZoomToFitArcFrame,\n normalizeArcAngle,\n shiftArcFrameToOuterEdge,\n} from '../../svghelpers/arc-frame.js';\n\nexport enum PitchRollPriorityElement {\n pitch = 'pitch',\n roll = 'roll',\n}\n\nexport enum PitchRollType {\n /**\n * Pitch and roll arcs on both opposing sides (default). Unlike\n * `obc-pitch`/`obc-roll` this is the default, because it is the historical\n * behaviour of `obc-pitch-roll`.\n */\n dualScale = 'dual-scale',\n /**\n * One pitch arc on the right and one roll arc at the bottom, with a thin\n * ring completing the circle and rotating indicator lines in the centre.\n */\n singleScale = 'single-scale',\n}\n\n/** Half-side of the centre overlay viewBox in SVG units. */\nconst CENTRE_HALF = 200;\n\n/**\n * Minimum diagonal Euclidean distance (in central-layer / display\n * pixels on the default 400 px container) required between adjacent\n * zoomed arc bands' nearest corners (inner-to-inner and outer-to-outer\n * checked, the smaller binds). When two adjacent requested arcs would\n * sit closer than this — or actually overlap — both axes' visible arcs\n * are shortened (ratio-preserving so `aP : aR = pitchReq : rollReq`)\n * just enough to reach this clearance. The frame itself stays\n * unchanged so band thickness, position and zoom level keep matching\n * the standalone `obc-pitch` / `obc-roll` instruments.\n */\nconst CORNER_GAP_PX = 32;\n\n/** Numerical safety floor when an axis arc has to collapse for clearance. */\nconst MIN_ARC_HALF_DEG = 2;\n\n/**\n * @stable\n */\n@customElement('obc-pitch-roll')\nexport class ObcPitchRoll extends LitElement {\n /**\n * `dual-scale` (default) shows pitch and roll arcs on both opposing sides;\n * `single-scale` shows one pitch arc on the right and one roll arc at the\n * bottom, completed by a thin ring.\n */\n @property({type: String}) type: PitchRollType = PitchRollType.dualScale;\n @property({type: Number}) pitch = 0;\n @property({type: Number}) roll = 0;\n @property({type: Number}) minAvgPitch = 0;\n @property({type: Number}) maxAvgPitch = 0;\n @property({type: Number}) minAvgRoll = 0;\n @property({type: Number}) maxAvgRoll = 0;\n @property({type: String}) vesselImageFore: VesselImage = VesselImage.psvFore;\n @property({type: String}) vesselImageSide: VesselImage = VesselImage.psvSide;\n @property({type: Number}) scaleForeImage = 1;\n @property({type: Number}) maxPitchAdvice: number | undefined = undefined;\n @property({type: Number}) maxRollAdvice: number | undefined = undefined;\n /** @availableWhen maxPitchAdvice!=undefined */\n @property({type: Boolean}) triggerPitchAdvice = false;\n /** @availableWhen maxRollAdvice!=undefined */\n @property({type: Boolean}) triggerRollAdvice = false;\n @property({type: String}) priority: Priority = Priority.regular;\n @property({type: Array, attribute: false})\n priorityElements: PitchRollPriorityElement[] = [\n PitchRollPriorityElement.pitch,\n PitchRollPriorityElement.roll,\n ];\n /**\n * When `true`, the centre shows two stacked `<obc-readout>`s (pitch above\n * roll) instead of the vessel images. Default `false`.\n */\n @property({type: Boolean}) hasReadout: boolean = false;\n /**\n * Label for the pitch readout. Default `Pitch`.\n * @availableWhen hasReadout==true\n */\n @property({type: String}) pitchLabel = 'Pitch';\n /**\n * Label for the roll readout. Default `Roll`.\n * @availableWhen hasReadout==true\n */\n @property({type: String}) rollLabel = 'Roll';\n /**\n * Unit shown in both readouts. Default `DEG`.\n * @availableWhen hasReadout==true\n */\n @property({type: String}) unit = 'DEG';\n /**\n * Number of fraction digits shown in both readouts. Default `0`.\n * @availableWhen hasReadout==true\n */\n @property({type: Number}) fractionDigits = 0;\n @property({type: Boolean}) zoomToFitArc: boolean = false;\n /**\n * Half-extent of each of the four watch arcs in degrees, measured from the\n * arc's natural center (0°/90°/180°/270°). Each arc spans\n * `center ± arcAngle`. Default `30` reproduces the historical 60°-wide\n * arcs; smaller values produce narrower arcs that, combined with\n * `zoomToFitArc`, reveal more detail in the relevant motion range.\n */\n @property({type: Number}) arcAngle: number = 30;\n /**\n * Optional per-axis override for the pitch arcs (top + bottom). Falls\n * back to {@link arcAngle} when undefined. Useful for rectangular layouts\n * where pitch and roll need different angular extents.\n */\n @property({type: Number}) pitchArcAngle?: number;\n /**\n * Optional per-axis override for the roll arcs (left + right). Falls\n * back to {@link arcAngle} when undefined.\n */\n @property({type: Number}) rollArcAngle?: number;\n\n private priorityFor(element: PitchRollPriorityElement): 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 needleColor(element: PitchRollPriorityElement): string {\n return this.priorityFor(element) === Priority.enhanced\n ? 'var(--instrument-enhanced-secondary-color)'\n : 'var(--instrument-regular-secondary-color)';\n }\n\n private barColor(element: PitchRollPriorityElement): string {\n return this.priorityFor(element) === Priority.enhanced\n ? 'var(--instrument-enhanced-tertiary-color)'\n : 'var(--instrument-regular-tertiary-color)';\n }\n\n private get normalizedScaleForeImage(): number {\n if (!Number.isFinite(this.scaleForeImage)) {\n return 1;\n }\n return Math.max(0, Math.min(2, this.scaleForeImage));\n }\n\n /** Requested (clamped to a minimum) half-extent for each axis. */\n private get requestedPitchArcAngle(): number {\n return normalizeArcAngle(this.pitchArcAngle ?? this.arcAngle, 30);\n }\n private get requestedRollArcAngle(): number {\n return normalizeArcAngle(this.rollArcAngle ?? this.arcAngle, 30);\n }\n\n private get isSingleScale(): boolean {\n return this.type === PitchRollType.singleScale;\n }\n\n override render() {\n const pitchReq = this.requestedPitchArcAngle;\n const rollReq = this.requestedRollArcAngle;\n const areas: WatchArea[] = [\n {\n startAngle: 90 - pitchReq,\n endAngle: 90 + pitchReq,\n roundOutsideCut: true,\n roundInsideCut: true,\n },\n {\n startAngle: 180 - rollReq,\n endAngle: 180 + rollReq,\n roundOutsideCut: true,\n roundInsideCut: true,\n },\n ];\n if (!this.isSingleScale) {\n areas.push(\n {\n startAngle: 270 - pitchReq,\n endAngle: 270 + pitchReq,\n roundOutsideCut: true,\n roundInsideCut: true,\n },\n {\n startAngle: 360 - rollReq,\n endAngle: rollReq,\n roundOutsideCut: true,\n roundInsideCut: true,\n }\n );\n }\n\n const overlayViewBox = `-${CENTRE_HALF} -${CENTRE_HALF} ${CENTRE_HALF * 2} ${CENTRE_HALF * 2}`;\n const vesselScale = 224 / 160;\n\n return html`\n <div class=\"container\">\n <svg viewBox=\"${overlayViewBox}\">\n ${this.isSingleScale && !this.zoomToFitArc\n ? this.renderRingComplement(pitchReq, rollReq)\n : nothing}\n ${this.hasReadout\n ? nothing\n : svg`\n ${\n this.isSingleScale\n ? svg`\n <line\n x1=${-OUTER_RING_RADIUS}\n y1=\"0\"\n x2=${OUTER_RING_RADIUS}\n y2=\"0\"\n stroke=\"var(--instrument-frame-tertiary-color)\"\n />\n <line\n x1=\"0\"\n y1=${-OUTER_RING_RADIUS}\n x2=\"0\"\n y2=${OUTER_RING_RADIUS}\n stroke=\"var(--instrument-frame-tertiary-color)\"\n />\n <line\n x1=\"0\"\n y1=\"0\"\n x2=${OUTER_RING_RADIUS - 10}\n y2=\"0\"\n stroke=\"${this.needleColor(PitchRollPriorityElement.pitch)}\"\n transform=\"rotate(${this.pitch} 0 0)\"\n />\n <line\n x1=\"0\"\n y1=\"0\"\n x2=\"0\"\n y2=${OUTER_RING_RADIUS - 10}\n stroke=\"${this.needleColor(PitchRollPriorityElement.roll)}\"\n transform=\"rotate(${this.roll} 0 0)\"\n />\n `\n : svg`\n <line\n x1=\"-150\"\n y1=\"0\"\n x2=\"150\"\n y2=\"0\"\n stroke=\"var(--instrument-frame-tertiary-color)\"\n />\n `\n }\n <g\n style=\"transform: rotate(${this.pitch}deg) scale(${vesselScale}) translate(-80px, -80px);\"\n >\n ${this.zoomToFitArc ? vesselImages[this.vesselImageSide] : nothing}\n </g>\n <g\n style=\"transform: rotate(${this.roll}deg) scale(${vesselScale * this.normalizedScaleForeImage}) translate(-80px, -80px);\"\n >\n ${this.zoomToFitArc ? vesselImages[this.vesselImageFore] : nothing}\n </g>\n `}\n </svg>\n ${this.zoomToFitArc\n ? this.renderZoomedArcs(pitchReq, rollReq)\n : this.renderFullWatch(areas)}\n ${this.hasReadout\n ? html`<div class=\"readout\">\n ${renderCenterReadouts([\n {\n value: this.pitch,\n label: this.pitchLabel,\n unit: this.unit,\n fractionDigits: this.fractionDigits,\n size: ReadoutSize.large,\n priority: this.priorityFor(PitchRollPriorityElement.pitch),\n },\n {\n value: this.roll,\n label: this.rollLabel,\n unit: this.unit,\n fractionDigits: this.fractionDigits,\n size: ReadoutSize.large,\n priority: this.priorityFor(PitchRollPriorityElement.roll),\n },\n ])}\n </div>`\n : nothing}\n </div>\n `;\n }\n\n /**\n * Thin ring segments completing the circle between the single-scale arcs:\n * one short segment between the pitch (right) and roll (bottom) arcs, and\n * one long segment the other way around (left and top).\n */\n private renderRingComplement(pitchArc: number, rollArc: number) {\n const r = OUTER_RING_RADIUS;\n const pt = (deg: number): [number, number] => {\n const rad = ((deg - 90) * Math.PI) / 180;\n return [r * Math.cos(rad), r * Math.sin(rad)];\n };\n const segment = (from: number, to: number) => {\n if (to - from <= 0) {\n return nothing;\n }\n const [x1, y1] = pt(from);\n const [x2, y2] = pt(to);\n const large = to - from > 180 ? 1 : 0;\n return svg`\n <path\n d=\"M ${x1} ${y1} A ${r} ${r} 0 ${large} 1 ${x2} ${y2}\"\n fill=\"none\"\n stroke=\"var(--instrument-frame-tertiary-color)\"\n />\n `;\n };\n return svg`\n ${segment(90 + pitchArc, 180 - rollArc)}\n ${segment(180 + rollArc, 450 - pitchArc)}\n `;\n }\n\n /**\n * Zoomed-arc layer: four CSS-rotated `<obc-watch>` instances, each\n * containing a single arc rendered at the watch's natural top\n * (`0° ± arcAngle`). Each watch handles its own `zoomToFitArc` framing\n * so each visible arc spans almost the full container — exactly like the\n * pitch and roll narrow stories. The four are rotated 0 / 90 / 180 / 270\n * to land at top / right / bottom / left. Top + bottom carry pitch data,\n * left + right carry roll data.\n *\n * Each axis can request its own half-extent via `pitchArcAngle` /\n * `rollArcAngle`. The zoom-fit frame for each axis is computed with the\n * EXACT same math as `obc-pitch` / `obc-roll` at the requested\n * half-extent (same band thickness, same zoom level, same position) so\n * each cardinal sub-watch matches its standalone equivalent. With the\n * frames left untouched, two requested arcs may overlap at the\n * diagonals; to avoid that, both arcs are shortened (ratio-preserving:\n * `aP : aR = pitchReq : rollReq`) just enough that the diagonal\n * Euclidean distance between adjacent inner BBOX corners equals\n * {@link CORNER_GAP_PX}. The shortened half-extent is passed only to\n * the band's `areas` (and clamped advices) so the sub-watch renders a\n * shorter band with its native rounded end-caps; the frame itself is\n * unchanged.\n */\n private renderZoomedArcs(pitchReq: number, rollReq: number) {\n // ---- Per-axis zoom-fit frames (requested half-extents) -------------\n const ext = 48;\n const targetSize = (176 + ext) * 2;\n const innerNat = innerRingRadiusFor(WatchCircleType.double);\n const buildFrame = (halfDeg: number) => {\n const areas: WatchArea[] = [\n {\n startAngle: -halfDeg,\n endAngle: halfDeg,\n roundOutsideCut: true,\n roundInsideCut: true,\n },\n ];\n const baseFrame = computeZoomToFitArcFrame({\n areas,\n outerRadius: OUTER_RING_RADIUS,\n innerRadius: innerNat,\n extension: ext,\n targetSize,\n });\n const subArcFrame = shiftArcFrameToOuterEdge(\n baseFrame,\n OUTER_RING_RADIUS + baseFrame.radiusOffset,\n OUTER_RING_RADIUS,\n CENTRE_HALF\n );\n // Display scale: how many container px per obc-watch SVG unit.\n const scale = (CENTRE_HALF * 2) / subArcFrame.width;\n // Outer- and inner-arc circle radii of the band, in central\n // (container) px. The watch renders the area between\n // (OUTER_RING_RADIUS + radiusOffset) and (innerRingRadius +\n // radiusOffset), so radiusOffset shifts BOTH radii (band\n // thickness stays constant). Both arcs are centred at the watch's\n // SVG origin; that origin sits at central-coords (0, outerR-OR)\n // along the band's cardinal direction (= outerR-OR below centre\n // for the top band).\n const outerR = (OUTER_RING_RADIUS + baseFrame.radiusOffset) * scale;\n const innerR = (innerNat + baseFrame.radiusOffset) * scale;\n return {subArcFrame, outerR, innerR};\n };\n // Frames are built at the REQUESTED half-extents — identical to\n // what `obc-pitch` / `obc-roll` produce when `zoomToFitArc=true`.\n // Each cardinal sub-watch therefore matches its standalone\n // equivalent (band thickness, length, position, zoom level).\n const pitchFrame = buildFrame(pitchReq);\n const rollFrame = buildFrame(rollReq);\n\n // ---- Method A: shorten visible arc to clear adjacent corners --------\n // The frames stay UNCHANGED; only the half-extent passed to the\n // band's `areas` shrinks. obc-watch then renders a shorter arc with\n // its native rounded end-caps — same band thickness, same position,\n // same zoom level.\n //\n // Geometry of one band (top, cardinal = -y in container coords):\n // outer-edge endpoint at angle θ from cardinal\n // P_out(θ) = (outerR·sin θ, (outerR − OR) − outerR·cos θ)\n // inner-edge endpoint at angle θ\n // P_in(θ) = (innerR·sin θ, (outerR − OR) − innerR·cos θ)\n // The right band is the same template rotated 90° CW\n // (CSS rotate(90deg)): (x, y) → (−y, x).\n //\n // For pitch–roll layout the binding constraint is the diagonal\n // gap between the top band's right corners and the right band's\n // top corners (and analogously for the other three diagonals). Two\n // pairs need to clear each other:\n // (a) inner-corner vs inner-corner (P1 = P_in_top(+aP),\n // Q1 = rotate(P_in_right(−aR)))\n // (b) outer-corner vs outer-corner (P2 = P_out_top(+aP),\n // Q2 = rotate(P_out_right(−aR)))\n // Cap-line endpoints lie on the same arcs so any other point on\n // the cap is at least as far away.\n //\n // Define a SIGNED diagonal gap: positive when the two corners are\n // diagonally clear (both Δx > 0 AND Δy > 0), negative when either\n // projection has crossed (i.e. the bands overlap). Its magnitude\n // is the Euclidean distance between the corner pair. We bisect on\n // a scalar s ∈ [0, 1] (aP = pitchReq·s, aR = rollReq·s) so the\n // requested pitch:roll RATIO is preserved, until the MIN of the\n // inner and outer signed gaps equals CORNER_GAP_PX.\n const OR = OUTER_RING_RADIUS;\n const aPreqRad = (pitchReq * Math.PI) / 180;\n const aRreqRad = (rollReq * Math.PI) / 180;\n const signedDist = (\n px: number,\n py: number,\n qx: number,\n qy: number\n ): number => {\n const dx = qx - px;\n const dy = qy - py;\n const mag = Math.hypot(dx, dy);\n return dx > 0 && dy > 0 ? mag : -mag;\n };\n const cornerGaps = (\n apRad: number,\n arRad: number\n ): {inner: number; outer: number} => {\n const cosP = Math.cos(apRad);\n const sinP = Math.sin(apRad);\n const cosR = Math.cos(arRad);\n const sinR = Math.sin(arRad);\n // Top band's right corners (container coords).\n const p1x = pitchFrame.innerR * sinP;\n const p1y = pitchFrame.outerR - OR - pitchFrame.innerR * cosP;\n const p2x = pitchFrame.outerR * sinP;\n const p2y = pitchFrame.outerR - OR - pitchFrame.outerR * cosP;\n // Right band's top corners = top template's left corners rotated\n // 90° CW: (x, y) → (−y, x).\n // Top template's −aR inner corner: (−innerR·sin aR,\n // (outerR−OR) − innerR·cos aR) → rotated:\n // (OR − outerR + innerR·cos aR, −innerR·sin aR)\n const q1x = OR - rollFrame.outerR + rollFrame.innerR * cosR;\n const q1y = -rollFrame.innerR * sinR;\n const q2x = OR - rollFrame.outerR + rollFrame.outerR * cosR;\n const q2y = -rollFrame.outerR * sinR;\n return {\n inner: signedDist(p1x, p1y, q1x, q1y),\n outer: signedDist(p2x, p2y, q2x, q2y),\n };\n };\n const minGap = (apRad: number, arRad: number): number => {\n const g = cornerGaps(apRad, arRad);\n return Math.min(g.inner, g.outer);\n };\n let aP = aPreqRad;\n let aR = aRreqRad;\n if (minGap(aPreqRad, aRreqRad) < CORNER_GAP_PX) {\n let lo = 0;\n let hi = 1;\n for (let i = 0; i < 40; i++) {\n const mid = (lo + hi) / 2;\n if (minGap(aPreqRad * mid, aRreqRad * mid) >= CORNER_GAP_PX) {\n lo = mid;\n } else {\n hi = mid;\n }\n }\n aP = aPreqRad * lo;\n aR = aRreqRad * lo;\n }\n const pitchClampedDeg = Math.max(MIN_ARC_HALF_DEG, (aP * 180) / Math.PI);\n const rollClampedDeg = Math.max(MIN_ARC_HALF_DEG, (aR * 180) / Math.PI);\n\n const subAreas = (halfDeg: number): WatchArea[] => [\n {\n startAngle: -halfDeg,\n endAngle: halfDeg,\n roundOutsideCut: true,\n roundInsideCut: true,\n },\n ];\n const pitchAreas = subAreas(pitchClampedDeg);\n const rollAreas = subAreas(rollClampedDeg);\n\n const pitchAdvices = this.subAdvices('pitch', pitchClampedDeg);\n const rollAdvices = this.subAdvices('roll', rollClampedDeg);\n\n // Ladders span the CLAMPED extent so ticks never fall outside the band\n // that is actually drawn (or outside the sector clip below).\n const pitchTickmarks = [\n {angle: 0, type: TickmarkType.main},\n ...arcTickmarks(0, pitchClampedDeg),\n ];\n const rollTickmarks = [\n {angle: 0, type: TickmarkType.main},\n ...arcTickmarks(0, rollClampedDeg),\n ];\n\n // Clip each sub-watch to the angular sector actually covered by the\n // (possibly shortened) arc so the indicator pill and bar end-of-range\n // limit lines cannot leak past the visible band when the value falls\n // outside the clamped range. Advices are clamped to the band extent\n // in `subAdvices` so they fit naturally and are not affected by this\n // clip. The clip is a triangle in the element's CSS box, with one\n // vertex at the watch origin (SVG 0,0 mapped to CSS px) and two\n // vertices at the intersection of the sector edges with the top edge\n // of the box. Applied in unrotated local coords; CSS rotation then\n // carries it to the correct cardinal side.\n const sectorClip = (\n halfDeg: number,\n frame: typeof rollFrame.subArcFrame\n ): string => {\n // Watch origin (SVG 0,0) in CSS percentages of the element box.\n // Element fills the 100% × 100% .container; obc-watch fills it with\n // viewBox = frame.{x,y,width,height}, so SVG (0,0) sits at:\n // (-frame.x / frame.width, -frame.y / frame.height)\n const oxPct = (-frame.x / frame.width) * 100;\n const oyPct = (-frame.y / frame.height) * 100;\n // Sector half-angle, expressed as the horizontal offset (in pct)\n // a ray reaches when traveling from the origin up to the top edge.\n const dxPct = oyPct * Math.tan((halfDeg * Math.PI) / 180);\n // Clamp to box bounds so half-angles ≥ 45° still produce a polygon\n // that reaches the corners instead of going off-canvas.\n const lx = Math.max(0, oxPct - dxPct);\n const rx = Math.min(100, oxPct + dxPct);\n return `polygon(${oxPct}% ${oyPct}%, ${lx}% 0%, ${rx}% 0%)`;\n };\n const pitchClip = sectorClip(pitchClampedDeg, pitchFrame.subArcFrame);\n const rollClip = sectorClip(rollClampedDeg, rollFrame.subArcFrame);\n\n const rollNeedles = [\n {\n angle: this.roll,\n fillColor: this.needleColor(PitchRollPriorityElement.roll),\n strokeColor: 'var(--border-silhouette-color)',\n },\n ];\n const pitchNeedles = [\n {\n angle: this.pitch,\n fillColor: this.needleColor(PitchRollPriorityElement.pitch),\n strokeColor: 'var(--border-silhouette-color)',\n },\n ];\n const rollBars = [\n {\n startAngle: this.minAvgRoll,\n endAngle: this.maxAvgRoll,\n fillColor: this.barColor(PitchRollPriorityElement.roll),\n },\n ];\n const pitchBars = [\n {\n startAngle: this.minAvgPitch,\n endAngle: this.maxAvgPitch,\n fillColor: this.barColor(PitchRollPriorityElement.pitch),\n },\n ];\n\n const subWatch = (\n rotation: number,\n arcFrame: typeof rollFrame.subArcFrame,\n areas: WatchArea[],\n barAreas: typeof rollBars,\n needles: typeof rollNeedles,\n advices: AngleAdviceRaw[],\n clipPath: string,\n tickmarks: typeof rollTickmarks\n ) => html`\n <obc-watch\n class=\"sub-watch\"\n style=\"transform: rotate(${rotation}deg); clip-path: ${clipPath};\"\n .watchCircleType=${WatchCircleType.double}\n .zoomToFitArc=${true}\n .arcFrame=${arcFrame}\n .areas=${areas}\n .barAreas=${barAreas}\n .needles=${needles}\n .vessels=${[]}\n .tickmarks=${tickmarks}\n .advices=${advices}\n ></obc-watch>\n `;\n\n return html`\n ${this.isSingleScale\n ? nothing\n : subWatch(\n 0,\n rollFrame.subArcFrame,\n rollAreas,\n rollBars,\n rollNeedles,\n rollAdvices,\n rollClip,\n rollTickmarks\n )}\n ${subWatch(\n 90,\n pitchFrame.subArcFrame,\n pitchAreas,\n pitchBars,\n pitchNeedles,\n pitchAdvices,\n pitchClip,\n pitchTickmarks\n )}\n ${subWatch(\n 180,\n rollFrame.subArcFrame,\n rollAreas,\n rollBars,\n rollNeedles,\n rollAdvices,\n rollClip,\n rollTickmarks\n )}\n ${this.isSingleScale\n ? nothing\n : subWatch(\n 270,\n pitchFrame.subArcFrame,\n pitchAreas,\n pitchBars,\n pitchNeedles,\n pitchAdvices,\n pitchClip,\n pitchTickmarks\n )}\n `;\n }\n\n /**\n * Caution advices for a single sub-watch axis, emitted at sub-watch local\n * angles (centred on 0°). The outer extent is clamped to the actually\n * rendered band half-extent (`halfDeg`) so advices fit naturally inside\n * the visible arc and are not visually cropped by the sub-watch's sector\n * clip-path. The clip-path itself remains in place to crop the needle.\n */\n private subAdvices(\n axis: 'pitch' | 'roll',\n halfDeg: number\n ): AngleAdviceRaw[] {\n const advices: AngleAdviceRaw[] = [];\n const max = axis === 'pitch' ? this.maxPitchAdvice : this.maxRollAdvice;\n if (max === undefined) return advices;\n const trigger =\n axis === 'pitch' ? this.triggerPitchAdvice : this.triggerRollAdvice;\n const cap = axis === 'pitch' ? 30 : 45;\n const outer = Math.min(halfDeg, cap);\n const inner = Math.min(max, outer);\n const state = trigger ? AdviceState.triggered : AdviceState.regular;\n advices.push({\n minAngle: -outer,\n maxAngle: -inner,\n type: AdviceType.caution,\n state,\n hideMinTickmark: true,\n });\n advices.push({\n minAngle: inner,\n maxAngle: outer,\n type: AdviceType.caution,\n state,\n hideMaxTickmark: true,\n });\n return advices;\n }\n\n /** Full unzoomed watch — original single-instance render. */\n private renderFullWatch(areas: WatchArea[]) {\n const barAreas = [\n {\n startAngle: 180 + this.minAvgRoll,\n endAngle: 180 + this.maxAvgRoll,\n fillColor: this.barColor(PitchRollPriorityElement.roll),\n },\n {\n startAngle: 90 + this.minAvgPitch,\n endAngle: 90 + this.maxAvgPitch,\n fillColor: this.barColor(PitchRollPriorityElement.pitch),\n },\n ];\n const needles = [\n {\n angle: 180 + this.roll,\n fillColor: this.needleColor(PitchRollPriorityElement.roll),\n strokeColor: 'var(--border-silhouette-color)',\n },\n {\n angle: 90 + this.pitch,\n fillColor: this.needleColor(PitchRollPriorityElement.pitch),\n strokeColor: 'var(--border-silhouette-color)',\n },\n ];\n const tickmarks = [\n {angle: 90, type: TickmarkType.main},\n {angle: 180, type: TickmarkType.main},\n ...arcTickmarks(90, this.requestedPitchArcAngle),\n ...arcTickmarks(180, this.requestedRollArcAngle),\n ];\n if (!this.isSingleScale) {\n barAreas.push(\n {\n startAngle: this.minAvgRoll,\n endAngle: this.maxAvgRoll,\n fillColor: this.barColor(PitchRollPriorityElement.roll),\n },\n {\n startAngle: 270 + this.minAvgPitch,\n endAngle: 270 + this.maxAvgPitch,\n fillColor: this.barColor(PitchRollPriorityElement.pitch),\n }\n );\n needles.push(\n {\n angle: this.roll,\n fillColor: this.needleColor(PitchRollPriorityElement.roll),\n strokeColor: 'var(--border-silhouette-color)',\n },\n {\n angle: 270 + this.pitch,\n fillColor: this.needleColor(PitchRollPriorityElement.pitch),\n strokeColor: 'var(--border-silhouette-color)',\n }\n );\n tickmarks.push(\n {angle: 0, type: TickmarkType.main},\n {angle: 270, type: TickmarkType.main},\n ...arcTickmarks(0, this.requestedRollArcAngle),\n ...arcTickmarks(270, this.requestedPitchArcAngle)\n );\n }\n\n return html`\n <obc-watch\n .watchCircleType=${WatchCircleType.double}\n .zoomToFitArc=${false}\n .areas=${areas}\n .barAreas=${barAreas}\n .needles=${needles}\n .vessels=${this.hasReadout\n ? []\n : [\n {\n size: VesselImageSize.large,\n vesselImage: this.vesselImageSide,\n transform: `rotate(${this.pitch}deg)`,\n },\n {\n size: VesselImageSize.large,\n vesselImage: this.vesselImageFore,\n transform: `rotate(${this.roll}deg) scale(${this.normalizedScaleForeImage})`,\n },\n ]}\n .tickmarks=${tickmarks}\n .advices=${this.advices}\n ></obc-watch>\n `;\n }\n\n private get advices(): AngleAdviceRaw[] {\n const pitchReq = this.requestedPitchArcAngle;\n const rollReq = this.requestedRollArcAngle;\n const advices = [];\n if (this.maxPitchAdvice !== undefined) {\n const outer = Math.min(pitchReq, 30);\n const inner = Math.min(this.maxPitchAdvice, outer);\n const state = this.triggerPitchAdvice\n ? AdviceState.triggered\n : AdviceState.regular;\n advices.push({\n minAngle: 90 - outer,\n maxAngle: 90 - inner,\n type: AdviceType.caution,\n state: state,\n hideMinTickmark: true,\n });\n advices.push({\n minAngle: 90 + inner,\n maxAngle: 90 + outer,\n type: AdviceType.caution,\n state: state,\n hideMaxTickmark: true,\n });\n if (!this.isSingleScale) {\n advices.push({\n minAngle: 270 - outer,\n maxAngle: 270 - inner,\n type: AdviceType.caution,\n state: state,\n hideMinTickmark: true,\n });\n advices.push({\n minAngle: 270 + inner,\n maxAngle: 270 + outer,\n type: AdviceType.caution,\n state: state,\n hideMaxTickmark: true,\n });\n }\n }\n if (this.maxRollAdvice !== undefined) {\n const outer = Math.min(rollReq, 45);\n const inner = Math.min(this.maxRollAdvice, outer);\n const state = this.triggerRollAdvice\n ? AdviceState.triggered\n : AdviceState.regular;\n advices.push({\n minAngle: 180 - outer,\n maxAngle: 180 - inner,\n type: AdviceType.caution,\n state: state,\n hideMinTickmark: true,\n });\n advices.push({\n minAngle: 180 + inner,\n maxAngle: 180 + outer,\n type: AdviceType.caution,\n state: state,\n hideMaxTickmark: true,\n });\n if (!this.isSingleScale) {\n advices.push({\n minAngle: -outer,\n maxAngle: -inner,\n type: AdviceType.caution,\n state: state,\n hideMinTickmark: true,\n });\n advices.push({\n minAngle: inner,\n maxAngle: outer,\n type: AdviceType.caution,\n state: state,\n hideMaxTickmark: true,\n });\n }\n }\n return advices;\n }\n\n static override styles = [\n centerReadoutStyles,\n css`\n * {\n box-sizing: border-box;\n }\n\n .container {\n position: relative;\n width: 100%;\n height: 100%;\n }\n\n .container > * {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n }\n\n .readout {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n `,\n ];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'obc-pitch-roll': ObcPitchRoll;\n }\n}\n"],"names":["PitchRollPriorityElement","PitchRollType"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oicl/openbridge-webcomponents",
3
- "version": "2.0.0-next.105",
3
+ "version": "2.0.0-next.106",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "type": "git",