| 42 | const clamp = (v, min, max) => Math.min(Math.max(v, min), max); |
| 43 | const normalizeAngle = d => ((d % 360) + 360) % 360; |
| 44 | const wrapAngleSigned = deg => { |
| 45 | const a = (((deg + 180) % 360) + 360) % 360; |
| 46 | return a - 180; |
| 47 | }; |
| 48 | const getDataNumber = (el, name, fallback) => { |
| 49 | const attr = el.dataset[name] ?? el.getAttribute(`data-${name}`); |
| 50 | const n = attr == null ? NaN : parseFloat(attr); |