PageSourceSearch

https://strategicplaybook.netlify.app/assets/main-BYCVgIxd.js

js strategicplaybook.netlify.app collected 2026-10-03 11:27:27 UTC 30,012 bytes, 242 lines download raw bytes

1import{n as k}from"./nav-DUWj6VIX.js";const w=document.documentElement,j="sp-theme",S=()=>typeof window<"u"&&window.matchMedia?.("(prefers-color-scheme: dark)").matches,H=()=>{if(typeof window>"u")return"light";const e=window.localStorage?.getItem(j);return e==="light"||e==="dark"?e:S()?"dark":"light"},E=(e,r)=>{e==="dark"?(w.setAttribute("data-theme","dark"),r?.setAttribute("aria-pressed","true")):(w.removeAttribute("data-theme"),r?.setAttribute("aria-pressed","false"))},C=()=>{const e=document.getElementById("themeToggle"),r=H();E(r,e),e?.addEventListener("click",()=>{const a=w.getAttribute("data-theme")==="dark"?"light":"dark";window.localStorage?.setItem(j,a),E(a,e)})};document.readyState==="loading"?document.addEventListener("DOMContentLoaded",C):C();const $={menu:'<svg xmlns="http://www.w3.org/2000/svg" width="800px" height="800px" viewBox="-0.5 0 25 25" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="h-5 w-5" aria-hidden="true" focusable="false"><path d="M6.5 10.32C8.433 10.32 10 8.753 10 6.82001C10 4.88701 8.433 3.32001 6.5 3.32001C4.567 3.32001 3 4.88701 3 6.82001C3 8.753 4.567 10.32 6.5 10.32Z"/><path d="M17.5 10.32C19.433 10.32 21 8.753 21 6.82001C21 4.88701 19.433 3.32001 17.5 3.32001C15.567 3.32001 14 4.88701 14 6.82001C14 8.753 15.567 10.32 17.5 10.32Z"/><path d="M6.5 21.32C8.433 21.32 10 19.753 10 17.82C10 15.887 8.433 14.32 6.5 14.32C4.567 14.32 3 15.887 3 17.82C3 19.753 4.567 21.32 6.5 21.32Z"/><path d="M17.5 21.32C19.433 21.32 21 19.753 21 17.82C21 15.887 19.433 14.32 17.5 14.32C15.567 14.32 14 15.887 14 17.82C14 19.753 15.567 21.32 17.5 21.32Z"/></svg>',"x-mark":'<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="h-5 w-5" aria-hidden="true" focusable="false"><path stroke-linecap="round" stroke-linejoin="round" d="M6 18 18 6M6 6l12 12"/></svg>',moon:'<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="h-5 w-5" aria-hidden="true" focusable="false"><path stroke-linecap="round" stroke-linejoin="round" d="M21.752 15.002A9.72 9.72 0 0 1 18 15.75c-5.385 0-9.75-4.365-9.75-9.75 0-1.33.266-2.597.748-3.752A9.753 9.753 0 0 0 3 11.25C3 16.635 7.365 21 12.75 21a9.753 9.753 0 0 0 9.002-5.998Z"/></svg>',sun:'<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="h-5 w-5" aria-hidden="true" focusable="false"><path stroke-linecap="round" stroke-linejoin="round" d="M12 3v2.25m6.364.386-1.591 1.591M21 12h-2.25m-.386 6.364-1.591-1.591M12 18.75V21m-4.773-4.227-1.591 1.591M5.25 12H3m4.227-4.773L5.636 5.636M15.75 12a3.75 3.75 0 1 1-7.5 0 3.75 3.75 0 0 1 7.5 0Z"/></svg>',"question-mark-circle":'<svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 512 512" class="h-4 w-4" aria-hidden="true" focusable="false"><path d="M396.138,85.295c-13.172-25.037-33.795-45.898-59.342-61.03C311.26,9.2,280.435,0.001,246.98,0.001c-41.238-0.102-75.5,10.642-101.359,25.521c-25.962,14.826-37.156,32.088-37.156,32.088c-4.363,3.786-6.824,9.294-6.721,15.056c0.118,5.77,2.775,11.186,7.273,14.784l35.933,28.78c7.324,5.864,17.806,5.644,24.875-0.518c0,0,4.414-7.978,18.247-15.88c13.91-7.85,31.945-14.173,58.908-14.258c23.517-0.051,44.022,8.725,58.016,20.717c6.952,5.941,12.145,12.594,15.328,18.68c3.208,6.136,4.379,11.5,4.363,15.574c-0.068,13.766-2.742,22.77-6.603,30.442c-2.945,5.729-6.789,10.813-11.738,15.744c-7.384,7.384-17.398,14.207-28.634,20.479c-11.245,6.348-23.365,11.932-35.612,18.68c-13.978,7.74-28.77,18.858-39.701,35.544c-5.449,8.249-9.71,17.686-12.416,27.641c-2.742,9.964-3.98,20.412-3.98,31.071c0,11.372,0,20.708,0,20.708c0,10.719,8.69,19.41,19.41,19.41h46.762c10.719,0,19.41-8.691,19.41-19.41c0,0,0-9.336,0-20.708c0-4.107,0.467-6.755,0.917-8.436c0.773-2.512,1.206-3.14,2.47-4.668c1.29-1.452,3.895-3.674,8.698-6.331c7.019-3.946,18.298-9.276,31.07-16.176c19.121-10.456,42.367-24.646,61.972-48.062c9.752-11.686,18.374-25.758,24.323-41.968c6.001-16.21,9.242-34.431,9.226-53.96C410.243,120.761,404.879,101.971,396.138,85.295z"/><path d="M228.809,406.44c-29.152,0-52.788,23.644-52.788,52.788c0,29.136,23.637,52.772,52.788,52.772c29.136,0,52.763-23.636,52.763-52.772C281.572,430.084,257.945,406.44,228.809,406.44z"/></svg>',phone:'<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="h-5 w-5" aria-hidden="true" focusable="false">
1<path stroke-linecap="round" stroke-linejoin="round" d="M2.25 6.75c0 8.284 6.716 15 15 15h2.25a2.25 2.25 0 0 0 2.25-2.25v-1.372c0-.516-.351-.966-.852-1.091l-4.423-1.106c-.44-.11-.902.055-1.173.417l-.97 1.293c-.282.376-.769.542-1.21.38a12.035 12.035 0 0 1-7.143-7.143c-.162-.441.004-.928.38-1.21l1.293-.97c.363-.271.527-.734.417-1.173L6.963 3.102a1.125 1.125 0 0 0-1.091-.852H4.5A2.25 2.25 0 0 0 2.25 4.5v2.25Z"/></svg>',"arrow-top-right-on-square":'<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="h-4 w-4" aria-hidden="true" focusable="false"><path stroke-linecap="round" stroke-linejoin="round" d="M13.5 6H5.25A2.25 2.25 0 0 0 3 8.25v10.5A2.25 2.25 0 0 0 5.25 21h10.5A2.25 2.25 0 0 0 18 18.75V10.5m-10.5 6L21 3m0 0h-5.25M21 3v5.25"/></svg>',"chevron-down":'<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="h-4 w-4" aria-hidden="true" focusable="false"><path stroke-linecap="round" stroke-linejoin="round" d="m19.5 8.25-7.5 7.5-7.5-7.5"/></svg>',github:'<svg class="h-5 w-5" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path fill-rule="evenodd" d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z" clip-rule="evenodd"/></svg>',twitter:'<svg class="h-5 w-5" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"/></svg>',"academic-cap":'<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="h-8 w-8" aria-hidden="true" focusable="false"><path stroke-linecap="round" stroke-linejoin="round" d="M4.26 10.147a60.438 60.438 0 0 0-.491 6.347A48.62 48.62 0 0 1 12 20.904a48.62 48.62 0 0 1 8.232-4.41 60.46 60.46 0 0 0-.491-6.347m-15.482 0a50.636 50.636 0 0 0-2.658-.813A59.906 59.906 0 0 1 12 3.493a59.903 59.903 0 0 1 10.399 5.84c-.896.248-1.783.52-2.658.814m-15.482 0A50.717 50.717 0 0 1 12 13.489a50.702 50.702 0 0 1 7.74-3.342M6.75 15a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm0 0v-3.675A55.378 55.378 0 0 1 12 8.443m-7.007 11.55A5.981 5.981 0 0 0 6.75 15.75v-1.5"/></svg>',"calendar-plus":'<svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 612 612" class="h-5 w-5" aria-hidden="true" focusable="false"><path d="M612,463.781c0-70.342-49.018-129.199-114.75-144.379c-10.763-2.482-21.951-3.84-33.469-3.84c-3.218,0-6.397,0.139-9.562,0.34c-71.829,4.58-129.725,60.291-137.69,131.145c-0.617,5.494-0.966,11.073-0.966,16.734c0,10.662,1.152,21.052,3.289,31.078C333.139,561.792,392.584,612,463.781,612C545.641,612,612,545.641,612,463.781z M463.781,561.797c-54.133,0-98.016-43.883-98.016-98.016s43.883-98.016,98.016-98.016s98.016,43.883,98.016,98.016S517.914,561.797,463.781,561.797z"/><polygon points="482.906,396.844 449.438,396.844 449.438,449.438 396.844,449.438 396.844,482.906 482.906,482.906 482.906,449.438 482.906,449.438"/><path d="M109.969,0c-9.228,0-16.734,7.507-16.734,16.734v38.25v40.641c0,9.228,7.506,16.734,16.734,16.734h14.344c9.228,0,16.734-7.507,16.734-16.734V54.984v-38.25C141.047,7.507,133.541,0,124.312,0H109.969z"/><path d="M372.938,0c-9.228,0-16.734,7.507-16.734,16.734v38.25v40.641c0,9.228,7.507,16.734,16.734,16.734h14.344c9.228,0,16.734-7.507,16.734-16.734V54.984v-38.25C404.016,7.507,396.509,0,387.281,0H372.938z"/><path d="M38.25,494.859h236.672c-2.333-11.6-3.572-23.586-3.572-35.859c0-4.021,0.177-7.999,0.435-11.953H71.719c-15.845,0-28.688-12.843-28.688-28.688v-229.5h411.188v88.707c3.165-0.163,6.354-0.253,9.562-0.253c11.437,0,22.61,1.109,33.469,3.141V93.234c0-21.124-17.126-38.25-38.25-38.25h-31.078v40.641c0,22.41-18.23,40.641-40.641,40.641h-14.344c-22.41,0-40.641-18.231-40.641-40.641V54.984H164.953v40.641c0,22.41-18.231,40.641-40.641,40.641h-14.344c-22.41,0-40.641-18.231-40.641-40.641V54.984H38.25C17.126,54.984,0,72.111,0,93.234v363.375C0,477.733,17.126,494.859,38.25,494.859z"/>
1<circle cx="134.774" cy="260.578" r="37.954"/><circle cx="248.625" cy="260.578" r="37.954"/><circle cx="362.477" cy="260.578" r="37.954"/><circle cx="248.625" cy="375.328" r="37.953"/><circle cx="134.774" cy="375.328" r="37.953"/></svg>'};function n(e){return $[e]||$["question-mark-circle"]}const O={facebook:"/img/socialmedia/facebook.svg",linkedin:"/img/socialmedia/linkedin.svg",maps:"/img/socialmedia/maps.svg",whatsapp:"/img/socialmedia/whatsapp.svg"};function B(e){return O[e]||null}let f=null,p=!1;function D(e){const r=[];return e.brand?.name||r.push("brand.name is required"),e.brand?.href||r.push("brand.href is required"),Array.isArray(e.menuGroups)||r.push("menuGroups must be an array"),e.menuGroups?.length>4&&r.push("menuGroups cannot exceed 4 columns"),Array.isArray(e.actions)||r.push("actions must be an array"),e.footer||r.push("footer is required"),e.menuGroups?.forEach((a,t)=>{a.heading||r.push(`menuGroups[${t}].heading is required`),Array.isArray(a.links)||r.push(`menuGroups[${t}].links must be an array`)}),r}function N(){const e=D(k);return e.length>0?(console.error("Navigation config validation errors:",e),G("Navigation configuration is invalid. Check console for details."),null):k}function G(e){const r=document.createElement("div");r.className="fixed top-0 left-0 right-0 z-[100] bg-[var(--sp-status-danger)] text-white px-4 py-3 text-center text-sm",r.textContent=e,r.setAttribute("role","alert"),document.body.prepend(r)}function q(e){const r=document.getElementById("sp-header");if(!r)return;const a=e.actions.map(t=>t.type==="theme-toggle"?`
2        <button 
3          id="navThemeToggle" 
4          type="button"
5          class="relative hidden md:inline-flex items-center justify-center rounded-lg p-2 text-[var(--sp-text-secondary)] hover:text-[var(--sp-text-primary)] focus-visible:ring-2 focus-visible:ring-[var(--sp-accent-volt)] after:content-[''] after:absolute after:bottom-0 after:left-1/2 after:w-0 after:h-0.5 after:bg-[var(--sp-text-secondary)] after:transition-all after:duration-200 hover:after:w-full hover:after:left-0 dark:after:bg-[var(--sp-accent-volt)]"
6          aria-pressed="false" 
7          aria-label="${t.label}">
8          <span class="theme-icon-dark inline-flex dark:hidden">${n("moon")}</span>
9          <span class="theme-icon-light hidden dark:inline-flex">${n("sun")}</span>
10        </button>`:t.primary?`
11        <a 
12          href="${t.href}" 
13          class="relative hidden md:inline-flex items-center justify-center rounded-lg p-2 text-[var(--sp-text-secondary)] hover:text-[var(--sp-text-primary)] focus-visible:ring-2 focus-visible:ring-[var(--sp-accent-volt)] after:content-[''] after:absolute after:bottom-0 after:left-1/2 after:w-0 after:h-0.5 after:bg-[var(--sp-text-secondary)] after:transition-all after:duration-200 hover:after:w-full hover:after:left-0 dark:after:bg-[var(--sp-accent-volt)]"
14          aria-label="${t.label}">
15          ${n("calendar-plus")}
16        </a>`:t.id==="help"?`
17        <button 
18          id="helpTrigger"
19          type="button"
20          class="relative hidden md:inline-flex items-center justify-center rounded-lg p-2 text-[var(--sp-text-secondary)] hover:text-[var(--sp-text-primary)] focus-visible:ring-2 focus-visible:ring-[var(--sp-accent-volt)] after:content-[''] after:absolute after:bottom-0 after:left-1/2 after:w-0 after:h-0.5 after:bg-[var(--sp-text-secondary)] after:transition-all after:duration-200 hover:after:w-full hover:after:left-0 dark:after:bg-[var(--sp-accent-volt)]"
21          aria-label="${t.label}">
22          ${n(t.icon)}
23        </button>`:`
24      <a 
25        href="${t.href}" 
26        class="hidden md:inline-flex items-center justify-center rounded-lg p-2 text-[var(--sp-text-secondary)] hover:text-[var(--sp-text-primary)] hover:bg-[var(--sp-surface)] focus-visible:ring-2 focus-visible:ring-[var(--sp-accent-volt)]"
27        aria-label="${t.label}">
28        ${n(t.icon)}
29      </a>`).join("");r.innerHTML=`
30    <div class="mx-auto max-w-6xl px-6 py-4 grid grid-cols-3 items-center">
31      <!-- Brand (left) -->
32      <a href="${e.brand.href}" class="inline-flex items-center gap-2 font-semibold text-[var(--sp-text-primary)] focus-visible:ring-2 focus-visible:ring-[var(--sp-accent-volt)] rounded-lg px-2 py-1 justify-self-start">
33        ${n("academic-cap")}
34        <span>${e.brand.name}</span>
35      </a>
36      
37      <!-- Menu trigger (true center) -->
38      <button
39        id="menuTrigger"
40        type="button"
41        class="relative inline-flex items-center justify-center rounded-lg p-2 text-[var(--sp-text-secondary)] hover:text-[var(--sp-text-primary)] focus-visible:ring-2 focus-visible:ring-[var(--sp-accent-volt)] justify-self-center after:content-[''] after:absolute after:bottom-0 after:left-1/2 after:w-0 after:h-0.5 after:bg-[var(--sp-text-secondary)] after:transition-all after:duration-200 hover:after:w-full hover:after:left-0 dark:after:bg-[var(--sp-accent-volt)]"
42        aria-expanded="false"
43        aria-controls="megaMenu"
44        aria-label="Open navigation menu">
45        <span class="menu-icon-open inline-flex transition-transform duration-300">${n("menu")}</span>
46      </button>
47      
48      <!-- Desktop actions (right, hidden on mobile) -->
49      <div class="hidden md:flex items-center gap-2 justify-self-end">
50        ${a}
51      </div>
52      <!-- Mobile: empty right column -->
53      <div class="md:hidden justify-self-end"></div>
54    </div>
55    
56    <!-- Mega Menu Panel (OVERLAY - fixed, viewport centered) -->
57    ${(()=>{const t=e.menuGroups.filter(m=>!m.disabled),s=t.length;return`
58    <div 
59      id="megaMenu"
60      class="fixed top-16 left-1/2 z-50 w-full ${s<=2?"max-w-xl":s===3?"max-w-3xl":"max-w-4xl"} -translate-x-1/2 rounded-2xl border border-[var(--sp-divider)] bg-[var(--sp-canvas)] shadow-lg transition-all duration-150 opacity-0 -translate-y-2 pointer-events-none invisible max-md:max-h-[calc(100dvh-4rem)] max-md:overflow-y-auto max-md:overscroll-contain"
61      role="dialog"
62      aria-modal="true"
63      aria-label="Navigation menu">
64      
65      <!-- Desktop menu content -->
66      <div class="hidden md:block mx-auto px-6 py-8">
67        <div class="grid ${s===1?"grid-cols-1":s===2?"grid-cols-2":s===3?"grid-cols-3":"grid-cols-4"} gap-8">
68          ${t.map(m=>`
69            <div>
70              <h3 class="text-xs font-bold uppercase tracking-wide text-[var(--sp-text-primary)] dark:text-[var(--sp-accent-volt)]">${m.heading}</h3>
71              <ul class="mt-4 space-y-3">
72                ${m.links.map(i=>`
73                  <li>
74                    <a href="${i.href}" class="relative group block text-sm text-[var(--sp-text-primary)] focus-visible:ring-2 focus-visible:ring-[var(--sp-accent-volt)] rounded-md px-2 py-1.5 before:content-[''] before:absolute before:left-0 before:top-1/2 before:w-0.5 before:h-0 before:bg-[var(--sp-text-secondary)] before:transition-all before:duration-200 hover:before:h-full hover:before:top-0 dark:before:bg-[var(--sp-accent-volt)]"${i.external?' target="_blank" rel="noreferrer"':""}>
75                      <span class="flex items-center gap-1">
76                        ${i.label}
77                        ${i.external?n("arrow-top-right-on-square"):""}
78                      </span>
79                      ${i.subtitle?`<span class="text-xs text-[var(--sp-text-tertiary)]">${i.subtitle}</span>`:""}
80                    </a>
81                  </li>
82                `).join("")}
83              </ul>
84            </div>
85          `).join("")}
86        </div>
87      </div>`})()}
88      
89      <!-- Mobile menu content (consolidated navigation) -->
90      <div class="md:hidden max-h-[calc(100vh-4rem)] overflow-y-auto px-6 py-6">
91        <!-- Actions (icon-only, top of menu) -->
92        <div class="flex items-center justify-end gap-2 mb-6">
93          ${e.actions.map(t=>t.type==="theme-toggle"?`
94                <button 
95                  id="mobileThemeToggle" 
96                  type="button"
97                  class="flex items-center justify-center rounded-lg p-2 text-[var(--sp-text-secondary)] hover:text-[var(--sp-text-primary)] hover:bg-[var(--sp-surface)] focus-visible:ring-2 focus-visible:ring-[var(--sp-accent-volt)]"
98                  aria-label="${t.label}"
99                  aria-pressed="false">
100                  <span class="theme-icon-dark">${n("moon")}</span>
101                  <span class="theme-icon-light hidden">${n("sun")}</span>
102                </button>`:`
103              <a 
104                href="${t.href}" 
105                class="flex items-center justify-center rounded-lg p-2 text-[var(--sp-text-secondary)] hover:text-[var(--sp-text-primary)] hover:bg-[var(--sp-surface)] focus-visible:ring-2 focus-visible:ring-[var(--sp-accent-volt)]${t.primary?" !bg-[var(--sp-text-primary)] !text-[var(--sp-canvas)]":""}"
106                aria-label="${t.label}">
107                ${n(t.icon)}
108              </a>`).join("")}
109        </div>
110        
111        <!-- Primary navigation groups -->
112        <div class="space-y-6">
113          ${e.menuGroups.filter(t=>!t.disabled).map(t=>`
114            <div>
115              <h3 class="text-xs font-bold uppercase tracking-wide text-[var(--sp-text-primary)] dark:text-[var(--sp-accent-volt)]">${t.heading}</h3>
116              <ul class="mt-3 space-y-2">
117                ${t.links.map(s=>`
118                  <li>
119                    <a href="${s.href}" class="block py-2 text-base text-[var(--sp-text-primary)] hover:text-[var(--sp-accent-volt)] focus-visible:ring-2 focus-visible:ring-[var(--sp-accent-volt)] rounded-md"${s.external?' target="_blank" rel="noreferrer"':""}>
120                      <span class="flex items-center gap-2">
121                        ${s.label}
122                        ${s.external?n("arrow-top-right-on-square"):""}
123                      </span>
124                    </a>
125                  </li>
126                `).join("")}
127              </ul>
128            </div>
129          `).join("")}
130        </div>
131        
132        <!-- Divider -->
133        <hr class="my-6 border-[var(--sp-divider)]" />
134        
135        <!-- Footer navigation groups (consolidated) -->
136        <div class="space-y-6">
137          ${e.footer.groups.map(t=>`
138            <div>
139              <h3 class="text-xs font-bold uppercase tracking-wide text-[var(--sp-text-primary)] dark:text-[var(--sp-accent-volt)]">${t.heading}</h3>
140              <ul class="mt-3 space-y-2">
141                ${t.links.map(s=>`
142                  <li>
143                    <a href="${s.href}" class="block py-2 text-base text-[var(--sp-text-primary)] hover:text-[var(--sp-accent-volt)] focus-visible:ring-2 focus-visible:ring-[var(--sp-accent-volt)] rounded-md"${s.external?' target="_blank" rel="noreferrer"':""}>
144                      <span class="flex items-center gap-2">
145                        ${s.label}
146                        ${s.external?n("arrow-top-right-on-square"):""}
147                      </span>
148                    </a>
149                  </li>
150                `).join("")}
151              </ul>
152            </div>
153          `).join("")}
154        </div>
155        
156        <!-- Divider -->
157        <hr class="my-6 border-[var(--sp-divider)]" />
158        
159        <!-- Footer meta content -->
160        <div class="space-y-4">
161          <p class="text-xs text-[var(--sp-text-tertiary)]">${e.footer.meta.copyright}</p>
162          
163          <!-- Social icons -->
164          ${e.footer.social?.filter(t=>!t.disabled).length?`
165            <div class="flex gap-4">
166              ${e.footer.social.filter(t=>!t.disabled).map(t=>`
167                <a href="${t.href}" class="text-[var(--sp-text-secondary)] hover:text-[var(--sp-text-primary)] focus-visible:ring-2 focus-visible:ring-[var(--sp-accent-volt)] rounded-md p-1 group" aria-label="${t.label}" target="_blank" rel="noreferrer">
168                  <img src="${B(t.id)}" alt="" class="h-5 w-5 brightness-0 invert-[0.45] transition-[filter] duration-150 group-hover:invert-[0.15] dark:invert-[0.6] dark:group-hover:invert" aria-hidden="true" />
169                </a>
170              `).join("")}
171            </div>
172          `:""}
173        </div>
174      </div>
175    </div>
176  `,P(),document.getElementById("menuTrigger"),V(),Z()}function _(e){const r=document.getElementById("sp-footer");r&&(r.innerHTML=`
177    <div class="mx-auto max-w-6xl px-6 py-8">
178      <!-- Footer with social links only -->
179      <div class="flex flex-col sm:flex-row gap-4 items-center justify-between">
180        <p class="text-xs text-[var(--sp-text-secondary)]">${e.meta.copyright}</p>
181        <!-- Social icons -->
182        ${e.social?.filter(a=>!a.disabled).length?`
183          <div class="flex gap-3">
184            ${e.social.filter(a=>!a.disabled).map(a=>`
185              <a href="${a.href}" class="relative text-[var(--sp-text-secondary)] hover:text-[var(--sp-text-primary)] focus-visible:ring-2 focus-visible:ring-[var(--sp-accent-volt)] rounded-md p-1 after:content-[''] after:absolute after:bottom-0 after:left-1/2 after:w-0 after:h-px after:bg-[var(--sp-text-secondary)] after:transition-all after:duration-200 hover:after:w-full hover:after:left-0 dark:after:bg-[var(--sp-accent-volt)] group" aria-label="${a.label}" target="_blank" rel="noreferrer">
186                <img src="${B(a.id)}" alt="" class="h-5 w-5 brightness-0 invert-[0.45] transition-[filter] duration-150 group-hover:invert-[0.15] dark:invert-[0.6] dark:group-hover:invert" aria-hidden="true" />
187              </a>
188            `).join("")}
189          </div>
190        `:""}
191      </div>
192    </div>
193  `)}let d=!1;function P(){const e=document.createElement("div");e.id="helpOverlay",e.className="fixed inset-0 z-[60] hidden flex items-center justify-center bg-black/50 backdrop-blur-sm",e.setAttribute("role","dialog"),e.setAttribute("aria-modal","true"),e.setAttribute("aria-labelledby","helpTitle"),e.innerHTML=`
194    <div class="relative mx-4 w-full max-w-lg rounded-2xl border border-[var(--sp-divider)] bg-[var(--sp-canvas)] p-6 shadow-xl">
195      <button
196        id="helpClose"
197        type="button"
198        class="absolute top-4 right-4 rounded-lg p-2 text-[var(--sp-text-secondary)] hover:text-[var(--sp-text-primary)] hover:bg-[var(--sp-surface)] focus-visible:ring-2 focus-visible:ring-[var(--sp-accent-volt)]"
199        aria-label="Close help">
200        ${n("x-mark")}
201      </button>
202      
203      <h2 id="helpTitle" class="text-lg font-semibold text-[var(--sp-text-primary)]">Keyboard Shortcuts</h2>
204      <p class="mt-2 text-sm text-[var(--sp-text-secondary)]">
205        Navigate efficiently using these shortcuts.
206      </p>
207      
208      <div class="mt-6 space-y-3">
209        <div class="flex items-center justify-between rounded-lg bg-[var(--sp-surface)] px-4 py-3">
210          <span class="text-sm text-[var(--sp-text-primary)]">Toggle menu</span>
211          <kbd class="rounded-md bg-[var(--sp-canvas)] border border-[var(--sp-divider)] px-2 py-1 text-xs font-mono text-[var(--sp-text-secondary)]">M</kbd>
212        </div>
213        <div class="flex items-center justify-between rounded-lg bg-[var(--sp-surface)] px-4 py-3">
214          <span class="text-sm text-[var(--sp-text-primary)]">Toggle theme</span>
215          <kbd class="rounded-md bg-[var(--sp-canvas)] border border-[var(--sp-divider)] px-2 py-1 text-xs font-mono text-[var(--sp-text-secondary)]">T</kbd>
216        </div>
217        <div class="flex items-center justify-between rounded-lg bg-[var(--sp-surface)] px-4 py-3">
218          <span class="text-sm text-[var(--sp-text-primary)]">Show help</span>
219          <kbd class="rounded-md bg-[var(--sp-canvas)] border border-[var(--sp-divider)] px-2 py-1 text-xs font-mono text-[var(--sp-text-secondary)]">?</kbd>
220        </div>
221        <div class="flex items-center justify-between rounded-lg bg-[var(--sp-surface)] px-4 py-3">
222          <span class="text-sm text-[var(--sp-text-primary)]">Close overlay</span>
223          <kbd class="rounded-md bg-[var(--sp-canvas)] border border-[var(--sp-divider)] px-2 py-1 text-xs font-mono text-[var(--sp-text-secondary)]">Esc</kbd>
224        </div>
225      </div>
226      
227      <div class="mt-6 border-t border-[var(--sp-divider)] pt-6">
228        <h3 class="text-sm font-semibold text-[var(--sp-text-primary)]">Quick Help</h3>
229        <ul class="mt-3 space-y-2 text-sm text-[var(--sp-text-secondary)]">
230          <li>• Use the menu to navigate between sections</li>
231          <li>• Toggle between light and dark themes anytime</li>
232          <li>• All pages follow StrategicPlaybook governance</li>
233          <li>• Documentation is available in the menu</li>
234        </ul>
235      </div>
236    </div>
237  `,document.body.appendChild(e),z()}function c(e){const r=document.getElementById("helpOverlay");r&&(d=e,e?(r.classList.remove("hidden"),document.body.classList.add("overflow-hidden"),document.getElementById("helpClose")?.focus()):(r.classList.add("hidden"),document.body.classList.remove("overflow-hidden"),document.getElementById("helpTrigger")?.focus()))}function z(){const e=document.getElementById("helpTrigger"),r=document.getElementById("helpOverlay"),a=document.getElementById("helpClose");e?.addEventListener("click",()=>{c(!0)}),a?.addEventListener("click",()=>{c(!1)}),r?.addEventListener("click",t=>{t.target===r&&c(!1)}),document.addEventListener("keydown",t=>{if(t.key==="Escape"&&d){c(!1);return}t.target.tagName==="INPUT"||t.target.tagName==="TEXTAREA"||(t.key==="?"&&!d&&c(!0),t.key.toLowerCase()==="m"&&!d&&u(!p),t.key.toLowerCase()==="t"&&!d&&document.getElementById("navThemeToggle")?.click())})}function u(e){const r=document.getElementById("megaMenu"),a=document.getElementById("menuTrigger"),t=a?.querySelector(".menu-icon-open");!r||!a||(p=e,e?(r.classList.remove("opacity-0","-translate-y-2","pointer-events-none","invisible"),r.classList.add("opacity-100","translate-y-0","pointer-events-auto","visible"),a.setAttribute("aria-expanded","true"),t?.classList.add("rotate-180"),r.querySelector("a, button")?.focus(),document.body.classList.add("overflow-hidden")):(r.classList.add("opacity-0","-translate-y-2","pointer-events-none","invisible"),r.classList.remove("opacity-100","translate-y-0","pointer-events-auto","visible"),a.setAttribute("aria-expanded","false"),t?.classList.remove("rotate-180"),document.body.classList.remove("overflow-hidden"),a.focus()))}function V(){const e=document.getElementById("menuTrigger"),r=document.getElementById("megaMenu");e?.addEventListener("click",()=>{u(!p)}),document.addEventListener("keydown",a=>{a.key==="Escape"&&p&&u(!1)}),r?.addEventListener("click",a=>{a.target.closest("a")&&u(!1)}),document.addEventListener("click",a=>{p&&!a.target.closest("#sp-header")&&u(!1)})}function h(){const e=document.documentElement.getAttribute("data-theme")==="dark";document.querySelectorAll(".theme-icon-dark").forEach(r=>{r.classList.toggle("hidden",e)}),document.querySelectorAll(".theme-icon-light").forEach(r=>{r.classList.toggle("hidden",!e)}),document.querySelectorAll("#navThemeToggle, #mobileThemeToggle").forEach(r=>{r?.setAttribute("aria-pressed",e?"true":"false")})}function Z(){const e="sp-theme",r=()=>{const s=document.documentElement.getAttribute("data-theme")==="dark"?"light":"dark";s==="dark"?document.documentElement.setAttribute("data-theme","dark"):document.documentElement.removeAttribute("data-theme"),localStorage.setItem(e,s),h()};document.getElementById("navThemeToggle")?.addEventListener("click",r),document.getElementById("mobileThemeToggle")?.addEventListener("click",r),h(),new MutationObserver(h).observe(document.documentElement,{attributes:!0,attributeFilter:["data-theme"]})}function T(){f=N(),f&&(q(f),_(f.footer))}document.readyState==="loading"?document.addEventListener("DOMContentLoaded",T):T();const L=["AI that you can [trust].","AI that you can [govern].","AI that you can [audit]."],F=80,R=40,Y=2e3,U=500;let b=0,o=0,x=!1,g=null,y=null;function A(e){return e.replace(/\[([^\]]+)\]/g,"<strong>$1</strong>")}function K(e){return e.replace(/[\[\]]/g,"").length}function M(e,r){let a="",t=0;for(let s=0;s<e.length&&t<r;s++){const l=e[s];l==="["||l==="]"?a+=l:(a+=l,t++)}return a.includes("[")&&!a.includes("]")&&(a+="]"),a}function I(){if(g=document.getElementById("typewriter-text"),y=document.getElementById("typewriter-cursor"),!(!g||!y)){if(y.style.animation="typewriter-blink 1s ease-in-out infinite",!document.getElementById("typewriter-styles")){const e=document.createElement("style");e.id="typewriter-styles",e.textContent=`
238      @keyframes typewriter-blink {
239        0%, 50% { opacity: 1; }
240        51%, 100% { opacity: 0; }
241      }
242    `,document.head.appendChild(e)}v()}}function v(){const e=L[b],r=K(e);if(x){o--;const a=M(e,o);g.innerHTML=A(a),o===0?(x=!1,b=(b+1)%L.length,setTimeout(v,U)):setTimeout(v,R)}else{o++;const a=M(e,o);g.innerHTML=A(a),o===r?(x=!0,setTimeout(v,Y)):setTimeout(v,F)}}document.readyState==="loading"?document.addEventListener("DOMContentLoaded",I):I();

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.