| (() => { | |
| '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(); | |
| })(); |