/** * toc-sidebar — inject a persistent widget into Observable Framework's * right-column table-of-contents sidebar. * * Observable Framework renders a non-scrolling TOC aside (#observablehq-toc) * in the right column. This helper lets you prepend a custom element to it, * replacing any previously injected element with the same id on each call so * reactive cells can refresh the widget without accumulating duplicates. * * Usage: * import {injectTocTop} from "./components/toc-sidebar.js"; * * const el = html`
`; * injectTocTop("my-widget-id", el); // call again on each reactive update * * @param {string} id Stable id used to find and remove the previous * instance. Must be unique per widget on the page. * @param {HTMLElement} element Element to inject. Its id will be set to `id`. * @returns {boolean} true if injected into the TOC sidebar; * false if #observablehq-toc was not found. */ export function injectTocTop(id, element) { document.getElementById(id)?.remove(); element.id = id; const toc = document.querySelector("#observablehq-toc"); if (!toc) return false; toc.prepend(element); return true; }