maverick-wave 5.26.0 → 5.28.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.
Files changed (35) hide show
  1. package/.claude/skills/mw-maverick-wave/SKILL.md +9 -1
  2. package/.claude/skills/mw-maverick-wave/references/components.md +13 -6
  3. package/.claude/skills/mw-maverick-wave/references/layout.md +2 -2
  4. package/.claude/skills/mw-maverick-wave/references/theming.md +2 -1
  5. package/CHANGELOG.md +13 -0
  6. package/README.md +2 -2
  7. package/maverick-wave.min.css +7 -7
  8. package/maverick-wave.min.js +1 -1
  9. package/package.json +2 -2
  10. package/scripts/verify.js +10 -1
  11. package/src/js/main.js +8 -8
  12. package/src/partials/tiles-container.html +38 -38
  13. package/src/scss/abstracts/_variables.scss +6 -0
  14. package/src/scss/base/_base.scss +17 -7
  15. package/src/scss/base/_reset.scss +7 -1
  16. package/src/scss/components/_announcement.scss +1 -3
  17. package/src/scss/components/_blog-post.scss +5 -4
  18. package/src/scss/components/_cards.scss +2 -2
  19. package/src/scss/components/_contact.scss +5 -3
  20. package/src/scss/components/_hero-badge.scss +48 -0
  21. package/src/scss/components/_index.scss +2 -0
  22. package/src/scss/components/_leader-row.scss +24 -18
  23. package/src/scss/components/_localhost-indicator.scss +2 -2
  24. package/src/scss/components/_panels.scss +18 -52
  25. package/src/scss/components/_tabs.scss +2 -2
  26. package/src/scss/components/_tiles.scss +43 -49
  27. package/src/scss/components/_tooltip.scss +193 -0
  28. package/src/scss/layout/_footer.scss +46 -84
  29. package/src/scss/layout/_grid.scss +67 -42
  30. package/src/scss/layout/_header-reveal.scss +1 -1
  31. package/src/scss/layout/_header.scss +49 -77
  32. package/src/scss/layout/_home.scss +7 -4
  33. package/src/scss/layout/_main.scss +100 -337
  34. package/src/scss/layout/_parallax.scss +1 -1
  35. package/src/scss/layout/_section.scss +37 -21
