PageSourceSearch

https://spectreconsole.net/_content/Pennington.UI/scripts.js?v=639198145617588909

js spectreconsole.net collected 2026-10-02 07:46:58 UTC 35,958 bytes, 32 lines download raw bytes

1class PageManager{constructor(){this.init()}init(){document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>this.initializeComponents()):this.initializeComponents()}initializeComponents(){this.themeManager=new ThemeManager,this.outlineManager=new OutlineManager,this.tabManager=new TabManager,this.contentTabManager=new ContentTabManager,this.syntaxHighlighter=new SyntaxHighlighter,this.mermaidManager=new MermaidManager,this.mobileNavManager=new MobileNavManager,this.mainSiteNavManager=new MainSiteNavManager,this.sidebarToggleManager=new SidebarToggleManager,this.searchManager=new SearchManager,this.areaNavManager=new AreaNavManager,this.sidebarStateManager=new SidebarStateManager(this.areaNavManager),this.languageSwitcherManager=new LanguageSwitcherManager,this.outlineManager.init(),this.tabManager.init(),this.contentTabManager.init(),this.syntaxHighlighter.init(),this.mermaidManager.init(),this.mobileNavManager.init(),this.mainSiteNavManager.init(),this.sidebarToggleManager.init(),this.searchManager.init(),this.areaNavManager.init(),this.sidebarStateManager.init(),this.languageSwitcherManager.init()}onSpaNavigating(){const e=document.querySelector('[data-role="page-outline"] ul');e&&(e.innerHTML="")}onSpaCommit(e){this.sidebarStateManager?.patch(e),this.languageSwitcherManager?.patch(e),this.syntaxHighlighter?.init(),this.tabManager?.init(),this.contentTabManager?.init(),this.mermaidManager?.init(),this.outlineManager?.init()}}class ThemeManager{constructor(){this.bindThemeToggleEvents(),window.swapTheme=this.swapTheme.bind(this)}bindThemeToggleEvents(){const e=document.querySelectorAll("[data-theme-toggle]");e.forEach(e=>{e.addEventListener("click",()=>{this.swapTheme()})})}swapTheme(){const t=!document.documentElement.classList.contains("dark"),e=document.createElement("style");e.appendChild(document.createTextNode("*,*::before,*::after{transition:none !important}")),document.head.appendChild(e),document.documentElement.classList.toggle("dark",t);try{localStorage.setItem("theme",t?"dark":"light")}catch{}window.syncThemeColor&&window.syncThemeColor(),window.getComputedStyle(e).opacity,requestAnimationFrame(function(){document.head.removeChild(e)}),window.pageManager&&window.pageManager.mermaidManager&&window.pageManager.mermaidManager.reinitializeForTheme()}}class OutlineManager{constructor(){this.outlineLinks=[],this.sectionMap=new Map,this.sections=[],this.isScrolling=!1,this.scrollTimeout=null,this._scrollAbort=null}init(){this.reset(),this.setupOutline(),this.outlineLinks.length>0&&(this.setupScrollListener(),this.updateActiveSection())}reset(){this._scrollAbort&&(this._scrollAbort.abort(),this._scrollAbort=null),this.sectionMap=new Map,this.sections=[],this.outlineLinks=[]}setupOutline(){const e=document.querySelector('[data-role="page-outline"]');if(!e)return;const t=e.dataset.contentSelector;t&&this.buildOutlineFromContent(t,e),this.outlineLinks=Array.from(document.querySelectorAll('[data-role="page-outline"] ul li a')),this.outlineLinks.forEach(e=>{e.dataset.selected="false";const t=this.extractIdFromHref(e.getAttribute("href"));if(t){const n=document.getElementById(t);n&&(this.sectionMap.set(n,e),this.sections.push(n))}}),this.sections.sort((e,t)=>{const n=e.compareDocumentPosition(t);return n&Node.DOCUMENT_POSITION_FOLLOWING?-1:1})}buildOutlineFromContent(e,t){const n=document.querySelector(e);if(!n)return;const s=this.extractHeadings(n);if(s.length===0)return;const o=this.buildOutlineStructure(s);this.renderOutline(o,t)}extractHeadings(e){const n=e.querySelectorAll("h2, h3"),t=[];return n.forEach(e=>{e.id||(e.id=this.generateIdFromText(e.textContent)),t.push({level:parseInt(e.tagName[1]),id:e.id,text:e.textContent.trim(),element:e})}),t}generateIdFromText(e){return e.toLowerCase().trim().replace(/[^\w\s-]/g,"").replace(/\s+/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"")}buildOutlineStructure(e){const n=[];if(e.length===0)return n;const s=Math.min(...e.map(e=>e.level));let t=null;return e.forEach(e=>{e.level===s||!t?(t={id:e.id,text:e.text,children:[]},n.push(t)):t.children.push({id:e.id,text:e.text})}),n}renderOutline(e,t){const n=t.querySelector("ul");if(!n)return;const s=n.dataset.outlineLinkClass||"",o=n.dataset.outlineNestedLinkClass||"";
1n.innerHTML="",e.forEach(e=>{const t=this.createOutlineLink(e.id,e.text,"",s);if(n.appendChild(t),e.children.length>0){const t=document.createElement("li"),i=document.createElement("ul");e.children.forEach(e=>{const t=this.createOutlineLink(e.id,e.text,o,s);i.appendChild(t)}),t.appendChild(i),n.appendChild(t)}})}createOutlineLink(e,t,n,s){const i=document.createElement("li");i.className=`${n} flex`.trim();const o=document.createElement("a");return o.className=`${n} ${s}`.trim(),o.href=`#${e}`,o.textContent=t,o.dataset.selected="false",i.appendChild(o),i}extractIdFromHref(e){return e?.split("#")[1]||null}setupScrollListener(){this._scrollAbort=new AbortController,window.addEventListener("scroll",()=>{this.isScrolling||(this.isScrolling=!0,requestAnimationFrame(()=>{this.updateActiveSection(),this.isScrolling=!1}))},{passive:!0,signal:this._scrollAbort.signal})}updateActiveSection(){this.resetAllLinks();const e=this.findActiveSection();if(e){const t=this.sectionMap.get(e);t&&this.activateLink(t)}}findActiveSection(){if(this.sections.length===0)return null;const t=130,n=t+50;let e=null;for(let t=this.sections.length-1;t>=0;t--){const s=this.sections[t],o=s.getBoundingClientRect();if(o.top<=n){e=s;break}}return e||this.sections[0]}resetAllLinks(){this.outlineLinks.forEach(e=>{e.dataset.selected="false",e.parentElement?.classList.remove("active")}),this.hideHighlighter()}activateLink(e){e.dataset.selected="true",e.parentElement?.classList.add("active"),this.updateHighlighter(e)}updateHighlighter(e){const t=document.querySelector('[data-role="page-outline-highlighter"]');if(!t||!e)return;const n=e.getBoundingClientRect(),s=document.querySelector('[data-role="page-outline"]');if(!s)return;const o=s.getBoundingClientRect(),i=n.top-o.top,a=n.height;t.style.top=`${i}px`,t.style.height=`${a}px`,t.classList.remove("opacity-0"),t.classList.add("opacity-100")}hideHighlighter(){const e=document.querySelector('[data-role="page-outline-highlighter"]');e&&(e.classList.remove("opacity-100"),e.classList.add("opacity-0"))}destroy(){}}class TabManager{constructor(){this.tablists=[]}init(){this.tablists=Array.from(document.querySelectorAll('[role="tablist"]')),this.tablists.forEach(e=>this.setupTablist(e))}setupTablist(e){const n=e.id;if(!n)return;const t=Array.from(e.querySelectorAll('[role="tab"]'));if(t.length===0)return;t.forEach(e=>{e.addEventListener("click",()=>this.activateTab(e,t))}),this.initializeActiveTab(e,t)}initializeActiveTab(e,t){const n=e.querySelector('[data="true"]');!n&&t.length>0?this.activateTab(t[0],t):n&&this.showTabContent(n)}activateTab(e,t){t.forEach(e=>{e.dataset.selected="false",e.setAttribute("data-state","inactive"),e.setAttribute("tabindex","-1")}),e.dataset.selected="true",e.setAttribute("data-state","active"),e.setAttribute("tabindex","0"),this.showTabContent(e)}showTabContent(e){const n=e.getAttribute("aria-controls");if(!n)return;const t=document.getElementById(n);if(!t)return;this.hideRelatedContentPanels(e),t.removeAttribute("hidden"),t.dataset.selected="true"}hideRelatedContentPanels(e){const n=e.id,t=n.match(/^tabButton(.*)-\d+$/);if(t){const e=t[1],n=document.querySelectorAll(`[id^="tab-content${e}-"]`);n.forEach(e=>{e.dataset.selected="false",e.setAttribute("hidden","")})}}}class ContentTabManager{constructor(){this.groups=[],this.parent=new Map,this.selected=new Map}init(){if(this.groups=Array.from(document.querySelectorAll("[data-content-tabs]")),this.groups.length===0)return;this.parent=new Map,this.selected=new Map;for(const t of this.groups){const e=this.buttonIds(t);for(let t=1;t<e.length;t++)this.union(e[0],e[t])}for(const e of this.groups)for(const n of this.buttonIds(e)){const t=this.find(n);if(!this.selected.has(t)){const e=this.readStored(t);this.selected.set(t,e&&this.find(e)===t?e:n)}}for(const e of this.groups)for(const t of this.buttons(e))t.addEventListener("click",()=>this.select(t.dataset.tab));this.render()}buttons(e){return Array.from(e.querySelectorAll(':scope > [role="tablist"] > .ctab-btn[data-tab]'))}buttonIds(e){return this.buttons(e).map(e=>e.dataset.tab)}find(e){if(!this.parent.has(e))return this.parent.set(e,e),e;let t=e;for(;this.parent.get(t)!==t;)t=this.parent.get(t);let n=e;for(;this.parent.get(n)!==t;){const e=this.parent.get(n);this.parent.set(n,t),n=e}return t}union(e,t){const n=this.find(e),s=this.find(t);n!==s&&this.parent.set(s,n)}select(e){const t=this.find(e);this.selected.set(t,e),this.writeStored(t,e),this.render()}render(){for(const t of this.groups){const e=this.buttonIds(t);
1if(e.length===0)continue;const o=this.find(e[0]),n=this.selected.get(o),s=e.includes(n)?n:e[0];for(const e of this.buttons(t)){const n=e.dataset.tab===s;e.dataset.active=String(n),e.setAttribute("aria-selected",String(n))}for(const e of t.querySelectorAll(":scope > .ctab-panel[data-tab]")){let n=e.dataset.tab===s;const o=e.dataset.condition||"";n&&o&&(n=this.selected.get(this.find(o))===o),e.dataset.active=String(n)}}}readStored(e){try{return localStorage.getItem("pn-ctab:"+e)}catch{return null}}writeStored(e,t){try{localStorage.setItem("pn-ctab:"+e,t)}catch{}}}class MermaidManager{constructor(){this.mermaidLoaded=!1,this.mermaidInstance=null,this.diagrams=[],this.renderedDiagrams=[]}async init(){if(this.renderedDiagrams=[],this.diagrams=this.findMermaidDiagrams(),this.diagrams.length===0)return;try{await this.loadMermaid(),await this.renderDiagrams()}catch(e){console.error("Failed to initialize mermaid:",e)}}findMermaidDiagrams(){return Array.from(document.querySelectorAll("code.language-mermaid"))}async loadMermaid(){if(this.mermaidLoaded)return;this.mermaidInstance=await import("https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs"),this.mermaidLoaded=!0,this.initializeMermaid()}initializeMermaid(){if(!this.mermaidInstance)return;const e=document.documentElement.classList.contains("dark"),t=this.getMermaidConfig(e);this.mermaidInstance.default.initialize(t)}getMermaidConfig(e){function t(e,t){if(typeof window=="undefined"||typeof document=="undefined")return t;const n=getComputedStyle(document.documentElement).getPropertyValue(e).trim()||t;if(n.startsWith("oklch(")){let e=s(n);return e}return n}function s(e){const s=e.match(/oklch\(\s*([\d.]+)%?\s+([\d.]+)\s+([\d.]+)\s*\)/);if(!s)return"#000000";let t=parseFloat(s[1]);const u=parseFloat(s[2]),p=parseFloat(s[3]);t>1&&(t=t/100);const d=p*Math.PI/180,c=Math.cos(d)*u,l=Math.sin(d)*u,f=t+.3963377774*c+.2158037573*l,h=t-.1055613458*c-.0638541728*l,m=t-.0894841775*c-1.291485548*l,i=f**3,r=h**3,a=m**3,g=+4.0767416621*i-3.3077115913*r+.2309699292*a,v=-1.2684380046*i+2.6097574011*r-.3413193965*a,b=-.0041960863*i-.7034186147*r+1.707614701*a,j=n(g),y=n(v),_=n(b);return o(j,y,_)}function n(e){return e=Math.max(0,Math.min(1,e)),e<=.0031308?12.92*e:1.055*e**(1/2.4)-.055}function o(e,t,n){const s=e=>Math.max(0,Math.min(255,Math.round(e*255)));return"#"+s(e).toString(16).padStart(2,"0")+s(t).toString(16).padStart(2,"0")+s(n).toString(16).padStart(2,"0")}return e?{startOnLoad:!1,securityLevel:"loose",logLevel:"error",theme:"base",darkMode:!0,themeVariables:{fontFamily:t("--font-sans",'ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"'),primaryColor:t("--color-primary-600","#BB2528"),primaryTextColor:t("--color-primary-50","#ffffff"),secondaryColor:t("--color-accent-600","#006100"),tertiaryColor:t("--color-accent-600","#666666"),background:t("--color-base-950","#0a0a0a"),mainBkg:t("--color-base-900","#1a1a1a"),nodeBkg:t("--color-base-900","#1a1a1a"),secondaryBkg:t("--color-base-800","#2a2a2a"),tertiaryBkg:t("--color-base-700","#333333"),noteBorderColor:t("--color-base-600","#333333"),noteBkgColor:t("--color-base-800","#333333"),lineColor:t("--color-accent-400","#4ade80"),primaryBorderColor:t("--color-primary-500","#dc2626"),nodeBorder:t("--color-primary-500","#dc2626"),secondaryBorderColor:t("--color-accent-500","#22c55e"),tertiaryBorderColor:t("--color-accent-500","#6b7280"),textColor:t("--color-base-300","#f3f4f6"),nodeTextColor:t("--color-primary-50","#ffffff"),edgeLabelColor:t("--color-base-200","#e5e7eb"),edgeLabelBackground:t("--color-base-800","#1f2937"),node0:t("--color-primary-600","#dc2626"),node1:t("--color-accent-600","#059669"),node2:t("--color-accent-600","#4b5563"),node3:t("--color-primary-600","#7c3aed")}}:{startOnLoad:!1,securityLevel:"loose",logLevel:"error",theme:"base",darkMode:!1,themeVariables:{fontFamily:t("--font-sans",'ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"'),primaryColor:t("--color-primary-700","#BB2528"),primaryTextColor:t("--color-base-500","#ffffff"),secondaryColor:t("--color-accent-700","#006100"),tertiaryColor:t("--color-accent-600","#4b5563"),background:t("--color-base-50","#f9fafb"),mainBkg:t("--color-base-100","#f3f4f6"),nodeBkg:t("--color-base-100","#f3f4f6"),secondaryBkg:t("--color-base-200","#e5e7eb"),tertiaryBkg:t("--color-base-150","#f0f0f0"),noteBorderColor:t("--color-base-200","#333333"),noteBkgColor:t("--monorail-color-base-100","#333333"),lineColor:t("--color-accent-600","#16a34a"),primaryBorderColor:t("--color-primary-600","#dc2626"),nodeBorder:t("--color-primary-600","#dc2626"),secondaryBorderColor:t("--color-accent-600","#16a34a"),tertiaryBorderColor:t("--color-accent-400","#9ca3af"),textColor:t("--color-base-900","#111827"),nodeTextColor:t("--color-base-900","#ffffff"),edgeLabelColor:t("--color-base-700","#374151"),edgeLabelBackgroun
1d:t("--color-base-100","#f3f4f6"),node0:t("--color-primary-600","#dc2626"),node1:t("--color-accent-600","#16a34a"),node2:t("--color-accent-600","#4b5563"),node3:t("--color-primary-600","#7c3aed")}}}async renderDiagrams(){if(!this.mermaidInstance||this.diagrams.length===0)return;for(let e=0;e<this.diagrams.length;e++){const t=this.diagrams[e],n=t.textContent;try{const{svg:o}=await this.mermaidInstance.default.render(`mermaid-diagram-${e}`,n),s=document.createElement("div");s.className="mermaid-diagram",s.innerHTML=o,s.dataset.originalText=n,t.parentNode.replaceChild(s,t),this.renderedDiagrams.push(s)}catch(t){console.error(`Failed to render mermaid diagram ${e}:`,t)}}}async reinitializeForTheme(){if(!this.mermaidLoaded||this.renderedDiagrams.length===0)return;this.initializeMermaid();const e=Date.now();for(let t=0;t<this.renderedDiagrams.length;t++){const n=this.renderedDiagrams[t],s=n.dataset.originalText;if(s)try{const{svg:o}=await this.mermaidInstance.default.render(`mermaid-diagram-${e}-${t}`,s);n.innerHTML=o}catch(e){console.error(`Failed to re-render mermaid diagram ${t} for theme:`,e)}}}}class MobileNavManager{constructor(){this.menuToggle=null,this.navSidebar=null,this.mobileOverlay=null,this.isInitialized=!1}init(){this.menuToggle=document.getElementById("menu-toggle"),this.navSidebar=document.getElementById("nav-sidebar"),this.mobileOverlay=document.getElementById("mobile-overlay"),this.menuToggle&&this.navSidebar&&(this.setupEventListeners(),this.isInitialized=!0)}setupEventListeners(){this.menuToggle.addEventListener("click",()=>{this.toggleMenu()}),this.navSidebar.addEventListener("click",e=>{e.target.tagName==="A"&&window.innerWidth<1024&&this.closeMenu()}),this.mobileOverlay&&this.mobileOverlay.addEventListener("click",()=>{this.closeMenu()}),document.addEventListener("click",e=>{window.innerWidth<1024&&!this.navSidebar.contains(e.target)&&!this.menuToggle.contains(e.target)&&this.isMenuOpen()&&this.closeMenu()}),document.addEventListener("keydown",e=>{e.key==="Escape"&&this.isMenuOpen()&&this.closeMenu()})}toggleMenu(){this.isMenuOpen()?this.closeMenu():this.openMenu()}isMenuOpen(){return this.navSidebar.getAttribute("aria-expanded")==="true"}closeMenu(){this.navSidebar.dataset.expanded="false",this.mobileOverlay&&this.mobileOverlay.setAttribute("aria-hidden","true"),document.body.setAttribute("data-mobile-menu-open","false")}openMenu(){this.navSidebar.dataset.expanded="true",this.mobileOverlay&&this.mobileOverlay.setAttribute("aria-hidden","false"),document.body.setAttribute("data-mobile-menu-open","true")}}class MainSiteNavManager{constructor(){this.menuButton=null,this.mobileMenu=null}init(){this.menuButton=document.getElementById("mobile-menu-button"),this.mobileMenu=document.getElementById("mobile-menu"),this.menuButton&&this.mobileMenu&&this.setupEventListeners()}setupEventListeners(){this.menuButton.addEventListener("click",()=>{this.toggleMenu()}),this.mobileMenu.addEventListener("click",e=>{e.target.tagName==="A"&&this.closeMenu()}),document.addEventListener("click",e=>{!this.mobileMenu.contains(e.target)&&!this.menuButton.contains(e.target)&&this.isMenuOpen()&&this.closeMenu()}),document.addEventListener("keydown",e=>{e.key==="Escape"&&this.isMenuOpen()&&this.closeMenu()}),window.addEventListener("resize",()=>{window.innerWidth>=768&&this.closeMenu()})}toggleMenu(){this.isMenuOpen()?this.closeMenu():this.openMenu()}isMenuOpen(){return this.mobileMenu.dataset.expanded==="true"}openMenu(){this.mobileMenu.dataset.expanded="true"}closeMenu(){this.mobileMenu.dataset.expanded="false"}}class SidebarToggleManager{constructor(){this.sidebarToggle=null,this.sidebarOverlay=null,this.sidebarClose=null,this.sidebarPanel=null}init(){this.sidebarToggle=document.getElementById("sidebar-toggle"),this.sidebarOverlay=document.getElementById("sidebar-overlay"),this.sidebarClose=document.getElementById("sidebar-close"),this.sidebarPanel=document.getElementById("sidebar-panel"),this.sidebarToggle&&this.sidebarOverlay&&this.setupEventListeners()}setupEventListeners(){this.sidebarToggle.addEventListener("click",()=>{this.toggleSidebar()}),this.sidebarClose&&this.sidebarClose.addEventListener("click",()=>{this.closeSidebar()}),this.sidebarOverlay.addEventListener("click",e=>{e.target===this.sidebarOverlay&&this.closeSidebar()}),document.addEventListener("keydown",e=>{e.key==="Escape"&&this.isSidebarOpen()&&this.closeSidebar()}),this.sidebarPanel&&this.sidebarPanel.addEventListener("click",e=>{e.target.closest("a[href]")&&this.closeSidebar()})}toggleSidebar(){this.isSidebarOpen()?this.closeSidebar():this.openSidebar()}isSidebarOpen(){return!this.sidebarOverlay.classList.contains("hidden")}openSidebar(){this.sidebarOverlay.classList.remove("hidden"),document.body.setAttribute("data-sidebar-open","true")}closeSidebar(){this.sidebarOverlay.classList.add("hidden"),document.body.setAttribute("data-sidebar-open","false")}}class AreaNavManager{init(){if(this.nav=document.querySelector("[data-area-nav]"),!this.nav)return;this.hideInactiveAreas(),this.nav.addEventListener("click",e=>this.onPillClick(e))}hideInactiveAreas(){const e=this.nav.dataset.activeArea;for(const t of document.querySelectorAll("[data-area-toc]"))t.classList.toggle("hidden",t.dataset.areaToc!==e)}onPillClick(e){const t=e.target.closest("[data-area]");if(!t)return;if(t.dataset.areaDirect==="true")return;e.preventDefault(),e.stopPropagation(),this.switchToArea(t.dataset.area)}switchToArea(e){if(!this.nav)return;for(const t of this.nav.querySelectorAll("[data-area]")){const n=t.dataset.area===e;t.setAttribute("aria-current",n?"true":"false");const s=t.querySelector("[data-area-dot]");s&&(s.classList.toggle("bg-accent-500",n),s.classList.toggle("bg-base-400",!n))}for(const t of document.querySelectorAll("[data-area-toc]"))t.classList.toggle("hidden",t.dataset.areaToc!==e);this.nav.dataset.activeArea=e}}class SidebarStateManager{constructor(e){this.areaNavManager=e,this.sidebar=null}init(){this.sidebar=document.getElementById("nav-sidebar")}patch(e){if(!this.sidebar||!e)return;const n=e.getElementById("nav-sidebar");
1if(!n)return;const t=new Map;for(const e of n.querySelectorAll("a[data-current]")){const s=e.getAttribute("href");s&&t.set(s,e.getAttribute("data-current"))}for(const e of this.sidebar.querySelectorAll("a[data-current]")){const n=e.getAttribute("href"),s=n&&t.has(n)?t.get(n):"false";e.getAttribute("data-current")!==s&&e.setAttribute("data-current",s)}const s=e.querySelector("[data-area-nav]"),o=this.sidebar.querySelector("[data-area-nav]");if(s&&o){const e=s.getAttribute("data-active-area"),t=o.getAttribute("data-active-area");e&&e!==t&&this.areaNavManager.switchToArea(e)}}}class LanguageSwitcherManager{constructor(){this.switcher=null}init(){this.switcher=document.querySelector("[data-lang-switcher]")}patch(e){if(!this.switcher||!e)return;const t=e.querySelector("[data-lang-switcher]");if(!t)return;this.switcher.innerHTML=t.innerHTML}}class SearchManager{constructor(){this.searchInput=null,this.backdrop=null,this.modal=null,this.modalInput=null,this.resultsBody=null,this.clearBtn=null,this.engine=null,this.engineFailed=!1,this.loadedLocale=null,this._scriptPromise=null,this.lastRanked=[],this.lastQuery="",this.queryId=0,this.selected=0,this.MAX_RESULTS=30,this.MAX_PER_PAGE=3}async init(){if(this.searchInput=document.getElementById("search-input"),!this.searchInput)return;this.createSearchModal(),this.setupEventListeners(),this.ensureSearchEngineScript().catch(()=>{})}svg(e,t=""){const n={search:'<circle cx="11" cy="11" r="7"/><path d="m21 21-4.3-4.3"/>',x:'<path d="M18 6 6 18M6 6l12 12"/>',bolt:'<path d="M13 2 3 14h9l-1 8 10-12h-9l1-8z"/>',chevron:'<path d="m9 18 6-6-6-6"/>',hash:'<path d="M9 17H7A5 5 0 0 1 7 7h2"/><path d="M15 7h2a5 5 0 1 1 0 10h-2"/><line x1="8" y1="12" x2="16" y2="12"/>',file:'<path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/>',clock:'<circle cx="12" cy="12" r="10"/><polyline points="12 6 12 12 16 14"/>',nores:'<circle cx="11" cy="11" r="7"/><path d="m21 21-4.3-4.3"/><line x1="8" y1="11" x2="14" y2="11"/>',warn:'<path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3z"/><line x1="12" y1="9" x2="12" y2="13"/><line x1="12" y1="17" x2="12.01" y2="17"/>'}[e]||"";return`<svg class="${t}" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">${n}</svg>`}createSearchModal(){const e=document.createElement("div");e.id="search-modal-backdrop",e.className="search-modal-backdrop hidden",e.innerHTML=`
2            <div class="search-modal" role="dialog" aria-label="Search" aria-modal="true">
3                <div class="search-input-row">
4                    ${this.svg("search","search-input-icon")}
5                    <input id="search-modal-input" class="search-input" type="text" placeholder="Search docs…" autocomplete="off" spellcheck="false" />
6                    <button id="search-clear-btn" class="search-clear-btn hidden" aria-label="Clear search">${this.svg("x","w-3 h-3")}</button>
7                    <span class="search-esc-kbd">Esc</span>
8                </div>
9                <div id="search-results" class="search-results-body"></div>
10                <div class="search-foot">
11                    <div class="search-powered">${this.svg("bolt","w-3 h-3")} Pennington search</div>
12                </div>
13            </div>`,document.body.appendChild(e),this.backdrop=e,this.modal=e.querySelector(".search-modal"),this.modalInput=e.querySelector("#search-modal-input"),this.clearBtn=e.querySelector("#search-clear-btn"),this.resultsBody=e.querySelector("#search-results")}setupEventListeners(){this.searchInput.addEventListener("click",e=>{e.preventDefault(),this.openModal()}),this.backdrop.addEventListener("click",e=>{e.target===this.backdrop&&this.closeModal()}),this.clearBtn.addEventListener("click",()=>{this.modalInput.value="",this.clearBtn.classList.add("hidden"),this.modalInput.focus(),this.showEmpty()});let e;this.modalInput.addEventListener("input",t=>{this.clearBtn.classList.toggle("hidden",!t.target.value),clearTimeout(e),e=setTimeout(()=>this.performSearch(t.target.value),250)}),document.addEventListener("keydown",e=>{const n=!this.backdrop.classList.contains("hidden");if(!n){(e.metaKey||e.ctrlKey)&&e.key==="k"&&(e.preventDefault(),this.openModal());return}if(e.key==="Escape"){this.closeModal();return}if((e.metaKey||e.ctrlKey)&&e.key==="k"){e.preventDefault();return}const t=this.resultsBody.querySelectorAll(".search-result");if(e.key==="ArrowDown")e.preventDefault(),t.length&&(this.selected=(this.selected+1)%t.length,this.applySelection());else if(e.key==="ArrowUp")e.preventDefault(),t.length&&(this.selected=(this.selected-1+t.length)%t.length,this.applySelection());else if(e.key==="Enter"){const n=t[this.selected];n&&this.openResult(n,e.metaKey||e.ctrlKey)}}),this.resultsBody.addEventListener("click",e=>{const t=e.target.closest("[data-recent]");if(t){this.modalInput.value=t.dataset.recent,this.clearBtn.classList.remove("hidden"),this.performSearch(t.dataset.recent);return}if(e.target.closest("[data-clear-recents]")){localStorage.removeItem("pnx-search-recents"),this.showEmpty();return}if(e.target.closest("[data-retry]")){this.engineFailed=!1,this.engine=null,this.openModal();return}const n=e.target.closest(".search-result");n&&this.openResult(n,e.metaKey||e.ctrlKey)})}async openModal(){if(this.backdrop.classList.remove("hidden"),document.body.style.overflow="hidden",this.modalInput.focus(),this.modalInput.select(),this.engineFailed){this.showError();return}const e=this.getIndexLocale();if(this.engine&&this.loadedLocale&&this.loadedLocale!==e&&(this.engine=null,this.loadedLocale=null,this.lastRanked=[]),!this.engine){this.showLoading();try{await this.ensureSearchEngineScript();const t=new DeweySearchEngine(`${this.baseUrl()}/search/${e}`);await t.loadManifest(),this.engine=t,this.loadedLocale=e}catch(e){console.error("Failed to load search index:",e),this.engineFailed=!0,this.showError();return}}this.modalInput.value.trim()?this.performSearch(this.modalInput.value):this.showEmpty()}closeModal(){this.backdrop.classList.add("hidden"),document.body.style.overflow=""}baseUrl(){let e=document.body.getAttribute("data-base-url")||"";return e.endsWith("/")&&(e=e.slice(0,-1)),e}ensureSearchEngineScript(){return typeof DeweySearchEngine!="undefined"?Promise.resolve():this._scriptPromise?this._scriptPromise:(this._scriptPromise=new Promise((e,t)=>
13{const n=document.createElement("script");n.src=`${this.baseUrl()}/_content/DeweySearch.Web/dewey-search.js`,n.addEventListener("load",()=>e(),{once:!0}),n.addEventListener("error",()=>{this._scriptPromise=null,n.remove(),t(new Error("Failed to load dewey-search.js"))},{once:!0}),document.head.appendChild(n)}),this._scriptPromise)}async performSearch(e){const t=e.trim();this.lastQuery=t;const n=++this.queryId;if(!t){this.lastRanked=[],this.showEmpty();return}if(this.engineFailed){this.showError();return}if(!this.engine){this.showLoading();return}try{const e=await this.engine.search(t);if(n!==this.queryId)return;this.lastRanked=e,await this.renderResults(n)}catch(e){console.error("Search error:",e),n===this.queryId&&this.showError()}}areaOf(e){const t=this.engine.docEntry(e),s=this.engine.availableFacets(),n=t&&t.f&&t.f.area;return!n||!n.length||!s.area?"":s.area[n[0]]||""}areaLabel(e){return e?e.charAt(0).toUpperCase()+e.slice(1):""}areaPill(e){return e?`<span class="search-area-pill" data-area="${e}"><span class="search-dot search-pill-dot" data-area="${e}"></span>${this.areaLabel(e)}</span>`:""}async renderResults(e){const t=this.lastRanked;if(t.length===0){this.showNoResults();return}this._fieldsById=new Map(t.map(e=>[e.docId,e.fields|0]));const n=this.groupByPage(t.slice(0,this.MAX_RESULTS));for(const e of n)e.items=e.items.slice(0,this.MAX_PER_PAGE);const s=n.flatMap(e=>e.items.filter(e=>this.showsSnippet(e))),o=await this.fetchFragments(s);if(e!==this.queryId)return;this.resultsBody.innerHTML=n.map(e=>this.groupHtml(e,o)).join(""),this.selected=0,this.applySelection()}groupByPage(e){const n=[],t=new Map;for(const i of e){const o=this.engine.docEntry(i.docId)||{},r=o.u||"",a=r.split("#")[0];let s=t.get(a);s||(s={pageUrl:a,title:"",area:this.areaOf(i.docId),leadId:null,items:[]},t.set(a,s),n.push(a)),r.includes("#")?(s.items.push(i.docId),s.title||(s.title=o.c&&o.c[0]||o.t||"")):(s.leadId=i.docId,s.title=o.t||s.title)}return n.map(e=>t.get(e))}async fetchFragments(e){const t=[...new Set(e)],s=await Promise.all(t.map(e=>this.engine.loadFragment(e))),n={};return t.forEach((e,t)=>{n[e]=s[t]}),n}groupHtml(e,t){const n=e.area==="reference"?"search-page-group-title is-mono":"search-page-group-title",s=`<div class="search-result search-page-group-head" data-url="${this.escapeAttr(this.baseUrl()+e.pageUrl)}">
14            <span class="${n}">${this.highlightEsc(e.title)}</span>
15            ${this.areaPill(e.area)}
16        </div>`,o=e.items.map(e=>this.subRowHtml(e,t[e])).join("");return`<div class="search-page-group">${s}${o}</div>`}subRowHtml(e,t){const n=this.engine.docEntry(e)||{},s=(n.c||[]).slice(1),i=s.length?`<div class="search-result-breadcrumb">${s.map(e=>`<span>${this.highlightEsc(e)}</span>`).join('<span class="sep">›</span>')}</div>`:"",o=this.showsSnippet(e)?this.getContentSnippet(t&&t.body||"",this.lastQuery):"",a=o?`<div class="search-result-snippet">${o}</div>`:"";return`<div class="search-result search-result-sub" data-url="${this.escapeAttr(this.baseUrl()+(n.u||""))}">
17            ${i}
18            <div class="search-result-heading">${this.highlightEsc(n.t||"")}</div>
19            ${a}
20        </div>`}showsSnippet(e){const t=typeof DeweySearchEngine!="undefined"&&DeweySearchEngine.FieldFlags||{Title:1,Heading:2},n=this._fieldsById&&this._fieldsById.get(e)||0;return(n&(t.Title|t.Heading))===0}applySelection(){const e=this.resultsBody.querySelectorAll(".search-result");e.forEach((e,t)=>{t===this.selected?e.setAttribute("data-selected","true"):e.removeAttribute("data-selected")}),e[this.selected]?.scrollIntoView({block:"nearest"})}openResult(e,t){const n=e.getAttribute("data-url");if(!n)return;if(this.saveRecent(),t){window.open(n,"_blank","noopener");return}this.closeModal(),window.location.href=n}showLoading(){const e=`<div class="search-skel-row"><div class="search-skel" style="height:14px"></div><div><div class="search-skel" style="height:10px;width:55%;margin-bottom:8px"></div><div class="search-skel" style="height:14px;width:70%;margin-bottom:8px"></div><div class="search-skel" style="height:10px;width:92%"></div></div></div>`;this.resultsBody.innerHTML=e.repeat(4)}showError(){this.resultsBody.innerHTML=`<div class="search-state">
21            <div class="search-state-icon search-state-icon-warn">${this.svg("warn","w-6 h-6")}</div>
22            <div class="search-state-title">Search is temporarily unavailable</div>
23            <div class="search-state-sub">The search index didn't load. This usually clears up on its own — try again in a moment.</div>
24            <div class="search-state-actions"><button class="search-nr-btn search-nr-btn-primary" data-retry>Retry</button></div></div>`}showNoResults(){const e=this.escapeHtml('"'+this.lastQuery+'"');this.resultsBody.innerHTML=`<div class="search-state">
25            <div class="search-state-icon">${this.svg("nores","w-6 h-6")}</div>
26            <div class="search-state-title">No matches for <span class="font-mono">${e}</span></div>
27            <div class="search-state-sub">We couldn't find any heading or page mentioning that. Try a broader term.</div></div>`}showEmpty(){const e=this.getRecents();if(!e.length){this.resultsBody.innerHTML=`<div class="search-state"><div class="search-state-sub">Start typing to search the docs.</div></div>`;return}const t=e.map(e=>`<div class="search-recent-row" data-recent="${this.escapeAttr(e.q)}">
28            ${this.svg("clock","search-recent-icon")}
29            <div><div class="search-recent-title">${this.escapeHtml(e.q)}</div><div class="search-recent-sub">${this.ago(e.ts)} · ${e.count} ${e.count===1?"result":"results"}</div></div>
30            ${this.svg("chevron","search-recent-chevron")}</div>`).join("");this.resultsBody.innerHTML=`<section class="search-empty-section">
31            <div class="search-empty-head"><span>Recent searches</span><span class="search-empty-clear" data-clear-recents>Clear all</span></div>
32            ${t}</section>`}getRecents(){try{return JSON.parse(localStorage.getItem("pnx-search-recents")||"[]")}catch{return[]}}saveRecent(){const e=this.lastQuery.trim();if(!e)return;let t=this.getRecents().filter(t=>t.q!==e);t.unshift({q:e,ts:Date.now(),count:this.lastRanked.length}),localStorage.setItem("pnx-search-recents",JSON.stringify(t.slice(0,5)))}ago(e){const t=Math.floor((Date.now()-e)/864e5);if(t<=0)return"today";if(t===1)return"yesterday";if(t<7)return`${t} days ago`;const n=Math.floor(t/7);return n===1?"last week":`${n} weeks ago`}escapeAttr(e){return String(e).replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/</g,"&lt;")}highlightEsc(e){return this.highlightText(this.escapeHtml(e),this.lastQuery)}escapeHtml(e){return String(e).replace(/[&<>"']/g,e=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"}[e]))}getIndexLocale(){const n=(document.body.getAttribute("data-locales")||"").split(",").filter(
32Boolean),t=document.body.getAttribute("data-default-locale")||"en";if(n.length<=1)return t;const s=window.location.pathname.replace(/^\//,""),e=s.split("/")[0];return e&&n.includes(e)&&e!==t?e:t}highlightText(e,t){if(!e||!t)return e;const s=t.toLowerCase().split(/\s+/);let n=e;return s.forEach(e=>{if(e.length>2){const t=new RegExp(`(${e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")})`,"gi");n=n.replace(t,'<mark class="search-highlight">$1</mark>')}}),n}getContentSnippet(e,t){if(!e||!t)return"";const a=t.toLowerCase().split(/\s+/),r=e.toLowerCase();let n=-1;for(const e of a)if(e.length>2){const t=r.indexOf(e);t!==-1&&(n===-1||t<n)&&(n=t)}if(n===-1)return this.escapeHtml(e.substring(0,150))+(e.length>150?"…":"");const o=Math.max(0,n-75),i=Math.min(e.length,n+75);let s=e.substring(o,i);return o>0&&(s="…"+s),i<e.length&&(s=s+"…"),this.highlightText(this.escapeHtml(s),t)}}class SyntaxHighlighter{constructor(){this.prefix="language-",this.hljs=null}async init(){const e=this.getRelevantCodeNodes();if(e.length===0)return;try{await this.setupHighlightJs(),this.highlightCodeNodes(e)}catch(e){console.error("Failed to initialize syntax highlighting:",e)}}getRelevantCodeNodes(){const e=Array.from(document.body.querySelectorAll("code"));return e.filter(e=>{const t=Array.from(e.classList).some(e=>e.startsWith(this.prefix)&&e!==this.prefix+"mermaid"&&e!==this.prefix+"text"&&e!==this.prefix);return!!t&&!e.querySelector('span[class^="hljs-"]')})}async setupHighlightJs(){this.hljs=await import("https://esm.sh/highlight.js@11/lib/core"),this.hljs.default.configure({ignoreUnescapedHTML:!0,throwUnescapedHTML:!1});const e=["javascript","typescript","python","java","csharp","cpp","c","css","xml","json","yaml","bash","shell","sql","php","ruby","go","rust","kotlin","swift","markdown"];for(const t of e)try{const e=await import(`https://esm.sh/highlight.js@11/lib/languages/${t}`);this.hljs.default.registerLanguage(t,e.default)}catch{}}highlightCodeNodes(e){for(const t of e)try{this.highlightSingleNode(t)}catch(e){console.error(`Failed to highlight code node:`,e)}}highlightSingleNode(e){const n=Array.from(e.classList).find(e=>e.startsWith(this.prefix));if(!n)return;const t=n.slice(this.prefix.length),o={js:"javascript",ts:"typescript",cs:"csharp",py:"python",sh:"bash",yml:"yaml"},s=o[t]||t;try{if(this.hljs.default.getLanguage(s)){const t=this.hljs.default.highlight(e.textContent,{language:s});e.innerHTML=t.value,e.classList.add("hljs")}else{const t=this.hljs.default.highlightAuto(e.textContent);e.innerHTML=t.value,e.classList.add("hljs")}}catch(e){console.warn(`Failed to highlight ${t}:`,e)}}}const pageManager=new PageManager;window.pageManager=pageManager,document.addEventListener("spa:before-navigate",()=>{window.pageManager?.onSpaNavigating()}),document.addEventListener("spa:commit",e=>{window.pageManager?.onSpaCommit(e.detail?.doc)})

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.