function makeCustomHighlighterTag(
tagName = "x-mark",
defaultColor = "rgb(255,255,0)"
) {
class HighlighterStyleElement extends HTMLElement {
connectedCallback() {
this.attachShadow({ mode: "open" });
let hPadding = 0.25;
let vPadding = 0.15;
let hOffset = (2 * Math.random() - 1) * hPadding;
let vOffset = (2 * Math.random() - 1) * vPadding;
let minAngle = Math.max(90 - this.textContent.length / 1.5, 20);
let maxAngle = Math.min(minAngle + 20, 90);
let angle = minAngle + (maxAngle - minAngle) * Math.random();
let top = vPadding + vOffset;
let bottom = vPadding - vOffset;
let left = hPadding - hOffset;
let right = hPadding + hOffset;
this.shadowRoot.innerHTML = `
<style>
:host {
--color: ${defaultColor};
}
mark {
margin: ${-top}em ${-right}em ${-bottom}em ${-left}em;
padding: ${top}em ${right}em ${bottom}em ${left}em;
border-radius: 0.5em 0.3em;
background: transparent;
box-decoration-break: clone;
-webkit-box-decoration-break: clone;
background-image: linear-gradient(
${angle}deg,
color-mix(in srgb, var(--color), transparent 50%),
color-mix(in srgb, var(--color), transparent 90%) 4%,
color-mix(in srgb, var(--color), transparent 70%) 96%,
color-mix(in srgb, var(--color), transparent 30%)
);
}
</style>
<mark>${this.textContent}</mark>
`;
}
}
customElements.get(tagName) ||
customElements.define(tagName, HighlighterStyleElement);
return html`<span style="color:grey;"><span style="font:var(--monospace-font);"><${tagName}></span> is defined for highlighter-type styles. Use <span style="font:var(--monospace-font);">${tagName} {--color: ...};</span> to style.</span>`;
}