@@ -1 +1 @@
1
- !function(){"use strict";function e(e,t){e&&(e.classList.toggle("mw-active",t),t||e.classList.remove("active"))}function t(e){return!!e&&(e.classList.contains("mw-active")||e.classList.contains("active"))}const n=new WeakSet;function a(e){return!(!e||n.has(e))&&(n.add(e),!0)}let r=!1;function o(){r||(r=!0,function(){const t=document.querySelector(".mw-theme-toggle");if(!t)return;const n=document.documentElement,a=t.querySelector(".mw-theme-toggle-slider i"),r=getComputedStyle(document.documentElement).getPropertyValue("--mw-internal-theme-mode").trim()||"switchable";if("switchable"!==r)return console.log(`Theme mode fixed to: ${r}. Disabling toggle.`),a&&(a.className="light"===r?"fas fa-sun":"fas fa-moon"),e(t,"light"===r),t.style.opacity="0.4",t.style.pointerEvents="none",t.style.cursor="default",t.setAttribute("aria-disabled","true"),localStorage.removeItem("mw-theme"),void n.classList.remove("mw-theme-light","mw-theme-dark");const o=window.matchMedia("(prefers-color-scheme: light)"),c=window.CSS&&CSS.supports("color","light-dark(#000, #fff)"),s=()=>c&&o.matches,i=localStorage.getItem("mw-theme");let d=i?"light"===i:s();const u=r=>{n.classList.add("mw-theme-switching"),n.classList.toggle("mw-theme-light",r),n.classList.toggle("mw-theme-dark",!r),n.offsetHeight,n.classList.remove("mw-theme-switching"),e(t,r),a&&(a.className=r?"fas fa-sun":"fas fa-moon")};u(d),o.addEventListener("change",()=>{localStorage.getItem("mw-theme")||(d=s(),u(d),l())}),t.addEventListener("click",()=>{d=!d,u(d),localStorage.setItem("mw-theme",d?"light":"dark"),l()})}(),l(),function(){const e=document.querySelector(".mw-menu-btn"),t=document.querySelector(".mw-navbar");if(!e||!t)return;const n="BUTTON"===e.tagName;function a(a){e.classList.toggle("open",a),t.classList.toggle("open",a),document.body.classList.toggle("mw-nav-open",a),n&&e.setAttribute("aria-expanded",String(a))}function r(e){e.preventDefault(),e.stopPropagation(),a(!t.classList.contains("open"))}e.addEventListener("click",r),document.addEventListener("click",function(n){t.classList.contains("open")&&(t.contains(n.target)||e.contains(n.target)||a(!1))}),document.addEventListener("keydown",function(n){"Escape"===n.key&&t.classList.contains("open")&&(a(!1),e.focus())})}(),function(){const e=document.querySelector(".mw-header-reveal");if(!e)return;if(CSS.supports("animation-timeline","scroll()"))return;if(window.matchMedia("(prefers-reduced-motion: reduce)").matches)return;const t=document.querySelector(".mw-announcement:not(.mw-announcement-static)"),n=270;let a=null;const r=()=>{const r=window.scrollY<n;r!==a&&(a=r,e.classList.toggle("mw-header-away",r),t&&t.classList.toggle("mw-announcement-away",r))};r(),requestAnimationFrame(()=>{e.classList.add("mw-header-driven"),t&&t.classList.add("mw-announcement-driven")}),window.addEventListener("scroll",r,{passive:!0})}(),function(){if(CSS.supports("animation-timeline","view()"))return;if(window.matchMedia("(prefers-reduced-motion: reduce)").matches)return;const e=document.querySelectorAll(".mw-parallax-media");if(!e.length)return;const t=[...e].map(e=>(e.classList.add("mw-parallax-driven"),{el:e,pinned:Boolean(e.closest(".mw-parallax-sticky"))})),n=e=>Math.min(1,Math.max(0,e)),a=(e,t)=>{if(e.pinned)return n(window.scrollY/t);const a=e.el.getBoundingClientRect();return n((t-a.top)/(t+a.height))};let r=!1;const o=()=>{r=!1;const e=document.documentElement.clientHeight,n=t.map(t=>a(t,e));t.forEach((e,t)=>e.el.style.setProperty("--mw-parallax-progress",n[t]))},c=()=>{r||(r=!0,requestAnimationFrame(o))};o(),window.addEventListener("scroll",c,{passive:!0}),window.addEventListener("resize",c,{passive:!0})}(),function(){function e(e){const t=e.style.position,n="sticky"===getComputedStyle(e).position;n&&(e.style.position="static");const a=e.getBoundingClientRect().top+window.scrollY;return n&&(e.style.position=t),a}function t(e){const t=window.scrollY,n=e-t;if(!n)return;const a=Math.min(2e3,600+.5*Math.abs(n)),r={};d=r;let o=null;function c(e){if(d!==r)return;null===o&&(o=e);const s=Math.min(1,(e-o)/a),l=s<.5?4*s*s*s:1-Math.pow(-2*s+2,3)/2;window.scrollTo({top:t+n*l,behavior:"instant"}),s<1?requestAnimationFrame(c):d=null}requestAnimationFrame(c)}document.querySelectorAll('a[href^="#"]').forEach(n=>{n.addEventListener("click",function(n){const a=this.getAttribute("href");if("#"===a)return;const r=document.querySelector(a);if(!r)return;const o=document.querySelector(".mw-menu-btn"),c=document.querySelector(".mw-navbar");o&&c&&(o.classList.remove("open"),c.classList.remove("open"),document.body.classList.remove("mw-nav-open"),"BUTTON"===o.tagName&&o.setAttribute("aria-expanded","false")),n.preventDefault();const s=Math.max(0,e(r)-i());r.hasAttribute("tabindex")||r.setAttribute("tabindex","-1"),r.focus({preventScroll:!0}),window.matchMedia("(prefers-reduced-motion: reduce)").matches?window.scrollTo({top:s,behavior:"instant"}):t(s),history.replaceState(null,"",a)})})}(),function(){const t=document.querySelectorAll("section[id]"),n=document.querySelectorAll(".mw-navbar-link");if(0===t.length||0===n.length)return;window.addEventListener("scroll",function(e,t){let n;return function(){const a=this,r=arguments;clearTimeout(n),n=setTimeout(()=>e.apply(a,r),t)}}(function(){let a="";const r=i()+2;t.forEach(e=>{const t=e.offsetTop-r,n=e.clientHeight;scrollY>=t&&scrollY<t+n&&(a=e.getAttribute("id"))}),n.forEach(t=>{e(t,!1);const n=t.getAttribute("href");if(n){const r=n.indexOf("#");if(-1!==r){n.substring(r+1)===a&&e(t,!0)}}})},100),{passive:!0})}(),document.addEventListener("click",e=>{const t=e.target.closest(".mw-modal-close");if(t){const e=t.closest("dialog.mw-modal");if(e)return void e.close();const n=t.closest(".mw-modal-overlay");return void(n&&n.classList.remove("mw-modal-open"))}const n=e.target.closest("[data-mw-modal]");var a;n?g(document.getElementById(n.dataset.mwModal)):e.target.matches("dialog.mw-modal[open]")&&(!("closedBy"in(a=e.target))||null===a.getAttribute("closedby"))&&e.target.close()}),function(){function e(e){document.querySelectorAll(".mw-dropdown[open]").forEach(t=>{t!==e&&t.removeAttribute("open")})}document.addEventListener("click",function(t){const n=t.target.closest(".mw-dropdown");e(n),n&&t.target.closest(".mw-dropdown-item")&&n.removeAttribute("open")}),document.addEventListener("keydown",function(e){if("Escape"!==e.key)return;const t=document.querySelector(".mw-dropdown[open]");if(!t)return;t.removeAttribute("open");const n=t.querySelector("summary");n&&n.focus()})}(),document.addEventListener("click",e=>{const t=e.target.closest(".mw-tags-remove");if(!t)return;const n=t.closest(".mw-tags-item");n&&n.remove()}),document.addEventListener("click",e=>{const t=e.target.closest("[data-mw-copy]");if(!t||!navigator.clipboard)return;const n=t.getAttribute("data-mw-copy"),a=t.closest(".mw-input-group")?.querySelector("input"),r=n||a?.value;r&&navigator.clipboard.writeText(r).then(()=>{t.dispatchEvent(new CustomEvent("mwCopied",{bubbles:!0,detail:{text:r}}))})}),function(){const e=document.querySelector(".mw-localhost-indicator-activated"),t=document.querySelector(".mw-header");if(e&&h()){const e=document.createElement("div");e.className="mw-localhost-indicator-pulse",t.prepend(e)}}(),function(){if(!h())return;const e=document.querySelector('meta[name="viewport"]'),t=e&&e.getAttribute("content")||"";if(/viewport-fit\s*=\s*cover/.test(t))return;console.warn('MaverickWave: <meta name="viewport"> is missing viewport-fit=cover. env(safe-area-inset-*) resolves to 0 without it, so notched phones lose the gutter, the nav panel and the modal padding that expect it.')}())}function c(n){const r=n||document;!function(e){e.querySelectorAll(".mw-gallery").forEach(e=>{if(!a(e))return;const t=e.closest(".mw-gallery-container")||e.parentElement;t&&function(e,t){const n=t.querySelector(".mw-gallery-track");if(!n||!n.children.length)return;const a=n.children,r=e.querySelector(".mw-gallery-dots"),o=e.querySelector(".mw-gallery-desc"),c=t.querySelector(".mw-gallery-navi-prev"),s=t.querySelector(".mw-gallery-navi-next");let l=0;function i(e){const t=a.length;l=(e+t)%t,n.style.transform=`translateX(-${100*l}%)`,r&&r.querySelectorAll(".mw-gallery-dot").forEach((e,t)=>{e.classList.toggle("mw-active",t===l)}),o&&(o.textContent=a[l].dataset.desc||"")}if(r)for(let e=0;e<a.length;e++){const t=document.createElement("button");t.type="button",t.className="mw-gallery-dot"+(0===e?" mw-active":""),t.setAttribute("aria-label","Go to slide "+(e+1)),t.addEventListener("click",()=>i(e)),r.appendChild(t)}c&&c.addEventListener("click",()=>i(l-1));s&&s.addEventListener("click",()=>i(l+1));let d=0,u=0,m=!1;n.addEventListener("touchstart",e=>{m=1===e.touches.length,m&&(d=e.touches[0].clientX,u=e.touches[0].clientY)},{passive:!0}),n.addEventListener("touchcancel",()=>m=!1),n.addEventListener("touchend",e=>{if(!m)return;m=!1;const t=e.changedTouches[0].clientX-d,n=e.changedTouches[0].clientY-u;Math.abs(t)<50||Math.abs(t)<=Math.abs(n)||i(l+(t<0?1:-1))},{passive:!0}),i(0)}(t,e)})}(r),function(n){const r=n.querySelectorAll(".mw-accordion-header");r.forEach(n=>{if(!a(n))return;const r="BUTTON"===n.tagName;r&&n.setAttribute("aria-expanded",String(t(n))),n.addEventListener("click",function(){const n=!t(this);e(this,n),e(this.nextElementSibling,n),r&&this.setAttribute("aria-expanded",String(n))})})}(r),function(e){const t=Array.from(e.querySelectorAll(".mw-progress-fill")).filter(a);if(!t.length)return;const n=CSS.supports("animation-timeline","view()"),r=e=>e.dataset.value?e.dataset.value+"%":e.style.width,o=[];if(t.forEach(e=>{const t=r(e);t&&(e.style.setProperty("--mw-progress-value",t),n?e.classList.add("mw-progress-driven"):o.push(e))}),n)return;const c=new IntersectionObserver((e,t)=>{e.forEach(e=>{e.isIntersecting&&(e.target.style.width=r(e.target),t.unobserve(e.target))})},{root:null,threshold:.2});o.forEach(e=>c.observe(e))}(r),function(e){if(CSS.supports("animation-timeline","view()"))return;if(window.matchMedia("(prefers-reduced-motion: reduce)").matches)return;const t=Array.from(e.querySelectorAll(".mw-reveal, .mw-reveal-stagger > *")).filter(a);if(!t.length)return;const n=e=>{const t=e.parentElement;if(!t||!t.classList.contains("mw-reveal-stagger"))return 0;const n=getComputedStyle(t).gridTemplateColumns.split(" ").length;return[...t.children].indexOf(e)%n*90},r=new IntersectionObserver((e,t)=>{e.forEach(e=>{e.isIntersecting&&(t.unobserve(e.target),e.target.style.animationDelay=n(e.target)+"ms",e.target.classList.replace("mw-reveal-hidden","mw-reveal-run"))})},{threshold:.15});t.forEach(e=>{e.getBoundingClientRect().top<window.innerHeight||(e.classList.add("mw-reveal-hidden"),r.observe(e))})}(r),function(e){e.querySelectorAll(".mw-tabs-nav").forEach(e=>{if(!a(e))return;const t=Array.from(e.querySelectorAll(".mw-tabs-nav-item"));if(!t.length)return;const n=!!e.closest(".mw-tabs-vertical");e.setAttribute("role","tablist"),n&&e.setAttribute("aria-orientation","vertical"),t.forEach((e,a)=>{const r=m(e);e.setAttribute("role","tab"),e.id||(e.id=(r?r.id:"mw-tab-"+a)+"-tab"),r&&(e.setAttribute("aria-controls",r.id),r.setAttribute("role","tabpanel"),r.setAttribute("aria-labelledby",e.id)),w(e),e.addEventListener("click",()=>f(t,e)),e.addEventListener("keydown",e=>{const r=function(e,t,n,a){const r=t?"ArrowUp":"ArrowLeft",o=t?"ArrowDown":"ArrowRight";return e.key===r?(a-1+n)%n:e.key===o?(a+1)%n:"Home"===e.key?0:"End"===e.key?n-1:null}(e,n,t.length,a);null!==r&&(e.preventDefault(),f(t,t[r]),t[r].focus())})}),u(e);const r=new ResizeObserver(()=>u(e));r.observe(e),t.forEach(e=>r.observe(e))})}(r),function(e){const t=e.querySelectorAll(".mw-alert-close");t.forEach(e=>{a(e)&&e.addEventListener("click",function(){const e=this.closest(".mw-alert");e&&(e.classList.add("mw-alert-closing"),setTimeout(()=>{e.classList.add("mw-alert-closed")},300))})})}(r),function(e){e.querySelectorAll(".mw-slider-container").forEach(e=>{if(!a(e))return;const t=e.querySelector(".mw-slider"),n=e.querySelector(".mw-slider-value");if(!t||!n)return;const r=()=>{const e=Number(t.value),a=Number(t.max)||100,r=Math.round(e/a*100);t.style.setProperty("--value",r+"%"),n.classList.contains("mw-slider-numeric")?n.setAttribute("data-value",e):n.setAttribute("data-value",r)};t.addEventListener("input",r),r()})}(r),function(t){const n=t.querySelectorAll(".mw-image-slider");n.forEach(t=>{if(!a(t))return;const n=t.querySelectorAll(".mw-image-slider-overlay-image"),r=t.querySelectorAll("button[data-index]");if(!n.length||!r.length)return;let o=0;function c(){n.forEach(t=>{e(t,parseInt(t.dataset.index)===o)}),r.forEach(t=>{e(t,parseInt(t.dataset.index)===o)})}function s(e){o=e,c()}r.forEach(e=>{e.addEventListener("click",()=>{s(parseInt(e.dataset.index))})}),c()})}(r),function(e){const t=e.querySelectorAll(".mw-item-list-checkbox, .mw-item-list-checkbox-scroll");t.forEach(e=>{if(!a(e))return;e.querySelectorAll("li").forEach(e=>{const t=e.querySelector('input[type="checkbox"]'),n=e.querySelector(".mw-checkbox");t&&n&&(t.checked&&e.classList.add("mw-selected"),e.addEventListener("click",function(e){e.target!==t&&e.target.closest(".mw-checkbox")!==n&&s(this)}),t.addEventListener("change",function(){const e=this.closest("li");this.checked?e.classList.add("mw-selected"):e.classList.remove("mw-selected"),e.dispatchEvent(new CustomEvent("checkboxToggle",{detail:{checked:this.checked,item:e}}))}),n.addEventListener("click",function(e){setTimeout(()=>{const e=this.closest("li");this.querySelector('input[type="checkbox"]').checked?e.classList.add("mw-selected"):e.classList.remove("mw-selected")},0)}))})})}(r),function(e){e.querySelectorAll(".mw-kanban").forEach(e=>{a(e)&&function(e){const t=Array.from(e.querySelectorAll(".mw-kanban-column")),n=e.querySelector(".mw-kanban-composer"),a=e.querySelector(".mw-kanban-card-template"),r=e.dataset.kanbanPrefix||"MW",o=n.querySelector(".mw-kanban-composer-title"),c=n.querySelector(".mw-kanban-composer-text"),s=n.querySelector(".mw-kanban-composer-priority"),l=n.querySelector(".mw-kanban-composer-assignee");let i=null;function d(){t.forEach(function(e,n){const a=e.querySelectorAll(".mw-kanban-card"),r=e.querySelector(".mw-kanban-count");r&&(r.textContent=a.length),e.querySelectorAll("[data-kanban-move]").forEach(function(e){const a=n+parseInt(e.dataset.kanbanMove,10);e.disabled=a<0||a>=t.length})})}function u(){const t=Array.from(e.querySelectorAll(".mw-kanban-card-id")).map(function(e){return parseInt(e.textContent.split("-").pop(),10)||0});return r+"-"+(Math.max(0,...t)+1)}function m(e){const t=e.querySelector(".mw-card-ribbon");if(!t)return"";const n=Array.from(t.classList).find(function(e){return 0===e.indexOf("mw-card-addon-")});return n?n.replace("mw-card-addon-",""):""}function w(e,t){const n=e.querySelector(".mw-card-ribbon");if(n&&n.remove(),!t||!t.value)return;const a=document.createElement("div");a.className="mw-card-ribbon mw-card-addon-"+t.value,a.textContent=t.textContent,e.prepend(a)}function f(e){const t=e.querySelector(".mw-avatar-initials");return t?t.textContent.trim():""}function h(e,t){const n=e.querySelector(t);return n?n.textContent.replace(/\s+/g," ").trim():""}function g(e,t){const n=e.querySelector(".mw-kanban-card-actions"),a=n.querySelector(".mw-avatar");if(!t)return void(a&&a.remove());const r=a||document.createElement("div");r.className="mw-avatar mw-avatar-xs mw-avatar-initials",r.textContent=t,a||n.prepend(r)}function p(e,t){y(),i=t||null,o.value=t?h(t,".mw-kanban-card-title"):"",c.value=t?h(t,".mw-kanban-card-text"):"",s.value=t?m(t):"",l.value=t?f(t):"",t?(t.classList.add("mw-kanban-editing"),t.before(n)):e.querySelector(".mw-kanban-column-body").prepend(n),n.classList.add("mw-active"),o.focus()}function y(){n.classList.remove("mw-active"),i&&i.classList.remove("mw-kanban-editing"),i=null}function v(){const e=o.value.trim();if(!e)return void o.focus();const t=i||a.content.firstElementChild.cloneNode(!0);if(t.querySelector(".mw-kanban-card-title").textContent=e,t.querySelector(".mw-kanban-card-text").textContent=c.value.trim(),w(t,s.selectedOptions[0]),g(t,l.value),!i){const e=u();t.classList.add("mw-kanban-card-in"),t.querySelector(".mw-kanban-card-id").textContent=e,t.querySelectorAll("[aria-label]").forEach(function(t){t.setAttribute("aria-label",t.getAttribute("aria-label").replace(/[A-Z]+-\d+/,e))}),n.before(t)}y(),d()}const b=["mw-kanban-card-moved-forward","mw-kanban-card-moved-back"];function S(e,n){const a=e.closest(".mw-kanban-column"),r=t[t.indexOf(a)+n];r&&(r.querySelector(".mw-kanban-column-body").appendChild(e),e.classList.remove.apply(e.classList,b),e.offsetWidth,e.classList.add(n>0?b[0]:b[1]),d())}e.addEventListener("click",function(e){const t=e.target.closest("[data-kanban-move]");if(t){if(S(t.closest(".mw-kanban-card"),parseInt(t.dataset.kanbanMove,10)),t.disabled){const e=t.parentElement.querySelector("[data-kanban-move]:not(:disabled)");e&&e.focus()}return}const n=e.target.closest(".mw-kanban-edit");if(n){const e=n.closest(".mw-kanban-card");return void p(e.closest(".mw-kanban-column"),e)}const a=e.target.closest(".mw-kanban-delete");if(a){const e=a.closest(".mw-kanban-card");return e===i&&y(),e.remove(),void d()}const r=e.target.closest(".mw-kanban-add");r?p(r.closest(".mw-kanban-column"),null):e.target.closest(".mw-kanban-composer-cancel")&&y()}),n.addEventListener("submit",function(e){e.preventDefault(),v()}),n.addEventListener("keydown",function(e){"Escape"===e.key&&y()}),d()}(e)})}(r),function(e){e.querySelectorAll("[data-calendar]").forEach(e=>{a(e)&&function(e){const t=e.querySelector(".mw-calendar-grid"),n=e.querySelector(".mw-calendar-title");if(!t)return;const a="week"===e.dataset.calendar,r=function(e){if(!e)return{};try{return JSON.parse(e)}catch(e){return{}}}(e.dataset.calendarMarkers),o=e.dataset.calendarLocale||document.documentElement.lang||void 0,c=new Date;c.setHours(0,0,0,0);let s=e.dataset.calendarDate?new Date(e.dataset.calendarDate+"T00:00:00"):new Date(c),l=e.dataset.calendarSelected||"";function i(e){const t=new Date(e);return t.setDate(t.getDate()-(t.getDay()+6)%7),t}function d(e){return e.getFullYear()+"-"+String(e.getMonth()+1).padStart(2,"0")+"-"+String(e.getDate()).padStart(2,"0")}function u(e){const t=i(e);t.setDate(t.getDate()+3);const n=i(new Date(t.getFullYear(),0,4));return n.setDate(n.getDate()+3),1+Math.round((t-n)/6048e5)}function m(){if(!a)return s.toLocaleDateString(o,{month:"long",year:"numeric"});const e=i(s),t=new Date(e);t.setDate(t.getDate()+6);const n=e.toLocaleDateString(o,{day:"numeric",month:e.getMonth()===t.getMonth()?void 0:"short"}),r=t.toLocaleDateString(o,{day:"numeric",month:"short",year:"numeric"});return"Week "+u(e)+" · "+n+" - "+r}function w(e){const t=e.getDay();return 0===t||6===t}function f(){const e=i(new Date);for(let n=0;n<7;n++){const n=document.createElement("div");n.className="mw-calendar-weekday",w(e)&&n.classList.add("mw-calendar-weekend"),n.setAttribute("aria-hidden","true"),n.textContent=e.toLocaleDateString(o,{weekday:"short"}),t.appendChild(n),e.setDate(e.getDate()+1)}}function h(e,t){const n=d(e),s=document.createElement("button");s.type="button",s.className="mw-calendar-day",s.tabIndex=-1,s.dataset.calendarDay=n,s.setAttribute("aria-pressed",n===l?"true":"false"),s.setAttribute("aria-label",e.toLocaleDateString(o,{weekday:"long",day:"numeric",month:"long",year:"numeric"})),w(e)&&s.classList.add("mw-calendar-weekend"),a||e.getMonth()===t||s.classList.add("mw-calendar-adjacent"),n===d(c)&&(s.classList.add("mw-calendar-today"),s.setAttribute("aria-current","date")),n===l&&s.classList.add("mw-selected");const i=document.createElement("span");i.className="mw-calendar-date",i.textContent=e.getDate(),s.appendChild(i);const u=[].concat(r[n]||[]);if(u.length){const e=document.createElement("span");e.className="mw-calendar-dots",u.forEach(function(t){const n=document.createElement("span");n.className=t?"mw-calendar-dot mw-calendar-dot-"+t:"mw-calendar-dot",e.appendChild(n)}),s.appendChild(e)}return s}function g(){const e=s.getMonth(),r=a?7:42,o=i(a?s:new Date(s.getFullYear(),e,1));t.innerHTML="",f();for(let n=0;n<r;n++)t.appendChild(h(o,e)),o.setDate(o.getDate()+1);n&&(n.textContent=m()),p()}function p(){const e=t.querySelector(".mw-selected")||t.querySelector(".mw-calendar-today")||t.querySelector(".mw-calendar-day:not(.mw-calendar-adjacent)")||t.querySelector(".mw-calendar-day");e&&(e.tabIndex=0)}function y(n){l=n===l?"":n,t.querySelectorAll(".mw-calendar-day").forEach(function(e){const t=e.dataset.calendarDay===l;e.classList.toggle("mw-selected",t),e.setAttribute("aria-pressed",t?"true":"false")}),e.dispatchEvent(new CustomEvent("mw-calendar-select",{bubbles:!0,detail:{date:l}}))}function v(e){a?s.setDate(s.getDate()+7*e):s=new Date(s.getFullYear(),s.getMonth()+e,1),g()}function b(e){const n=d(e);let a=t.querySelector('[data-calendar-day="'+n+'"]');a||(s=new Date(e),g(),a=t.querySelector('[data-calendar-day="'+n+'"]')),a&&(t.querySelectorAll(".mw-calendar-day").forEach(function(e){e.tabIndex=-1}),a.tabIndex=0,a.focus())}e.addEventListener("click",function(e){const t=e.target.closest("[data-calendar-nav]");if(t)return void v(parseInt(t.dataset.calendarNav,10));const n=e.target.closest(".mw-calendar-day");n&&!n.disabled&&y(n.dataset.calendarDay)}),t.addEventListener("keydown",function(e){const t={ArrowLeft:-1,ArrowRight:1,ArrowUp:-7,ArrowDown:7}[e.key];if(!t)return;const n=e.target.closest(".mw-calendar-day");if(!n)return;e.preventDefault();const a=new Date(n.dataset.calendarDay+"T00:00:00");a.setDate(a.getDate()+t),b(a)}),g()}(e)})}(r),function(t){t.querySelectorAll(".mw-lang-switch").forEach(t=>{if(!a(t))return;const n=t.querySelectorAll("[data-mw-lang]"),r=t.querySelector("summary"),o=t.querySelector("summary .mw-flag"),c=t.querySelector("summary .mw-lang-switch-code");n.forEach(a=>{a.addEventListener("click",function(){const s=a.dataset.mwLang,l=a.querySelector(".mw-lang-switch-name"),i=l?l.textContent.trim():s;n.forEach(t=>{e(t,t===a),t===a?t.setAttribute("aria-current","true"):t.removeAttribute("aria-current")}),c&&(c.textContent=s);const d=a.querySelector(".mw-flag");o&&d&&(o.className=d.className),r&&r.setAttribute("aria-label","Language: "+i),t.dispatchEvent(new CustomEvent("mw-language-change",{bubbles:!0,detail:{lang:s,name:i}}))})})})}(r)}function s(e){const t=e.querySelector('input[type="checkbox"]');if(!t)return;const n=t.checked;t.checked=!n,t.checked?e.classList.add("mw-selected"):e.classList.remove("mw-selected"),e.dispatchEvent(new CustomEvent("checkboxToggle",{detail:{checked:t.checked,item:e}}))}function l(){const e=Array.from(document.querySelectorAll(".color-swatch")),t=e.map(e=>function(e){if(!e||"transparent"===e)return"#000000";const t=e=>Math.max(0,Math.min(255,Math.round(e))).toString(16).padStart(2,"0"),n=e.match(/color\(srgb\s+([\d.]+)\s+([\d.]+)\s+([\d.]+)(?:\s*\/\s*([\d.]+))?\)/);if(n){const e="#"+t(255*n[1])+t(255*n[2])+t(255*n[3]),a=void 0===n[4]?1:parseFloat(n[4]);return(a<1?`${e} / ${a}`:e).toUpperCase()}const a=e.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*([\d.]+))?\)/);if(!a)return e;const r="#"+t(a[1])+t(a[2])+t(a[3]),o=void 0===a[4]?1:parseFloat(a[4]);return(o<1?`${r} / ${o}`:r).toUpperCase()}(window.getComputedStyle(e).backgroundColor));e.forEach((e,n)=>{const a=e.parentElement.querySelector(".mw-text-muted");a&&(a.textContent=t[n])})}function i(){const e=parseFloat(getComputedStyle(document.documentElement).scrollPaddingTop);return Number.isNaN(e)?0:e}document.addEventListener("DOMContentLoaded",function(){o(),c(document)}),window.MaverickWave={init:function(e){o(),c(e)}},window.mwToggleCheckbox=s;let d=null;function u(e){const t=e.querySelector(".mw-tabs-nav-item.mw-active, .mw-tabs-nav-item.active");t?(e.style.setProperty("--mw-tabs-marker-x",t.offsetLeft+"px"),e.style.setProperty("--mw-tabs-marker-w",t.offsetWidth),e.style.setProperty("--mw-tabs-marker-y",t.offsetTop+"px"),e.style.setProperty("--mw-tabs-marker-h",t.offsetHeight),e.setAttribute("data-mw-tabs-marker","")):e.removeAttribute("data-mw-tabs-marker")}function m(e){const t=e.getAttribute("data-tab");return t?document.getElementById(t):null}function w(e){const n=t(e);e.setAttribute("aria-selected",String(n)),e.tabIndex=n?0:-1}function f(t,n){t.forEach(t=>{const a=t===n;e(t,a),e(m(t),a),w(t)});const a=n.closest(".mw-tabs-nav");a&&u(a)}function h(){const e=window.location.hostname;return"localhost"===e||"127.0.0.1"===e||e.includes("192.168.")}function g(e){e&&("DIALOG"===e.tagName?e.showModal():e.classList.add("mw-modal-open"))}["wheel","touchstart"].forEach(e=>{window.addEventListener(e,()=>d=null,{passive:!0})}),window.mwOpenModal=e=>g(document.getElementById(e)),window.mwCloseModal=e=>{var t;(t=document.getElementById(e))&&("DIALOG"===t.tagName?t.close():t.classList.remove("mw-modal-open"))},window.mwRefreshColorSwatches=l}();
1
+ !function(){"use strict";function e(e,t){e&&(e.classList.toggle("mw-active",t),t||e.classList.remove("active"))}function t(e){return!!e&&(e.classList.contains("mw-active")||e.classList.contains("active"))}const n=new WeakSet;function a(e){return!(!e||n.has(e))&&(n.add(e),!0)}let r=!1;function o(){r||(r=!0,function(){const t=document.querySelector(".mw-theme-toggle");if(!t)return;const n=document.documentElement,a=t.querySelector(".mw-theme-toggle-slider i"),r=getComputedStyle(document.documentElement).getPropertyValue("--mw-internal-theme-mode").trim()||"switchable";if("switchable"!==r)return console.log(`Theme mode fixed to: ${r}. Disabling toggle.`),a&&(a.className="light"===r?"fas fa-sun":"fas fa-moon"),e(t,"light"===r),t.style.opacity="0.4",t.style.pointerEvents="none",t.style.cursor="default",t.setAttribute("aria-disabled","true"),localStorage.removeItem("mw-theme"),void n.classList.remove("mw-theme-light","mw-theme-dark");const o=window.matchMedia("(prefers-color-scheme: light)"),c=window.CSS&&CSS.supports("color","light-dark(#000, #fff)"),s=()=>c&&o.matches,i=localStorage.getItem("mw-theme");let d=i?"light"===i:s();const u=r=>{n.classList.add("mw-theme-switching"),n.classList.toggle("mw-theme-light",r),n.classList.toggle("mw-theme-dark",!r),n.offsetHeight,n.classList.remove("mw-theme-switching"),e(t,r),a&&(a.className=r?"fas fa-sun":"fas fa-moon")};u(d),o.addEventListener("change",()=>{localStorage.getItem("mw-theme")||(d=s(),u(d),l())}),t.addEventListener("click",()=>{d=!d,u(d),localStorage.setItem("mw-theme",d?"light":"dark"),l()})}(),l(),function(){const e=document.querySelector(".mw-menu-btn"),t=document.querySelector(".mw-navbar");if(!e||!t)return;const n="BUTTON"===e.tagName;function a(a){e.classList.toggle("mw-active",a),t.classList.toggle("mw-active",a),document.body.classList.toggle("mw-nav-open",a),n&&e.setAttribute("aria-expanded",String(a))}function r(e){e.preventDefault(),e.stopPropagation(),a(!t.classList.contains("mw-active"))}e.addEventListener("click",r),document.addEventListener("click",function(n){t.classList.contains("mw-active")&&(t.contains(n.target)||e.contains(n.target)||a(!1))}),document.addEventListener("keydown",function(n){"Escape"===n.key&&t.classList.contains("mw-active")&&(a(!1),e.focus())})}(),function(){const e=document.querySelector(".mw-header-reveal");if(!e)return;if(CSS.supports("animation-timeline","scroll()"))return;if(window.matchMedia("(prefers-reduced-motion: reduce)").matches)return;const t=document.querySelector(".mw-announcement:not(.mw-announcement-static)"),n=270;let a=null;const r=()=>{const r=window.scrollY<n;r!==a&&(a=r,e.classList.toggle("mw-header-away",r),t&&t.classList.toggle("mw-announcement-away",r))};r(),requestAnimationFrame(()=>{e.classList.add("mw-header-driven"),t&&t.classList.add("mw-announcement-driven")}),window.addEventListener("scroll",r,{passive:!0})}(),function(){if(CSS.supports("animation-timeline","view()"))return;if(window.matchMedia("(prefers-reduced-motion: reduce)").matches)return;const e=document.querySelectorAll(".mw-parallax-media");if(!e.length)return;const t=[...e].map(e=>(e.classList.add("mw-parallax-driven"),{el:e,pinned:Boolean(e.closest(".mw-parallax-sticky"))})),n=e=>Math.min(1,Math.max(0,e)),a=(e,t)=>{if(e.pinned)return n(window.scrollY/t);const a=e.el.getBoundingClientRect();return n((t-a.top)/(t+a.height))};let r=!1;const o=()=>{r=!1;const e=document.documentElement.clientHeight,n=t.map(t=>a(t,e));t.forEach((e,t)=>e.el.style.setProperty("--mw-parallax-progress",n[t]))},c=()=>{r||(r=!0,requestAnimationFrame(o))};o(),window.addEventListener("scroll",c,{passive:!0}),window.addEventListener("resize",c,{passive:!0})}(),function(){function e(e){const t=e.style.position,n="sticky"===getComputedStyle(e).position;n&&(e.style.position="static");const a=e.getBoundingClientRect().top+window.scrollY;return n&&(e.style.position=t),a}function t(e){const t=window.scrollY,n=e-t;if(!n)return;const a=Math.min(2e3,600+.5*Math.abs(n)),r={};d=r;let o=null;function c(e){if(d!==r)return;null===o&&(o=e);const s=Math.min(1,(e-o)/a),l=s<.5?4*s*s*s:1-Math.pow(-2*s+2,3)/2;window.scrollTo({top:t+n*l,behavior:"instant"}),s<1?requestAnimationFrame(c):d=null}requestAnimationFrame(c)}document.querySelectorAll('a[href^="#"]').forEach(n=>{n.addEventListener("click",function(n){const a=this.getAttribute("href");if("#"===a)return;const r=document.querySelector(a);if(!r)return;const o=document.querySelector(".mw-menu-btn"),c=document.querySelector(".mw-navbar");o&&c&&(o.classList.remove("mw-active"),c.classList.remove("mw-active"),document.body.classList.remove("mw-nav-open"),"BUTTON"===o.tagName&&o.setAttribute("aria-expanded","false")),n.preventDefault();const s=Math.max(0,e(r)-i());r.hasAttribute("tabindex")||r.setAttribute("tabindex","-1"),r.focus({preventScroll:!0}),window.matchMedia("(prefers-reduced-motion: reduce)").matches?window.scrollTo({top:s,behavior:"instant"}):t(s),history.replaceState(null,"",a)})})}(),function(){const t=document.querySelectorAll("section[id]"),n=document.querySelectorAll(".mw-navbar-link");if(0===t.length||0===n.length)return;window.addEventListener("scroll",function(e,t){let n;return function(){const a=this,r=arguments;clearTimeout(n),n=setTimeout(()=>e.apply(a,r),t)}}(function(){let a="";const r=i()+2;t.forEach(e=>{const t=e.offsetTop-r,n=e.clientHeight;scrollY>=t&&scrollY<t+n&&(a=e.getAttribute("id"))}),n.forEach(t=>{e(t,!1);const n=t.getAttribute("href");if(n){const r=n.indexOf("#");if(-1!==r){n.substring(r+1)===a&&e(t,!0)}}})},100),{passive:!0})}(),document.addEventListener("click",e=>{const t=e.target.closest(".mw-modal-close");if(t){const e=t.closest("dialog.mw-modal");if(e)return void e.close();const n=t.closest(".mw-modal-overlay");return void(n&&n.classList.remove("mw-modal-open"))}const n=e.target.closest("[data-mw-modal]");var a;n?g(document.getElementById(n.dataset.mwModal)):e.target.matches("dialog.mw-modal[open]")&&(!("closedBy"in(a=e.target))||null===a.getAttribute("closedby"))&&e.target.close()}),function(){function e(e){document.querySelectorAll(".mw-dropdown[open]").forEach(t=>{t!==e&&t.removeAttribute("open")})}document.addEventListener("click",function(t){const n=t.target.closest(".mw-dropdown");e(n),n&&t.target.closest(".mw-dropdown-item")&&n.removeAttribute("open")}),document.addEventListener("keydown",function(e){if("Escape"!==e.key)return;const t=document.querySelector(".mw-dropdown[open]");if(!t)return;t.removeAttribute("open");const n=t.querySelector("summary");n&&n.focus()})}(),document.addEventListener("click",e=>{const t=e.target.closest(".mw-tags-remove");if(!t)return;const n=t.closest(".mw-tags-item");n&&n.remove()}),document.addEventListener("click",e=>{const t=e.target.closest("[data-mw-copy]");if(!t||!navigator.clipboard)return;const n=t.getAttribute("data-mw-copy"),a=t.closest(".mw-input-group")?.querySelector("input"),r=n||a?.value;r&&navigator.clipboard.writeText(r).then(()=>{t.dispatchEvent(new CustomEvent("mwCopied",{bubbles:!0,detail:{text:r}}))})}),function(){const e=document.querySelector(".mw-localhost-indicator-activated"),t=document.querySelector(".mw-header");if(e&&h()){const e=document.createElement("div");e.className="mw-localhost-indicator-pulse",t.prepend(e)}}(),function(){if(!h())return;const e=document.querySelector('meta[name="viewport"]'),t=e&&e.getAttribute("content")||"";if(/viewport-fit\s*=\s*cover/.test(t))return;console.warn('MaverickWave: <meta name="viewport"> is missing viewport-fit=cover. env(safe-area-inset-*) resolves to 0 without it, so notched phones lose the gutter, the nav panel and the modal padding that expect it.')}())}function c(n){const r=n||document;!function(e){e.querySelectorAll(".mw-gallery").forEach(e=>{if(!a(e))return;const t=e.closest(".mw-gallery-container")||e.parentElement;t&&function(e,t){const n=t.querySelector(".mw-gallery-track");if(!n||!n.children.length)return;const a=n.children,r=e.querySelector(".mw-gallery-dots"),o=e.querySelector(".mw-gallery-desc"),c=t.querySelector(".mw-gallery-navi-prev"),s=t.querySelector(".mw-gallery-navi-next");let l=0;function i(e){const t=a.length;l=(e+t)%t,n.style.transform=`translateX(-${100*l}%)`,r&&r.querySelectorAll(".mw-gallery-dot").forEach((e,t)=>{e.classList.toggle("mw-active",t===l)}),o&&(o.textContent=a[l].dataset.desc||"")}if(r)for(let e=0;e<a.length;e++){const t=document.createElement("button");t.type="button",t.className="mw-gallery-dot"+(0===e?" mw-active":""),t.setAttribute("aria-label","Go to slide "+(e+1)),t.addEventListener("click",()=>i(e)),r.appendChild(t)}c&&c.addEventListener("click",()=>i(l-1));s&&s.addEventListener("click",()=>i(l+1));let d=0,u=0,m=!1;n.addEventListener("touchstart",e=>{m=1===e.touches.length,m&&(d=e.touches[0].clientX,u=e.touches[0].clientY)},{passive:!0}),n.addEventListener("touchcancel",()=>m=!1),n.addEventListener("touchend",e=>{if(!m)return;m=!1;const t=e.changedTouches[0].clientX-d,n=e.changedTouches[0].clientY-u;Math.abs(t)<50||Math.abs(t)<=Math.abs(n)||i(l+(t<0?1:-1))},{passive:!0}),i(0)}(t,e)})}(r),function(n){const r=n.querySelectorAll(".mw-accordion-header");r.forEach(n=>{if(!a(n))return;const r="BUTTON"===n.tagName;r&&n.setAttribute("aria-expanded",String(t(n))),n.addEventListener("click",function(){const n=!t(this);e(this,n),e(this.nextElementSibling,n),r&&this.setAttribute("aria-expanded",String(n))})})}(r),function(e){const t=Array.from(e.querySelectorAll(".mw-progress-fill")).filter(a);if(!t.length)return;const n=CSS.supports("animation-timeline","view()"),r=e=>e.dataset.value?e.dataset.value+"%":e.style.width,o=[];if(t.forEach(e=>{const t=r(e);t&&(e.style.setProperty("--mw-progress-value",t),n?e.classList.add("mw-progress-driven"):o.push(e))}),n)return;const c=new IntersectionObserver((e,t)=>{e.forEach(e=>{e.isIntersecting&&(e.target.style.width=r(e.target),t.unobserve(e.target))})},{root:null,threshold:.2});o.forEach(e=>c.observe(e))}(r),function(e){if(CSS.supports("animation-timeline","view()"))return;if(window.matchMedia("(prefers-reduced-motion: reduce)").matches)return;const t=Array.from(e.querySelectorAll(".mw-reveal, .mw-reveal-stagger > *")).filter(a);if(!t.length)return;const n=e=>{const t=e.parentElement;if(!t||!t.classList.contains("mw-reveal-stagger"))return 0;const n=getComputedStyle(t).gridTemplateColumns.split(" ").length;return[...t.children].indexOf(e)%n*90},r=new IntersectionObserver((e,t)=>{e.forEach(e=>{e.isIntersecting&&(t.unobserve(e.target),e.target.style.animationDelay=n(e.target)+"ms",e.target.classList.replace("mw-reveal-hidden","mw-reveal-run"))})},{threshold:.15});t.forEach(e=>{e.getBoundingClientRect().top<window.innerHeight||(e.classList.add("mw-reveal-hidden"),r.observe(e))})}(r),function(e){e.querySelectorAll(".mw-tabs-nav").forEach(e=>{if(!a(e))return;const t=Array.from(e.querySelectorAll(".mw-tabs-nav-item"));if(!t.length)return;const n=!!e.closest(".mw-tabs-vertical");e.setAttribute("role","tablist"),n&&e.setAttribute("aria-orientation","vertical"),t.forEach((e,a)=>{const r=m(e);e.setAttribute("role","tab"),e.id||(e.id=(r?r.id:"mw-tab-"+a)+"-tab"),r&&(e.setAttribute("aria-controls",r.id),r.setAttribute("role","tabpanel"),r.setAttribute("aria-labelledby",e.id)),w(e),e.addEventListener("click",()=>f(t,e)),e.addEventListener("keydown",e=>{const r=function(e,t,n,a){const r=t?"ArrowUp":"ArrowLeft",o=t?"ArrowDown":"ArrowRight";return e.key===r?(a-1+n)%n:e.key===o?(a+1)%n:"Home"===e.key?0:"End"===e.key?n-1:null}(e,n,t.length,a);null!==r&&(e.preventDefault(),f(t,t[r]),t[r].focus())})}),u(e);const r=new ResizeObserver(()=>u(e));r.observe(e),t.forEach(e=>r.observe(e))})}(r),function(e){const t=e.querySelectorAll(".mw-alert-close");t.forEach(e=>{a(e)&&e.addEventListener("click",function(){const e=this.closest(".mw-alert");e&&(e.classList.add("mw-alert-closing"),setTimeout(()=>{e.classList.add("mw-alert-closed")},300))})})}(r),function(e){e.querySelectorAll(".mw-slider-container").forEach(e=>{if(!a(e))return;const t=e.querySelector(".mw-slider"),n=e.querySelector(".mw-slider-value");if(!t||!n)return;const r=()=>{const e=Number(t.value),a=Number(t.max)||100,r=Math.round(e/a*100);t.style.setProperty("--value",r+"%"),n.classList.contains("mw-slider-numeric")?n.setAttribute("data-value",e):n.setAttribute("data-value",r)};t.addEventListener("input",r),r()})}(r),function(t){const n=t.querySelectorAll(".mw-image-slider");n.forEach(t=>{if(!a(t))return;const n=t.querySelectorAll(".mw-image-slider-overlay-image"),r=t.querySelectorAll("button[data-index]");if(!n.length||!r.length)return;let o=0;function c(){n.forEach(t=>{e(t,parseInt(t.dataset.index)===o)}),r.forEach(t=>{e(t,parseInt(t.dataset.index)===o)})}function s(e){o=e,c()}r.forEach(e=>{e.addEventListener("click",()=>{s(parseInt(e.dataset.index))})}),c()})}(r),function(e){const t=e.querySelectorAll(".mw-item-list-checkbox, .mw-item-list-checkbox-scroll");t.forEach(e=>{if(!a(e))return;e.querySelectorAll("li").forEach(e=>{const t=e.querySelector('input[type="checkbox"]'),n=e.querySelector(".mw-checkbox");t&&n&&(t.checked&&e.classList.add("mw-selected"),e.addEventListener("click",function(e){e.target!==t&&e.target.closest(".mw-checkbox")!==n&&s(this)}),t.addEventListener("change",function(){const e=this.closest("li");this.checked?e.classList.add("mw-selected"):e.classList.remove("mw-selected"),e.dispatchEvent(new CustomEvent("checkboxToggle",{detail:{checked:this.checked,item:e}}))}),n.addEventListener("click",function(e){setTimeout(()=>{const e=this.closest("li");this.querySelector('input[type="checkbox"]').checked?e.classList.add("mw-selected"):e.classList.remove("mw-selected")},0)}))})})}(r),function(e){e.querySelectorAll(".mw-kanban").forEach(e=>{a(e)&&function(e){const t=Array.from(e.querySelectorAll(".mw-kanban-column")),n=e.querySelector(".mw-kanban-composer"),a=e.querySelector(".mw-kanban-card-template"),r=e.dataset.kanbanPrefix||"MW",o=n.querySelector(".mw-kanban-composer-title"),c=n.querySelector(".mw-kanban-composer-text"),s=n.querySelector(".mw-kanban-composer-priority"),l=n.querySelector(".mw-kanban-composer-assignee");let i=null;function d(){t.forEach(function(e,n){const a=e.querySelectorAll(".mw-kanban-card"),r=e.querySelector(".mw-kanban-count");r&&(r.textContent=a.length),e.querySelectorAll("[data-kanban-move]").forEach(function(e){const a=n+parseInt(e.dataset.kanbanMove,10);e.disabled=a<0||a>=t.length})})}function u(){const t=Array.from(e.querySelectorAll(".mw-kanban-card-id")).map(function(e){return parseInt(e.textContent.split("-").pop(),10)||0});return r+"-"+(Math.max(0,...t)+1)}function m(e){const t=e.querySelector(".mw-card-ribbon");if(!t)return"";const n=Array.from(t.classList).find(function(e){return 0===e.indexOf("mw-card-addon-")});return n?n.replace("mw-card-addon-",""):""}function w(e,t){const n=e.querySelector(".mw-card-ribbon");if(n&&n.remove(),!t||!t.value)return;const a=document.createElement("div");a.className="mw-card-ribbon mw-card-addon-"+t.value,a.textContent=t.textContent,e.prepend(a)}function f(e){const t=e.querySelector(".mw-avatar-initials");return t?t.textContent.trim():""}function h(e,t){const n=e.querySelector(t);return n?n.textContent.replace(/\s+/g," ").trim():""}function g(e,t){const n=e.querySelector(".mw-kanban-card-actions"),a=n.querySelector(".mw-avatar");if(!t)return void(a&&a.remove());const r=a||document.createElement("div");r.className="mw-avatar mw-avatar-xs mw-avatar-initials",r.textContent=t,a||n.prepend(r)}function v(e,t){y(),i=t||null,o.value=t?h(t,".mw-kanban-card-title"):"",c.value=t?h(t,".mw-kanban-card-text"):"",s.value=t?m(t):"",l.value=t?f(t):"",t?(t.classList.add("mw-kanban-editing"),t.before(n)):e.querySelector(".mw-kanban-column-body").prepend(n),n.classList.add("mw-active"),o.focus()}function y(){n.classList.remove("mw-active"),i&&i.classList.remove("mw-kanban-editing"),i=null}function p(){const e=o.value.trim();if(!e)return void o.focus();const t=i||a.content.firstElementChild.cloneNode(!0);if(t.querySelector(".mw-kanban-card-title").textContent=e,t.querySelector(".mw-kanban-card-text").textContent=c.value.trim(),w(t,s.selectedOptions[0]),g(t,l.value),!i){const e=u();t.classList.add("mw-kanban-card-in"),t.querySelector(".mw-kanban-card-id").textContent=e,t.querySelectorAll("[aria-label]").forEach(function(t){t.setAttribute("aria-label",t.getAttribute("aria-label").replace(/[A-Z]+-\d+/,e))}),n.before(t)}y(),d()}const b=["mw-kanban-card-moved-forward","mw-kanban-card-moved-back"];function S(e,n){const a=e.closest(".mw-kanban-column"),r=t[t.indexOf(a)+n];r&&(r.querySelector(".mw-kanban-column-body").appendChild(e),e.classList.remove.apply(e.classList,b),e.offsetWidth,e.classList.add(n>0?b[0]:b[1]),d())}e.addEventListener("click",function(e){const t=e.target.closest("[data-kanban-move]");if(t){if(S(t.closest(".mw-kanban-card"),parseInt(t.dataset.kanbanMove,10)),t.disabled){const e=t.parentElement.querySelector("[data-kanban-move]:not(:disabled)");e&&e.focus()}return}const n=e.target.closest(".mw-kanban-edit");if(n){const e=n.closest(".mw-kanban-card");return void v(e.closest(".mw-kanban-column"),e)}const a=e.target.closest(".mw-kanban-delete");if(a){const e=a.closest(".mw-kanban-card");return e===i&&y(),e.remove(),void d()}const r=e.target.closest(".mw-kanban-add");r?v(r.closest(".mw-kanban-column"),null):e.target.closest(".mw-kanban-composer-cancel")&&y()}),n.addEventListener("submit",function(e){e.preventDefault(),p()}),n.addEventListener("keydown",function(e){"Escape"===e.key&&y()}),d()}(e)})}(r),function(e){e.querySelectorAll("[data-calendar]").forEach(e=>{a(e)&&function(e){const t=e.querySelector(".mw-calendar-grid"),n=e.querySelector(".mw-calendar-title");if(!t)return;const a="week"===e.dataset.calendar,r=function(e){if(!e)return{};try{return JSON.parse(e)}catch(e){return{}}}(e.dataset.calendarMarkers),o=e.dataset.calendarLocale||document.documentElement.lang||void 0,c=new Date;c.setHours(0,0,0,0);let s=e.dataset.calendarDate?new Date(e.dataset.calendarDate+"T00:00:00"):new Date(c),l=e.dataset.calendarSelected||"";function i(e){const t=new Date(e);return t.setDate(t.getDate()-(t.getDay()+6)%7),t}function d(e){return e.getFullYear()+"-"+String(e.getMonth()+1).padStart(2,"0")+"-"+String(e.getDate()).padStart(2,"0")}function u(e){const t=i(e);t.setDate(t.getDate()+3);const n=i(new Date(t.getFullYear(),0,4));return n.setDate(n.getDate()+3),1+Math.round((t-n)/6048e5)}function m(){if(!a)return s.toLocaleDateString(o,{month:"long",year:"numeric"});const e=i(s),t=new Date(e);t.setDate(t.getDate()+6);const n=e.toLocaleDateString(o,{day:"numeric",month:e.getMonth()===t.getMonth()?void 0:"short"}),r=t.toLocaleDateString(o,{day:"numeric",month:"short",year:"numeric"});return"Week "+u(e)+" · "+n+" - "+r}function w(e){const t=e.getDay();return 0===t||6===t}function f(){const e=i(new Date);for(let n=0;n<7;n++){const n=document.createElement("div");n.className="mw-calendar-weekday",w(e)&&n.classList.add("mw-calendar-weekend"),n.setAttribute("aria-hidden","true"),n.textContent=e.toLocaleDateString(o,{weekday:"short"}),t.appendChild(n),e.setDate(e.getDate()+1)}}function h(e,t){const n=d(e),s=document.createElement("button");s.type="button",s.className="mw-calendar-day",s.tabIndex=-1,s.dataset.calendarDay=n,s.setAttribute("aria-pressed",n===l?"true":"false"),s.setAttribute("aria-label",e.toLocaleDateString(o,{weekday:"long",day:"numeric",month:"long",year:"numeric"})),w(e)&&s.classList.add("mw-calendar-weekend"),a||e.getMonth()===t||s.classList.add("mw-calendar-adjacent"),n===d(c)&&(s.classList.add("mw-calendar-today"),s.setAttribute("aria-current","date")),n===l&&s.classList.add("mw-selected");const i=document.createElement("span");i.className="mw-calendar-date",i.textContent=e.getDate(),s.appendChild(i);const u=[].concat(r[n]||[]);if(u.length){const e=document.createElement("span");e.className="mw-calendar-dots",u.forEach(function(t){const n=document.createElement("span");n.className=t?"mw-calendar-dot mw-calendar-dot-"+t:"mw-calendar-dot",e.appendChild(n)}),s.appendChild(e)}return s}function g(){const e=s.getMonth(),r=a?7:42,o=i(a?s:new Date(s.getFullYear(),e,1));t.innerHTML="",f();for(let n=0;n<r;n++)t.appendChild(h(o,e)),o.setDate(o.getDate()+1);n&&(n.textContent=m()),v()}function v(){const e=t.querySelector(".mw-selected")||t.querySelector(".mw-calendar-today")||t.querySelector(".mw-calendar-day:not(.mw-calendar-adjacent)")||t.querySelector(".mw-calendar-day");e&&(e.tabIndex=0)}function y(n){l=n===l?"":n,t.querySelectorAll(".mw-calendar-day").forEach(function(e){const t=e.dataset.calendarDay===l;e.classList.toggle("mw-selected",t),e.setAttribute("aria-pressed",t?"true":"false")}),e.dispatchEvent(new CustomEvent("mw-calendar-select",{bubbles:!0,detail:{date:l}}))}function p(e){a?s.setDate(s.getDate()+7*e):s=new Date(s.getFullYear(),s.getMonth()+e,1),g()}function b(e){const n=d(e);let a=t.querySelector('[data-calendar-day="'+n+'"]');a||(s=new Date(e),g(),a=t.querySelector('[data-calendar-day="'+n+'"]')),a&&(t.querySelectorAll(".mw-calendar-day").forEach(function(e){e.tabIndex=-1}),a.tabIndex=0,a.focus())}e.addEventListener("click",function(e){const t=e.target.closest("[data-calendar-nav]");if(t)return void p(parseInt(t.dataset.calendarNav,10));const n=e.target.closest(".mw-calendar-day");n&&!n.disabled&&y(n.dataset.calendarDay)}),t.addEventListener("keydown",function(e){const t={ArrowLeft:-1,ArrowRight:1,ArrowUp:-7,ArrowDown:7}[e.key];if(!t)return;const n=e.target.closest(".mw-calendar-day");if(!n)return;e.preventDefault();const a=new Date(n.dataset.calendarDay+"T00:00:00");a.setDate(a.getDate()+t),b(a)}),g()}(e)})}(r),function(t){t.querySelectorAll(".mw-lang-switch").forEach(t=>{if(!a(t))return;const n=t.querySelectorAll("[data-mw-lang]"),r=t.querySelector("summary"),o=t.querySelector("summary .mw-flag"),c=t.querySelector("summary .mw-lang-switch-code");n.forEach(a=>{a.addEventListener("click",function(){const s=a.dataset.mwLang,l=a.querySelector(".mw-lang-switch-name"),i=l?l.textContent.trim():s;n.forEach(t=>{e(t,t===a),t===a?t.setAttribute("aria-current","true"):t.removeAttribute("aria-current")}),c&&(c.textContent=s);const d=a.querySelector(".mw-flag");o&&d&&(o.className=d.className),r&&r.setAttribute("aria-label","Language: "+i),t.dispatchEvent(new CustomEvent("mw-language-change",{bubbles:!0,detail:{lang:s,name:i}}))})})})}(r)}function s(e){const t=e.querySelector('input[type="checkbox"]');if(!t)return;const n=t.checked;t.checked=!n,t.checked?e.classList.add("mw-selected"):e.classList.remove("mw-selected"),e.dispatchEvent(new CustomEvent("checkboxToggle",{detail:{checked:t.checked,item:e}}))}function l(){const e=Array.from(document.querySelectorAll(".color-swatch")),t=e.map(e=>function(e){if(!e||"transparent"===e)return"#000000";const t=e=>Math.max(0,Math.min(255,Math.round(e))).toString(16).padStart(2,"0"),n=e.match(/color\(srgb\s+([\d.]+)\s+([\d.]+)\s+([\d.]+)(?:\s*\/\s*([\d.]+))?\)/);if(n){const e="#"+t(255*n[1])+t(255*n[2])+t(255*n[3]),a=void 0===n[4]?1:parseFloat(n[4]);return(a<1?`${e} / ${a}`:e).toUpperCase()}const a=e.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*([\d.]+))?\)/);if(!a)return e;const r="#"+t(a[1])+t(a[2])+t(a[3]),o=void 0===a[4]?1:parseFloat(a[4]);return(o<1?`${r} / ${o}`:r).toUpperCase()}(window.getComputedStyle(e).backgroundColor));e.forEach((e,n)=>{const a=e.parentElement.querySelector(".mw-text-muted");a&&(a.textContent=t[n])})}function i(){const e=parseFloat(getComputedStyle(document.documentElement).scrollPaddingTop);return Number.isNaN(e)?0:e}document.addEventListener("DOMContentLoaded",function(){o(),c(document)}),window.MaverickWave={init:function(e){o(),c(e)}},window.mwToggleCheckbox=s;let d=null;function u(e){const t=e.querySelector(".mw-tabs-nav-item.mw-active, .mw-tabs-nav-item.active");t?(e.style.setProperty("--mw-tabs-marker-x",t.offsetLeft+"px"),e.style.setProperty("--mw-tabs-marker-w",t.offsetWidth),e.style.setProperty("--mw-tabs-marker-y",t.offsetTop+"px"),e.style.setProperty("--mw-tabs-marker-h",t.offsetHeight),e.setAttribute("data-mw-tabs-marker","")):e.removeAttribute("data-mw-tabs-marker")}function m(e){const t=e.getAttribute("data-tab");return t?document.getElementById(t):null}function w(e){const n=t(e);e.setAttribute("aria-selected",String(n)),e.tabIndex=n?0:-1}function f(t,n){t.forEach(t=>{const a=t===n;e(t,a),e(m(t),a),w(t)});const a=n.closest(".mw-tabs-nav");a&&u(a)}function h(){const e=window.location.hostname;return"localhost"===e||"127.0.0.1"===e||e.includes("192.168.")}function g(e){e&&("DIALOG"===e.tagName?e.showModal():e.classList.add("mw-modal-open"))}["wheel","touchstart"].forEach(e=>{window.addEventListener(e,()=>d=null,{passive:!0})}),window.mwOpenModal=e=>g(document.getElementById(e)),window.mwCloseModal=e=>{var t;(t=document.getElementById(e))&&("DIALOG"===t.tagName?t.close():t.classList.remove("mw-modal-open"))},window.mwRefreshColorSwatches=l}();
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "maverick-wave",
3
- "version": "5.26.0",
3
+ "version": "5.28.0",
4
4
  "config": {
5
- "version_short": "5.26"
5
+ "version_short": "5.28"
6
6
  },
