import {SVGTemplateResult, nothing, svg} from 'lit'; import {TickmarkStyle, TickmarkType, tickmark} from './tickmark'; export enum AdviceType { advice = 'advice', caution = 'caution', } export enum AdviceState { regular = 'regular', hinted = 'hinted', triggered = 'triggered', } export interface AngleAdviceRaw { minAngle: number; maxAngle: number; type: AdviceType; state: AdviceState; } export interface AngleAdvice { minAngle: number; maxAngle: number; type: AdviceType; hinted: boolean; } const margin = (344 - 328) / 2 + 8; const deltaAngle = Math.atan2(margin, (344 + 328) / 2); function adviceMask( minAngle: number, maxAngle: number, fill: string, stroke: string ): SVGTemplateResult { const radl = (minAngle * Math.PI) / 180 + deltaAngle; const radh = (maxAngle * Math.PI) / 180 - deltaAngle; const r1 = 328 / 2; const r2 = 344 / 2; const R = (r2 - r1) / 2; const x1l = Math.sin(radl) * r1; const y1l = -Math.cos(radl) * r1; const x2l = Math.sin(radl) * r2; const y2l = -Math.cos(radl) * r2; const x1h = Math.sin(radh) * r1; const y1h = -Math.cos(radh) * r1; const x2h = Math.sin(radh) * r2; const y2h = -Math.cos(radh) * r2; const path = `M ${x1l} ${y1l} A ${r1} ${r1} 0 0 1 ${x1h} ${y1h} A ${R} ${R} 0 0 0 ${x2h} ${y2h} A ${r2} ${r2} 0 0 0 ${x2l} ${y2l} A ${R} ${R} 0 0 0 ${x1l} ${y1l} Z`; return svg``; } export function renderAdvice(advice: AngleAdviceRaw): SVGTemplateResult { if (advice.type === AdviceType.caution) { let mainColor; let fillColor: string | null = null; if (advice.state === AdviceState.hinted) { mainColor = 'var(--instrument-frame-tertiary-color)'; } else if (advice.state === AdviceState.regular) { mainColor = 'var(--instrument-tick-mark-tertiary-color)'; } else { mainColor = 'var(--on-caution-active-color)'; fillColor = 'var(--alert-caution-color)'; } const radialPattern = []; for (let i = 0; i < 180; i += 4) { radialPattern.push(svg` `); } const maskId = `adviceMask-${advice.minAngle}-${advice.maxAngle}`; let tickmarkStyle = TickmarkStyle.hinted; if (advice.state === AdviceState.regular) { tickmarkStyle = TickmarkStyle.regular; } else if (advice.state === AdviceState.triggered) { tickmarkStyle = TickmarkStyle.enhanced; } return svg` ${adviceMask(advice.minAngle, advice.maxAngle, 'white', 'black')} ${fillColor ? svg`` : nothing} ${radialPattern} ${adviceMask(advice.minAngle, advice.maxAngle, 'none', mainColor)} ${tickmark(advice.minAngle, TickmarkType.primary, tickmarkStyle, 1)} ${tickmark(advice.maxAngle, TickmarkType.primary, tickmarkStyle, 1)} `; } else { let mainColor; let tickmarkStyle; if (advice.state === AdviceState.hinted) { mainColor = 'var(--instrument-frame-tertiary-color)'; tickmarkStyle = TickmarkStyle.hinted; } else if (advice.state === AdviceState.regular) { mainColor = 'var(--instrument-regular-secondary-color)'; tickmarkStyle = TickmarkStyle.regular; } else { mainColor = 'var(--instrument-enhanced-secondary-color)'; tickmarkStyle = TickmarkStyle.regular; } return svg` ${adviceMask(advice.minAngle, advice.maxAngle, advice.state === AdviceState.triggered ? mainColor : 'none', mainColor)} ${tickmark(advice.minAngle, TickmarkType.primary, tickmarkStyle, 1)} ${tickmark(advice.maxAngle, TickmarkType.primary, tickmarkStyle, 1)} `; } }