domma-cms 1.10.39 → 1.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,11 @@
1
+ import{colourToCss as T}from"/public/js/menu-decor.mjs?v=20261014-menu-entrance";import{normaliseLook as k,normalisePanel as q,cardColumns as R,floatsWithoutStrip as N,TILE_RAINBOW as L}from"/public/js/menu-look.mjs?v=20261029-pill-floats";const v="(min-width: 993px)",B=`
2
+ <span class="dm-nc-eyebrow" data-bind-text="heading.value"></span>
3
+ <a class="dm-nc-more" data-bind-href="linkUrl.value" data-bind-hidden="!linkUrl.value"><span data-bind-text="linkText.value"></span><span class="dm-nc-arrow" data-icon="arrow-right" data-size="14" aria-hidden="true"></span></a>`,_=`
4
+ <div class="dm-nc-feature-box">
5
+ <span class="dm-nc-feature-eyebrow" data-bind-text="eyebrow.value" data-bind-hidden="!eyebrow.value"></span>
6
+ <strong class="dm-nc-feature-title" data-bind-text="title.value" data-bind-hidden="!title.value"></strong>
7
+ <div class="dm-nc-points" data-bind-hidden="!hasPoints.value" data-each="points key=id"><div class="dm-nc-point"><span class="dm-nc-point-tick" aria-hidden="true"></span><span>{{text}}</span></div></div>
8
+ <a class="dm-nc-feature-btn" data-bind-href="buttonUrl.value" data-bind-hidden="!buttonUrl.value"><span data-bind-text="buttonText.value"></span><span data-icon="arrow-right" data-size="14" aria-hidden="true"></span></a>
9
+ </div>`,$=`
10
+ <span class="dm-nc-chips-label" data-bind-text="label.value" data-bind-hidden="!label.value"></span>
11
+ <span class="dm-nc-chips-row"></span>`;function y(n,e,c){const t=document.createElement("li");return t.className=n,t.setAttribute("role","presentation"),t.innerHTML=e,M.applyBindings(c,t),t}function C(n,e,c){return n?.tile?T(n.tile):e==="accent"?"var(--dm-primary)":e==="neutral"?"var(--dm-text-secondary)":L[c%L.length]}function S(n,e,c,t){if(n.querySelector(":scope > .dm-nc-body"))return;const a=n.querySelector(":scope > svg, :scope > [data-icon]"),r=document.createElement("span");r.className="dm-nc-body";const p=document.createElement("span");for(p.className="dm-nc-title",a&&a.remove();n.firstChild;)p.appendChild(n.firstChild);if(r.appendChild(p),e?.description){const s=document.createElement("span");s.className="dm-nc-desc",s.textContent=e.description,r.appendChild(s)}if(a&&t!=="none"){const s=document.createElement("span");s.className="dm-nc-tile",s.setAttribute("aria-hidden","true"),s.appendChild(a),n.appendChild(s),n.style.setProperty("--dm-nc-tone",c)}else a&&(a.classList.add("dm-nc-icon"),n.appendChild(a));n.appendChild(r),n.classList.add("dm-nc-link")}function O(n,e,c){const t=n.querySelector(":scope > .navbar-dropdown-menu");if(!t||t.classList.contains("dm-nc-card"))return null;const a=q(e.panel),r=c.tiles||"rainbow";t.classList.add("dm-nc-card");const p=Array.isArray(e.items)?e.items:[],s=[],i=[];let l=0;for(const o of[...t.children]){if(o.classList.contains("navbar-dropdown-divider")){o.classList.add("dm-nc-skip");continue}const d=o.querySelector(":scope > .navbar-dropdown-item"),h=o.classList.contains("navbar-dropdown-sub")?o:null,g=(d||o.querySelector(":scope > .navbar-submenu-toggle"))?.dataset.path||"",b=p[Number(g.split(".").pop())];if(d&&b?.chip){i.push(d),o.remove();continue}if(d)S(d,b,C(b,r,l++),r),o.classList.add("dm-nc-entry"),s.push(o);else if(h){h.classList.add("dm-nc-group");const E=h.querySelector(":scope > .navbar-dropdown-menu"),A=Array.isArray(b?.items)?b.items:[];E?.querySelectorAll(":scope > li > .navbar-dropdown-item").forEach(w=>{const x=A[Number((w.dataset.path||"").split(".").pop())];S(w,x,C(x,r,l++),r)}),s.push(h)}}const u=Math.min(R(s.length,a),Math.max(1,s.length));t.style.setProperty("--dm-nc-cols",String(u));const f=a?.heading||a?.link?1:0;s.forEach((o,d)=>{o.style.setProperty("--dm-nc-r",String(f+Math.floor(d/u)+1)),o.style.setProperty("--dm-nc-c",String(d%u+1))});const m=f+Math.ceil(s.length/u);if(f){const o=y("dm-nc-head",B,{heading:M.observable(a.heading||""),linkUrl:M.observable(a.link?.url||""),linkText:M.observable(a.link?.text||"")});t.insertBefore(o,t.firstChild)}if(a?.feature){const o=a.feature,d=(o.points||[]).map((g,b)=>({id:b,text:g})),h=y(`dm-nc-feature dm-nc-feature--${o.tone||"dark"}`,_,{eyebrow:M.observable(o.eyebrow||""),title:M.observable(o.title||""),points:M.observableArray(d),hasPoints:M.observable(d.length>0),buttonUrl:M.observable(o.button?.url||""),buttonText:M.observable(o.button?.text||"")});h.style.setProperty("--dm-nc-rows",String(Math.max(1,m))),t.appendChild(h),t.classList.add("dm-nc-has-feature")}if(i.length){const o=y("dm-nc-chips",$,{label:M.observable(a?.chipsLabel||"")}),d=o.querySelector(".dm-nc-chips-row");i.forEach(h=>{h.classList.add("dm-nc-chip"),d.appendChild(h)}),o.style.setProperty("--dm-nc-r",String(m+1)),t.appendChild(o)}return Domma.icons.scan(t),t}function P(n,e){if(!matchMedia(v).matches)return;e.classList.remove("navbar-dropdown-flip-end"),e.style.maxHeight="",e.style.overflowY="",e.style.setProperty("--dm-nc-shift","0px"),e._ncShift=0;const t=n.querySelector(":scope > .navbar-dropdown-toggle").getBoundingClientRect(),a=e.getBoundingClientRect(),r=16,p=document.documentElement.clientWidth,s=t.left+t.width/2-a.width/2,i=Math.max(r,Math.min(p-r-a.width,s));e._ncShift=Math.round(i-s),e.style.setProperty("--dm-nc-shift",`${e._ncShift}px`),e.style.setProperty("--dm-nc-caret",`${Math.round(t.left+t.width/2-i)}px`)}function U(n,e){if(!matchMedia(v).matches||!n||matchMedia("(prefers-reduced-motion: reduce)").matches||document.documentElement.classList.contains("dm-reduced-motion"))return;const c=e.getBoundingClientRect();if(!c.width)return;const t=n.left-c.left,a=e._ncShift||0,r=Math.max(0,c.width-n.width),p=Math.max(0,c.height-n.height);e.dataset.ncMorph="1";const s=e.animate([{transform:`translateX(calc(-50% + ${a+t}px))`,clipPath:`inset(0 ${r}px ${p}px 0 round 18px)`},{transform:`translateX(calc(-50% + ${a}px))`,clipPath:"inset(-20px -20px -40px -20px round 18px)"}],{duration:260,easing:"cubic-bezier(.2,.8,.2,1)"});s.oncancel=()=>{delete e.dataset.ncMorph}}function z(n){n.classList.add("dm-nav-no-strip"),document.body.classList.add("dm-nav-floating-pills");const e=()=>{document.body.style.setProperty("--dm-nav-float-h",`${Math.round(n.getBoundingClientRect().height)}px`)};e(),addEventListener("resize",e)}export function applyMenuLook(n,e,c){const t=k(e?.look);if(!n||!t||e.orientation==="vertical"||((t.bar==="pill"||t.strip==="none")&&n.classList.add("dm-nav-bar-pill"),t.brand==="pill"&&n.classList.add("dm-nav-brand-pill"),N(t)&&z(n),t.dropdown!=="cards"))return;n.classList.add("dm-nav-cards");const a=new Map;if(n.querySelectorAll(".navbar-nav > .navbar-dropdown").forEach(s=>{const i=s.querySelector(":scope > .navbar-dropdown-toggle"),l=c?.[Number(i?.dataset.path)],u=l&&O(s,l,t);u&&a.set(s,u)}),!a.size)return;const r=new Map,p=new MutationObserver(s=>{let i=null,l=null;for(const f of s){const m=f.target;if(!a.has(m))continue;const o=m.classList.contains("open"),d=(f.oldValue||"").split(/\s+/).includes("open");o&&!d&&(i=m),!o&&d&&(l=m)}if(l&&delete a.get(l).dataset.ncMorph,!i)return;const u=a.get(i);P(i,u),t.morph&&l&&r.has(l)&&U(r.get(l),u),matchMedia(v).matches&&r.set(i,u.getBoundingClientRect())});for(const s of a.keys())p.observe(s,{attributes:!0,attributeFilter:["class"],attributeOldValue:!0});addEventListener("resize",()=>{for(const[s,i]of a)s.classList.contains("open")&&P(s,i)})}
@@ -0,0 +1 @@
1
+ export const LOOK_BARS=["pill"],LOOK_BRANDS=["pill"],LOOK_STRIPS=["none","band"],LOOK_DROPDOWNS=["cards"],LOOK_TILES=["rainbow","accent","neutral","none"],FEATURE_TONES=["dark","light","accent"],DESCRIPTION_MAX=160,FEATURE_POINTS_MAX=6;const b=/^(\/|#|https?:\/\/|mailto:)/,u=(t,e=120)=>typeof t=="string"?t.trim().slice(0,e):"";export function normaliseLook(t){if(!t||typeof t!="object"||Array.isArray(t))return null;const e={};return LOOK_BARS.includes(t.bar)&&(e.bar=t.bar),LOOK_BRANDS.includes(t.brand)&&(e.brand=t.brand),LOOK_STRIPS.includes(t.strip)&&(e.strip=t.strip),LOOK_DROPDOWNS.includes(t.dropdown)&&(e.dropdown=t.dropdown),e.dropdown&&(LOOK_TILES.includes(t.tiles)&&t.tiles!=="rainbow"&&(e.tiles=t.tiles),t.morph===!0&&(e.morph=!0)),Object.keys(e).length?e:null}export function lookProblems(t){if(t==null)return[];if(typeof t!="object"||Array.isArray(t))return["look must be an object"];const e=[];return t.bar!=null&&t.bar!==""&&!LOOK_BARS.includes(t.bar)&&e.push(`look.bar must be one of: ${LOOK_BARS.join(", ")}`),t.brand!=null&&t.brand!==""&&!LOOK_BRANDS.includes(t.brand)&&e.push(`look.brand must be one of: ${LOOK_BRANDS.join(", ")}`),t.strip!=null&&t.strip!==""&&!LOOK_STRIPS.includes(t.strip)&&e.push(`look.strip must be one of: ${LOOK_STRIPS.join(", ")}`),t.dropdown!=null&&t.dropdown!==""&&!LOOK_DROPDOWNS.includes(t.dropdown)&&e.push(`look.dropdown must be one of: ${LOOK_DROPDOWNS.join(", ")}`),t.tiles!=null&&t.tiles!==""&&!LOOK_TILES.includes(t.tiles)&&e.push(`look.tiles must be one of: ${LOOK_TILES.join(", ")}`),t.morph!=null&&typeof t.morph!="boolean"&&e.push("look.morph must be true or false"),e}function d(t){if(!t||typeof t!="object")return null;const e=u(t.text,60),r=u(t.url,500);return e&&b.test(r)?{text:e,url:r}:null}export function normalisePanel(t){if(!t||typeof t!="object"||Array.isArray(t))return null;const e={},r=u(t.heading,80);r&&(e.heading=r);const n=d(t.link);n&&(e.link=n);const l=Number(t.columns);Number.isInteger(l)&&l>=1&&l<=4&&(e.columns=l);const o=u(t.chipsLabel,60);o&&(e.chipsLabel=o);const s=t.feature;if(s&&typeof s=="object"&&!Array.isArray(s)){const i={};FEATURE_TONES.includes(s.tone)&&s.tone!=="dark"&&(i.tone=s.tone);const c=u(s.eyebrow,60),p=u(s.title,80);c&&(i.eyebrow=c),p&&(i.title=p);const f=(Array.isArray(s.points)?s.points:[]).map(h=>u(h,100)).filter(Boolean).slice(0,6);f.length&&(i.points=f);const a=d(s.button);a&&(i.button=a),(i.title||i.points||i.button)&&(e.feature=i)}return Object.keys(e).length?e:null}export function itemLookProblems(t,e){const r=[];if(t.description!=null&&typeof t.description!="string"?r.push("description must be a string"):typeof t.description=="string"&&t.description.length>160&&r.push("description must be at most 160 characters"),t.tile!=null&&t.tile!==""&&!e(t.tile)&&r.push("tile must be a preset key or #rrggbb"),t.chip!=null&&typeof t.chip!="boolean"&&r.push("chip must be true or false"),t.panel!=null){const n=t.panel;if(typeof n!="object"||Array.isArray(n))r.push("panel must be an object");else{n.columns!=null&&n.columns!==""&&!(Number.isInteger(Number(n.columns))&&n.columns>=1&&n.columns<=4)&&r.push("panel.columns must be 1 to 4");for(const[l,o]of[["link",n.link],["feature.button",n.feature?.button]])o&&typeof o=="object"&&o.url&&!b.test(String(o.url))&&r.push(`panel.${l}.url must start with /, #, http(s)://, or mailto:`);n.feature?.tone!=null&&n.feature.tone!==""&&!FEATURE_TONES.includes(n.feature.tone)&&r.push(`panel.feature.tone must be one of: ${FEATURE_TONES.join(", ")}`),n.feature?.points!=null&&!Array.isArray(n.feature.points)&&r.push("panel.feature.points must be a list")}}return r}export const TILE_RAINBOW=["#f26b3a","#8b5cf6","#3b82f6","#10b981","#f59e0b","#ec4899","#06b6d4","#84cc16"];export function floatsWithoutStrip(t){return t?t.strip==="none"||t.bar==="pill"&&t.strip!=="band":!1}export function cardColumns(t,e){return e?.columns?e.columns:t<=4?Math.max(1,Math.min(2,t)):3}
@@ -0,0 +1 @@
1
+ const f=()=>matchMedia("(prefers-reduced-motion: reduce)").matches||document.documentElement.classList.contains("dm-reduced-motion"),c=()=>matchMedia("(hover: hover) and (pointer: fine)").matches;export function splitWords(r,t){const n=[];return(function e(i){for(const s of[...i.childNodes])if(s.nodeType===3){const o=document.createDocumentFragment();for(const a of s.textContent.split(/(\s+)/)){if(!a)continue;if(/^\s+$/.test(a)){o.appendChild(document.createTextNode(a));continue}const l=document.createElement("span");l.className=t,l.textContent=a,n.push(l),o.appendChild(l)}s.replaceWith(o)}else if(s.nodeType===1&&s.classList.contains("dm-tg")){const o=document.createElement("span");o.className=t,s.replaceWith(o),o.appendChild(s),n.push(o)}else s.nodeType===1&&s.tagName!=="BR"&&e(s)})(r),n}function m(r){const t=r.closest("h1, h2, h3, h4, h5, h6, p, li, a, .card")||r.parentElement;if(!t||t.dataset.dmShine)return;t.dataset.dmShine="1";const n=()=>t.querySelectorAll(".dm-tg--hover");t.addEventListener("pointermove",e=>{for(const i of n()){const s=i.getBoundingClientRect();i.style.setProperty("--dm-tg-x",((e.clientX-s.left)/Math.max(1,s.width)).toFixed(3))}},{passive:!0}),t.addEventListener("pointerenter",()=>{for(const e of n())e.style.setProperty("--dm-tg-s","1")}),t.addEventListener("pointerleave",()=>{for(const e of n())e.style.setProperty("--dm-tg-s","0")})}function u(r){const t=r.map(i=>({el:i,words:splitWords(i,"dm-tm-iw"),lit:0}));let n=!1;const e=()=>{n=!1;const i=innerHeight;for(const s of t){const o=s.el.getBoundingClientRect(),a=Math.min(1,Math.max(0,(i*.9-o.top)/(i*.55+o.height*.5))),l=Math.round(a*s.words.length);if(l!==s.lit){for(let d=Math.min(l,s.lit);d<Math.max(l,s.lit);d++)s.words[d].classList.toggle("is-lit",d<l);s.lit=l}}};addEventListener("scroll",()=>{n||(n=!0,requestAnimationFrame(e))},{passive:!0}),addEventListener("resize",e),e()}function h(r){const t=new IntersectionObserver(n=>{for(const e of n)e.isIntersecting?e.target.classList.add("is-in"):e.boundingClientRect.top>0&&e.target.classList.remove("is-in")},{threshold:.2});for(const n of r)splitWords(n,"dm-tm-w").forEach((e,i)=>e.style.setProperty("--dm-tm-d",`${Math.min(i,24)*45}ms`)),n.classList.add("is-split"),t.observe(n)}function p(r){for(const t of r.children){let n=0,e=null;t.classList.add("dm-tilt"),t.addEventListener("pointerenter",()=>{e=[t.style.transition,t.style.transitionDelay],t.style.transition="transform 0.12s ease-out, box-shadow 0.3s ease",t.style.transitionDelay="0ms"});const i=()=>{if(!e)return;t.style.transition="transform 0.5s cubic-bezier(.2,.8,.2,1), box-shadow 0.5s ease";const[s,o]=e;e=null,setTimeout(()=>{e||(t.style.transition=s,t.style.transitionDelay=o)},520)};t.addEventListener("pointermove",s=>{cancelAnimationFrame(n),n=requestAnimationFrame(()=>{const o=t.getBoundingClientRect(),a=(s.clientX-o.left)/o.width-.5,l=(s.clientY-o.top)/o.height-.5;t.style.setProperty("--dm-tilt-x",`${(-l*6).toFixed(2)}deg`),t.style.setProperty("--dm-tilt-y",`${(a*8).toFixed(2)}deg`),t.style.setProperty("--dm-tilt-mx",`${((a+.5)*100).toFixed(1)}%`),t.style.setProperty("--dm-tilt-my",`${((l+.5)*100).toFixed(1)}%`),t.classList.add("is-tilting")})},{passive:!0}),t.addEventListener("pointerleave",()=>{cancelAnimationFrame(n),t.classList.remove("is-tilting"),i(),t.style.removeProperty("--dm-tilt-x"),t.style.removeProperty("--dm-tilt-y")})}}export function initPageMotion(r=document){const t=[...r.querySelectorAll(".dm-tm-ink")],n=[...r.querySelectorAll(".dm-tm-words")];if(f()){document.documentElement.classList.add("dm-tm-still");return}c()&&(r.querySelectorAll(".dm-tg--hover").forEach(m),r.querySelectorAll("[data-tilt]").forEach(p));for(const e of[...t,...n])e.classList.contains("dm-tg")&&(e.dataset.dmTgWords=[...e.classList].filter(i=>i.startsWith("dm-tg")).join(" "),e.classList.remove(...e.dataset.dmTgWords.split(" ")));t.length&&u(t),n.length&&h(n);for(const e of r.querySelectorAll("[data-dm-tg-words]")){const i=e.dataset.dmTgWords.split(" ");e.querySelectorAll(":scope .dm-tm-w, :scope .dm-tm-iw").forEach(s=>s.classList.add(...i)),c()&&e.querySelectorAll(".dm-tg--hover").forEach(m)}}
package/public/js/site.js CHANGED
@@ -1 +1 @@
1
- import{applyMobileMenu as se,initCarouselPopup as ie}from"/public/js/mobile-ui.mjs?v=20261016-mobile-options";import{installSmoothCarets as re}from"/public/js/smooth-caret.js";import{decodeBase64Json as W}from"/public/js/utf8-base64.mjs";import{makeBadgeEl as U,applyColour as G,applyPill as ce,applyFloat as le,applyHighlight as V,applyItemHighlight as de,itemHighlightAttrs as me,isCurrentItem as K,menuAlign as ue,applyClasses as P,cssClasses as Y,applyEntrance as J}from"/public/js/menu-decor.mjs?v=20261014-menu-entrance";import{initFloatingMenus as pe}from"/public/js/menu-float.js?v=20260829-float-panel";import{enhancePickerFields as Q,markInvalidFields as Z,showValidationPopup as ee}from"/public/js/forms.js?v=20261025-forms-files-total";import{buildWizardSteps as fe}from"/public/js/form-steps.mjs";import{applyFormClasses as te,applySubmitButtons as he,applyWizardButtons as ge}from"/public/js/form-submit.mjs";import{captureFileFields as oe,destroyDropzones as ye,fileBlueprint as ve,restoreFileFields as be,setFileLimits as we,splitFiles as Ce,submitBody as Se,totalTooLarge as xe,wireFileFields as ke}from"/public/js/form-files.mjs";document.addEventListener("click",m=>{const c=m.target?.closest?.(".dm-banner__dismiss");c&&(m.preventDefault(),c.closest(".dm-banner")?.remove())}),$(()=>{re(document);const m=window.__CMS_NAV__||{},c=window.__CMS_SITE__||{};if(c.autoTheme?.enabled){let o=function(e){const a=(e||"07:00").split(":");return+a[0]*60+(+a[1]||0)},s=function(){const e=new Date,a=e.getHours()*60+e.getMinutes();return a>=o(n.dayStart)&&a<o(n.nightStart)?n.dayTheme:n.nightTheme},t=function(e){const a=n.apply&&n.apply[e]||{theme:e,custom:""};Domma.theme.set(a.theme);for(const d of[...document.body.classList])d.startsWith("dm-custom-")&&document.body.classList.remove(d);a.custom&&document.body.classList.add(a.custom)};const n=c.autoTheme;t(s()),setInterval(()=>t(s()),6e4)}const k=$("#site-navbar");if(k.length&&m.brand){let s=function(f,b=0){return Array.isArray(f)?f.filter(h=>!(h&&(h.type==="spacer"||h.type==="theme-switcher"))).filter(h=>!(h&&h.type==="separator"&&b===0)).map(h=>h&&h.type==="separator"?{divider:!0}:Array.isArray(h?.items)?{...h,items:s(h.items,b+1)}:h):f};const n={...m.brand},o=n.size&&n.size!=="md"?` navbar-brand-${n.size}`:"";if(n.logo||n.icon||n.tagline){let f="";n.logo?f+=`<img src="${n.logo}" class="navbar-brand-logo" alt="${n.text||""}">`:n.icon&&(f+=`<span data-icon="${n.icon}" style="width:1.1em;height:1.1em;margin-right:.35em;vertical-align:middle;"></span>`),n.text&&(f+=`<span class="navbar-brand-text${o}">${n.text}</span>`),n.tagline&&(f+=`<small class="navbar-brand-tagline">${n.tagline}</small>`),n.html=f}else o&&n.text&&(n.html=`<span class="navbar-brand-text${o}">${n.text}</span>`);const t=s(m.items||[]),e=m.position==="floating",a=m.orientation==="vertical";k.get(0).querySelector(":scope > .cms-nojs-links")?.remove(),Domma.elements.navbar("#site-navbar",{brand:n,items:t,variant:m.variant||"dark",position:e?"static":m.position||"sticky",collapsible:!0,appearOnHover:!!m.appearOnHover}),Domma.icons.scan("#site-navbar");const d=k.get(0);se(d,m.mobile);const p=()=>{if(!a)return;const b=d.querySelector('a[aria-current="page"]')?.closest(".navbar-dropdown");b&&!b.classList.contains("open")&&b.querySelector(":scope > .navbar-dropdown-toggle")?.click()};d.classList.add(`dm-nav-align-${ue(m)||"centre"}`),a&&k.get(0).classList.add("dm-nav-vertical",m.side==="right"?"dm-nav-vertical-right":"dm-nav-vertical-left");const i=m.dock||{};a&&!e&&Le(d,m.side==="right"),!a&&i.hideOnScroll&&$e(d),V(d,m),J(d,m),P(d,m.class),e&&(le(k.get(0),m),pe(k.get(0).parentNode||document));const l=d.querySelector(".navbar-toggle"),g=d.querySelector(".navbar-collapse");if(l&&g){let f=null;const b=()=>{g.classList.contains("show")&&l.click()},h=()=>{f&&(f.remove(),f=null),document.body.classList.remove("dm-drawer-open")},u=()=>{f||(f=document.createElement("div"),f.className="dm-navbar-backdrop",f.addEventListener("click",b),document.body.appendChild(f),document.body.classList.add("dm-drawer-open"))};l.addEventListener("click",()=>{requestAnimationFrame(()=>{g.classList.contains("show")?(p(),u()):h()})}),g.addEventListener("click",w=>{w.target.closest("a")&&requestAnimationFrame(h)}),document.addEventListener("keydown",w=>{w.key==="Escape"&&g.classList.contains("show")&&b()})}const v=d.querySelector(".navbar-nav");if(v){const f=Array.from(v.children);let b=0;for(const h of m.items||[])if(!(h&&h.type==="separator")){if(h&&h.type==="spacer"){const u=document.createElement("li"),w=["xs","sm","md","lg","xl","flex"].includes(h.size)?h.size:"md";u.className=`dm-menu-spacer dm-menu-spacer--${w}`,u.setAttribute("aria-hidden","true"),v.insertBefore(u,f[b]||null);continue}if(h&&h.type==="theme-switcher"){const u=document.createElement("li");u.className="dm-menu-theme-switcher";const w=document.createElement("span");w.dataset.themeSwitcher="menu",w.dataset.position="inline",u.appendChild(w),v.insertBefore(u,f[b]||null);continue}b++}window.CMSThemeSwitcher?.scan(v)}d.querySelectorAll("[data-path]").forEach(f=>{const b=f.dataset.path.split(".").map(Number),h=b.length>1,u=b.reduce((M,N)=>M?.items?.[N],{items:t});if(!u)return;u.colour&&G(f,u.colour),u.pill&&!h&&ce(f,u.pill),de(f,u),P(f.closest("li"),u.class);const w=U(u.badge);w&&f.appendChild(w),K(u.url,location.pathname)&&(f.classList.add("active"),f.setAttribute("aria-current","page"))}),p()}const y=$("#site-footer");if(y.length){let e=function(r){return String(r??"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")},a=function(r){return e(r).replace(/'/g,"&#39;")},d=function(r){if(r&&r.type==="separator")return'<li class="footer-sep"><hr></li>';if(r&&r.type==="spacer")return`<li class="dm-menu-spacer dm-menu-spacer--${["xs","sm","md","lg","xl","flex"].includes(r.size)?r.size:"md"}" aria-hidden="true"></li>`;if(r&&r.type==="theme-switcher")return'<li class="dm-menu-theme-switcher"><span data-theme-switcher="menu" data-position="inline"></span></li>';const I=a(r.url||"#"),x=e(r.text||""),A=Array.isArray(r.items)&&r.items.length?`<ul>${r.items.map(d).join("")}</ul>`:"",j=me(r),ne=[j.hover&&` data-menu-item-hover="${a(j.hover)}"`,j.active&&` data-menu-item-active="${a(j.active)}"`].filter(Boolean).join(""),ae=j.accent?` style="--dm-menu-highlight:${a(j.accent)}"`:"",X=Y(r.class).join(" ");return`<li${X?` class="${a(X)}"`:""}><a href="${I}"${ne}${ae}>${x}</a>${A}</li>`},i=function(){if(!c.footer)return"";const r=Object.keys(o).filter(x=>n[x]);if(!r.length)return"";const I=Y(c.footer.socialClass).join(" ");return`<div class="footer-social">${r.map(x=>{const{label:A,svg:j}=o[x];return`<a href="${n[x]}" target="_blank" rel="noopener noreferrer" aria-label="${A}" class="footer-social-link${I?` ${a(I)}`:""}">${j}</a>`}).join("")}</div>`},f=function(r){if(!r||r.type==="separator"||r.type==="spacer")return"";if(r.type==="theme-switcher")return`<li class="cms-footer-col">${d(r).replace(/^<li[^>]*>|<\/li>$/g,"")}</li>`;const I=Array.isArray(r.items)&&r.items.length?`<ul>${r.items.map(d).join("")}</ul>`:"",x=v(r)?`<span class="cms-footer-col-title">${e(r.text||"")}</span>`:`<a class="cms-footer-col-title" href="${a(r.url||"#")}">${e(r.text||"")}</a>`,A=["cms-footer-col",...Y(r.class)].join(" ");return`<li class="${a(A)}">${x}${I}</li>`},u=function(r,I,x=!1){return(r||[]).forEach(A=>{A&&(A.type==="separator"||A.type==="spacer"||A.type==="theme-switcher")||(x&&v(A)||I.push(A),Array.isArray(A.items)&&A.items.length&&u(A.items,I))}),I};const n=c.social||{},o={twitter:{label:"X / Twitter",svg:'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-4.714-6.231-5.401 6.231H2.742l7.73-8.835L1.254 2.25H8.08l4.259 5.629L18.244 2.25zm-1.161 17.52h1.833L7.084 4.126H5.117z"/></svg>'},facebook:{label:"Facebook",svg:'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z"/></svg>'},instagram:{label:"Instagram",svg:'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zM12 0C8.741 0 8.333.014 7.053.072 2.695.272.273 2.69.073 7.052.014 8.333 0 8.741 0 12c0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98C8.333 23.986 8.741 24 12 24c3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98C15.668.014 15.259 0 12 0zm0 5.838a6.162 6.162 0 100 12.324 6.162 6.162 0 000-12.324zM12 16a4 4 0 110-8 4 4 0 010 8zm6.406-11.845a1.44 1.44 0 100 2.881 1.44 1.44 0 000-2.881z"/></svg>'},linkedin:{label:"LinkedIn",svg:'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 01-2.063-2.065 2.064 2.064 0 112.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg>'},github:{label:"GitHub",svg:'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg>'},youtube:{label:"YouTube",svg:'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M23.495 6.205a3.007 3.007 0 00-2.088-2.088c-1.87-.501-9.396-.501-9.396-.501s-7.507-.01-9.396.501A3.007 3.007 0 00.527 6.205a31.247 31.247 0 00-.522 5.805 31.247 31.247 0 00.522 5.783 3.007 3.007 0 002.088 2.088c1.868.502 9.396.502 9.396.502s7.506 0 9.396-.502a3.007 3.007 0 002.088-2.088 31.247 31.247 0 00.5-5.783 31.247 31.247 0 00-.5-5.805zM9.609 15.601V8.408l6.264 3.602z"/></svg>'}};let s='<div class="footer-inner container">';const t=window.__CMS_FOOTER__||{primary:[],legal:[],copyright:""},p=(()=>{const r=c.cookieConsent;if(!r||r.showSettingsLink===!1)return"";const I=x=>(x||[]).some(A=>A&&(A.url==="#cookie-settings"||I(A.items)));return I(t.primary)||I(t.legal)?"":`<li class="cms-cookie-settings"><a href="#cookie-settings">${e(r.settingsLinkText||"Cookie settings")}</a></li>`})(),l=["columns","row"].includes(c.footer?.layout)?c.footer.layout:"auto",g=l==="columns"||l==="auto"&&t.primary.some(r=>Array.isArray(r?.items)&&r.items.length),v=r=>g&&!r.url&&Array.isArray(r.items)&&r.items.length>0;if(g){const r=m.brand||{},I=r.text||c.title||"",x=r.logo?`<img src="${a(r.logo)}" class="cms-footer-brand-logo" alt="">`:r.icon?'<span class="cms-footer-brand-icon"></span>':"",A=String(c.footer?.blurb||"").trim();s='<div class="footer-inner footer-inner--columns container"><div class="cms-footer-top">',s+=`<div class="cms-footer-brand">${I||x?`<a class="cms-footer-brand-name" href="${a(r.url||"/")}">${x}<span>${e(I)}</span></a>`:""}${A?`<p class="cms-footer-blurb">${e(A)}</p>`:""}${i()}</div>`,t.primary.length&&(s+=`<nav class="footer-nav footer-nav--primary footer-nav--columns" aria-label="Footer"><ul>${t.primary.map(f).join("")}</ul></nav>`),s+='</div><div class="cms-footer-bottom">',t.copyright&&(s+=`<p class="cms-footer-copyright">${e(t.copyright)}</p>`),(t.legal.length||p)&&(s+=`<nav class="footer-nav footer-nav--legal" aria-label="Legal"><ul>${t.legal.map(d).join("")}${p}</ul></nav>`),s+="</div>"}else t.copyright&&(s+=`<p>${e(t.copyright)}</p>`),t.primary.length&&(s+=`<nav class="footer-nav footer-nav--primary"><ul>${t.primary.map(d).join("")}</ul></nav>`),(t.legal.length||p)&&(s+=`<nav class="footer-nav footer-nav--legal"><ul>${t.legal.map(d).join("")}${p}</ul></nav>`),s+=i();s+="</div>",y.get(0).querySelector(":scope > .cms-nojs-links")?.remove();const b=y.get(0).querySelector(":scope > .cms-footer-blocks");b?.remove(),y.html(s),b&&y.get(0).prepend(b),window.CMSThemeSwitcher?.scan(y.get(0));const h=y.get(0).querySelector(".cms-footer-brand-icon");h&&m.brand?.icon&&h.setAttribute("data-icon",m.brand.icon),P(y.get(0),c.footer?.class);const w=[...u(t.primary,[],!0),...u(t.legal,[])];y.get(0).querySelectorAll(".footer-nav a").forEach((r,I)=>{const x=w[I];if(!x)return;x.colour&&G(r,x.colour);const A=U(x.badge);A&&r.appendChild(A),K(x.url,location.pathname)&&(r.classList.add("is-active"),r.setAttribute("aria-current","page"))}),V(y.get(0).querySelector(".footer-nav--primary"),{highlight:t.primaryHighlight}),V(y.get(0).querySelector(".footer-nav--legal"),{highlight:t.legalHighlight}),J(y.get(0).querySelector(".footer-nav--primary"),{entrance:t.primaryEntrance}),J(y.get(0).querySelector(".footer-nav--legal"),{entrance:t.legalEntrance}),P(y.get(0).querySelector(".footer-nav--primary"),t.primaryClass),P(y.get(0).querySelector(".footer-nav--legal"),t.legalClass);const N=c.footer?.showMotionToggle!==!1,z=S.get("reduced_motion"),B=c.footer?.motionDefault,O=z!=null?!!z:B==="on"?!0:B==="off"?!1:!!(window.matchMedia&&window.matchMedia("(prefers-reduced-motion: reduce)").matches),L=c.footer?.motionControl==="checkbox",D=y.get(0).querySelector(".cms-footer-bottom")||y.get(0).querySelector(".footer-inner");if(N&&D){const r=document.createElement("input");r.type="checkbox",r.className=L?"footer-motion-checkbox":"form-switch-input",r.id="dm-motion-switch",r.checked=O,r.addEventListener("change",function(){S.set("reduced_motion",this.checked),window.location.reload()});const I=document.createElement("span");I.className=L?"footer-motion-label":"form-switch-label",I.textContent="Reduce motion";const x=document.createElement("label");x.className=L?"footer-motion-check":"form-switch footer-motion-switch",x.title="Reduce motion",x.appendChild(r),x.appendChild(I),D.appendChild(x)}}const q=document.getElementById("site-sidebar");q&&Ee(q),Domma.icons.scan(),Domma.syntax?.scan&&Domma.syntax.scan();const C=$(".page-body");if(C.length){C.find(".accordion").each(function(){Domma.elements.accordion(this,{allowMultiple:this.dataset.multi==="true"})}),C.find(".tabs").each(function(){Domma.elements.tabs(this)}),C.find(".carousel").each(function(){const n={primary:"--dm-primary",secondary:"--dm-secondary",accent:"--dm-primary",text:"--dm-text",surface:"--dm-surface",background:"--dm-background",success:"--dm-success",warning:"--dm-warning",danger:"--dm-danger",info:"--dm-info"},o=p=>{const i=String(p||"").trim();return i?n[i.toLowerCase()]?`var(${n[i.toLowerCase()]})`:CSS.supports("color",i)?i:"":""},s=o(this.dataset.background),t=o(this.dataset.arrowBackground),e=o(this.dataset.arrowColor);s&&(this.style.setProperty("--dm-carousel-background",s),this.classList.add("dm-carousel-custom-background")),t&&this.style.setProperty("--dm-carousel-arrow-background",t),e&&this.style.setProperty("--dm-carousel-arrow-color",e);const a=["top","middle","bottom"].includes(this.dataset.arrowPosition)?this.dataset.arrowPosition:"middle";this.classList.add(`dm-carousel-arrows-${a}`);const d={autoplay:this.dataset.autoplay==="true",interval:parseInt(this.dataset.interval,10)||5e3,loop:this.dataset.loop!=="false",animation:this.dataset.animation||"slide",heightMode:this.dataset.heightMode==="average"?"average":"crop"};if(this.dataset.height){const p=Number(this.dataset.height);Number.isFinite(p)&&p>0&&(d.height=p)}if(this.dataset.animationDuration){const p=parseInt(this.dataset.animationDuration,10);Number.isFinite(p)&&(d.animationDuration=p)}this.dataset.animationEasing&&(d.animationEasing=this.dataset.animationEasing),this.dataset.ctx&&(this._dmCtxSlides=Array.from(this.querySelectorAll(".carousel-slide")).map(p=>p.cloneNode(!0)),this._dmCarouselOpts=d),this._dmCarousel=Domma.elements.carousel(this,d),ie(this)}),C.find(".dm-countdown").each(function(){const n={autoStart:!0},o=String(this.dataset.format||"").trim(),s=String(this.dataset.to||"").trim(),t=/^(\d{4})-(\d{2})-(\d{2})$/.exec(s),e=t?new Date(+t[1],+t[2]-1,+t[3]).getTime():s?new Date(s).getTime():NaN;Number.isFinite(e)?n.duration=Math.max(0,e-Date.now()):this.dataset.duration&&(n.duration=(parseInt(this.dataset.duration,10)||0)*1e3);const a=/^dd:/i.test(o);n.format=a?"hh:mm:ss":o||(n.duration>=36e5?"hh:mm:ss":"mm:ss");const d=this,p=l=>String(l).padStart(2,"0"),i=l=>{const g=Math.max(0,Math.floor(l/1e3)),v=d.querySelector(".dm-timer-time");v&&(v.textContent=`${p(Math.floor(g/86400))}:${p(Math.floor(g%86400/3600))}:${p(Math.floor(g%3600/60))}:${p(g%60)}`)};a&&(n.onTick=i),Domma.elements.timer(this,n),a&&i(n.duration||0)}),C.find("[data-tooltip]:not(.dm-range-slider)").each(function(){Domma.elements.tooltip(this,{content:$(this).data("tooltip"),position:$(this).data("tooltip-position")||"top"})}),C.find(".dm-progression").each(function(){const n=Array.from(this.querySelectorAll(".dm-progression-item")).map(t=>{const e={title:t.querySelector(".dm-progression-item-title")?.textContent?.trim()||"",description:t.querySelector(".dm-progression-item-body")?.innerHTML?.trim()||""};return t.dataset.date&&(e.date=t.dataset.date),t.dataset.status&&(e.status=t.dataset.status),t.dataset.eventIcon&&(e.icon=t.dataset.eventIcon),t.dataset.entryId&&(e._entryId=t.dataset.entryId),e}),o=this.dataset.layout==="centred"?"centered":this.dataset.layout||"vertical",s=Domma.elements.progression(this,{layout:o,theme:this.dataset.theme||"minimal",mode:this.dataset.mode||"timeline",statusIcons:!0,allowHtml:!0,...n.length?{items:n}:{}});if((this.dataset.mode||"timeline")==="timeline"){const t={completed:{label:"Completed",icon:"check-circle",tone:"success"},planned:{label:"Planned",icon:"circle",tone:"secondary"},"in-progress":{label:"In progress",icon:"clock",tone:"primary"},blocked:{label:"Blocked",icon:"alert-circle",tone:"danger"}};this.querySelectorAll(".dm-progression-item").forEach((e,a)=>{const d=n[a];if(!d)return;const p=e.querySelector(".dm-progression-title");if(d.icon&&p){const l=document.createElement("span");l.dataset.icon=d.icon,l.style.cssText="display:inline-flex;vertical-align:middle;margin-right:.4em",l.setAttribute("aria-hidden","true"),p.prepend(l)}const i=t[d.status];if(i&&p){const l=document.createElement("span");l.className=`badge badge-${i.tone} cms-timeline-status`,l.style.cssText="display:inline-flex;align-items:center;gap:.35em;margin:.4rem 0";const g=document.createElement("span");g.dataset.icon=i.icon,g.dataset.iconSize="14",g.setAttribute("aria-hidden","true"),l.append(g,document.createTextNode(i.label)),p.after(l)}})}Domma.icons.scan(this),n.length&&(this._dmCtx={instance:s,items:n})});try{Domma.effects.reveal(".page-body .hero",{animation:"slide-up",duration:480,threshold:.06,stagger:60,once:!1})}catch{}document.querySelectorAll(".page-body .row[data-reveal]").forEach(n=>{const o=n.dataset.revealMode||"stagger",s=n.dataset.revealAnimation||"slide-up",t=parseInt(n.dataset.revealDuration,10)||400,e=parseInt(n.dataset.revealStagger,10)||60,a=parseInt(n.dataset.revealDelay,10)||0,d=n.dataset.revealDirection==="rtl",p=Array.from(n.children),i={"slide-up":"translateY(30px)","slide-down":"translateY(-30px)","slide-left":"translateX(30px)","slide-right":"translateX(-30px)",zoom:"scale(0.85)",flip:"perspective(600px) rotateX(15deg)"};p.forEach((l,g)=>{l.style.opacity="0",l.style.transform=i[s]||"",l.style.transition=`opacity ${t}ms ease, transform ${t}ms ease`;const v=d?p.length-1-g:g;l.style.transitionDelay=o==="stagger"?`${a+v*e}ms`:`${a}ms`}),requestAnimationFrame(()=>requestAnimationFrame(()=>{const l=new IntersectionObserver(g=>{g.forEach(v=>{v.isIntersecting&&(v.target.offsetWidth,v.target.style.opacity="1",v.target.style.transform="none",l.unobserve(v.target))})},{threshold:.1});p.forEach(g=>l.observe(g))}))}),C.find(".card[data-collapsible]").each(function(){const n=this.querySelector(".card-header");n&&n.addEventListener("click",()=>this.classList.toggle("is-collapsed"))}),C.find(".dm-so-trigger").each(function(){this.addEventListener("click",()=>{const n=this.dataset.soTarget,o=document.getElementById(n);if(!o)return;const s=E.slideover({title:o.dataset.soTitle||"",size:o.dataset.soSize||"md",position:o.dataset.soPosition||"right"});o.style.display="",s.setContent(o),s.open()})})}if(typeof $.setup=="function"){const n=Object.assign({},window.__CMS_DCONFIG__||{});if(document.querySelectorAll(".dm-page-config[data-config]").forEach(o=>{try{const s=W(o.dataset.config);Object.assign(n,s)}catch{}}),Object.keys(n).length>0){const o={};for(const[s,t]of Object.entries(n)){const e=t?.events?.click,{confirm:a,toast:d,alert:p,prompt:i,...l}=e||{};if(a||d||p||i){$(s).on("click",async function(I){if(I.preventDefault(),a&&!await E.confirm(a))return;let x=null;if(!(i&&(x=await E.prompt(i,{inputPlaceholder:l.promptPlaceholder||"",inputValue:l.promptDefault||""}),x===null))){{const A=$(l.target||this);l.toggleClass&&A.toggleClass(l.toggleClass),l.addClass&&A.addClass(l.addClass),l.removeClass&&A.removeClass(l.removeClass),x!==null&&(l.setText&&A.text(x),l.setVal&&A.val(x),l.setAttr&&A.attr(l.setAttr,x))}l.href&&(window.location.href=l.href),d&&E.toast(d,{type:l.toastType||"success"}),p&&E.alert(p)}});const{target:v,toggleClass:f,addClass:b,removeClass:h,setText:u,setVal:w,setAttr:M,href:N,toastType:z,promptPlaceholder:B,promptDefault:O,...L}=l,D={...t.events};Object.keys(L).length?D.click=v?{target:v,...L}:L:delete D.click;const r={...t,events:D};Object.keys(D).length||delete r.events,Object.keys(r).length&&(o[s]=r)}else o[s]=t}$.setup(o)}}C.length&&R(C.get(0))}),window.wireCTAButtons=R;function R(m){m.querySelectorAll(".dm-cta-trigger").forEach(c=>{c.__ctaWired||(c.__ctaWired=!0,c.addEventListener("click",async()=>{const k=c.dataset.action,y=c.dataset.entry,q=c.dataset.confirm;let C=S.get("auth_token");if(!C){E.toast("Please log in to perform this action.",{type:"warning"});return}if(q&&!await E.confirm(q))return;const n=Array.from(c.childNodes).map(s=>s.cloneNode(!0));c.disabled=!0,c.textContent="Running\u2026";const o=s=>fetch(`/api/actions/${k}/public`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${s}`},body:JSON.stringify(c.dataset.scope?{entryId:y,scope:c.dataset.scope}:{entryId:y})});try{let s=await o(C);if(s.status===401){const e=S.get("auth_refresh_token");if(e){const a=await fetch("/api/auth/refresh",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({refreshToken:e})});if(a.ok){const{token:d}=await a.json();S.set("auth_token",d),C=d,s=await o(C)}}}const t=await s.json().catch(()=>({}));if(!s.ok||t.success===!1)throw new Error(t.error||t.message||`Error ${s.status}`);E.toast(t.message||"Action completed.",{type:"success"})}catch(s){E.toast(s.message||"Action failed.",{type:"error"})}finally{c.disabled=!1,c.textContent="",n.forEach(s=>c.appendChild(s)),Domma.icons.scan(c)}}))})}(function(){const c=document.querySelectorAll('.dm-collection-hydrate[data-collection-scope="mine"]');if(!c.length)return;const k=S.get("auth_token");function y(C,n){const o=document.createElement("div");o.className="dm-collection-display dm-collection-empty";const s=document.createElement("p");if(n){s.appendChild(document.createTextNode("Please "));const t=document.createElement("a");t.href="/login",t.textContent="sign in",s.appendChild(t),s.appendChild(document.createTextNode(" to view your entries."))}else s.textContent=C;return o.appendChild(s),o}function q(C,n){const o=document.createElement("template");o.innerHTML=n||"",C.replaceWith(o.content)}c.forEach(async C=>{const n=C.dataset.collectionAttrs;if(!n)return;if(!k){C.replaceChildren(y("",!0));return}const o=s=>fetch("/api/collections/render-scope",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${s}`},body:JSON.stringify({attrs:n})});try{let s=k,t=await o(s);if(t.status===401){const a=S.get("auth_refresh_token");if(a){const d=await fetch("/api/auth/refresh",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({refreshToken:a})});if(d.ok){const{token:p}=await d.json();S.set("auth_token",p),s=p,t=await o(s)}}}if(!t.ok){const{error:a}=await t.json().catch(()=>({}));C.replaceChildren(y(a||"Unable to load entries.",!1));return}const{html:e}=await t.json();q(C,e),window.DommaCollectionBrowser?.hydrate&&window.DommaCollectionBrowser.hydrate(document)}catch{C.replaceChildren(y("Unable to load entries.",!1))}}),setTimeout(()=>{typeof Domma<"u"&&Domma.icons?.scan&&Domma.icons.scan(),typeof Domma<"u"&&Domma.syntax?.scan&&Domma.syntax.scan(),R(document.body)},100)})(),(function(){const c=document.querySelectorAll("[data-collection-table]");!c.length||typeof T>"u"||!T.create||c.forEach(k=>{let y;try{y=W(k.dataset.payload)}catch{return}const{columns:q,rows:C,search:n,sortable:o,exportable:s,pageSize:t,empty:e,ctaConfig:a,slug:d,exportCfg:p}=y;if(!q?.length)return;if(a){const g=q.findIndex(v=>v.key==="_cta");g!==-1&&(q[g]={key:"_cta",title:"",render:(v,f)=>{const b=document.createElement("button");if(b.className=`btn btn-${a.style||"primary"} dm-cta-trigger`,b.dataset.action=a.action||"",a.scope&&(b.dataset.scope=a.scope),b.dataset.entry=f._entryId||"",a.confirm&&(b.dataset.confirm=a.confirm),a.icon){const h=document.createElement("span");h.dataset.icon=a.icon,b.appendChild(h),b.appendChild(document.createTextNode(" "))}return b.appendChild(document.createTextNode(a.label||"Run")),b}})}const i="col-table-"+Math.random().toString(36).slice(2,7),l=document.createElement("div");l.id=i,k.replaceChildren(l),T.create("#"+i,{data:C,columns:q,search:n,sortable:o,exportable:s,pageSize:t,emptyMessage:e}),a&&R(l),k._dmTable={columns:q,rows:C,slug:d,exportCfg:p,render(g){T.create("#"+i,{data:g,columns:q,search:n,sortable:o,exportable:s,pageSize:t,emptyMessage:e}),a&&R(l)}}})})(),(function(){const c=document.querySelectorAll("[data-form-inline]");if(!c.length||typeof F>"u")return;function k(o){const s=o&&o.logic;return!!(s&&(s.visibility||s.requirement))}function y(o,s){const t={};return(o||[]).forEach(e=>{if(e.type==="page-break"||e.type==="spacer"||!e.name)return;const a=e.type==="chooser"||!!(e.variant&&["select","radio","checkbox-group"].includes(e.type)),d=e.type==="checkbox"?"boolean":e.type==="date"||e.type==="icon"||e.type==="image"?"string":a?"chooser":e.type,p={...e.formConfig||{}};p.span==="full"&&s&&(p.span=s);const i={type:d,required:k(e)?!1:e.required,label:e.label,options:e.options,formConfig:{...e.placeholder&&{placeholder:e.placeholder},...e.helper&&{hint:e.helper},...e.tooltip&&{tooltip:e.tooltip},...p}};e.minLength!==void 0&&(i.minLength=e.minLength),e.maxLength!==void 0&&(i.maxLength=e.maxLength),e.min!==void 0&&(i.min=e.min),e.max!==void 0&&(i.max=e.max),a&&(e.variant&&(i.variant=e.variant),(e.multiple||e.type==="checkbox-group")&&(i.multiple=!0),e.density&&(i.density=e.density),e.columns&&(i.columns=e.columns),e.accent&&(i.accent=e.accent),e.accentStyle&&(i.accentStyle=e.accentStyle),e.glow&&(i.glow=!0),e.glowColour&&(i.glowColour=e.glowColour),e.shadow&&(i.shadow=e.shadow),e.shadowColour&&(i.shadowColour=e.shadowColour)),t[e.name]=e.type==="file"?ve(e,i):i}),t}function q(o){const s={};return(o||[]).forEach(t=>{if(!(!t.name||t.type==="page-break"||t.type==="spacer")&&(t.type==="select"||t.type==="multiselect")&&t.required){const e=(t.options||[])[0];e&&(s[t.name]=typeof e=="object"?e.value:e)}}),s}function C(o,s){(s||[]).forEach(t=>{if(t.type!=="date"||!t.name)return;const e=o.querySelector(`[name="${t.name}"]`);e&&e.type!=="date"&&(e.type="date")})}function n(o,s,t){let e=o.querySelector(".cms-form-message");e||(e=document.createElement("p"),e.className="cms-form-message",o.appendChild(e)),e.textContent=s,e.style.cssText=t?"color:var(--dm-danger);margin-top:.75rem;":"color:var(--dm-success);margin-top:.75rem;"}c.forEach(o=>{let s;try{s=W(o.dataset.formInline)}catch{return}o.querySelector(":scope > .cms-form-embed-summary")?.remove();const t=s.fields||[],e=s.settings||{},a=Number(e.columns)===3?3:2,d=e.layout||"grid",p=t.some(h=>h.type==="page-break"),i=new Map;we(o,s.fileLimits,i),ke(o,t);const l=async h=>{if(o.dataset.triggerBlocked==="true"){const u=o._formLogicRuntime,w=u&&u.submitBlock?u.submitBlock().reasons:[];n(o,w.join(" ")||"This form cannot be submitted yet.",!0);const M=new Error("Blocked by a form trigger");throw M.formSubmitFailed=!0,M}try{const u=o.querySelector(".fb-form-honeypot"),w=u?.querySelector('input[type="text"]')||null,M=u?.querySelector('[name="_t"]')||null,N=Object.assign({},h);delete N._t,u?.dataset.hpName&&delete N[u.dataset.hpName],w!==null&&(N._hp=w.value),M!==null&&(N._t=M.value);const z=new Map(i);oe(o,z);const B=Ce(N,t,z),O=xe(o,B.files);if(O){n(o,O,!0);const D=new Error(O);throw D.formSubmitFailed=!0,D}const L=await H.post(`/api/forms/submit/${s.slug}`,B.files.size?Se(B.values,B.files).body:B.values);if(L&&L.error){n(o,L.error,!0);const D=new Error(L.error);throw D.formSubmitFailed=!0,D}if(L?.redirect){window.location.href=L.redirect;return}for(ye(o);o.firstChild;)o.removeChild(o.firstChild);n(o,L?.message||e.successMessage||"Thank you for your submission.",!1)}catch(u){throw u.formSubmitFailed||n(o,u.message||"Submission failed. Please try again.",!0),u}},g=Date.now();function v(h){const u=h.querySelector("form");if(!u||u.querySelector(".fb-form-honeypot"))return;const w=document.createElement("div");w.className="fb-form-honeypot",w.setAttribute("aria-hidden","true");const M=document.createElement("input");M.name=u.querySelector('[name="website"]')?"_website":"website",w.dataset.hpName=M.name,M.type="text",M.tabIndex=-1,M.autocomplete="url",M.placeholder="https://",w.appendChild(M);const N=document.createElement("input");N.name="_t",N.type="hidden",N.value=g,w.appendChild(N),u.appendChild(w)}function f(h){if(!window.FormLogicEngine||!t.some(w=>w.logic||Array.isArray(w.triggers)&&w.triggers.length))return null;const u=new window.FormLogicEngine.FormLogicRuntime(s,o,h?{baseValues:h}:void 0);if(u.init(),o._formLogicRuntime=u,o._formLogicObserved)return u;if(o._formLogicObserved=!0,o.parentNode&&typeof MutationObserver<"u"){const w=new MutationObserver(function(M){for(const N of M)for(const z of N.removedNodes)if(z===o||z.nodeType===1&&z.contains&&z.contains(o)){o._formLogicRuntime&&o._formLogicRuntime.destroy(),w.disconnect();return}});w.observe(o.parentNode,{childList:!0,subtree:!1}),o._formLogicObserver=w}return u}let b=!1;if(o.addEventListener("dm-form-end",h=>{const u=h.detail?.validation;if(u&&!u.valid){Z(o,u.missing),ee(u);return}b||(b=!0,l(h.detail?.values||{}).catch(()=>{}).finally(()=>{b=!1}))}),p&&F.wizard){const h=fe(t,s.title),u=h.map(L=>({title:L.title,description:L.description,fields:y(L.fields,a)})),w=h.map(L=>L.fields);let M=0,N=null,z=null;const B=L=>{const D=window.FormLogicEngine;if(!D||!D.validateFields)return;const r=D.validateFields(o,w[M]||[]);r.valid||(L.preventDefault(),L.stopImmediatePropagation(),Z(o,r.missing),ee(r))},O=()=>{const L=w[M]||t;ge(o,e),te(o,e,L),C(o,L),Q(o,L),be(o,i),e.honeypot!==!1&&v(o),N&&N.destroy(),N=f(z?.getStepData?z.getStepData():void 0),o.querySelectorAll(".wizard-next, .wizard-submit").forEach(D=>D.addEventListener("click",B,!0))};z=F.wizard(o,{schema:{steps:u},layout:d,columns:a,finishText:e.submitText||"Finish",onSubmit:l,onStepChange:L=>{oe(o,i),M=L,setTimeout(O,0)}}),o.addEventListener("dm-form-trigger",L=>{if(L.detail?.type!=="goto-step"||!z?.goToStep)return;const D=Number(L.detail.action.step);!Number.isFinite(D)||D<0||D>=u.length||D!==M&&z.goToStep(D)}),Promise.resolve(z).then(O)}else if(F.render){const h=F.render(o,y(t,a),q(t),{submitText:e.submitText||"Submit",layout:d,columns:a,onSubmit:l});Promise.resolve(h).then(function(){he(o,e,d),te(o,e,t),C(o,t),Q(o,t),e.honeypot!==!1&&v(o),f()})}})})();function Le(m,c){const k=document.body,y=k.classList,q=new Set((k.dataset.railSite||"").split(" ").filter(Boolean)),C=()=>window.matchMedia("(min-width: 993px)").matches;m.querySelectorAll(".navbar-link, .navbar-dropdown-toggle").forEach(a=>{const d=a.textContent.trim();d&&(a.setAttribute("title",d),a.querySelector("svg, [data-icon]")||(a.dataset.initial=d.charAt(0).toUpperCase()))});const n=document.createElement("button");n.type="button",n.className="dm-nav-collapse-toggle";const o=()=>{const a=y.contains("dm-vnav-collapsed");n.setAttribute("aria-pressed",String(a)),n.setAttribute("aria-label",a?"Expand menu":"Collapse menu"),n.title=n.getAttribute("aria-label");const d=c?"chevrons-left":"chevrons-right",p=c?"chevrons-right":"chevrons-left";n.innerHTML=`<span data-icon="${a?d:p}"></span>`,window.Domma&&Domma.icons&&Domma.icons.scan(n)},s=a=>{y.toggle("dm-vnav-collapsed",a),S.set("nav_collapsed",a),o()};n.addEventListener("click",()=>s(!y.contains("dm-vnav-collapsed"))),o();const t=m.querySelector(".navbar-container")||m;t.insertBefore(n,t.firstChild?.nextSibling||null);const e=a=>{y.toggle("dm-vnav-autohide",a),y.toggle("dm-vnav-collapsible",!a&&q.has("collapsible")),a?y.remove("dm-vnav-collapsed"):q.has("collapsible")&&S.get("nav_collapsed")===!0&&y.add("dm-vnav-collapsed"),m.classList.remove("dm-nav-revealed"),o()};m.addEventListener("pointerdown",a=>{y.contains("dm-vnav-autohide")&&a.pointerType!=="mouse"&&!m.classList.contains("dm-nav-revealed")&&(m.classList.add("dm-nav-revealed"),a.preventDefault())}),document.addEventListener("pointerdown",a=>{m.contains(a.target)||m.classList.remove("dm-nav-revealed")}),window.E&&typeof E.contextMenu=="function"&&E.contextMenu(m,{items:()=>{const a=y.contains("dm-vnav-autohide"),d=y.contains("dm-vnav-collapsed"),p=S.has("nav_autohide")||S.has("nav_collapsed");return[{header:"Menu"},{label:d?"Expand menu":"Collapse to icons",icon:d?"maximize":"minimize",disabled:!C()||a||!q.has("collapsible"),action:()=>s(!d)},{label:a?"Keep on screen":"Hide when not in use",icon:a?"eye":"eye-off",disabled:!C(),action:()=>{S.set("nav_autohide",!a),e(!a)}},{type:"divider"},{label:"Reset to the site's setting",icon:"refresh",disabled:!p,action:()=>{S.remove("nav_autohide"),S.remove("nav_collapsed"),e(q.has("autohide")),y.toggle("dm-vnav-collapsed",!q.has("autohide")&&q.has("start-collapsed")),o()}}]}})}function $e(m){m.classList.add("dm-nav-scroll-hide");let c=window.scrollY,k=!1;window.addEventListener("scroll",()=>{k||(k=!0,requestAnimationFrame(()=>{k=!1;const y=window.scrollY,q=m.matches(":focus-within")||m.querySelector(".navbar-dropdown.open, .navbar-collapse.show");y>c&&y>m.offsetHeight&&!q?m.classList.add("dm-nav-scrolled-away"):y<c&&m.classList.remove("dm-nav-scrolled-away"),c=y}))},{passive:!0})}function Ee(m){let c={};try{c=JSON.parse(m.dataset.contents||"{}")}catch{}const k=m.closest(".site-main"),y=document.querySelector(".site-content"),q=new Set(String(c.exclude||"").split(",").map(i=>i.trim().toLowerCase()).filter(Boolean)),C=i=>!i.closest(".hero, .card, .accordion, .tabs, figure, #site-sidebar"),n=i=>(y?[...y.querySelectorAll(i)]:[]).filter(C).filter(l=>!q.has(l.textContent.trim().toLowerCase())),o=c.headings==="h2"?n("h2"):c.headings==="h3"?n("h3"):c.headings==="h2h3"?n("h2, h3"):n("h2").length?n("h2"):n("h3");if(!o.length){k?.classList.add("no-sidebar-items");return}const s=new Set([...document.querySelectorAll("[id]")].map(i=>i.id)),t=document.createElement("nav");t.className="dm-contents",t.setAttribute("aria-label",c.title||"Page contents"),c.hover&&(t.dataset.menuHover=c.hover),c.selected&&(t.dataset.menuActive=c.selected),c.accent&&t.style.setProperty("--dm-menu-highlight",c.accent.startsWith("#")?c.accent:`var(--dm-${c.accent})`),c.font&&(t.style.fontFamily=c.font),c.fontSize&&(t.style.fontSize=c.fontSize),c.fontWeight&&(t.style.fontWeight=c.fontWeight);const e=document.createElement("div");e.className="dm-contents-head";const a=document.createElement("p");a.className="dm-contents-title",a.textContent=c.title||"",e.appendChild(a),t.appendChild(e);const d=document.createElement("ol");d.className="dm-contents-list"+(c.numbered?" is-numbered":"");const p=[];for(const i of o){if(!i.id){const v=(i.textContent||"").toLowerCase().trim().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"section";let f=v;for(let b=2;s.has(f);b++)f=`${v}-${b}`;s.add(f),i.id=f}const l=document.createElement("li");l.className=`dm-contents-item dm-contents-${i.tagName.toLowerCase()}`;const g=document.createElement("a");g.href=`#${i.id}`,g.textContent=i.textContent.trim(),l.appendChild(g),d.appendChild(l),p.push([i,g])}if(t.appendChild(d),m.replaceChildren(t),c.scrollSpy!==!1&&"IntersectionObserver"in window){const i=new Map,l=()=>{const v=p.find(([f])=>i.get(f))||null;p.forEach(([,f])=>{const b=v&&f===v[1];f.classList.toggle("is-active",!!b),b?f.setAttribute("aria-current","location"):f.removeAttribute("aria-current")})},g=new IntersectionObserver(v=>{v.forEach(f=>i.set(f.target,f.isIntersecting)),l()},{rootMargin:"-80px 0px -60% 0px"});p.forEach(([v])=>g.observe(v))}if(k?.classList.contains("contents-collapsible")){const i=document.createElement("button");i.type="button",i.className="dm-contents-toggle";const l=()=>{const g=k.classList.contains("contents-collapsed");i.setAttribute("aria-expanded",String(!g)),i.setAttribute("aria-label",g?"Show the contents":"Hide the contents"),i.title=i.getAttribute("aria-label"),i.innerHTML=`<span data-icon="${g?"list":"x"}"></span>`,window.Domma?.icons&&Domma.icons.scan(i)};i.addEventListener("click",()=>{S.set("contents_collapsed",k.classList.toggle("contents-collapsed")),l()}),l(),e.insertBefore(i,e.firstChild)}if(k?.classList.contains("contents-floating")&&c.movable){t.classList.add("is-movable");const i=S.get("contents_position");i&&Number.isFinite(i.x)&&Object.assign(m.style,{left:`${i.x}px`,top:`${i.y}px`,right:"auto",bottom:"auto"}),e.addEventListener("pointerdown",l=>{if(l.target.closest("button"))return;const g=m.getBoundingClientRect(),v=l.clientX-g.left,f=l.clientY-g.top,b=u=>{const w=Math.max(0,Math.min(window.innerWidth-g.width,u.clientX-v)),M=Math.max(0,Math.min(window.innerHeight-40,u.clientY-f));Object.assign(m.style,{left:`${w}px`,top:`${M}px`,right:"auto",bottom:"auto"})},h=()=>{document.removeEventListener("pointermove",b),S.set("contents_position",{x:parseInt(m.style.left,10),y:parseInt(m.style.top,10)})};document.addEventListener("pointermove",b),document.addEventListener("pointerup",h,{once:!0})})}window.E&&typeof E.contextMenu=="function"&&E.contextMenu(m,{items:()=>{const i=k?.classList.contains("contents-collapsible"),l=k?.classList.contains("contents-collapsed"),g=p.find(([,v])=>v.classList.contains("is-active"));return[{header:"Contents"},...i?[{label:l?"Show the contents":"Collapse to a button",icon:l?"list":"minimize",action:()=>m.querySelector(".dm-contents-toggle")?.click()}]:[],{label:"Copy a link to this section",icon:"link",disabled:!g,action:async()=>{const v=`${location.origin}${location.pathname}#${g[0].id}`;try{await _.copyToClipboard(v),E.toast("Link copied.",{type:"success"})}catch{E.toast("Could not copy the link.",{type:"error"})}}},{label:"Back to the top",icon:"arrow-up",action:()=>window.scrollTo({top:0,behavior:"smooth"})}]}}),k?.classList.contains("contents-autohide")&&(m.addEventListener("pointerdown",i=>{i.pointerType!=="mouse"&&!m.classList.contains("is-revealed")&&(m.classList.add("is-revealed"),i.preventDefault())}),document.addEventListener("pointerdown",i=>{m.contains(i.target)||m.classList.remove("is-revealed")}))}
1
+ import{applyMobileMenu as ae,initCarouselPopup as ie}from"/public/js/mobile-ui.mjs?v=20261016-mobile-options";import{installSmoothCarets as re}from"/public/js/smooth-caret.js";import{decodeBase64Json as W}from"/public/js/utf8-base64.mjs";import{makeBadgeEl as U,applyColour as G,applyPill as ce,applyFloat as le,applyHighlight as V,applyItemHighlight as de,itemHighlightAttrs as me,isCurrentItem as K,menuAlign as ue,applyClasses as P,cssClasses as Y,applyEntrance as X}from"/public/js/menu-decor.mjs?v=20261014-menu-entrance";import{applyMenuLook as pe}from"/public/js/menu-cards.mjs?v=20261029-pill-floats";import{initPageMotion as fe}from"/public/js/page-motion.mjs?v=20261029-page-motion";import{applyFooterShowcase as he}from"/public/js/footer-showcase.mjs?v=20261029-footer-showcase";import{initFloatingMenus as ge}from"/public/js/menu-float.js?v=20260829-float-panel";import{enhancePickerFields as Q,markInvalidFields as Z,showValidationPopup as ee}from"/public/js/forms.js?v=20261025-forms-files-total";import{buildWizardSteps as ye}from"/public/js/form-steps.mjs";import{applyFormClasses as te,applySubmitButtons as ve,applyWizardButtons as be}from"/public/js/form-submit.mjs";import{captureFileFields as oe,destroyDropzones as we,fileBlueprint as Ce,restoreFileFields as Se,setFileLimits as xe,splitFiles as ke,submitBody as Le,totalTooLarge as $e,wireFileFields as Ee}from"/public/js/form-files.mjs";document.addEventListener("click",u=>{const i=u.target?.closest?.(".dm-banner__dismiss");i&&(u.preventDefault(),i.closest(".dm-banner")?.remove())}),$(()=>{re(document);const u=window.__CMS_NAV__||{},i=window.__CMS_SITE__||{};if(i.autoTheme?.enabled){let t=function(e){const n=(e||"07:00").split(":");return+n[0]*60+(+n[1]||0)},s=function(){const e=new Date,n=e.getHours()*60+e.getMinutes();return n>=t(l.dayStart)&&n<t(l.nightStart)?l.dayTheme:l.nightTheme},o=function(e){const n=l.apply&&l.apply[e]||{theme:e,custom:""};Domma.theme.set(n.theme);for(const m of[...document.body.classList])m.startsWith("dm-custom-")&&document.body.classList.remove(m);n.custom&&document.body.classList.add(n.custom)};const l=i.autoTheme;o(s()),setInterval(()=>o(s()),6e4)}const L=$("#site-navbar");if(L.length&&u.brand){let s=function(p,v=0){return Array.isArray(p)?p.filter(f=>!(f&&(f.type==="spacer"||f.type==="theme-switcher"))).filter(f=>!(f&&f.type==="separator"&&v===0)).map(f=>f&&f.type==="separator"?{divider:!0}:Array.isArray(f?.items)?{...f,items:s(f.items,v+1)}:f):p};const l={...u.brand},t=l.size&&l.size!=="md"?` navbar-brand-${l.size}`:"";if(l.logo||l.icon||l.tagline){let p="";l.logo?p+=`<img src="${l.logo}" class="navbar-brand-logo" alt="${l.text||""}">`:l.icon&&(p+=`<span data-icon="${l.icon}" style="width:1.1em;height:1.1em;margin-right:.35em;vertical-align:middle;"></span>`),l.text&&(p+=`<span class="navbar-brand-text${t}">${l.text}</span>`),l.tagline&&(p+=`<small class="navbar-brand-tagline">${l.tagline}</small>`),l.html=p}else t&&l.text&&(l.html=`<span class="navbar-brand-text${t}">${l.text}</span>`);const o=s(u.items||[]),e=u.position==="floating",n=u.orientation==="vertical";L.get(0).querySelector(":scope > .cms-nojs-links")?.remove(),Domma.elements.navbar("#site-navbar",{brand:l,items:o,variant:u.variant||"dark",position:e?"static":u.position||"sticky",collapsible:!0,appearOnHover:!!u.appearOnHover}),Domma.icons.scan("#site-navbar");const m=L.get(0);ae(m,u.mobile);const b=()=>{if(!n)return;const v=m.querySelector('a[aria-current="page"]')?.closest(".navbar-dropdown");v&&!v.classList.contains("open")&&v.querySelector(":scope > .navbar-dropdown-toggle")?.click()};m.classList.add(`dm-nav-align-${ue(u)||"centre"}`),n&&L.get(0).classList.add("dm-nav-vertical",u.side==="right"?"dm-nav-vertical-right":"dm-nav-vertical-left");const a=u.dock||{};n&&!e&&Ae(m,u.side==="right"),!n&&a.hideOnScroll&&Te(m),V(m,u),X(m,u),P(m,u.class),e&&(le(L.get(0),u),ge(L.get(0).parentNode||document));const c=m.querySelector(".navbar-toggle"),g=m.querySelector(".navbar-collapse");if(c&&g){let p=null;const v=()=>{g.classList.contains("show")&&c.click()},f=()=>{p&&(p.remove(),p=null),document.body.classList.remove("dm-drawer-open")},d=()=>{p||(p=document.createElement("div"),p.className="dm-navbar-backdrop",p.addEventListener("click",v),document.body.appendChild(p),document.body.classList.add("dm-drawer-open"))};c.addEventListener("click",()=>{requestAnimationFrame(()=>{g.classList.contains("show")?(b(),d()):f()})}),g.addEventListener("click",y=>{y.target.closest("a")&&requestAnimationFrame(f)}),document.addEventListener("keydown",y=>{y.key==="Escape"&&g.classList.contains("show")&&v()})}const w=m.querySelector(".navbar-nav");if(w){const p=Array.from(w.children);let v=0;for(const f of u.items||[])if(!(f&&f.type==="separator")){if(f&&f.type==="spacer"){const d=document.createElement("li"),y=["xs","sm","md","lg","xl","flex"].includes(f.size)?f.size:"md";d.className=`dm-menu-spacer dm-menu-spacer--${y}`,d.setAttribute("aria-hidden","true"),w.insertBefore(d,p[v]||null);continue}if(f&&f.type==="theme-switcher"){const d=document.createElement("li");d.className="dm-menu-theme-switcher";const y=document.createElement("span");y.dataset.themeSwitcher="menu",y.dataset.position="inline",d.appendChild(y),w.insertBefore(d,p[v]||null);continue}v++}window.CMSThemeSwitcher?.scan(w)}m.querySelectorAll("[data-path]").forEach(p=>{const v=p.dataset.path.split(".").map(Number),f=v.length>1,d=v.reduce((C,D)=>C?.items?.[D],{items:o});if(!d)return;d.colour&&G(p,d.colour),d.pill&&!f&&ce(p,d.pill),de(p,d),P(p.closest("li"),d.class);const y=U(d.badge);y&&p.appendChild(y),K(d.url,location.pathname)&&(p.classList.add("active"),p.setAttribute("aria-current","page"))}),pe(m,u,o),b()}const h=$("#site-footer");if(h.length){let e=function(r){return String(r??"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")},n=function(r){return e(r).replace(/'/g,"&#39;")},m=function(r){if(r&&r.type==="separator")return'<li class="footer-sep"><hr></li>';if(r&&r.type==="spacer")return`<li class="dm-menu-spacer dm-menu-spacer--${["xs","sm","md","lg","xl","flex"].includes(r.size)?r.size:"md"}" aria-hidden="true"></li>`;if(r&&r.type==="theme-switcher")return'<li class="dm-menu-theme-switcher"><span data-theme-switcher="menu" data-position="inline"></span></li>';const N=n(r.url||"#"),k=e(r.text||""),M=Array.isArray(r.items)&&r.items.length?`<ul>${r.items.map(m).join("")}</ul>`:"",j=me(r),ne=[j.hover&&` data-menu-item-hover="${n(j.hover)}"`,j.active&&` data-menu-item-active="${n(j.active)}"`].filter(Boolean).join(""),se=j.accent?` style="--dm-menu-highlight:${n(j.accent)}"`:"",J=Y(r.class).join(" ");return`<li${J?` class="${n(J)}"`:""}><a href="${N}"${ne}${se}>${k}</a>${M}</li>`},a=function(){if(!i.footer)return"";const r=Object.keys(t).filter(k=>l[k]);if(!r.length)return"";const N=Y(i.footer.socialClass).join(" ");return`<div class="footer-social">${r.map(k=>{const{label:M,svg:j}=t[k];return`<a href="${l[k]}" target="_blank" rel="noopener noreferrer" aria-label="${M}" class="footer-social-link${N?` ${n(N)}`:""}">${j}</a>`}).join("")}</div>`},p=function(r){if(!r||r.type==="separator"||r.type==="spacer")return"";if(r.type==="theme-switcher")return`<li class="cms-footer-col">${m(r).replace(/^<li[^>]*>|<\/li>$/g,"")}</li>`;const N=Array.isArray(r.items)&&r.items.length?`<ul>${r.items.map(m).join("")}</ul>`:"",k=w(r)?`<span class="cms-footer-col-title">${e(r.text||"")}</span>`:`<a class="cms-footer-col-title" href="${n(r.url||"#")}">${e(r.text||"")}</a>`,M=["cms-footer-col",...Y(r.class)].join(" ");return`<li class="${n(M)}">${k}${N}</li>`},d=function(r,N,k=!1){return(r||[]).forEach(M=>{M&&(M.type==="separator"||M.type==="spacer"||M.type==="theme-switcher")||(k&&w(M)||N.push(M),Array.isArray(M.items)&&M.items.length&&d(M.items,N))}),N};const l=i.social||{},t={twitter:{label:"X / Twitter",svg:'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-4.714-6.231-5.401 6.231H2.742l7.73-8.835L1.254 2.25H8.08l4.259 5.629L18.244 2.25zm-1.161 17.52h1.833L7.084 4.126H5.117z"/></svg>'},facebook:{label:"Facebook",svg:'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z"/></svg>'},instagram:{label:"Instagram",svg:'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zM12 0C8.741 0 8.333.014 7.053.072 2.695.272.273 2.69.073 7.052.014 8.333 0 8.741 0 12c0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98C8.333 23.986 8.741 24 12 24c3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98C15.668.014 15.259 0 12 0zm0 5.838a6.162 6.162 0 100 12.324 6.162 6.162 0 000-12.324zM12 16a4 4 0 110-8 4 4 0 010 8zm6.406-11.845a1.44 1.44 0 100 2.881 1.44 1.44 0 000-2.881z"/></svg>'},linkedin:{label:"LinkedIn",svg:'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 01-2.063-2.065 2.064 2.064 0 112.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg>'},github:{label:"GitHub",svg:'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg>'},youtube:{label:"YouTube",svg:'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M23.495 6.205a3.007 3.007 0 00-2.088-2.088c-1.87-.501-9.396-.501-9.396-.501s-7.507-.01-9.396.501A3.007 3.007 0 00.527 6.205a31.247 31.247 0 00-.522 5.805 31.247 31.247 0 00.522 5.783 3.007 3.007 0 002.088 2.088c1.868.502 9.396.502 9.396.502s7.506 0 9.396-.502a3.007 3.007 0 002.088-2.088 31.247 31.247 0 00.5-5.783 31.247 31.247 0 00-.5-5.805zM9.609 15.601V8.408l6.264 3.602z"/></svg>'}};let s='<div class="footer-inner container">';const o=window.__CMS_FOOTER__||{primary:[],legal:[],copyright:""},b=(()=>{const r=i.cookieConsent;if(!r||r.showSettingsLink===!1)return"";const N=k=>(k||[]).some(M=>M&&(M.url==="#cookie-settings"||N(M.items)));return N(o.primary)||N(o.legal)?"":`<li class="cms-cookie-settings"><a href="#cookie-settings">${e(r.settingsLinkText||"Cookie settings")}</a></li>`})(),c=["columns","row"].includes(i.footer?.layout)?i.footer.layout:"auto",g=i.footer?.look==="showcase"||c==="columns"||c==="auto"&&o.primary.some(r=>Array.isArray(r?.items)&&r.items.length),w=r=>g&&!r.url&&Array.isArray(r.items)&&r.items.length>0;if(g){const r=u.brand||{},N=r.text||i.title||"",k=r.logo?`<img src="${n(r.logo)}" class="cms-footer-brand-logo" alt="">`:r.icon?'<span class="cms-footer-brand-icon"></span>':"",M=String(i.footer?.blurb||"").trim();s='<div class="footer-inner footer-inner--columns container"><div class="cms-footer-top">',s+=`<div class="cms-footer-brand">${N||k?`<a class="cms-footer-brand-name" href="${n(r.url||"/")}">${k}<span>${e(N)}</span></a>`:""}${M?`<p class="cms-footer-blurb">${e(M)}</p>`:""}${a()}</div>`,o.primary.length&&(s+=`<nav class="footer-nav footer-nav--primary footer-nav--columns" aria-label="Footer"><ul>${o.primary.map(p).join("")}</ul></nav>`),s+='</div><div class="cms-footer-bottom">',o.copyright&&(s+=`<p class="cms-footer-copyright">${e(o.copyright)}</p>`),(o.legal.length||b)&&(s+=`<nav class="footer-nav footer-nav--legal" aria-label="Legal"><ul>${o.legal.map(m).join("")}${b}</ul></nav>`),s+="</div>"}else o.copyright&&(s+=`<p>${e(o.copyright)}</p>`),o.primary.length&&(s+=`<nav class="footer-nav footer-nav--primary"><ul>${o.primary.map(m).join("")}</ul></nav>`),(o.legal.length||b)&&(s+=`<nav class="footer-nav footer-nav--legal"><ul>${o.legal.map(m).join("")}${b}</ul></nav>`),s+=a();s+="</div>",h.get(0).querySelector(":scope > .cms-nojs-links")?.remove();const v=h.get(0).querySelector(":scope > .cms-footer-blocks");v?.remove(),h.html(s),v&&h.get(0).prepend(v),window.CMSThemeSwitcher?.scan(h.get(0));const f=h.get(0).querySelector(".cms-footer-brand-icon");f&&u.brand?.icon&&f.setAttribute("data-icon",u.brand.icon),P(h.get(0),i.footer?.class),g&&he(h.get(0),i);const y=[...d(o.primary,[],!0),...d(o.legal,[])];h.get(0).querySelectorAll(".footer-nav a").forEach((r,N)=>{const k=y[N];if(!k)return;k.colour&&G(r,k.colour);const M=U(k.badge);M&&r.appendChild(M),K(k.url,location.pathname)&&(r.classList.add("is-active"),r.setAttribute("aria-current","page"))}),V(h.get(0).querySelector(".footer-nav--primary"),{highlight:o.primaryHighlight}),V(h.get(0).querySelector(".footer-nav--legal"),{highlight:o.legalHighlight}),X(h.get(0).querySelector(".footer-nav--primary"),{entrance:o.primaryEntrance}),X(h.get(0).querySelector(".footer-nav--legal"),{entrance:o.legalEntrance}),P(h.get(0).querySelector(".footer-nav--primary"),o.primaryClass),P(h.get(0).querySelector(".footer-nav--legal"),o.legalClass);const D=i.footer?.showMotionToggle!==!1,z=S.get("reduced_motion"),B=i.footer?.motionDefault,O=z!=null?!!z:B==="on"?!0:B==="off"?!1:!!(window.matchMedia&&window.matchMedia("(prefers-reduced-motion: reduce)").matches),A=i.footer?.motionControl==="checkbox",I=h.get(0).querySelector(".cms-footer-bottom")||h.get(0).querySelector(".footer-inner");if(D&&I){const r=document.createElement("input");r.type="checkbox",r.className=A?"footer-motion-checkbox":"form-switch-input",r.id="dm-motion-switch",r.checked=O,r.addEventListener("change",function(){S.set("reduced_motion",this.checked),window.location.reload()});const N=document.createElement("span");N.className=A?"footer-motion-label":"form-switch-label",N.textContent="Reduce motion";const k=document.createElement("label");k.className=A?"footer-motion-check":"form-switch footer-motion-switch",k.title="Reduce motion",k.appendChild(r),k.appendChild(N),I.appendChild(k)}}const q=document.getElementById("site-sidebar");q&&_e(q),Domma.icons.scan(),Domma.syntax?.scan&&Domma.syntax.scan();const x=$(".page-body");if(x.length){x.find(".accordion").each(function(){Domma.elements.accordion(this,{allowMultiple:this.dataset.multi==="true"})}),x.find(".tabs").each(function(){Domma.elements.tabs(this)}),x.find(".carousel").each(function(){const t={primary:"--dm-primary",secondary:"--dm-secondary",accent:"--dm-primary",text:"--dm-text",surface:"--dm-surface",background:"--dm-background",success:"--dm-success",warning:"--dm-warning",danger:"--dm-danger",info:"--dm-info"},s=a=>{const c=String(a||"").trim();return c?t[c.toLowerCase()]?`var(${t[c.toLowerCase()]})`:CSS.supports("color",c)?c:"":""},o=s(this.dataset.background),e=s(this.dataset.arrowBackground),n=s(this.dataset.arrowColor);o&&(this.style.setProperty("--dm-carousel-background",o),this.classList.add("dm-carousel-custom-background")),e&&this.style.setProperty("--dm-carousel-arrow-background",e),n&&this.style.setProperty("--dm-carousel-arrow-color",n);const m=["top","middle","bottom"].includes(this.dataset.arrowPosition)?this.dataset.arrowPosition:"middle";this.classList.add(`dm-carousel-arrows-${m}`);const b={autoplay:this.dataset.autoplay==="true",interval:parseInt(this.dataset.interval,10)||5e3,loop:this.dataset.loop!=="false",animation:this.dataset.animation||"slide",heightMode:this.dataset.heightMode==="average"?"average":"crop"};if(this.dataset.height){const a=Number(this.dataset.height);Number.isFinite(a)&&a>0&&(b.height=a)}if(this.dataset.animationDuration){const a=parseInt(this.dataset.animationDuration,10);Number.isFinite(a)&&(b.animationDuration=a)}this.dataset.animationEasing&&(b.animationEasing=this.dataset.animationEasing),this.dataset.ctx&&(this._dmCtxSlides=Array.from(this.querySelectorAll(".carousel-slide")).map(a=>a.cloneNode(!0)),this._dmCarouselOpts=b),this._dmCarousel=Domma.elements.carousel(this,b),ie(this)}),x.find(".dm-countdown").each(function(){const t={autoStart:!0},s=String(this.dataset.format||"").trim(),o=String(this.dataset.to||"").trim(),e=/^(\d{4})-(\d{2})-(\d{2})$/.exec(o),n=e?new Date(+e[1],+e[2]-1,+e[3]).getTime():o?new Date(o).getTime():NaN;Number.isFinite(n)?t.duration=Math.max(0,n-Date.now()):this.dataset.duration&&(t.duration=(parseInt(this.dataset.duration,10)||0)*1e3);const m=/^dd:/i.test(s);t.format=m?"hh:mm:ss":s||(t.duration>=36e5?"hh:mm:ss":"mm:ss");const b=this,a=g=>String(g).padStart(2,"0"),c=g=>{const w=Math.max(0,Math.floor(g/1e3)),p=b.querySelector(".dm-timer-time");p&&(p.textContent=`${a(Math.floor(w/86400))}:${a(Math.floor(w%86400/3600))}:${a(Math.floor(w%3600/60))}:${a(w%60)}`)};m&&(t.onTick=c),Domma.elements.timer(this,t),m&&c(t.duration||0)}),x.find("[data-tooltip]:not(.dm-range-slider)").each(function(){Domma.elements.tooltip(this,{content:$(this).data("tooltip"),position:$(this).data("tooltip-position")||"top"})}),x.find(".dm-progression").each(function(){const t=Array.from(this.querySelectorAll(".dm-progression-item")).map(e=>{const n={title:e.querySelector(".dm-progression-item-title")?.textContent?.trim()||"",description:e.querySelector(".dm-progression-item-body")?.innerHTML?.trim()||""};return e.dataset.date&&(n.date=e.dataset.date),e.dataset.status&&(n.status=e.dataset.status),e.dataset.eventIcon&&(n.icon=e.dataset.eventIcon),e.dataset.entryId&&(n._entryId=e.dataset.entryId),n}),s=this.dataset.layout==="centred"?"centered":this.dataset.layout||"vertical",o=Domma.elements.progression(this,{layout:s,theme:this.dataset.theme||"minimal",mode:this.dataset.mode||"timeline",statusIcons:!0,allowHtml:!0,...t.length?{items:t}:{}});if((this.dataset.mode||"timeline")==="timeline"){const e={completed:{label:"Completed",icon:"check-circle",tone:"success"},planned:{label:"Planned",icon:"circle",tone:"secondary"},"in-progress":{label:"In progress",icon:"clock",tone:"primary"},blocked:{label:"Blocked",icon:"alert-circle",tone:"danger"}};this.querySelectorAll(".dm-progression-item").forEach((n,m)=>{const b=t[m];if(!b)return;const a=n.querySelector(".dm-progression-title");if(b.icon&&a){const g=document.createElement("span");g.dataset.icon=b.icon,g.style.cssText="display:inline-flex;vertical-align:middle;margin-right:.4em",g.setAttribute("aria-hidden","true"),a.prepend(g)}const c=e[b.status];if(c&&a){const g=document.createElement("span");g.className=`badge badge-${c.tone} cms-timeline-status`,g.style.cssText="display:inline-flex;align-items:center;gap:.35em;margin:.4rem 0";const w=document.createElement("span");w.dataset.icon=c.icon,w.dataset.iconSize="14",w.setAttribute("aria-hidden","true"),g.append(w,document.createTextNode(c.label)),a.after(g)}})}Domma.icons.scan(this),t.length&&(this._dmCtx={instance:o,items:t})});try{Domma.effects.reveal(".page-body .hero",{animation:"slide-up",duration:480,threshold:.06,stagger:60,once:!1})}catch{}const l=matchMedia("(prefers-reduced-motion: reduce)").matches||document.documentElement.classList.contains("dm-reduced-motion");document.querySelectorAll(".page-body .row[data-reveal]").forEach(t=>{const s=t.dataset.revealMode||"stagger",o=t.dataset.revealAnimation||"slide-up",e=parseInt(t.dataset.revealDuration,10)||(o.startsWith("swoosh")?700:400),n=parseInt(t.dataset.revealStagger,10)||(o.startsWith("swoosh")?90:60),m=parseInt(t.dataset.revealDelay,10)||0,b=t.dataset.revealDirection==="rtl",a=t.dataset.revealReplay==="true",c=Array.from(t.children);if(l&&o.startsWith("swoosh"))return;const g={"slide-up":"translateY(30px)","slide-down":"translateY(-30px)","slide-left":"translateX(30px)","slide-right":"translateX(-30px)",zoom:"scale(0.85)",flip:"perspective(600px) rotateX(15deg)",swoosh:"translateY(36px) scale(0.96)"},w=d=>o!=="swoosh-sides"?g[o]||"":c.length>1&&d===0?"translateX(-64px) rotate(-1.5deg)":c.length>1&&d===c.length-1?"translateX(64px) rotate(1.5deg)":"translateY(40px) scale(0.94)",p=o.startsWith("swoosh"),v=p?"cubic-bezier(.2,.8,.2,1)":"ease",f=(d,y)=>{d.style.opacity="0",d.style.transform=w(y),p&&(d.style.filter="blur(10px)")};c.forEach((d,y)=>{f(d,y),d.style.transition=`opacity ${e}ms ${v}, transform ${e}ms ${v}`+(p?`, filter ${e}ms ${v}`:"");const C=b?c.length-1-y:y;d.style.transitionDelay=s==="stagger"?`${m+C*n}ms`:`${m}ms`}),requestAnimationFrame(()=>requestAnimationFrame(()=>{const d=new IntersectionObserver(y=>{y.forEach(C=>{if(C.isIntersecting){if(C.target.offsetWidth,C.target.style.opacity="1",C.target.style.transform="",p&&(C.target.style.filter=""),!a){d.unobserve(C.target);const D=C.target;D.addEventListener("transitionend",function z(B){B.target!==D||B.propertyName!=="opacity"||(D.removeEventListener("transitionend",z),D.style.transition="",D.style.transitionDelay="")})}}else a&&C.boundingClientRect.top>0&&f(C.target,c.indexOf(C.target))})},{threshold:.1});c.forEach(y=>d.observe(y))}))}),fe(document.querySelector(".page-body")||document),x.find(".card[data-collapsible]").each(function(){const t=this.querySelector(".card-header");t&&t.addEventListener("click",()=>this.classList.toggle("is-collapsed"))}),x.find(".dm-so-trigger").each(function(){this.addEventListener("click",()=>{const t=this.dataset.soTarget,s=document.getElementById(t);if(!s)return;const o=E.slideover({title:s.dataset.soTitle||"",size:s.dataset.soSize||"md",position:s.dataset.soPosition||"right"});s.style.display="",o.setContent(s),o.open()})})}if(typeof $.setup=="function"){const l=Object.assign({},window.__CMS_DCONFIG__||{});if(document.querySelectorAll(".dm-page-config[data-config]").forEach(t=>{try{const s=W(t.dataset.config);Object.assign(l,s)}catch{}}),Object.keys(l).length>0){const t={};for(const[s,o]of Object.entries(l)){const e=o?.events?.click,{confirm:n,toast:m,alert:b,prompt:a,...c}=e||{};if(n||m||b||a){$(s).on("click",async function(N){if(N.preventDefault(),n&&!await E.confirm(n))return;let k=null;if(!(a&&(k=await E.prompt(a,{inputPlaceholder:c.promptPlaceholder||"",inputValue:c.promptDefault||""}),k===null))){{const M=$(c.target||this);c.toggleClass&&M.toggleClass(c.toggleClass),c.addClass&&M.addClass(c.addClass),c.removeClass&&M.removeClass(c.removeClass),k!==null&&(c.setText&&M.text(k),c.setVal&&M.val(k),c.setAttr&&M.attr(c.setAttr,k))}c.href&&(window.location.href=c.href),m&&E.toast(m,{type:c.toastType||"success"}),b&&E.alert(b)}});const{target:w,toggleClass:p,addClass:v,removeClass:f,setText:d,setVal:y,setAttr:C,href:D,toastType:z,promptPlaceholder:B,promptDefault:O,...A}=c,I={...o.events};Object.keys(A).length?I.click=w?{target:w,...A}:A:delete I.click;const r={...o,events:I};Object.keys(I).length||delete r.events,Object.keys(r).length&&(t[s]=r)}else t[s]=o}$.setup(t)}}x.length&&R(x.get(0))}),window.wireCTAButtons=R;function R(u){u.querySelectorAll(".dm-cta-trigger").forEach(i=>{i.__ctaWired||(i.__ctaWired=!0,i.addEventListener("click",async()=>{const L=i.dataset.action,h=i.dataset.entry,q=i.dataset.confirm;let x=S.get("auth_token");if(!x){E.toast("Please log in to perform this action.",{type:"warning"});return}if(q&&!await E.confirm(q))return;const l=Array.from(i.childNodes).map(s=>s.cloneNode(!0));i.disabled=!0,i.textContent="Running\u2026";const t=s=>fetch(`/api/actions/${L}/public`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${s}`},body:JSON.stringify(i.dataset.scope?{entryId:h,scope:i.dataset.scope}:{entryId:h})});try{let s=await t(x);if(s.status===401){const e=S.get("auth_refresh_token");if(e){const n=await fetch("/api/auth/refresh",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({refreshToken:e})});if(n.ok){const{token:m}=await n.json();S.set("auth_token",m),x=m,s=await t(x)}}}const o=await s.json().catch(()=>({}));if(!s.ok||o.success===!1)throw new Error(o.error||o.message||`Error ${s.status}`);E.toast(o.message||"Action completed.",{type:"success"})}catch(s){E.toast(s.message||"Action failed.",{type:"error"})}finally{i.disabled=!1,i.textContent="",l.forEach(s=>i.appendChild(s)),Domma.icons.scan(i)}}))})}(function(){const i=document.querySelectorAll('.dm-collection-hydrate[data-collection-scope="mine"]');if(!i.length)return;const L=S.get("auth_token");function h(x,l){const t=document.createElement("div");t.className="dm-collection-display dm-collection-empty";const s=document.createElement("p");if(l){s.appendChild(document.createTextNode("Please "));const o=document.createElement("a");o.href="/login",o.textContent="sign in",s.appendChild(o),s.appendChild(document.createTextNode(" to view your entries."))}else s.textContent=x;return t.appendChild(s),t}function q(x,l){const t=document.createElement("template");t.innerHTML=l||"",x.replaceWith(t.content)}i.forEach(async x=>{const l=x.dataset.collectionAttrs;if(!l)return;if(!L){x.replaceChildren(h("",!0));return}const t=s=>fetch("/api/collections/render-scope",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${s}`},body:JSON.stringify({attrs:l})});try{let s=L,o=await t(s);if(o.status===401){const n=S.get("auth_refresh_token");if(n){const m=await fetch("/api/auth/refresh",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({refreshToken:n})});if(m.ok){const{token:b}=await m.json();S.set("auth_token",b),s=b,o=await t(s)}}}if(!o.ok){const{error:n}=await o.json().catch(()=>({}));x.replaceChildren(h(n||"Unable to load entries.",!1));return}const{html:e}=await o.json();q(x,e),window.DommaCollectionBrowser?.hydrate&&window.DommaCollectionBrowser.hydrate(document)}catch{x.replaceChildren(h("Unable to load entries.",!1))}}),setTimeout(()=>{typeof Domma<"u"&&Domma.icons?.scan&&Domma.icons.scan(),typeof Domma<"u"&&Domma.syntax?.scan&&Domma.syntax.scan(),R(document.body)},100)})(),(function(){const i=document.querySelectorAll("[data-collection-table]");!i.length||typeof T>"u"||!T.create||i.forEach(L=>{let h;try{h=W(L.dataset.payload)}catch{return}const{columns:q,rows:x,search:l,sortable:t,exportable:s,pageSize:o,empty:e,ctaConfig:n,slug:m,exportCfg:b}=h;if(!q?.length)return;if(n){const g=q.findIndex(w=>w.key==="_cta");g!==-1&&(q[g]={key:"_cta",title:"",render:(w,p)=>{const v=document.createElement("button");if(v.className=`btn btn-${n.style||"primary"} dm-cta-trigger`,v.dataset.action=n.action||"",n.scope&&(v.dataset.scope=n.scope),v.dataset.entry=p._entryId||"",n.confirm&&(v.dataset.confirm=n.confirm),n.icon){const f=document.createElement("span");f.dataset.icon=n.icon,v.appendChild(f),v.appendChild(document.createTextNode(" "))}return v.appendChild(document.createTextNode(n.label||"Run")),v}})}const a="col-table-"+Math.random().toString(36).slice(2,7),c=document.createElement("div");c.id=a,L.replaceChildren(c),T.create("#"+a,{data:x,columns:q,search:l,sortable:t,exportable:s,pageSize:o,emptyMessage:e}),n&&R(c),L._dmTable={columns:q,rows:x,slug:m,exportCfg:b,render(g){T.create("#"+a,{data:g,columns:q,search:l,sortable:t,exportable:s,pageSize:o,emptyMessage:e}),n&&R(c)}}})})(),(function(){const i=document.querySelectorAll("[data-form-inline]");if(!i.length||typeof F>"u")return;function L(t){const s=t&&t.logic;return!!(s&&(s.visibility||s.requirement))}function h(t,s){const o={};return(t||[]).forEach(e=>{if(e.type==="page-break"||e.type==="spacer"||!e.name)return;const n=e.type==="chooser"||!!(e.variant&&["select","radio","checkbox-group"].includes(e.type)),m=e.type==="checkbox"?"boolean":e.type==="date"||e.type==="icon"||e.type==="image"?"string":n?"chooser":e.type,b={...e.formConfig||{}};b.span==="full"&&s&&(b.span=s);const a={type:m,required:L(e)?!1:e.required,label:e.label,options:e.options,formConfig:{...e.placeholder&&{placeholder:e.placeholder},...e.helper&&{hint:e.helper},...e.tooltip&&{tooltip:e.tooltip},...b}};e.minLength!==void 0&&(a.minLength=e.minLength),e.maxLength!==void 0&&(a.maxLength=e.maxLength),e.min!==void 0&&(a.min=e.min),e.max!==void 0&&(a.max=e.max),n&&(e.variant&&(a.variant=e.variant),(e.multiple||e.type==="checkbox-group")&&(a.multiple=!0),e.density&&(a.density=e.density),e.columns&&(a.columns=e.columns),e.accent&&(a.accent=e.accent),e.accentStyle&&(a.accentStyle=e.accentStyle),e.glow&&(a.glow=!0),e.glowColour&&(a.glowColour=e.glowColour),e.shadow&&(a.shadow=e.shadow),e.shadowColour&&(a.shadowColour=e.shadowColour)),o[e.name]=e.type==="file"?Ce(e,a):a}),o}function q(t){const s={};return(t||[]).forEach(o=>{if(!(!o.name||o.type==="page-break"||o.type==="spacer")&&(o.type==="select"||o.type==="multiselect")&&o.required){const e=(o.options||[])[0];e&&(s[o.name]=typeof e=="object"?e.value:e)}}),s}function x(t,s){(s||[]).forEach(o=>{if(o.type!=="date"||!o.name)return;const e=t.querySelector(`[name="${o.name}"]`);e&&e.type!=="date"&&(e.type="date")})}function l(t,s,o){let e=t.querySelector(".cms-form-message");e||(e=document.createElement("p"),e.className="cms-form-message",t.appendChild(e)),e.textContent=s,e.style.cssText=o?"color:var(--dm-danger);margin-top:.75rem;":"color:var(--dm-success);margin-top:.75rem;"}i.forEach(t=>{let s;try{s=W(t.dataset.formInline)}catch{return}t.querySelector(":scope > .cms-form-embed-summary")?.remove();const o=s.fields||[],e=s.settings||{},n=Number(e.columns)===3?3:2,m=e.layout||"grid",b=o.some(f=>f.type==="page-break"),a=new Map;xe(t,s.fileLimits,a),Ee(t,o);const c=async f=>{if(t.dataset.triggerBlocked==="true"){const d=t._formLogicRuntime,y=d&&d.submitBlock?d.submitBlock().reasons:[];l(t,y.join(" ")||"This form cannot be submitted yet.",!0);const C=new Error("Blocked by a form trigger");throw C.formSubmitFailed=!0,C}try{const d=t.querySelector(".fb-form-honeypot"),y=d?.querySelector('input[type="text"]')||null,C=d?.querySelector('[name="_t"]')||null,D=Object.assign({},f);delete D._t,d?.dataset.hpName&&delete D[d.dataset.hpName],y!==null&&(D._hp=y.value),C!==null&&(D._t=C.value);const z=new Map(a);oe(t,z);const B=ke(D,o,z),O=$e(t,B.files);if(O){l(t,O,!0);const I=new Error(O);throw I.formSubmitFailed=!0,I}const A=await H.post(`/api/forms/submit/${s.slug}`,B.files.size?Le(B.values,B.files).body:B.values);if(A&&A.error){l(t,A.error,!0);const I=new Error(A.error);throw I.formSubmitFailed=!0,I}if(A?.redirect){window.location.href=A.redirect;return}for(we(t);t.firstChild;)t.removeChild(t.firstChild);l(t,A?.message||e.successMessage||"Thank you for your submission.",!1)}catch(d){throw d.formSubmitFailed||l(t,d.message||"Submission failed. Please try again.",!0),d}},g=Date.now();function w(f){const d=f.querySelector("form");if(!d||d.querySelector(".fb-form-honeypot"))return;const y=document.createElement("div");y.className="fb-form-honeypot",y.setAttribute("aria-hidden","true");const C=document.createElement("input");C.name=d.querySelector('[name="website"]')?"_website":"website",y.dataset.hpName=C.name,C.type="text",C.tabIndex=-1,C.autocomplete="url",C.placeholder="https://",y.appendChild(C);const D=document.createElement("input");D.name="_t",D.type="hidden",D.value=g,y.appendChild(D),d.appendChild(y)}function p(f){if(!window.FormLogicEngine||!o.some(y=>y.logic||Array.isArray(y.triggers)&&y.triggers.length))return null;const d=new window.FormLogicEngine.FormLogicRuntime(s,t,f?{baseValues:f}:void 0);if(d.init(),t._formLogicRuntime=d,t._formLogicObserved)return d;if(t._formLogicObserved=!0,t.parentNode&&typeof MutationObserver<"u"){const y=new MutationObserver(function(C){for(const D of C)for(const z of D.removedNodes)if(z===t||z.nodeType===1&&z.contains&&z.contains(t)){t._formLogicRuntime&&t._formLogicRuntime.destroy(),y.disconnect();return}});y.observe(t.parentNode,{childList:!0,subtree:!1}),t._formLogicObserver=y}return d}let v=!1;if(t.addEventListener("dm-form-end",f=>{const d=f.detail?.validation;if(d&&!d.valid){Z(t,d.missing),ee(d);return}v||(v=!0,c(f.detail?.values||{}).catch(()=>{}).finally(()=>{v=!1}))}),b&&F.wizard){const f=ye(o,s.title),d=f.map(A=>({title:A.title,description:A.description,fields:h(A.fields,n)})),y=f.map(A=>A.fields);let C=0,D=null,z=null;const B=A=>{const I=window.FormLogicEngine;if(!I||!I.validateFields)return;const r=I.validateFields(t,y[C]||[]);r.valid||(A.preventDefault(),A.stopImmediatePropagation(),Z(t,r.missing),ee(r))},O=()=>{const A=y[C]||o;be(t,e),te(t,e,A),x(t,A),Q(t,A),Se(t,a),e.honeypot!==!1&&w(t),D&&D.destroy(),D=p(z?.getStepData?z.getStepData():void 0),t.querySelectorAll(".wizard-next, .wizard-submit").forEach(I=>I.addEventListener("click",B,!0))};z=F.wizard(t,{schema:{steps:d},layout:m,columns:n,finishText:e.submitText||"Finish",onSubmit:c,onStepChange:A=>{oe(t,a),C=A,setTimeout(O,0)}}),t.addEventListener("dm-form-trigger",A=>{if(A.detail?.type!=="goto-step"||!z?.goToStep)return;const I=Number(A.detail.action.step);!Number.isFinite(I)||I<0||I>=d.length||I!==C&&z.goToStep(I)}),Promise.resolve(z).then(O)}else if(F.render){const f=F.render(t,h(o,n),q(o),{submitText:e.submitText||"Submit",layout:m,columns:n,onSubmit:c});Promise.resolve(f).then(function(){ve(t,e,m),te(t,e,o),x(t,o),Q(t,o),e.honeypot!==!1&&w(t),p()})}})})();function Ae(u,i){const L=document.body,h=L.classList,q=new Set((L.dataset.railSite||"").split(" ").filter(Boolean)),x=()=>window.matchMedia("(min-width: 993px)").matches;u.querySelectorAll(".navbar-link, .navbar-dropdown-toggle").forEach(n=>{const m=n.textContent.trim();m&&(n.setAttribute("title",m),n.querySelector("svg, [data-icon]")||(n.dataset.initial=m.charAt(0).toUpperCase()))});const l=document.createElement("button");l.type="button",l.className="dm-nav-collapse-toggle";const t=()=>{const n=h.contains("dm-vnav-collapsed");l.setAttribute("aria-pressed",String(n)),l.setAttribute("aria-label",n?"Expand menu":"Collapse menu"),l.title=l.getAttribute("aria-label");const m=i?"chevrons-left":"chevrons-right",b=i?"chevrons-right":"chevrons-left";l.innerHTML=`<span data-icon="${n?m:b}"></span>`,window.Domma&&Domma.icons&&Domma.icons.scan(l)},s=n=>{h.toggle("dm-vnav-collapsed",n),S.set("nav_collapsed",n),t()};l.addEventListener("click",()=>s(!h.contains("dm-vnav-collapsed"))),t();const o=u.querySelector(".navbar-container")||u;o.insertBefore(l,o.firstChild?.nextSibling||null);const e=n=>{h.toggle("dm-vnav-autohide",n),h.toggle("dm-vnav-collapsible",!n&&q.has("collapsible")),n?h.remove("dm-vnav-collapsed"):q.has("collapsible")&&S.get("nav_collapsed")===!0&&h.add("dm-vnav-collapsed"),u.classList.remove("dm-nav-revealed"),t()};u.addEventListener("pointerdown",n=>{h.contains("dm-vnav-autohide")&&n.pointerType!=="mouse"&&!u.classList.contains("dm-nav-revealed")&&(u.classList.add("dm-nav-revealed"),n.preventDefault())}),document.addEventListener("pointerdown",n=>{u.contains(n.target)||u.classList.remove("dm-nav-revealed")}),window.E&&typeof E.contextMenu=="function"&&E.contextMenu(u,{items:()=>{const n=h.contains("dm-vnav-autohide"),m=h.contains("dm-vnav-collapsed"),b=S.has("nav_autohide")||S.has("nav_collapsed");return[{header:"Menu"},{label:m?"Expand menu":"Collapse to icons",icon:m?"maximize":"minimize",disabled:!x()||n||!q.has("collapsible"),action:()=>s(!m)},{label:n?"Keep on screen":"Hide when not in use",icon:n?"eye":"eye-off",disabled:!x(),action:()=>{S.set("nav_autohide",!n),e(!n)}},{type:"divider"},{label:"Reset to the site's setting",icon:"refresh",disabled:!b,action:()=>{S.remove("nav_autohide"),S.remove("nav_collapsed"),e(q.has("autohide")),h.toggle("dm-vnav-collapsed",!q.has("autohide")&&q.has("start-collapsed")),t()}}]}})}function Te(u){u.classList.add("dm-nav-scroll-hide");let i=window.scrollY,L=!1;window.addEventListener("scroll",()=>{L||(L=!0,requestAnimationFrame(()=>{L=!1;const h=window.scrollY,q=u.matches(":focus-within")||u.querySelector(".navbar-dropdown.open, .navbar-collapse.show");h>i&&h>u.offsetHeight&&!q?u.classList.add("dm-nav-scrolled-away"):h<i&&u.classList.remove("dm-nav-scrolled-away"),i=h}))},{passive:!0})}function _e(u){let i={};try{i=JSON.parse(u.dataset.contents||"{}")}catch{}const L=u.closest(".site-main"),h=document.querySelector(".site-content"),q=new Set(String(i.exclude||"").split(",").map(a=>a.trim().toLowerCase()).filter(Boolean)),x=a=>!a.closest(".hero, .card, .accordion, .tabs, figure, #site-sidebar"),l=a=>(h?[...h.querySelectorAll(a)]:[]).filter(x).filter(c=>!q.has(c.textContent.trim().toLowerCase())),t=i.headings==="h2"?l("h2"):i.headings==="h3"?l("h3"):i.headings==="h2h3"?l("h2, h3"):l("h2").length?l("h2"):l("h3");if(!t.length){L?.classList.add("no-sidebar-items");return}const s=new Set([...document.querySelectorAll("[id]")].map(a=>a.id)),o=document.createElement("nav");o.className="dm-contents",o.setAttribute("aria-label",i.title||"Page contents"),i.hover&&(o.dataset.menuHover=i.hover),i.selected&&(o.dataset.menuActive=i.selected),i.accent&&o.style.setProperty("--dm-menu-highlight",i.accent.startsWith("#")?i.accent:`var(--dm-${i.accent})`),i.font&&(o.style.fontFamily=i.font),i.fontSize&&(o.style.fontSize=i.fontSize),i.fontWeight&&(o.style.fontWeight=i.fontWeight);const e=document.createElement("div");e.className="dm-contents-head";const n=document.createElement("p");n.className="dm-contents-title",n.textContent=i.title||"",e.appendChild(n),o.appendChild(e);const m=document.createElement("ol");m.className="dm-contents-list"+(i.numbered?" is-numbered":"");const b=[];for(const a of t){if(!a.id){const w=(a.textContent||"").toLowerCase().trim().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"section";let p=w;for(let v=2;s.has(p);v++)p=`${w}-${v}`;s.add(p),a.id=p}const c=document.createElement("li");c.className=`dm-contents-item dm-contents-${a.tagName.toLowerCase()}`;const g=document.createElement("a");g.href=`#${a.id}`,g.textContent=a.textContent.trim(),c.appendChild(g),m.appendChild(c),b.push([a,g])}if(o.appendChild(m),u.replaceChildren(o),i.scrollSpy!==!1&&"IntersectionObserver"in window){const a=new Map,c=()=>{const w=b.find(([p])=>a.get(p))||null;b.forEach(([,p])=>{const v=w&&p===w[1];p.classList.toggle("is-active",!!v),v?p.setAttribute("aria-current","location"):p.removeAttribute("aria-current")})},g=new IntersectionObserver(w=>{w.forEach(p=>a.set(p.target,p.isIntersecting)),c()},{rootMargin:"-80px 0px -60% 0px"});b.forEach(([w])=>g.observe(w))}if(L?.classList.contains("contents-collapsible")){const a=document.createElement("button");a.type="button",a.className="dm-contents-toggle";const c=()=>{const g=L.classList.contains("contents-collapsed");a.setAttribute("aria-expanded",String(!g)),a.setAttribute("aria-label",g?"Show the contents":"Hide the contents"),a.title=a.getAttribute("aria-label"),a.innerHTML=`<span data-icon="${g?"list":"x"}"></span>`,window.Domma?.icons&&Domma.icons.scan(a)};a.addEventListener("click",()=>{S.set("contents_collapsed",L.classList.toggle("contents-collapsed")),c()}),c(),e.insertBefore(a,e.firstChild)}if(L?.classList.contains("contents-floating")&&i.movable){o.classList.add("is-movable");const a=S.get("contents_position");a&&Number.isFinite(a.x)&&Object.assign(u.style,{left:`${a.x}px`,top:`${a.y}px`,right:"auto",bottom:"auto"}),e.addEventListener("pointerdown",c=>{if(c.target.closest("button"))return;const g=u.getBoundingClientRect(),w=c.clientX-g.left,p=c.clientY-g.top,v=d=>{const y=Math.max(0,Math.min(window.innerWidth-g.width,d.clientX-w)),C=Math.max(0,Math.min(window.innerHeight-40,d.clientY-p));Object.assign(u.style,{left:`${y}px`,top:`${C}px`,right:"auto",bottom:"auto"})},f=()=>{document.removeEventListener("pointermove",v),S.set("contents_position",{x:parseInt(u.style.left,10),y:parseInt(u.style.top,10)})};document.addEventListener("pointermove",v),document.addEventListener("pointerup",f,{once:!0})})}window.E&&typeof E.contextMenu=="function"&&E.contextMenu(u,{items:()=>{const a=L?.classList.contains("contents-collapsible"),c=L?.classList.contains("contents-collapsed"),g=b.find(([,w])=>w.classList.contains("is-active"));return[{header:"Contents"},...a?[{label:c?"Show the contents":"Collapse to a button",icon:c?"list":"minimize",action:()=>u.querySelector(".dm-contents-toggle")?.click()}]:[],{label:"Copy a link to this section",icon:"link",disabled:!g,action:async()=>{const w=`${location.origin}${location.pathname}#${g[0].id}`;try{await _.copyToClipboard(w),E.toast("Link copied.",{type:"success"})}catch{E.toast("Could not copy the link.",{type:"error"})}}},{label:"Back to the top",icon:"arrow-up",action:()=>window.scrollTo({top:0,behavior:"smooth"})}]}}),L?.classList.contains("contents-autohide")&&(u.addEventListener("pointerdown",a=>{a.pointerType!=="mouse"&&!u.classList.contains("is-revealed")&&(u.classList.add("is-revealed"),a.preventDefault())}),document.addEventListener("pointerdown",a=>{u.contains(a.target)||u.classList.remove("is-revealed")}))}
@@ -1 +1 @@
1
- export const SIZE_MAP={xs:".75rem",sm:".875rem",base:"1rem",lg:"1.125rem",xl:"1.25rem","2xl":"1.5rem","3xl":"1.875rem","4xl":"2.25rem"},WEIGHT_MAP={thin:"100",light:"300",normal:"400",medium:"500",semibold:"600",bold:"700",extrabold:"800",black:"900"},SPACING_MAP={tight:"-0.05em",normal:"0em",wide:"0.05em",wider:"0.1em"},COLOUR_TOKENS={primary:"var(--dm-color-primary)",secondary:"var(--dm-color-secondary)",muted:"var(--dm-text-muted)",danger:"var(--dm-color-danger)",success:"var(--dm-color-success)",warning:"var(--dm-color-warning)",info:"var(--dm-color-info)"},FONT_MAP={Georgia:"Georgia,serif",Arial:"Arial,sans-serif",Verdana:"Verdana,sans-serif","Courier New":"'Courier New',monospace","Times New Roman":"'Times New Roman',serif","Trebuchet MS":"'Trebuchet MS',sans-serif",Roboto:"'Roboto',sans-serif",Inter:"'Inter',sans-serif","Open Sans":"'Open Sans',sans-serif",Lato:"'Lato',sans-serif",Nunito:"'Nunito',sans-serif",Poppins:"'Poppins',sans-serif","Source Sans 3":"'Source Sans 3',sans-serif",Montserrat:"'Montserrat',sans-serif",Raleway:"'Raleway',sans-serif","DM Sans":"'DM Sans',sans-serif","Work Sans":"'Work Sans',sans-serif",Merriweather:"'Merriweather',serif","Playfair Display":"'Playfair Display',serif",Lora:"'Lora',serif","Roboto Slab":"'Roboto Slab',serif",Lexend:"'Lexend',sans-serif","Atkinson Hyperlegible":"'Atkinson Hyperlegible',sans-serif",Andika:"'Andika',sans-serif"},CMS_WEB_FONTS=Object.freeze(["Roboto","Inter","Open Sans","Lato","Nunito","Poppins","Source Sans 3","Montserrat","Raleway","DM Sans","Work Sans","Merriweather","Playfair Display","Lora","Roboto Slab","Lexend","Atkinson Hyperlegible","Andika"]),TRANSFORM_MAP={upper:"uppercase",lower:"lowercase",capitalize:"capitalize",none:"none"},DECORATION_MAP={underline:"underline","line-through":"line-through",none:"none"};function r(e){return e!=null&&e!==!1&&e!=="false"&&e!=="0"}function o(e){return String(e).replace(/["<>]/g,"").trim()}export function buildTextStyle(e={}){const n=[];if(e.size&&n.push(`font-size:${SIZE_MAP[e.size]||o(e.size)}`),e["point-size"]){const s=parseFloat(e["point-size"]);!isNaN(s)&&s>0&&n.push(`font-size:${s}pt`)}r(e.bold)?n.push("font-weight:700"):e.weight&&WEIGHT_MAP[e.weight]&&n.push(`font-weight:${WEIGHT_MAP[e.weight]}`),r(e.italic)&&n.push("font-style:italic");const i=e.colour||e.color;return i&&n.push(`color:${COLOUR_TOKENS[i]||o(i)}`),e.font&&FONT_MAP[e.font]&&n.push(`font-family:${FONT_MAP[e.font]}`),e.transform&&TRANSFORM_MAP[e.transform]&&n.push(`text-transform:${TRANSFORM_MAP[e.transform]}`),e.decoration&&DECORATION_MAP[e.decoration]&&n.push(`text-decoration:${DECORATION_MAP[e.decoration]}`),e.spacing&&n.push(`letter-spacing:${SPACING_MAP[e.spacing]||o(e.spacing)}`),e.align&&(n.push("display:block"),n.push(`text-align:${o(e.align)}`)),e.style&&n.push(o(e.style).replace(/;+$/,"")),n.join(";")}
1
+ export const SIZE_MAP={xs:".75rem",sm:".875rem",base:"1rem",lg:"1.125rem",xl:"1.25rem","2xl":"1.5rem","3xl":"1.875rem","4xl":"2.25rem"},WEIGHT_MAP={thin:"100",light:"300",normal:"400",medium:"500",semibold:"600",bold:"700",extrabold:"800",black:"900"},SPACING_MAP={tight:"-0.05em",normal:"0em",wide:"0.05em",wider:"0.1em"},COLOUR_TOKENS={primary:"var(--dm-color-primary)",secondary:"var(--dm-color-secondary)",muted:"var(--dm-text-muted)",danger:"var(--dm-color-danger)",success:"var(--dm-color-success)",warning:"var(--dm-color-warning)",info:"var(--dm-color-info)"},FONT_MAP={Georgia:"Georgia,serif",Arial:"Arial,sans-serif",Verdana:"Verdana,sans-serif","Courier New":"'Courier New',monospace","Times New Roman":"'Times New Roman',serif","Trebuchet MS":"'Trebuchet MS',sans-serif",Roboto:"'Roboto',sans-serif",Inter:"'Inter',sans-serif","Open Sans":"'Open Sans',sans-serif",Lato:"'Lato',sans-serif",Nunito:"'Nunito',sans-serif",Poppins:"'Poppins',sans-serif","Source Sans 3":"'Source Sans 3',sans-serif",Montserrat:"'Montserrat',sans-serif",Raleway:"'Raleway',sans-serif","DM Sans":"'DM Sans',sans-serif","Work Sans":"'Work Sans',sans-serif",Merriweather:"'Merriweather',serif","Playfair Display":"'Playfair Display',serif",Lora:"'Lora',serif","Roboto Slab":"'Roboto Slab',serif",Lexend:"'Lexend',sans-serif","Atkinson Hyperlegible":"'Atkinson Hyperlegible',sans-serif",Andika:"'Andika',sans-serif"},CMS_WEB_FONTS=Object.freeze(["Roboto","Inter","Open Sans","Lato","Nunito","Poppins","Source Sans 3","Montserrat","Raleway","DM Sans","Work Sans","Merriweather","Playfair Display","Lora","Roboto Slab","Lexend","Atkinson Hyperlegible","Andika"]),TRANSFORM_MAP={upper:"uppercase",lower:"lowercase",capitalize:"capitalize",none:"none"},DECORATION_MAP={underline:"underline","line-through":"line-through",none:"none"};function a(e){return e!=null&&e!==!1&&e!=="false"&&e!=="0"}function r(e){return String(e).replace(/["<>]/g,"").trim()}export function buildTextStyle(e={}){const n=[];if(e.size&&n.push(`font-size:${SIZE_MAP[e.size]||r(e.size)}`),e["point-size"]){const o=parseFloat(e["point-size"]);!isNaN(o)&&o>0&&n.push(`font-size:${o}pt`)}a(e.bold)?n.push("font-weight:700"):e.weight&&WEIGHT_MAP[e.weight]&&n.push(`font-weight:${WEIGHT_MAP[e.weight]}`),a(e.italic)&&n.push("font-style:italic");const i=e.colour||e.color;return i&&n.push(`color:${COLOUR_TOKENS[i]||r(i)}`),e.font&&FONT_MAP[e.font]&&n.push(`font-family:${FONT_MAP[e.font]}`),e.transform&&TRANSFORM_MAP[e.transform]&&n.push(`text-transform:${TRANSFORM_MAP[e.transform]}`),e.decoration&&DECORATION_MAP[e.decoration]&&n.push(`text-decoration:${DECORATION_MAP[e.decoration]}`),e.spacing&&n.push(`letter-spacing:${SPACING_MAP[e.spacing]||r(e.spacing)}`),e.align&&(n.push("display:block"),n.push(`text-align:${r(e.align)}`)),e.style&&n.push(r(e.style).replace(/;+$/,"")),n.join(";")}export const TEXT_GRADIENTS={brand:["var(--dm-primary)","color-mix(in oklab, var(--dm-primary) 45%, #a855f7)"],sunset:["#f26b3a","#8b5cf6"],ocean:["#06b6d4","#3b82f6"],forest:["#10b981","#84cc16"],fire:["#f59e0b","#ef4444"],candy:["#ec4899","#8b5cf6"]},TEXT_SHINES=["hover","sweep"];const l=/^#[0-9a-f]{6}$/i;export function buildTextMotion(e={}){const n=[],i=[],o=e.gradient;if(o!=null&&o!==!1&&o!=="false"){let s=TEXT_GRADIENTS[o===!0||o===""||o==="true"?"brand":o];if(!s){const t=String(o).split(",").map(f=>f.trim());t.length===2&&t.every(f=>l.test(f))&&(s=t)}s&&(n.push("dm-tg"),i.push(`--dm-tg-a:${s[0]}`,`--dm-tg-b:${s[1]}`),TEXT_SHINES.includes(e.shine)&&n.push(`dm-tg--${e.shine}`))}return a(e["light-up"])&&n.push("dm-tm-ink"),a(e.words)&&n.push("dm-tm-words"),{classes:n,style:i.join(";")}}
@@ -19,7 +19,7 @@ import {contentsOverrideFromAttrs} from './pageContents.js';
19
19
  import {buildMenuNav} from './menuRender.js';
20
20
  import {checkVisibility} from '../middleware/auth.js';
21
21
  import {getRoleHierarchy, getRoleLevel} from './roles.js';
22
- import {buildTextStyle} from '../../public/js/text-style.mjs';
22
+ import {buildTextStyle, buildTextMotion} from '../../public/js/text-style.mjs';
23
23
  import {buildScribeStyle} from '../../public/js/scribe-style.mjs';
24
24
  import {CHARACTERS, resolveCharacterSize} from '../../public/js/celebrations/character-catalog.mjs';
25
25
  import {publicButtonSettings} from '../../public/js/form-submit.mjs';
@@ -2348,7 +2348,10 @@ function processGridBlocks(markdown) {
2348
2348
  const revealStagger = attrs['reveal-stagger'] ? ` data-reveal-stagger="${escapeAttr(attrs['reveal-stagger'])}"` : '';
2349
2349
  const revealDelay = attrs['reveal-delay'] ? ` data-reveal-delay="${escapeAttr(attrs['reveal-delay'])}"` : '';
2350
2350
  const revealDirection = attrs['reveal-direction'] ? ` data-reveal-direction="${escapeAttr(attrs['reveal-direction'])}"` : '';
2351
- return `<div class="${classes.join(' ')}"${id}${reveal}${revealMode}${revealAnimation}${revealDuration}${revealStagger}${revealDelay}${revealDirection}>${inner}</div>\n`;
2351
+ // Swoosh in again each time the row comes back up into view; cards that lean toward the pointer.
2352
+ const revealReplay = isTruthyAttr(attrs['reveal-replay']) ? ' data-reveal-replay="true"' : '';
2353
+ const tilt = isTruthyAttr(attrs.tilt) ? ' data-tilt="true"' : '';
2354
+ return `<div class="${classes.join(' ')}"${id}${reveal}${revealMode}${revealAnimation}${revealDuration}${revealStagger}${revealDelay}${revealDirection}${revealReplay}${tilt}>${inner}</div>\n`;
2352
2355
  }
2353
2356
  );
2354
2357
 
@@ -3690,19 +3693,27 @@ function processTextBlocks(markdown) {
3690
3693
  const attrs = parseShortcodeAttrs(attrStr || '');
3691
3694
  // The attribute → CSS mapping is shared with the admin editor's live
3692
3695
  // preview (public/js/text-style.mjs), so the two cannot disagree.
3693
- const style = buildTextStyle(attrs);
3696
+ // Gradient, shine, light-up and word-by-word (text-motion.mjs moves them).
3697
+ const motion = buildTextMotion(attrs);
3698
+ const style = [buildTextStyle(attrs), motion.style].filter(Boolean).join(';');
3694
3699
  const styleAttr = style ? ` style="${style}"` : '';
3695
- const classAttr = attrs.class ? ` class="${escapeAttr(attrs.class)}"` : '';
3700
+ const classes = [...motion.classes, ...(attrs.class ? [attrs.class] : [])].join(' ');
3701
+ const classAttr = classes ? ` class="${escapeAttr(classes)}"` : '';
3696
3702
  const idAttr = attrs.id ? ` id="${escapeAttr(attrs.id)}"` : '';
3697
3703
 
3698
3704
  return `<span${styleAttr}${classAttr}${idAttr}>${inner.trim()}</span>`;
3699
3705
  }
3700
3706
 
3701
- // Note: [\s\S]*? allows multi-line body content (deliberate divergence from badge's [^\n]*?)
3702
- const result = scrubbed.replace(
3703
- /\[text([^\]]*)\]([\s\S]*?)\[\/text\]/gi,
3704
- (_, attrStr, body) => buildText(attrStr, body)
3705
- );
3707
+ // Note: [\s\S]*? allows multi-line body content (deliberate divergence from badge's [^\n]*?).
3708
+ // Innermost first, round again until none is left, so a [text] can sit inside another -
3709
+ // a gradient phrase inside a headline that rises word by word.
3710
+ const INNERMOST = /\[text(\s[^\]]*)?\]((?:(?!\[text[\s\]])[\s\S])*?)\[\/text\]/gi;
3711
+ let result = scrubbed;
3712
+ for (let pass = 0; pass < 8; pass++) {
3713
+ const next = result.replace(INNERMOST, (_, attrStr, body) => buildText(attrStr, body));
3714
+ if (next === result) break;
3715
+ result = next;
3716
+ }
3706
3717
 
3707
3718
  return restore(result);
3708
3719
  }
@@ -3985,8 +3996,8 @@ function processSpacerBlocks(markdown) {
3985
3996
  * Any Behaviour setting of the menu, as attributes (see NAVBAR_OVERRIDE_ATTRS in
3986
3997
  * menus.js): position, orientation, side, align, variant, hover-open, hover,
3987
3998
  * selected, accent, class, font, font-size, font-weight, letter-spacing,
3988
- * icon-size, width, collapsible, collapsed, autohide, hide-on-scroll and the
3989
- * float-* panel options. `true` / `false` switch a setting on or off; an empty
3999
+ * icon-size, width, collapsible, collapsed, autohide, hide-on-scroll, bar, dropdown,
4000
+ * tiles, morph and the float-* panel options. `true` / `false` switch a setting on or off; an empty
3990
4001
  * value clears it. Leaves a hidden marker the renderer reads (the first tag on
3991
4002
  * a page counts) - it draws nothing itself.
3992
4003
  *
@@ -22,6 +22,9 @@ import {
22
22
  PRESET_COLOUR_VARS, PRESET_COLOUR_FALLBACKS, colourToCss, cssClassProblems
23
23
  } from '../../public/js/menu-decor.mjs';
24
24
  import {fileIn} from './safePath.js';
25
+ import {normaliseLook, lookProblems, itemLookProblems} from '../../public/js/menu-look.mjs';
26
+
27
+ export {normaliseLook};
25
28
 
26
29
  /**
27
30
  * Bust the response-cache tags that menu changes affect. Public pages are
@@ -312,6 +315,9 @@ export const NAVBAR_OVERRIDE_ATTRS = {
312
315
  'width': ['dock', 'width', 'num'], 'collapsible': ['dock', 'collapsible', 'bool'],
313
316
  'collapsed': ['dock', 'collapsed', 'bool'], 'autohide': ['dock', 'autohide', 'bool'],
314
317
  'hide-on-scroll': ['dock', 'hideOnScroll', 'bool'],
318
+ 'bar': ['look', 'bar'], 'dropdown': ['look', 'dropdown'], 'tiles': ['look', 'tiles'],
319
+ 'brand': ['look', 'brand'], 'strip': ['look', 'strip'],
320
+ 'morph': ['look', 'morph', 'bool'],
315
321
  'float-anchor': ['float', 'anchor'], 'float-x': ['float', 'offsetX', 'num'], 'float-y': ['float', 'offsetY', 'num'],
316
322
  'float-width': ['float', 'width', 'num'], 'float-radius': ['float', 'radius', 'num'],
317
323
  'float-shadow': ['float', 'shadow'], 'float-accent': ['float', 'accent'], 'float-opacity': ['float', 'opacity', 'num'],
@@ -367,6 +373,10 @@ export function applyMenuOverride(menu, override) {
367
373
  const dock = normaliseDock(next.dock);
368
374
  if (dock) next.dock = dock; else delete next.dock;
369
375
  }
376
+ if (next.look) {
377
+ const look = normaliseLook(next.look);
378
+ if (look) next.look = look; else delete next.look;
379
+ }
370
380
  return next;
371
381
  }
372
382
 
@@ -620,6 +630,7 @@ export async function createMenu(input) {
620
630
  ...(input.style != null && {style: input.style}),
621
631
  ...(normaliseDock(input.dock) && {dock: normaliseDock(input.dock)}),
622
632
  ...(normaliseMobile(input.mobile) && {mobile: normaliseMobile(input.mobile)}),
633
+ ...(normaliseLook(input.look) && {look: normaliseLook(input.look)}),
623
634
  ...(binding != null && {binding}),
624
635
  items: Array.isArray(input.items) ? input.items : [],
625
636
  meta: {
@@ -669,6 +680,7 @@ export async function updateMenu(slug, input) {
669
680
  ...(input.style != null && {style: input.style}),
670
681
  ...(normaliseDock(input.dock) && {dock: normaliseDock(input.dock)}),
671
682
  ...(normaliseMobile(input.mobile) && {mobile: normaliseMobile(input.mobile)}),
683
+ ...(normaliseLook(input.look) && {look: normaliseLook(input.look)}),
672
684
  ...(binding != null && {binding}),
673
685
  items: Array.isArray(input.items) ? input.items : [],
674
686
  meta: {
@@ -886,6 +898,8 @@ export function validateMenu(menu) {
886
898
  }
887
899
  }
888
900
  }
901
+ // Bar shape and dropdown style - see public/js/menu-look.mjs.
902
+ errors.push(...lookProblems(menu.look));
889
903
  if (menu.highlight != null) {
890
904
  if (typeof menu.highlight !== 'object' || Array.isArray(menu.highlight)) {
891
905
  errors.push('highlight must be an object');
@@ -996,6 +1010,8 @@ export function validateMenu(menu) {
996
1010
  if (item.colour != null && !isValidColour(item.colour)) {
997
1011
  errors.push(`Item ${path}: colour must be a preset key or #rrggbb`);
998
1012
  }
1013
+ // Card dropdown fields (description, tile, chip, panel) - menu-look.mjs.
1014
+ for (const p of itemLookProblems(item, isValidColour)) errors.push(`Item ${path}: ${p}`);
999
1015
  for (const p of cssClassProblems(item.class)) errors.push(`Item ${path}: class: ${p}`);
1000
1016
  // Per-item highlight override. Same shape and same value sets as
1001
1017
  // the menu-level `highlight` block validated above - an item that
@@ -390,6 +390,8 @@ export async function renderPage(page, opts = {}) {
390
390
  // wires it; width and autohide also shape the body below, from the first paint.
391
391
  ...(navMenu.dock && {dock: navMenu.dock}),
392
392
  ...(navMenu.mobile && {mobile: navMenu.mobile}),
393
+ // Bar shape and card dropdowns - drawn by menu-cards.mjs in the browser.
394
+ ...(navMenu.look && {look: navMenu.look}),
393
395
  // Item highlighting: the navbar is built in the browser, so the
394
396
  // config has to travel to site.js rather than being rendered here.
395
397
  ...(navMenu.highlight && {highlight: navMenu.highlight}),
@@ -1205,6 +1207,8 @@ export async function renderBlogPage(templatePath, data = {}, seoMeta = {}) {
1205
1207
  // wires it; width and autohide also shape the body below, from the first paint.
1206
1208
  ...(navMenu.dock && {dock: navMenu.dock}),
1207
1209
  ...(navMenu.mobile && {mobile: navMenu.mobile}),
1210
+ // Bar shape and card dropdowns - drawn by menu-cards.mjs in the browser.
1211
+ ...(navMenu.look && {look: navMenu.look}),
1208
1212
  // Item highlighting: the navbar is built in the browser, so the
1209
1213
  // config has to travel to site.js rather than being rendered here.
1210
1214
  ...(navMenu.highlight && {highlight: navMenu.highlight}),
@@ -30,6 +30,9 @@
30
30
  <!-- Menu item hover / current-page effects. Loaded after site.css so a
31
31
  menu's own highlight wins over the blanket link styling there. -->
32
32
  <link rel="stylesheet" href="/public/css/menu-highlight.css?v=20261024-menu-highlight-fix">
33
+ <link rel="stylesheet" href="/public/css/menu-cards.css?v=20261029-brand-pill">
34
+ <link rel="stylesheet" href="/public/css/footer-showcase.css?v=20261029-footer-showcase">
35
+ <link rel="stylesheet" href="/public/css/page-motion.css?v=20261029-page-motion">
33
36
 
34
37
  <!-- Font overrides -->
35
38
  {{fontStyleTag}}
@@ -185,7 +188,7 @@
185
188
  <script src="/public/js/form-logic-engine.js?v=20261025-dropzone-disable" defer></script>
186
189
 
187
190
  <!-- Site initialisation -->
188
- <script src="/public/js/site.js?v=20261025-dconfig-click2" type="module"></script>
191
+ <script src="/public/js/site.js?v=20261029-pill-floats" type="module"></script>
189
192
  <script src="/public/js/collection-context.js?v=20261010-utf8-payloads" type="module"></script>
190
193
  {{ctxMenusModule}}
191
194