| 136 | }; |
| 137 | |
| 138 | const linkElements = element => { |
| 139 | element.addEventListener( |
| 140 | "click", |
| 141 | event => { |
| 142 | eachElementWithSameWasmOff(event, elem => { |
| 143 | if (elem === event.target) return; // Only scroll into view the other elements. |
| 144 | elem.scrollIntoView({ |
| 145 | behavior: "smooth", |
| 146 | block: "center", |
| 147 | inline: "nearest", |
| 148 | }); |
| 149 | }); |
| 150 | }, |
| 151 | { passive: true }, |
| 152 | ); |
| 153 | |
| 154 | element.addEventListener("mouseenter", event => { |
| 155 | let offset = event.target.dataset.wasmOffset; |
| 156 | if (offset === null) return; |
| 157 | |
| 158 | // Gather all elements related to the desired offset. |
| 159 | let elems = linkedElementCache.get(offset); |
| 160 | |
| 161 | // Perform the DOM modification inside an animation frame to give the browser a bit of |
| 162 | // a breathing room. |
| 163 | window.requestAnimationFrame(() => { |
| 164 | // Draw a 2px dark outline in each block of instructions so it stands out a bit better |
| 165 | // when hovered. |
| 166 | let outline = `2px solid ${rgbToCss(rgbDarken(rgbForOffset(offset)))}`; |
| 167 | for (const elem of elems) { |
| 168 | elem.setAttribute("title", `Wasm offset @ ${offset}`); |
| 169 | elem.classList.add("hovered"); |
| 170 | elem.style.outline = outline; |
| 171 | } |
| 172 | }); |
| 173 | }); |
| 174 | |
| 175 | element.addEventListener("mouseleave", event => { |
| 176 | eachElementWithSameWasmOff(event, elem => { |
| 177 | elem.removeAttribute("title"); |
| 178 | elem.classList.remove("hovered"); |
| 179 | elem.style.outline = ""; |
| 180 | }); |
| 181 | }); |
| 182 | }; |
| 183 | |
| 184 | /*** Rendering *****************************************************************/ |
| 185 |
no test coverage detected