| 169 | s.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">"); |
| 170 | |
| 171 | const ghost = (corners: Pt[], center: Pt, color: string, opacity: number, f: number): string => { |
| 172 | const tickEnd = { |
| 173 | x: (corners[0]!.x + corners[1]!.x) / 2, |
| 174 | y: (corners[0]!.y + corners[1]!.y) / 2, |
| 175 | }; |
| 176 | return ( |
| 177 | polygon(corners, color, Math.max(0.08, opacity * 0.42), timeColor(f)) + |
| 178 | line(center, tickEnd, timeColor(f), 3, 0.9) |
| 179 | ); |
| 180 | }; |
| 181 | |
| 182 | /** Build the full onion-skin SVG overlay markup from sampled elements. */ |
| 183 | export function buildOnionSvg(elements: OnionElement[], opt: ShotLayoutOptions): string { |