import {SVGTemplateResult, nothing, svg} from 'lit'; import {AdviceState, AdviceType} from '../watch/advice'; import {TickmarkStyle} from '../watch/tickmark'; import {singleSidedTickmark} from './tickmark'; export interface LinearAdviceRaw { min: number; max: number; type: AdviceType; state: AdviceState; } export interface LinearAdvice { min: number; max: number; type: AdviceType; hinted: boolean; } function adviceMask( height: number, min: number, max: number, fill: string, stroke: string ): SVGTemplateResult { const width = 8; const x1 = 12; const x2 = x1 + width; const r = width / 2; const yL = (-min * height) / 100 - 2 * r - 2; const yH = (-max * height) / 100 + 2 * r - 2; const path = `M ${x1} ${yL} A ${r} ${r} 0 0 0 ${x2} ${yL} V ${yH} A ${r} ${r} 0 0 0 ${x1} ${yH} Z`; return svg``; } export function renderAdvice( height: number, advice: LinearAdviceRaw, flipDirection: boolean ): 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 pattern = []; const ypattern = flipDirection ? 50 : -50; for (let i = -100; i < 300; i += 16) { pattern.push(svg` `); } const maskId = `adviceMask-${advice.min}-${advice.max}`; let tickmarkStyle = TickmarkStyle.hinted; if (advice.state === AdviceState.regular) { tickmarkStyle = TickmarkStyle.regular; } else if (advice.state === AdviceState.triggered) { tickmarkStyle = TickmarkStyle.enhanced; } return svg` ${adviceMask(height, advice.min, advice.max, 'white', 'black')} ${fillColor ? svg`` : nothing} ${pattern} ${adviceMask(height, advice.min, advice.max, 'none', mainColor)} ${singleSidedTickmark(height, advice.min, tickmarkStyle)} ${singleSidedTickmark(height, advice.max, tickmarkStyle)} `; } else { let strokeColor; let tickmarkStyle; let fillColor: string; if (advice.state === AdviceState.hinted) { strokeColor = 'var(--instrument-frame-tertiary-color)'; fillColor = 'none'; tickmarkStyle = TickmarkStyle.hinted; } else if (advice.state === AdviceState.regular) { strokeColor = 'var(--instrument-regular-secondary-color)'; fillColor = 'none'; tickmarkStyle = TickmarkStyle.regular; } else { strokeColor = 'var(--instrument-enhanced-secondary-color)'; fillColor = strokeColor; tickmarkStyle = TickmarkStyle.regular; } return svg` ${adviceMask(height, advice.min, advice.max, fillColor, strokeColor)} ${singleSidedTickmark(height, advice.min, tickmarkStyle)} ${singleSidedTickmark(height, advice.max, tickmarkStyle)} `; } }