7
7
  "description": "A lightweight, modern CSS framework for building responsive websites with elegance and speed.",
8
8
  "main": "src/js/main.js",
package/scripts/verify.js CHANGED
@@ -109,6 +109,10 @@ for (const t of [...tokensDefined].sort()) {
109
109
 
110
110
  const classesInCss = new Set(all(css, /\.(mw-[a-z0-9-]+)/g));
111
111
 
112
+ // Keyframes carry the same prefix and get named in the docs, but they are not
113
+ // classes - and one the docs name without the CSS having it still has to fail.
114
+ const keyframesInCss = new Set(all(css, /@keyframes\s+(mw-[a-z0-9-]+)/g));
115
+
112
116
  // Classes the JS adds at runtime, or queries as a hook, count as legitimate
113
117
  // targets - including selector strings like '.mw-foo' and '[class~="mw-foo"]'
114
118
  const classesInJs = new Set(all(js, /\.?(mw-[a-z0-9-]+)/g));
@@ -130,7 +134,12 @@ for (const c of all(docs, /[`."'\s](mw-[a-z0-9-]+)/g)) {
130
134
  }
131
135
 
132
136
  for (const [c, where] of [...classesInMarkup].sort()) {
133
- if (classesInCss.has(c) || classesInJs.has(c) || CLASS_ALLOWLIST.has(c)) {
137
+ if (
138
+ classesInCss.has(c) ||
139
+ classesInJs.has(c) ||
140
+ keyframesInCss.has(c) ||
141
+ CLASS_ALLOWLIST.has(c)
142
+ ) {
134
143
  continue;
135
144
  }
136
145
  errors.push(`class used in ${where} but not generated by the CSS: .${c}`);
package/src/js/main.js CHANGED
@@ -586,10 +586,10 @@
586
586
  const announces = menuBtn.tagName === 'BUTTON';
587
587
 
588
588
  function setOpen(open) {
589
- menuBtn.classList.toggle('open', open);
590
- navbar.classList.toggle('open', open);
589
+ menuBtn.classList.toggle('mw-active', open);
590
+ navbar.classList.toggle('mw-active', open);
591
591
  // The scrim and the rules that pin the bar and the burger in place hang
592
- // off this one class rather than off `:has(.mw-navbar.open)` - a selector
592
+ // off this one class rather than off `:has(.mw-navbar.mw-active)` - a selector
593
593
  // that has to re-match the whole document from a class change several
594
594
  // levels down, which is where WebKit's invalidation has let it slip.
595
595
  document.body.classList.toggle('mw-nav-open', open);
@@ -599,7 +599,7 @@
599
599
  function toggleMenu(e) {
600
600
  e.preventDefault();
601
601
  e.stopPropagation();
602
- setOpen(!navbar.classList.contains('open'));
602
+ setOpen(!navbar.classList.contains('mw-active'));
603
603
  }
604
604
 
605
605
  // One listener, not two. The button carries touch-action: manipulation, so
@@ -610,7 +610,7 @@
610
610
 
611
611
  // The scrim is a body pseudo-element, so its taps land on the document
612
612
  document.addEventListener('click', function (e) {
613
- if (!navbar.classList.contains('open')) return;
613
+ if (!navbar.classList.contains('mw-active')) return;
614
614
  if (navbar.contains(e.target) || menuBtn.contains(e.target)) return;
615
615
  setOpen(false);
616
616
  });
@@ -618,7 +618,7 @@
618
618
  // Or Escape strands the keyboard user in a panel that is no longer there
619
619
  document.addEventListener('keydown', function (e) {
620
620
  if (e.key !== 'Escape') return;
621
- if (!navbar.classList.contains('open')) return;
621
+ if (!navbar.classList.contains('mw-active')) return;
622
622
  setOpen(false);
623
623
  menuBtn.focus();
624
624
  });
@@ -891,8 +891,8 @@
891
891
  const menuBtn = document.querySelector('.mw-menu-btn');
892
892
  const nav = document.querySelector('.mw-navbar');
893
893
  if (menuBtn && nav) {
894
- menuBtn.classList.remove('open');
895
- nav.classList.remove('open');
894
+ menuBtn.classList.remove('mw-active');
895
+ nav.classList.remove('mw-active');
896
896
  document.body.classList.remove('mw-nav-open');
897
897
  if (menuBtn.tagName === 'BUTTON') {
898
898
  menuBtn.setAttribute('aria-expanded', 'false');
@@ -8,66 +8,66 @@
8
8
  <div>
9
9
  <h4 class="mw-mb-2">Basic Tiles in 3 Columns</h4>
10
10
  <div class="mw-tiles">
11
- <div class="mw-tile">
11
+ <a href="#" class="mw-tile">
12
12
  <h3 class="mw-tile-header">Project Management</h3>
13
13
  <div class="mw-tile-body">
14
14
  <p>Organize tasks and track project progress</p>
15
15
  <p>Collaborate with team members efficiently</p>
16
16
  </div>
17
17
  <div class="mw-tile-footer">Last updated: 2024-12-15</div>
18
- </div>
18
+ </a>
19
19
 
20
- <div class="mw-tile">
20
+ <a href="#" class="mw-tile">
21
21
  <h3 class="mw-tile-header">Analytics Dashboard</h3>
22
22
  <div class="mw-tile-body">
23
23
  <p>Real-time data visualization and insights</p>
24
24
  <p>Track KPIs and performance metrics</p>
25
25
  </div>
26
26
  <div class="mw-tile-footer">Last updated: 2025-01-02</div>
27
- </div>
27
+ </a>
28
28
 
29
- <div class="mw-tile">
29
+ <a href="#" class="mw-tile">
30
30
  <h3 class="mw-tile-header">Customer Support</h3>
31
31
  <div class="mw-tile-body">
32
32
  <p>24/7 help desk and ticket management</p>
33
33
  <p>Live chat and knowledge base access</p>
34
34
  </div>
35
35
  <div class="mw-tile-footer">Last updated: 2024-11-23</div>
36
- </div>
36
+ </a>
37
37
 
38
- <div class="mw-tile">
38
+ <a href="#" class="mw-tile">
39
39
  <h3 class="mw-tile-header">Document Management</h3>
40
40
  <div class="mw-tile-body">
41
41
  <p>Secure file storage and version control</p>
42
42
  <p>Easy sharing and collaboration tools</p>
43
43
  </div>
44
44
  <div class="mw-tile-footer">Last updated: 2024-12-30</div>
45
- </div>
45
+ </a>
46
46
 
47
- <div class="mw-tile">
47
+ <a href="#" class="mw-tile">
48
48
  <h3 class="mw-tile-header">Billing & Invoices</h3>
49
49
  <div class="mw-tile-body">
50
50
  <p>Automated invoicing and payment tracking</p>
51
51
  <p>Financial reporting and tax preparation</p>
52
52
  </div>
53
53
  <div class="mw-tile-footer">Last updated: 2025-01-01</div>
54
- </div>
54
+ </a>
55
55
 
56
- <div class="mw-tile">
56
+ <a href="#" class="mw-tile">
57
57
  <h3 class="mw-tile-header">User Management</h3>
58
58
  <div class="mw-tile-body">
59
59
  <p>Role-based access control and permissions</p>
60
60
  <p>User authentication and security settings</p>
61
61
  </div>
62
62
  <div class="mw-tile-footer">Last updated: 2024-12-28</div>
63
- </div>
63
+ </a>
64
64
  </div>
65
65
  </div>
66
66
 
67
67
  <div>
68
68
  <h4 class="mw-mb-2">Basic Tiles with Images in 2 Columns</h4>
69
69
  <div class="mw-tiles mw-tiles-2col">
70
- <div class="mw-tile">
70
+ <a href="#" class="mw-tile">
71
71
  <div class="mw-tile-img">
72
72
  <img
73
73
  src="images/tile-ecommerce.svg"
@@ -81,9 +81,9 @@
81
81
  <p>Inventory tracking and order fulfillment</p>
82
82
  </div>
83
83
  <div class="mw-tile-footer">Last updated: 2024-12-15</div>
84
- </div>
84
+ </a>
85
85
 
86
- <div class="mw-tile">
86
+ <a href="#" class="mw-tile">
87
87
  <div class="mw-tile-img">
88
88
  <img
89
89
  src="images/tile-marketing.svg"
@@ -97,91 +97,91 @@
97
97
  <p>Social media scheduling and analytics</p>
98
98
  </div>
99
99
  <div class="mw-tile-footer">Last updated: 2025-01-02</div>
100
- </div>
100
+ </a>
101
101
  </div>
102
102
  </div>
103
103
 
104
104
  <div>
105
105
  <h4 class="mw-mb-2">Small Tiles in 4 Columns</h4>
106
106
  <div class="mw-tiles mw-tiles-4col">
107
- <div class="mw-tile mw-tile-sm">
107
+ <a href="#" class="mw-tile mw-tile-sm">
108
108
  <h3 class="mw-tile-header">API Documentation</h3>
109
109
  <div class="mw-tile-body">
110
110
  <p>REST API reference guide</p>
111
111
  <p>Code examples and tutorials</p>
112
112
  </div>
113
113
  <div class="mw-tile-footer">Last updated: 2025-01-01</div>
114
- </div>
114
+ </a>
115
115
 
116
- <div class="mw-tile mw-tile-sm">
116
+ <a href="#" class="mw-tile mw-tile-sm">
117
117
  <h3 class="mw-tile-header">Security Center</h3>
118
118
  <div class="mw-tile-body">
119
119
  <p>Two-factor authentication</p>
120
120
  <p>Security audit logs</p>
121
121
  </div>
122
122
  <div class="mw-tile-footer">Last updated: 2024-12-31</div>
123
- </div>
123
+ </a>
124
124
 
125
- <div class="mw-tile mw-tile-sm">
125
+ <a href="#" class="mw-tile mw-tile-sm">
126
126
  <h3 class="mw-tile-header">Backup & Recovery</h3>
127
127
  <div class="mw-tile-body">
128
128
  <p>Automated daily backups</p>
129
129
  <p>One-click data restoration</p>
130
130
  </div>
131
131
  <div class="mw-tile-footer">Last updated: 2024-12-29</div>
132
- </div>
132
+ </a>
133
133
 
134
- <div class="mw-tile mw-tile-sm">
134
+ <a href="#" class="mw-tile mw-tile-sm">
135
135
  <h3 class="mw-tile-header">Performance Monitor</h3>
136
136
  <div class="mw-tile-body">
137
137
  <p>Server uptime: 99.9%</p>
138
138
  <p>Response time: 150ms</p>
139
139
  </div>
140
140
  <div class="mw-tile-footer">Last updated: 2025-01-02</div>
141
- </div>
141
+ </a>
142
142
 
143
- <div class="mw-tile mw-tile-sm">
143
+ <a href="#" class="mw-tile mw-tile-sm">
144
144
  <h3 class="mw-tile-header">Integration Hub</h3>
145
145
  <div class="mw-tile-body">
146
146
  <p>Connect third-party apps</p>
147
147
  <p>Webhook configurations</p>
148
148
  </div>
149
149
  <div class="mw-tile-footer">Last updated: 2024-12-27</div>
150
- </div>
150
+ </a>
151
151
 
152
- <div class="mw-tile mw-tile-sm">
152
+ <a href="#" class="mw-tile mw-tile-sm">
153
153
  <h3 class="mw-tile-header">Mobile App</h3>
154
154
  <div class="mw-tile-body">
155
155
  <p>iOS and Android apps</p>
156
156
  <p>Offline sync capabilities</p>
157
157
  </div>
158
158
  <div class="mw-tile-footer">Last updated: 2024-12-25</div>
159
- </div>
159
+ </a>
160
160
 
161
- <div class="mw-tile mw-tile-sm">
161
+ <a href="#" class="mw-tile mw-tile-sm">
162
162
  <h3 class="mw-tile-header">Training Center</h3>
163
163
  <div class="mw-tile-body">
164
164
  <p>Video tutorials available</p>
165
165
  <p>Certification programs</p>
166
166
  </div>
167
167
  <div class="mw-tile-footer">Last updated: 2025-01-01</div>
168
- </div>
168
+ </a>
169
169
 
170
- <div class="mw-tile mw-tile-sm">
170
+ <a href="#" class="mw-tile mw-tile-sm">
171
171
  <h3 class="mw-tile-header">System Status</h3>
172
172
  <div class="mw-tile-body">
173
173
  <p>All systems operational</p>
174
174
  <p>Last incident: None</p>
175
175
  </div>
176
176
  <div class="mw-tile-footer">Last updated: 2024-12-30</div>
177
- </div>
177
+ </a>
178
178
  </div>
179
179
  </div>
180
180
 
181
181
  <div>
182
182
  <h4 class="mw-mb-2">Large Tiles</h4>
183
183
  <div class="mw-tiles">
184
- <div class="mw-tile mw-tile-lg">
184
+ <a href="#" class="mw-tile mw-tile-lg">
185
185
  <div class="mw-tile-img">
186
186
  <img
187
187
  src="images/tile-cloud.svg"
@@ -200,9 +200,9 @@
200
200
  </p>
201
201
  </div>
202
202
  <div class="mw-tile-footer">Last updated: 2024-12-28</div>
203
- </div>
203
+ </a>
204
204
 
205
- <div class="mw-tile mw-tile-lg">
205
+ <a href="#" class="mw-tile mw-tile-lg">
206
206
  <div class="mw-tile-img">
207
207
  <img
208
208
  src="images/tile-analytics.svg"
@@ -222,9 +222,9 @@
222
222
  </p>
223
223
  </div>
224
224
  <div class="mw-tile-footer">Last updated: 2024-12-31</div>
225
- </div>
225
+ </a>
226
226
 
227
- <div class="mw-tile mw-tile-lg">
227
+ <a href="#" class="mw-tile mw-tile-lg">
228
228
  <div class="mw-tile-img">
229
229
  <img
230
230
  src="images/tile-enterprise.svg"
@@ -241,7 +241,7 @@
241
241
  </p>
242
242
  </div>
243
243
  <div class="mw-tile-footer">Last updated: 2024-12-23</div>
244
- </div>
244
+ </a>
245
245
  </div>
246
246
  </div>
247
247
  </div>
@@ -520,7 +520,13 @@ $z-index: (
520
520
  'lift': 3,
521
521
  'card': 10,
522
522
  'menu': 30,
523
+ // The scrim sits under the bar, the panel hangs off it, the logo clears the
524
+ // panel and the burger stays on top of all of them while it is the X.
525
+ 'header-scrim': 99,
523
526
  'header': 100,
527
+ 'header-panel': 103,
528
+ 'header-logo': 105,
529
+ 'header-burger': 110,
524
530
  'spinner': 300,
525
531
  'modal': 500,
526
532
  'tooltip': 700,
@@ -131,13 +131,22 @@
131
131
  // header height
132
132
  --mw-header-height: #{$header-height};
133
133
 
134
- // Read by the anchor offset of anything the sticky section nav can cover
135
- --mw-section-nav-height: 3.7rem;
134
+ // Read by the anchor offset of anything the sticky section nav can cover.
135
+ // The strip at its tallest: a 2.75rem button under a thumb plus its two
136
+ // 0.5rem paddings. Rounded up rather than down - a pointer gets 2px of
137
+ // slack, and the offset may overshoot but must not undershoot.
138
+ --mw-section-nav-height: 3.75rem;
136
139
 
137
140
  // The anchor scroll offset is calculated from it, so a taller ribbon raises
138
141
  // this token rather than fighting the offset
139
142
  --mw-announcement-height: 2.7rem;
140
143
 
144
+ // What each layer of sticky chrome below the header adds to the scroll
145
+ // offset in the reset. A length and not a bare 0 - calc() cannot add a
146
+ // unitless one.
147
+ --mw-announcement-offset: 0px;
148
+ --mw-section-nav-offset: 0px;
149
+
141
150
  // Fluid rather than stepped: ~24px at 375px up to 64px, where the 1200px cap
142
151
  // takes over. Stepping at a breakpoint makes the container jump *backwards*
143
152
  // there, because the gutter grows faster than the viewport does.
@@ -160,11 +169,12 @@
160
169
  --mw-section-padding-compact: #{spacing('8')};
161
170
  --mw-section-padding-airy: #{spacing('12')};
162
171
  // The third regime beside the stepped default and the two stepped presets:
163
- // spacing that grows with the screen. It starts at the value a phone already
164
- // gets below `sm` and reaches the airy preset at `xl`, so a desktop pushes
165
- // less content past per wheel notch while the phone carries none of that air.
166
- // Needs no steps of its own - the ramp is the steps.
167
- --mw-section-padding-fluid: #{fluid(spacing('7'), spacing('12'), $to: 'xl')};
172
+ // spacing that grows with the screen. Both ends sit beside the spacing scale
173
+ // rather than on it: the nearest steps are a phone value the default already
174
+ // has and a desktop value the airy preset already is, and a ramp that ends
175
+ // where a preset ends is a preset. Needs no steps of its own - the ramp is
176
+ // the steps.
177
+ --mw-section-padding-fluid: #{fluid(35px, 65px, $to: 'xl')};
168
178
  // The section head: the gap it leaves to the content below, the space
169
179
  // between its rule and the title, and the mark sitting on that rule.
170
180
  //
@@ -14,7 +14,13 @@
14
14
  font-size: var(--mw-root-font-size);
15
15
  scroll-behavior: smooth;
16
16
  min-width: 320px;
17
- scroll-padding-top: var(--mw-header-height);
17
+ // Each layer of sticky chrome contributes its own term, so a page carrying
18
+ // both a ribbon and a section nav reserves for both - two rules setting one
19
+ // offset would have the later layer silently win instead.
20
+ scroll-padding-top: calc(
21
+ var(--mw-header-height) + var(--mw-announcement-offset) +
22
+ var(--mw-section-nav-offset)
23
+ );
18
24
  -webkit-text-size-adjust: 100%;
19
25
  text-size-adjust: 100%;
20
26
  @include scrollbar(var(--mw-border), transparent);
@@ -60,9 +60,7 @@
60
60
  // page without a ribbon keeps the plain offset - and a static ribbon does not
61
61
  // count, it scrolls with the content.
62
62
  html:has(.mw-announcement:not(.mw-announcement-static)) {
63
- scroll-padding-top: calc(
64
- var(--mw-header-height) + var(--mw-announcement-height)
65
- );
63
+ --mw-announcement-offset: var(--mw-announcement-height);
66
64
  }
67
65
 
68
66
  // On a phone the line wraps and the ribbon grows - the height token follows,
@@ -8,13 +8,14 @@
8
8
  // One-shot entrance, not a loop, so it belongs on the scale. It ran for
9
9
  // 1.6s before - long enough that the reader is into the second paragraph
10
10
  // while the page is still arriving.
11
- animation: pageReveal var(--mw-duration-slower) var(--mw-ease-out) forwards;
11
+ animation: mw-page-reveal var(--mw-duration-slower) var(--mw-ease-out)
12
+ forwards;
12
13
  border-radius: radius('sm') radius('2xl') radius('sm') radius('2xl');
13
14
  box-shadow:
14
15
  var(--mw-border) 0 30px 60px -18px inset,
15
16
  var(--mw-border) 0 18px 36px -18px inset;
16
17
 
17
- @keyframes pageReveal {
18
+ @keyframes mw-page-reveal {
18
19
  0% {
19
20
  opacity: 0;
20
21
  transform: translateY(-30px) rotateX(10deg);
@@ -81,10 +82,10 @@
81
82
  margin-bottom: spacing('4');
82
83
  font-size: font-size('xl');
83
84
  box-shadow: var(--mw-elevation-2);
84
- animation: iconFlip var(--mw-duration-slower) var(--mw-ease-out)
85
+ animation: mw-icon-flip var(--mw-duration-slower) var(--mw-ease-out)
85
86
  forwards;
86
87
 
87
- @keyframes iconFlip {
88
+ @keyframes mw-icon-flip {
88
89
  0% {
89
90
  transform: rotateY(90deg);
90
91
  }
@@ -280,13 +280,13 @@
280
280
  flex-shrink: 0;
281
281
  text-wrap: balance;
282
282
 
283
- /* push the last element all the way right - a single one included */
283
+ // The last element goes right whether it has company or not, so a lone
284
+ // button sits where the confirming one sits in a pair
284
285
  > *:last-child {
285
286
  margin-left: auto;
286
287
  text-align: right;
287
288
  }
288
289
 
289
- // Ensure buttons maintain their size
290
290
  .mw-btn {
291
291
  flex-shrink: 0;
292
292
  }
@@ -19,10 +19,12 @@
19
19
  gap: spacing('1') spacing('4');
20
20
  }
21
21
 
22
- // Sized rather than auto, so the values line up under each other however
23
- // long the words in front of them are
22
+ // A floor rather than a fixed size, so the values line up under each other
23
+ // however long the words in front of them are - and a label longer than the
24
+ // column still gets its room instead of running into the value beside it
24
25
  &-label {
25
- flex: 0 0 5rem;
26
+ flex: 0 0 auto;
27
+ min-width: 5rem;
26
28
  color: var(--mw-text-muted-color);
27
29
  }
28
30
  }