Skip to content

Instantly share code, notes, and snippets.

@shannonmoeller
Last active May 23, 2025 22:03
Show Gist options
  • Save shannonmoeller/925ed3564b73d04a0107249da2ff3d3e to your computer and use it in GitHub Desktop.
Save shannonmoeller/925ed3564b73d04a0107249da2ff3d3e to your computer and use it in GitHub Desktop.
(() => {
'use strict';
// CSS //////////////////////////////////////////////////////////////////////
let sheet = new CSSStyleSheet();
let maxDepth = -1;
function createHighlight(id, depth) {
if (depth <= maxDepth) return;
maxDepth = depth;
sheet.insertRule(`
::highlight(${id}) {
background-color: oklch(1 0.1 ${50 * depth});
}
`);
sheet.insertRule(`
.bracket-city-dark-mode ::highlight(${id}) {
background-color: oklch(0.4 0.1 ${50 * depth});
}
`);
}
sheet.replace(`
.active-clue {
outline: 2px solid color-mix(in srgb, transparent, currentcolor 40%);
outline-offset: -3px;
}
.solved {
outline: 4px dashed color-mix(in srgb, transparent, currentcolor 40%);
outline-offset: -4px;
}
`);
document.adoptedStyleSheets = [
...document.adoptedStyleSheets,
sheet,
];
// DOM //////////////////////////////////////////////////////////////////////
function updateHighlights() {
let puzzle = document.querySelector('.puzzle-display');
let walker = document.createTreeWalker(puzzle, NodeFilter.SHOW_TEXT);
let ranges = [];
let highlights = [];
for (let node; node = walker.nextNode();) {
let text = node.textContent;
for (let i = 0; i < text.length; i++) {
let char = text[i];
if (char === '[') {
let range = new Range();
range.setStart(node, i);
ranges.push(range);
}
if (char === ']') {
let range = ranges.pop();
range.setEnd(node, i + 1);
highlights[ranges.length] ??= new Highlight();
highlights[ranges.length].add(range);
}
}
}
for (let i = 0; i < highlights.length; i++) {
let id = `brackets-${i}`;
createHighlight(id, i);
CSS.highlights.delete(id);
CSS.highlights.set(id, highlights[i]);
}
}
new MutationObserver(updateHighlights).observe(document.body, {
childList: true,
subtree: true,
});
updateHighlights();
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment