// highlight.js utilities (auto-init is handled by the bundle). Exposes
// window.highlightCode / window.highlightContainer for dynamic content, and a
// MutationObserver fallback for non-HTMX DOM mutations. Under the htmx-ssr
// profile the RusteloReinit 'highlight' handler covers swaps; this observer
// covers any other dynamic insertion. Provenance: promoted from jpl-website.
window.highlightCode = function() {
  document.querySelectorAll('pre code:not(.hljs)').forEach(function(block) {
    if (typeof hljs !== 'undefined' && hljs.highlightElement) {
      hljs.highlightElement(block);
    }
  });
};

window.highlightContainer = function(containerSelector) {
  const container = document.querySelector(containerSelector);
  if (container && typeof hljs !== 'undefined') {
    container.querySelectorAll('pre code:not(.hljs)').forEach(function(block) {
      hljs.highlightElement(block);
    });
  }
};

// Re-highlight when content changes (for dynamic content not driven by HTMX).
document.addEventListener('DOMContentLoaded', function() {
  const observer = new MutationObserver(function(mutations) {
    let shouldHighlight = false;
    mutations.forEach(function(mutation) {
      if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
        mutation.addedNodes.forEach(function(node) {
          if (node.nodeType === 1 && (node.tagName === 'PRE' || node.querySelector('pre'))) {
            shouldHighlight = true;
          }
        });
      }
    });

    if (shouldHighlight) {
      setTimeout(function() {
        window.highlightCode();
      }, 100);
    }
  });

  observer.observe(document.body, {
    childList: true,
    subtree: true
  });
});
