stylescape
Version:
Stylescape is a visual identity framework developed by Scape Agency.
12 lines • 102 kB
JavaScript
var B=class{toggleClass(t,e="active"){if(!t){console.warn(`Element: '${t}' not found`);return}t.classList.toggle(e)}};var R=class s{static getInstance(){return s.instance||(s.instance=new s),s.instance}setValue(t,e){try{localStorage&&localStorage.setItem(t,String(e))}catch(i){console.error("Error saving to localStorage:",i)}}getValue(t){try{return localStorage?localStorage.getItem(t):null}catch(e){return console.error("Error reading from localStorage:",e),null}}removeValue(t){try{localStorage&&localStorage.removeItem(t)}catch(e){console.error("Error removing from localStorage:",e)}}clearStorage(){try{localStorage&&localStorage.clear()}catch(t){console.error("Error clearing localStorage:",t)}}};var v=class s{constructor(t,e){this.asideMenu=null;this.asideSwitch=null;this.asideMenuActive=s.HIDDEN_STATE;this.localStorageManager=R.getInstance(),this.stateManager=new B,this.menuId=t,this.switchId=e,this.assertMenu(),this.setupToggleListener(),this.updateStateMenu()}static{this.VISIBLE_CLASS="active"}static{this.VISIBLE_SUFFIX="_visibility"}static{this.VISIBLE_STATE="show"}static{this.HIDDEN_STATE="hide"}assertMenu(){this.asideMenu=document.getElementById(this.menuId),this.asideSwitch=document.getElementById(this.switchId)}setupToggleListener(){this.asideSwitch&&this.asideSwitch.addEventListener("click",()=>this.toggleMenu())}toggleMenu(){this.assertMenu(),this.asideMenu?.classList.contains(s.VISIBLE_CLASS)?this.hideMenu():this.showMenu()}showMenu(){this.assertMenu(),this.localStorageManager.setValue(this.menuId+s.VISIBLE_SUFFIX,s.VISIBLE_STATE),this.updateStateMenu()}hideMenu(){this.assertMenu(),this.localStorageManager.setValue(this.menuId+s.VISIBLE_SUFFIX,s.HIDDEN_STATE),this.updateStateMenu()}updateStateMenu(){if(this.assertMenu(),!this.asideMenu)return;this.asideMenuActive=this.localStorageManager.getValue(this.menuId+s.VISIBLE_SUFFIX)||this.asideMenuActive;let t=this.asideMenuActive===s.VISIBLE_STATE;this.asideMenu.classList.toggle(s.VISIBLE_CLASS,t),this.asideSwitch?.classList.toggle(s.VISIBLE_CLASS,t)}};var f=class{constructor(t=".collapsible_table"){document.querySelectorAll(t).forEach(i=>{let n=i.querySelector(".collapsible_table--header"),o=i.querySelector(".collapsible_table--content"),r=i.querySelector(".flipper--down, .flipper--up");!n||!o||n.addEventListener("click",()=>{o.classList.toggle("expanded"),r&&(r.classList.toggle("flipper--up"),r.classList.toggle("flipper--down"))})})}};var b=class{constructor(t="details:not(.sidebar__accordion)"){this.details=document.querySelectorAll(t),this.boundHandler=this.handleClick.bind(this),document.addEventListener("click",this.boundHandler)}handleClick(t){let n=t.target.closest("summary")?.parentElement;n&&n.tagName==="DETAILS"?this.details.forEach(o=>{o!==n&&o.removeAttribute("open")}):this.details.forEach(o=>o.removeAttribute("open"))}toggle(t,e){e?t.setAttribute("open",""):t.removeAttribute("open")}destroy(){document.removeEventListener("click",this.boundHandler)}};var E=class{constructor(t=".select_dropdown"){this.dropdowns=document.querySelectorAll(t),this.dropdowns.length!==0&&(this.initializeDropdowns(),this.setupGlobalClickListener())}initializeDropdowns(){this.dropdowns.forEach(t=>{let e=t.querySelector(".select_dropdown--header"),i=t.querySelector(".select_dropdown--menu.dropdown--collapse"),n=t.querySelectorAll('input[type="checkbox"]');e&&(e.addEventListener("click",()=>{i&&i.classList.toggle("active");let o=e.querySelector(".flipper--down, .flipper--up");o&&(o.classList.toggle("flipper--down"),o.classList.toggle("flipper--up"))}),n.forEach(o=>{o.addEventListener("change",()=>{this.updateSelectionLabel(t)})}),this.updateSelectionLabel(t))})}updateSelectionLabel(t){let e=t.querySelector("#selected-count"),i=t.querySelectorAll('input[type="checkbox"]');if(!e||i.length===0)return;let n=Array.from(i).filter(o=>o.checked).length;e.textContent=`Selected: ${n} option${n!==1?"s":""}`}setupGlobalClickListener(){document.addEventListener("click",t=>{this.dropdowns.forEach(e=>{let i=e.querySelector(".dropdown--collapse");i&&!e.contains(t.target)&&i.classList.remove("active")})})}};var y=class{constructor(t){this.detailsElements=document.querySelectorAll(t),this.bindEvents()}bindEvents(){this.detailsElements.forEach(t=>{t.addEventListener("click",e=>this.handleDetailsClick(e,t))}),document.addEventListener("click",t=>this.handleClickOutside(t))}handleDetailsClick(t,e){t.stopPropagation(),this.detailsElements.forEach(i=>{i!==e&&i.removeAttribute("open")})}handleClickOutside(t){let e=t.target;Array.from(this.detailsElements).some(n=>n.contains(e))||this.closeAll()}closeAll(){this.detailsElements.forEach(t=>{t.removeAttribute("open")})}};var T=class{constructor(t="[data-password-toggle]"){this.selector=t,this.init()}init(){document.querySelectorAll(this.selector).forEach(t=>{let e=t.dataset.passwordToggle;if(!e)return;let i=document.getElementById(e);!i||i.type!=="password"||t.addEventListener("click",()=>this.togglePasswordVisibility(i,t))})}togglePasswordVisibility(t,e){let i=t.type==="text";t.type=i?"password":"text",e.classList.toggle("is-visible",!i),e.setAttribute("aria-pressed",String(!i))}};var L=class s{constructor(t){this.isActive=!1;if(this.container=t,this.slider=t.querySelector(".image__compare--slider"),this.overlay=t.querySelector(".image__compare--overlay"),this.baseImage=t.querySelector("img.image__compare--image:not(.image__compare--overlay)"),!this.container||!this.slider||!this.overlay||!this.baseImage){console.warn("ImageCompareSlider skipped: required elements not found in",t);return}this.checkAndInject(this.baseImage),this.checkAndInject(this.overlay),this.initEvents(),this.slideMove(this.container.offsetWidth/2)}checkAndInject(t){let e=t.dataset.darkSide;if(!e)return;let i=()=>{this.isImageBright(t).then(n=>{if(!n)return;let o=document.createElement("div");o.className=`dark--${e}`,this.slider.appendChild(o);let r=this.slider.querySelector(`.arrow--${e}`);r&&(r.style.borderColor="var(--color_text_primary)")}).catch(n=>{console.warn("Brightness check failed:",n)})};t.complete&&t.naturalWidth>0?i():t.onload=()=>{t.naturalWidth>0&&i()}}isImageBright(t){return new Promise(e=>{let i=document.createElement("canvas"),n=i.getContext("2d");if(!n)return e(!1);i.width=t.naturalWidth,i.height=t.naturalHeight,n.drawImage(t,0,0);let o=n.getImageData(0,0,i.width,i.height).data,r=0,a=0,l=0,d=0,p=80;for(let u=0;u<o.length;u+=p)r+=o[u],a+=o[u+1],l+=o[u+2],d++;let h=(r+a+l)/(3*d);e(h>160)})}initEvents(){this.slider.addEventListener("mousedown",()=>this.isActive=!0),window.addEventListener("mouseup",()=>this.isActive=!1),window.addEventListener("mousemove",t=>{this.isActive&&this.slideMove(t.clientX)}),this.slider.addEventListener("touchstart",()=>this.isActive=!0),window.addEventListener("touchend",()=>this.isActive=!1),window.addEventListener("touchmove",t=>{this.isActive&&this.slideMove(t.touches[0].clientX)})}slideMove(t){let e=this.container.getBoundingClientRect(),i=t-e.left;i=Math.max(0,Math.min(i,e.width)),this.overlay.style.width=`${i}px`,this.slider.style.left=`${i}px`}static initAll(t=".image__compare"){document.querySelectorAll(t).forEach(i=>{new s(i)})}};var k=class{constructor(t="active"){this.activeClass=t,this.highlightAllLinks()}normalizeUrl(t){let e=document.createElement("a");return e.href=t,e.pathname.replace(/\/+$/,"")+e.search}highlightAllLinks(){let t=this.normalizeUrl(window.location.href);document.querySelectorAll("a").forEach(i=>{if(i.closest(".ribbon__title")||!i.hasAttribute("href")||!i.getAttribute("href"))return;this.normalizeUrl(i.href)===t&&i.classList.add(this.activeClass)})}};var S=class s{constructor(t={}){this.sections=[];this.navLinks=[];this.ticking=!1;this.currentActiveId=null;this.handleScroll=()=>{this.ticking||(window.requestAnimationFrame(()=>{this.updateActiveLink(),this.ticking=!1}),this.ticking=!0)};this.handleLinkClick=t=>{let i=t.currentTarget.getAttribute("href");if(i?.startsWith("#")){t.preventDefault();let n=i.slice(1);this.scrollTo(n),this.options.updateHistory&&history.pushState(null,"",i)}};this.options={navSelector:t.navSelector??"[data-ss-scrollspy-link], .scrollspy-link",containerId:t.containerId??"",threshold:t.threshold??.5,offset:t.offset??0,activeClass:t.activeClass??"active",activeParentClass:t.activeParentClass??"active",smoothScroll:t.smoothScroll??!0,onChange:t.onChange??(()=>{}),updateHistory:t.updateHistory??!1},this.scrollContainer=this.options.containerId?document.getElementById(this.options.containerId)??window:window,this.init()}static fromElements(t,e,i,n=.5){let o=new s({navSelector:e,containerId:i,threshold:n});return o.sections=t,o.updateActiveLink(),o}refresh(){this.findSections(),this.updateActiveLink()}scrollTo(t){let e=document.getElementById(t);if(!e)return;let i=e.offsetTop-this.options.offset;this.scrollContainer instanceof Window?window.scrollTo({top:i,behavior:this.options.smoothScroll?"smooth":"auto"}):this.scrollContainer.scrollTo({top:i,behavior:this.options.smoothScroll?"smooth":"auto"})}getActive(){return this.currentActiveId}destroy(){(this.scrollContainer instanceof Window?window:this.scrollContainer).removeEventListener("scroll",this.handleScroll),this.navLinks.forEach(e=>{e.removeEventListener("click",this.handleLinkClick)}),this.sections=[],this.navLinks=[]}static init(){let t=[];return document.querySelectorAll('[data-ss="scrollspy"]').forEach(e=>{let i=e.dataset.ssScrollspyNav||`#${e.id} a`,n=e.dataset.ssScrollspyThreshold,o=e.dataset.ssScrollspySmooth!=="false",r=e.dataset.ssScrollspyOffset;t.push(new s({navSelector:i,threshold:n?parseFloat(n):void 0,smoothScroll:o,offset:r?parseInt(r,10):void 0}))}),t}init(){this.findSections(),this.bindScrollListener(),this.bindLinkListeners(),this.updateActiveLink()}findSections(){this.navLinks=Array.from(document.querySelectorAll(this.options.navSelector)),this.sections=[],this.navLinks.forEach(t=>{let e=t.getAttribute("href");if(e?.startsWith("#")){let i=e.slice(1),n=document.getElementById(i);n&&!this.sections.includes(n)&&this.sections.push(n)}})}bindScrollListener(){(this.scrollContainer instanceof Window?window:this.scrollContainer).addEventListener("scroll",this.handleScroll,{passive:!0})}bindLinkListeners(){this.navLinks.forEach(t=>{t.addEventListener("click",this.handleLinkClick)})}updateActiveLink(){if(this.sections.length===0||this.navLinks.length===0)return;let t=this.scrollContainer instanceof Window?window.scrollY:this.scrollContainer.scrollTop,e=null;for(let n of this.sections){let o=n.getAttribute("id");if(!o)continue;let r=n.offsetTop-this.options.offset,a=n.offsetHeight,l=r-a*this.options.threshold;t>=l&&(e=o)}if(e===this.currentActiveId)return;this.currentActiveId=e;let i=null;this.navLinks.forEach(n=>{let r=n.getAttribute("href")?.replace("#","")===e;n.classList.toggle(this.options.activeClass,r),n.setAttribute("aria-current",r?"true":"false"),r&&(i=n),this.updateParentClasses(n,r)}),this.options.onChange(e,i)}updateParentClasses(t,e){let i=t.parentElement;for(;i&&i!==document.body;)i.tagName==="LI"&&i.classList.toggle(this.options.activeParentClass,e),i=i.parentElement}};var I=class{constructor(t,e){this.idSet=new Set;this.linkSectionMap=new Map;this.rootId=t,this.tocContainerId=e}generateUniqueId(t){let e=t.toLowerCase().replace(/\s+/g,"-").replace(/[^\w-]/g,""),i=1;for(;this.idSet.has(e);)e=`${t}-${i++}`;return this.idSet.add(e),e}createTOCEntry(t){let e=t.getAttribute("data-label")||"Untitled",i=this.generateUniqueId(e);t.id=i;let n=document.createElement("a");n.href=`#${i}`,n.textContent=e;let o=document.createElement("li");return o.appendChild(n),this.linkSectionMap.set(n,t),o}buildTOCTree(t){let e=document.createElement("ul");return Array.from(t.children).forEach(i=>{if(i instanceof HTMLElement)if(i.hasAttribute("data-label")){let n=this.createTOCEntry(i),o=this.buildTOCTree(i);o.children.length>0&&n.appendChild(o),e.appendChild(n)}else{let n=this.buildTOCTree(i);n.children.length>0&&e.append(...Array.from(n.children))}}),e}buildAndAppendTOC(){let t=document.getElementById(this.rootId),e=document.getElementById(this.tocContainerId);if(!t||!e)return;let i=this.buildTOCTree(t);e.innerHTML="",e.appendChild(i),this.scrollSpyManager=S.fromElements(Array.from(this.linkSectionMap.values()),`#${this.tocContainerId} a`,this.rootId)}getLinkSectionMap(){return this.linkSectionMap}};var D=class s{static copyCodeFromButton(t){let e=t.nextElementSibling;if(!(e instanceof HTMLElement))return;let i=e.innerText;navigator.clipboard.writeText(i).then(()=>{t.textContent="Copied!",setTimeout(()=>{t.textContent="Copy"},1500)})}static attachToButtons(t=".copy-button"){document.querySelectorAll(t).forEach(i=>{i.addEventListener("click",()=>s.copyCodeFromButton(i))})}static copyById(t){let e=document.getElementById(t);if(!(e instanceof HTMLElement)){console.warn(`Code element with ID "${t}" not found.`);return}let i=e.innerText.trim();navigator.clipboard.writeText(i).then(()=>{let n=document.querySelector(`button[onclick*="${t}"]`);if(n){let o=n.textContent;n.textContent="Copied!",setTimeout(()=>{n.textContent=o},1500)}}).catch(n=>{console.error("Failed to copy text:",n)})}};var O=class{constructor(){this.STORAGE_KEY="unitgl:grid:visibility";this.visibilityMap={};document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>this.init()):this.init()}init(){this.loadVisibility(),this.applyVisibilityState(),this.setupToggleButtons(),this.updateAllGridHeights(),window.addEventListener("resize",()=>this.updateAllGridHeights()),window.addEventListener("scroll",()=>this.updateAllGridHeights())}loadVisibility(){try{this.visibilityMap=JSON.parse(localStorage.getItem(this.STORAGE_KEY)||"{}")}catch{this.visibilityMap={}}}saveVisibility(){localStorage.setItem(this.STORAGE_KEY,JSON.stringify(this.visibilityMap))}updateAllGridHeights(){let t=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight,document.documentElement.offsetHeight,document.body.offsetHeight);document.querySelectorAll(".guide--layer").forEach(e=>{e.offsetHeight!==t&&(e.style.height=`${t}px`)})}applyVisibilityState(){document.querySelectorAll(".guide--layer").forEach(t=>{let e=t.dataset.grid,i=!!this.visibilityMap[e];t.classList.toggle("active",i)}),document.querySelectorAll("button[data-toggle]").forEach(t=>{let e=t.dataset.toggle,i=!!this.visibilityMap[e];t.classList.toggle("active",i)})}setupToggleButtons(){document.querySelectorAll("button[data-toggle]").forEach(t=>{let e=t.dataset.toggle,i=document.querySelector(`[data-grid="${e}"]`);i&&t.addEventListener("click",()=>{let n=i.classList.toggle("active");t.classList.toggle("active",n),this.visibilityMap[e]=n,this.saveVisibility()})})}setupEventListeners(){document.addEventListener("DOMContentLoaded",()=>{this.updateAllGridHeights(),this.setupToggleButtons(),window.addEventListener("resize",()=>this.updateAllGridHeights()),window.addEventListener("scroll",()=>this.updateAllGridHeights())})}};var C=class s{static{this.THEME_ATTRIBUTE="theme"}static{this.DARK_THEME="dark"}static{this.LIGHT_THEME="light"}static{this.STORAGE_KEY="preferredTheme"}static{this.htmlElement=document.documentElement}constructor(){}static toggle(){let t=s.getCurrentTheme()===s.DARK_THEME?s.LIGHT_THEME:s.DARK_THEME;s.setTheme(t)}static setTheme(t){s.htmlElement.dataset[s.THEME_ATTRIBUTE]=t,localStorage.setItem(s.STORAGE_KEY,t)}static getCurrentTheme(){return s.htmlElement.dataset[s.THEME_ATTRIBUTE]||localStorage.getItem(s.STORAGE_KEY)||s.LIGHT_THEME}static syncToggleState(t){let e=s.getCurrentTheme();t.checked=e===s.DARK_THEME}static initializeToggleSwitch(t="themeToggle"){let e=document.getElementById(t);e||(e=document.querySelector("[data-theme-toggle]")),e&&(s.syncToggleState(e),e.addEventListener("change",()=>{s.toggle()}))}static registerOnLoad(t="themeToggle"){window.addEventListener("load",()=>{s.initializeToggleSwitch(t)})}};var M=class{constructor(t,e="scrollpos",i=!1){if(this.contentElement=document.querySelector(t),this.storageKey=e,this.debug=i,!this.contentElement){this.debug&&console.warn("ScrollElementManager: Element not found:",t);return}this.initialize()}initialize(){window.addEventListener("load",this.loadScrollPosition.bind(this)),this.contentElement?.addEventListener("scroll",this.updateScrollPosition.bind(this)),this.debug&&console.log("ScrollElementManager initialized.")}loadScrollPosition(){try{let t=sessionStorage.getItem(this.storageKey);t!==null&&this.contentElement&&(this.contentElement.scrollTop=parseInt(t,10),sessionStorage.removeItem(this.storageKey),this.debug&&console.log("Scroll position restored:",t))}catch(t){this.debug&&console.error("ScrollElementManager error loading scroll position:",t)}}updateScrollPosition(){try{this.contentElement&&(sessionStorage.setItem(this.storageKey,this.contentElement.scrollTop.toString()),this.debug&&console.log("Scroll position saved:",this.contentElement.scrollTop))}catch(t){this.debug&&console.error("ScrollElementManager error saving scroll position:",t)}}};var $=class{constructor(){this.key="scrollpos";this.debounceTimeout=null;this.initialize()}initialize(){window.addEventListener("load",()=>this.loadScrollPosition()),window.addEventListener("scroll",()=>this.debounceSaveScroll()),window.addEventListener("beforeunload",()=>this.saveScrollPosition())}loadScrollPosition(){let t=sessionStorage.getItem(this.key);t&&(window.scrollTo(0,parseInt(t,10)),sessionStorage.removeItem(this.key))}saveScrollPosition(){sessionStorage.setItem(this.key,window.scrollY.toString())}debounceSaveScroll(){this.debounceTimeout!==null&&clearTimeout(this.debounceTimeout),this.debounceTimeout=window.setTimeout(()=>{this.saveScrollPosition()},200)}};var q=class{constructor(t="details.sidebar__accordion",e="accordion-state"){this.selector=t,this.storageKey=e,this.accordions=document.querySelectorAll(this.selector),this.init()}init(){this.restoreState(),this.attachListeners()}getAccordionId(t,e){let n=t.querySelector("summary")?.querySelector("h2, h3");return t.id?t.id:n?.textContent?n.textContent.toLowerCase().trim().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,""):`accordion-${e}`}getState(){let t={};return this.accordions.forEach((e,i)=>{let n=this.getAccordionId(e,i);t[n]=e.open}),t}saveState(){try{let t=this.getState();localStorage.setItem(this.storageKey,JSON.stringify(t))}catch(t){console.warn("AccordionState: Could not save state",t)}}restoreState(){try{let t=localStorage.getItem(this.storageKey);if(!t)return;let e=JSON.parse(t);this.accordions.forEach((i,n)=>{let o=this.getAccordionId(i,n);o in e&&(i.open=e[o])})}catch(t){console.warn("AccordionState: Could not restore state",t)}}attachListeners(){this.accordions.forEach(t=>{t.addEventListener("toggle",()=>{this.saveState()})})}clearState(){try{localStorage.removeItem(this.storageKey)}catch(t){console.warn("AccordionState: Could not clear state",t)}}expandAll(){this.accordions.forEach(t=>{t.open=!0}),this.saveState()}collapseAll(){this.accordions.forEach(t=>{t.open=!1}),this.saveState()}};var F=class{constructor(t,e){let i=document.querySelector(t);if(!i)throw new Error(`Input element "${t}" not found`);this.inputElement=i,this.previewElements=Array.from(document.querySelectorAll(e)),this.initialize()}initialize(){this.inputElement.addEventListener("input",()=>this.updatePreviewText()),this.updatePreviewText()}updatePreviewText(){let t=this.inputElement.value||"The quick brown fox jumps over the lazy dog.";this.previewElements.forEach(e=>{e.textContent=t})}};var N=class{constructor(t,e={}){this.observer=null;typeof t=="string"?this.elements=Array.from(document.querySelectorAll(t)):t instanceof HTMLElement?this.elements=[t]:this.elements=Array.from(t),this.options={delay:e.delay??0,duration:e.duration??500,easing:e.easing??"ease",initialOpacity:e.initialOpacity??0,onScroll:e.onScroll??!1,threshold:e.threshold??.1},this.init()}revealAll(){this.elements.forEach(t=>this.reveal(t))}reveal(t){t.style.transition=`opacity ${this.options.duration}ms ${this.options.easing}`,t.style.opacity="1",t.classList.add("reveal--visible"),t.setAttribute("data-ss-reveal-revealed","true")}hide(t){t.style.opacity=String(this.options.initialOpacity),t.classList.remove("reveal--visible"),t.removeAttribute("data-ss-reveal-revealed")}hideAll(){this.elements.forEach(t=>this.hide(t))}destroy(){this.observer&&(this.observer.disconnect(),this.observer=null)}init(){this.elements.forEach(t=>{t.style.opacity=String(this.options.initialOpacity),t.style.transition=`opacity ${this.options.duration}ms ${this.options.easing}`}),this.options.onScroll?this.initIntersectionObserver():this.initLoadReveal()}initLoadReveal(){let t=()=>{setTimeout(()=>this.revealAll(),this.options.delay)};document.readyState==="complete"?t():window.addEventListener("load",t)}initIntersectionObserver(){this.observer=new IntersectionObserver(t=>{t.forEach(e=>{if(e.isIntersecting){let i=e.target;setTimeout(()=>this.reveal(i),this.options.delay),this.observer?.unobserve(i)}})},{threshold:this.options.threshold}),this.elements.forEach(t=>this.observer?.observe(t))}};var V=class{constructor(t,e={}){this.intervalId=null;if(this.element=typeof t=="string"?document.querySelector(t):t,this.options={endTime:e.endTime??new Date(Date.now()+36e5),format:e.format??"HH:MM:SS",endText:e.endText??"Time's up!",interval:e.interval??1e3,onComplete:e.onComplete??(()=>{}),onTick:e.onTick??(()=>{}),leadingZeros:e.leadingZeros!==!1},typeof this.options.endTime=="string"?this.endTime=new Date(this.options.endTime).getTime():typeof this.options.endTime=="number"?this.endTime=this.options.endTime:this.endTime=this.options.endTime.getTime(),!this.element){console.warn("[Stylescape] CountdownTimer element not found");return}this.start()}start(){this.intervalId||(this.tick(),this.intervalId=window.setInterval(()=>this.tick(),this.options.interval))}stop(){this.intervalId&&(clearInterval(this.intervalId),this.intervalId=null)}reset(t){this.stop(),typeof t=="string"?this.endTime=new Date(t).getTime():typeof t=="number"?this.endTime=t:this.endTime=t.getTime(),this.start()}getRemaining(){let t=Math.max(0,this.endTime-Date.now());return{total:t,days:Math.floor(t/(1e3*60*60*24)),hours:Math.floor(t/(1e3*60*60)%24),minutes:Math.floor(t/(1e3*60)%60),seconds:Math.floor(t/1e3%60)}}destroy(){this.stop(),this.element=null}tick(){let t=this.getRemaining();if(this.options.onTick(t),t.total<=0){this.stop(),this.updateDisplay(this.options.endText),this.options.onComplete();return}this.updateDisplay(this.formatTime(t))}formatTime(t){let e=i=>this.options.leadingZeros?i.toString().padStart(2,"0"):i.toString();switch(this.options.format){case"DD:HH:MM:SS":return`${e(t.days)}:${e(t.hours)}:${e(t.minutes)}:${e(t.seconds)}`;case"full":return`${t.days}d ${t.hours}h ${t.minutes}m ${t.seconds}s`;case"compact":return t.days>0?`${t.days}d ${t.hours}h`:t.hours>0?`${t.hours}h ${t.minutes}m`:`${t.minutes}m ${t.seconds}s`;default:{let i=t.days*24+t.hours;return`${e(i)}:${e(t.minutes)}:${e(t.seconds)}`}}}updateDisplay(t){this.element&&(this.element.textContent=t)}};var K=class{constructor(t,e={}){this.isHidden=!1;if(this.element=typeof t=="string"?document.querySelector(t):t,this.options={timeout:e.timeout??500,hiddenClass:e.hiddenClass??"preloader--hidden",minDisplayTime:e.minDisplayTime??0,onHide:e.onHide??(()=>{})},this.startTime=Date.now(),!this.element){console.warn("[Stylescape] Preloader element not found");return}this.init()}show(){this.element&&(this.isHidden=!1,this.startTime=Date.now(),this.element.classList.remove(this.options.hiddenClass),this.element.setAttribute("aria-hidden","false"))}hide(){if(!this.element||this.isHidden)return;let t=Date.now()-this.startTime,e=Math.max(0,this.options.minDisplayTime-t);setTimeout(()=>{this.element&&(this.element.classList.add(this.options.hiddenClass),this.element.setAttribute("aria-hidden","true"),this.isHidden=!0,this.options.onHide())},e)}destroy(){this.hide(),this.element=null}init(){this.element?.setAttribute("role","progressbar"),this.element?.setAttribute("aria-busy","true"),this.element?.setAttribute("aria-hidden","false"),document.readyState==="complete"?this.scheduleHide():window.addEventListener("load",()=>this.scheduleHide())}scheduleHide(){setTimeout(()=>this.hide(),this.options.timeout)}};var z=class{constructor(t,e={}){if(this.element=typeof t=="string"?document.querySelector(t):t,this.options={value:e.value??0,min:e.min??0,max:e.max??100,animate:e.animate!==!1,animationDuration:e.animationDuration??300,onChange:e.onChange??(()=>{}),onComplete:e.onComplete??(()=>{}),property:e.property??"width"},this.currentValue=this.options.value,this.bar=this.element?.querySelector("[class*='bar']")||this.element,!this.element){console.warn("[Stylescape] ProgressBarManager element not found");return}this.init()}setProgress(t){let e=Math.min(Math.max(t,this.options.min),this.options.max),i=this.calculatePercentage(e);this.currentValue=e,this.updateDisplay(i),this.options.onChange(e,i),i>=100&&this.options.onComplete()}getProgress(){return this.currentValue}getPercentage(){return this.calculatePercentage(this.currentValue)}increment(t=1){this.setProgress(this.currentValue+t)}decrement(t=1){this.setProgress(this.currentValue-t)}reset(){this.setProgress(this.options.min)}complete(){this.setProgress(this.options.max)}setIndeterminate(t){this.element&&(this.element.classList.toggle("progress--indeterminate",t),this.element.removeAttribute("aria-valuenow"))}destroy(){this.element=null,this.bar=null}init(){this.element&&(this.element.setAttribute("role","progressbar"),this.element.setAttribute("aria-valuemin",String(this.options.min)),this.element.setAttribute("aria-valuemax",String(this.options.max)),this.bar&&this.options.animate&&(this.bar.style.transition=`${this.options.property} ${this.options.animationDuration}ms ease`),this.setProgress(this.currentValue))}calculatePercentage(t){let e=this.options.max-this.options.min;return(t-this.options.min)/e*100}updateDisplay(t){!this.bar||!this.element||(this.bar.style[this.options.property]=`${t}%`,this.element.setAttribute("aria-valuenow",String(this.currentValue)),this.element.setAttribute("data-progress",String(Math.round(t))))}};var U=class{constructor(t,e={}){this.originalContent="";this.isLoading=!1;this.handleClick=async t=>{if(!(!this.button||this.isLoading)){this.options.ripple&&this.createRipple(t),this.options.loading&&this.startLoading();try{await this.options.onClick(this.button,t)}finally{this.options.loading&&this.stopLoading()}}};if(this.button=typeof t=="string"?document.querySelector(t):t,this.options={loading:e.loading??!1,disableOnLoading:e.disableOnLoading!==!1,loadingHtml:e.loadingHtml??'<span class="button__spinner"></span>',ripple:e.ripple??!1,rippleColor:e.rippleColor??"rgba(255, 255, 255, 0.3)",onClick:e.onClick??(()=>{})},!this.button){console.warn("[Stylescape] ButtonHandler button not found");return}this.originalContent=this.button.innerHTML,this.init()}startLoading(){!this.button||this.isLoading||(this.isLoading=!0,this.originalContent=this.button.innerHTML,this.options.disableOnLoading&&(this.button.disabled=!0),this.button.classList.add("button--loading"),this.button.innerHTML=this.options.loadingHtml,this.button.setAttribute("aria-busy","true"))}stopLoading(){!this.button||!this.isLoading||(this.isLoading=!1,this.button.disabled=!1,this.button.classList.remove("button--loading"),this.button.innerHTML=this.originalContent,this.button.setAttribute("aria-busy","false"))}click(){this.button?.click()}enable(){this.button&&(this.button.disabled=!1)}disable(){this.button&&(this.button.disabled=!0)}destroy(){this.button?.removeEventListener("click",this.handleClick),this.button=null}init(){this.button&&(this.button.addEventListener("click",this.handleClick),this.options.ripple&&(this.button.style.position="relative",this.button.style.overflow="hidden"))}createRipple(t){if(!this.button)return;let e=document.createElement("span");e.className="button__ripple";let i=this.button.getBoundingClientRect(),n=Math.max(i.width,i.height),o=t.clientX-i.left-n/2,r=t.clientY-i.top-n/2;e.style.cssText=`
position: absolute;
width: ${n}px;
height: ${n}px;
left: ${o}px;
top: ${r}px;
background: ${this.options.rippleColor};
border-radius: 50%;
transform: scale(0);
animation: ripple 0.6s linear;
pointer-events: none;
`,this.button.appendChild(e),e.addEventListener("animationend",()=>{e.remove()})}};var Z=class{constructor(t,e={}){this.labelElement=null;this.handleChange=()=>{this.element&&(this.options.persist&&localStorage.setItem(this.options.storageKey,String(this.element.checked)),this.updateUI(),this.updateAriaState(),this.options.onChange(this.element.checked,this.element))};if(this.element=typeof t=="string"?document.querySelector(t):t,this.options={checked:e.checked??!1,storageKey:e.storageKey??this.element?.id??"toggle-state",persist:e.persist??!1,onChange:e.onChange??(()=>{}),onClass:e.onClass??"toggle--on",offClass:e.offClass??"toggle--off",onLabel:e.onLabel??"",offLabel:e.offLabel??""},!this.element){console.warn("[Stylescape] ToggleSwitchManager element not found");return}this.init()}get isOn(){return this.element?.checked??!1}set isOn(t){this.element&&(this.element.checked=t,this.handleChange())}toggle(){this.isOn=!this.isOn}on(){this.isOn=!0}off(){this.isOn=!1}destroy(){this.element?.removeEventListener("change",this.handleChange),this.element=null}init(){if(this.element){if(this.options.persist){let t=localStorage.getItem(this.options.storageKey);t!==null?this.element.checked=t==="true":this.element.checked=this.options.checked}else this.element.checked=this.options.checked;this.element.id&&(this.labelElement=document.querySelector(`label[for="${this.element.id}"]`)),this.element.setAttribute("role","switch"),this.updateAriaState(),this.element.addEventListener("change",this.handleChange),this.updateUI()}}updateUI(){if(!this.element)return;let t=this.element.parentElement;if(t?.classList.toggle(this.options.onClass,this.element.checked),t?.classList.toggle(this.options.offClass,!this.element.checked),this.labelElement&&(this.options.onLabel||this.options.offLabel)){let e=this.element.checked?this.options.onLabel:this.options.offLabel;e&&(this.labelElement.textContent=e)}}updateAriaState(){this.element?.setAttribute("aria-checked",String(this.element?.checked??!1))}};var G=class{constructor(t,e={}){this.debounceTimer=null;this.handleInput=()=>{this.debounceTimer&&clearTimeout(this.debounceTimer),this.debounceTimer=window.setTimeout(()=>{this.filter()},this.options.debounce)};if(this.input=typeof t=="string"?document.querySelector(t):t,this.options={itemSelector:e.itemSelector??".filter-item",searchIn:e.searchIn??"textContent",debounce:e.debounce??150,caseSensitive:e.caseSensitive??!1,minChars:e.minChars??0,hiddenClass:e.hiddenClass??"filter--hidden",matchClass:e.matchClass??"filter--match",onFilter:e.onFilter??(()=>{}),onEmpty:e.onEmpty??(()=>{})},this.items=[],!this.input){console.warn("[Stylescape] FilterManager input not found");return}this.init()}filter(t){let e=t??this.input?.value??"";return this.applyFilter(e)}clear(){this.input&&(this.input.value=""),this.showAll()}showAll(){this.items.forEach(t=>{t.classList.remove(this.options.hiddenClass),t.classList.remove(this.options.matchClass)})}refresh(){this.items=Array.from(document.querySelectorAll(this.options.itemSelector))}getMatches(){return this.items.filter(t=>!t.classList.contains(this.options.hiddenClass))}destroy(){this.input?.removeEventListener("input",this.handleInput),this.input=null,this.items=[]}init(){this.refresh(),this.input?.addEventListener("input",this.handleInput),this.input?.value&&this.filter()}applyFilter(t){if(t.length<this.options.minChars)return this.showAll(),this.items;let e=this.options.caseSensitive?t:t.toLowerCase(),i=[];return this.items.forEach(n=>{let o=this.getSearchContent(n),a=(this.options.caseSensitive?o:o.toLowerCase()).includes(e);n.classList.toggle(this.options.hiddenClass,!a),n.classList.toggle(this.options.matchClass,a),a&&i.push(n)}),this.options.onFilter(i,t),i.length===0&&t.length>0&&this.options.onEmpty(t),i}getSearchContent(t){return(Array.isArray(this.options.searchIn)?this.options.searchIn:[this.options.searchIn]).map(i=>i==="textContent"?t.textContent||"":t.getAttribute(i)||t.dataset[i]||"").join(" ")}};var W=class{constructor(t,e={}){this.hoverValue=null;this.handleClick=t=>{if(this.options.readOnly)return;let e=t.currentTarget,i=this.getStarValue(e,t);this.setValue(i)};this.handleMouseEnter=t=>{if(this.options.readOnly)return;let e=t.currentTarget;this.hoverValue=this.getStarValue(e,t),this.updateDisplay()};this.handleMouseLeave=()=>{};this.handleKeyDown=t=>{if(this.options.readOnly)return;let e=this.options.half?.5:1;switch(t.key){case"ArrowRight":case"ArrowUp":t.preventDefault(),this.setValue(Math.min(this.currentValue+e,this.options.max));break;case"ArrowLeft":case"ArrowDown":t.preventDefault(),this.setValue(Math.max(this.currentValue-e,0));break;case"Home":t.preventDefault(),this.setValue(0);break;case"End":t.preventDefault(),this.setValue(this.options.max);break}};if(this.container=typeof t=="string"?document.querySelector(t):t,this.options={max:e.max??5,value:e.value??0,readOnly:e.readOnly??!1,half:e.half??!1,starSelector:e.starSelector??".star, [data-value]",activeClass:e.activeClass??"rating__star--active",halfClass:e.halfClass??"rating__star--half",hoverClass:e.hoverClass??"rating__star--hover",onChange:e.onChange??(()=>{})},this.currentValue=this.options.value,this.stars=[],!this.container){console.warn("[Stylescape] RatingManager container not found");return}this.init()}getValue(){return this.currentValue}setValue(t){let e=Math.min(Math.max(t,0),this.options.max);this.currentValue=this.options.half?e:Math.round(e),this.updateDisplay(),this.options.onChange(this.currentValue)}reset(){this.setValue(0)}setReadOnly(t){this.options.readOnly=t,this.container?.classList.toggle("rating--readonly",t),t?this.container?.setAttribute("aria-readonly","true"):this.container?.removeAttribute("aria-readonly")}destroy(){this.stars.forEach(t=>{t.removeEventListener("click",this.handleClick),t.removeEventListener("mouseenter",this.handleMouseEnter),t.removeEventListener("mouseleave",this.handleMouseLeave)}),this.container?.removeEventListener("keydown",this.handleKeyDown),this.container=null,this.stars=[]}init(){this.container&&(this.stars=Array.from(this.container.querySelectorAll(this.options.starSelector)),this.stars.length===0&&this.createStars(),this.container.setAttribute("role","slider"),this.container.setAttribute("aria-valuemin","0"),this.container.setAttribute("aria-valuemax",String(this.options.max)),this.container.setAttribute("aria-valuenow",String(this.currentValue)),this.container.setAttribute("tabindex","0"),this.options.readOnly||(this.stars.forEach((t,e)=>{t.addEventListener("click",this.handleClick),t.addEventListener("mouseenter",this.handleMouseEnter),t.addEventListener("mouseleave",this.handleMouseLeave),t.hasAttribute("data-value")||t.setAttribute("data-value",String(e+1))}),this.container.addEventListener("keydown",this.handleKeyDown),this.container.addEventListener("mouseleave",()=>{this.hoverValue=null,this.updateDisplay()})),this.updateDisplay())}createStars(){if(this.container)for(let t=1;t<=this.options.max;t++){let e=document.createElement("span");e.className="rating__star",e.setAttribute("data-value",String(t)),e.textContent="\u2605",this.container.appendChild(e),this.stars.push(e)}}getStarValue(t,e){let i=parseInt(t.getAttribute("data-value")||"0",10);if(this.options.half){let n=t.getBoundingClientRect();return e.clientX<n.left+n.width/2?i-.5:i}return i}updateDisplay(){let t=this.hoverValue??this.currentValue;this.stars.forEach(e=>{let i=parseInt(e.getAttribute("data-value")||"0",10),n=i<=t,o=this.options.half&&i-.5===t,r=this.hoverValue!==null;e.classList.toggle(this.options.activeClass,n&&!o),e.classList.toggle(this.options.halfClass,o),e.classList.toggle(this.options.hoverClass,r&&i<=t)}),this.container?.setAttribute("aria-valuenow",String(this.currentValue))}};var Y=class s{constructor(t,e={}){this.items=[];this.handleClick=t=>{let e=t.currentTarget,i=this.items.findIndex(n=>n.header===e);i!==-1&&this.toggle(i)};this.handleKeydown=t=>{let e=t.currentTarget,i=this.items.findIndex(n=>n.header===e);switch(t.key){case"Enter":case" ":t.preventDefault(),this.toggle(i);break;case"ArrowDown":t.preventDefault(),this.focusHeader((i+1)%this.items.length);break;case"ArrowUp":t.preventDefault(),this.focusHeader((i-1+this.items.length)%this.items.length);break;case"Home":t.preventDefault(),this.focusHeader(0);break;case"End":t.preventDefault(),this.focusHeader(this.items.length-1);break}};if(this.container=typeof t=="string"?document.querySelector(t):t,this.options={allowMultiple:e.allowMultiple??!1,defaultOpen:e.defaultOpen??-1,animationDuration:e.animationDuration??300,activeHeaderClass:e.activeHeaderClass??"accordion-header--active",activeContentClass:e.activeContentClass??"accordion-content--active",onOpen:e.onOpen??(()=>{}),onClose:e.onClose??(()=>{}),contentSelector:e.contentSelector??"[data-ss-accordion-content]"},!this.container){console.warn("[Stylescape] AccordionManager container not found");return}this.init()}open(t){t<0||t>=this.items.length||(this.options.allowMultiple||this.items.forEach((e,i)=>{i!==t&&e.isOpen&&this.closeItem(i)}),this.openItem(t))}close(t){t<0||t>=this.items.length||this.closeItem(t)}toggle(t){t<0||t>=this.items.length||(this.items[t].isOpen?this.close(t):this.open(t))}openAll(){this.items.forEach((t,e)=>this.openItem(e))}closeAll(){this.items.forEach((t,e)=>this.closeItem(e))}isOpen(t){return this.items[t]?.isOpen??!1}destroy(){this.items.forEach(t=>{t.header.removeEventListener("click",this.handleClick),t.header.removeEventListener("keydown",this.handleKeydown)}),this.items=[]}static initAccordions(){let t=[];return document.querySelectorAll('[data-ss="accordion"]').forEach(i=>{let n=i.dataset.ssAccordionMultiple==="true",o=i.dataset.ssAccordionDefaultOpen;t.push(new s(i,{allowMultiple:n,defaultOpen:o?parseInt(o,10):-1}))}),t}init(){if(!this.container)return;this.container.querySelectorAll("[data-ss-accordion-header], .accordion-header").forEach((e,i)=>{let n=this.findContent(e);if(!n)return;let o=`accordion-content-${i}-${Date.now()}`;n.id=n.id||o,e.setAttribute("aria-expanded","false"),e.setAttribute("aria-controls",n.id),n.setAttribute("role","region"),n.setAttribute("aria-labelledby",e.id||`accordion-header-${i}`),e.hasAttribute("tabindex")||e.setAttribute("tabindex","0"),n.hidden=!0,n.style.overflow="hidden",this.items.push({header:e,content:n,isOpen:!1}),e.addEventListener("click",this.handleClick),e.addEventListener("keydown",this.handleKeydown)}),this.openDefaults()}findContent(t){let e=t.nextElementSibling;return e?.matches(this.options.contentSelector)?e:t.parentElement?.querySelector(this.options.contentSelector)??null}openDefaults(){let t=this.options.defaultOpen;Array.isArray(t)?t.forEach(e=>this.openItem(e)):t>=0&&this.openItem(t)}openItem(t){let e=this.items[t];if(!e||e.isOpen)return;e.header.setAttribute("aria-expanded","true"),e.header.classList.add(this.options.activeHeaderClass),e.content.hidden=!1,e.content.classList.add(this.options.activeContentClass);let i=e.content.scrollHeight;e.content.style.height="0px",requestAnimationFrame(()=>{e.content.style.transition=`height ${this.options.animationDuration}ms ease`,e.content.style.height=`${i}px`,setTimeout(()=>{e.content.style.height="",e.content.style.transition=""},this.options.animationDuration)}),e.isOpen=!0,this.options.onOpen(e.header,e.content,t)}closeItem(t){let e=this.items[t];if(!e||!e.isOpen)return;e.header.setAttribute("aria-expanded","false"),e.header.classList.remove(this.options.activeHeaderClass),e.content.classList.remove(this.options.activeContentClass);let i=e.content.scrollHeight;e.content.style.height=`${i}px`,requestAnimationFrame(()=>{e.content.style.transition=`height ${this.options.animationDuration}ms ease`,e.content.style.height="0px",setTimeout(()=>{e.content.hidden=!0,e.content.style.height="",e.content.style.transition=""},this.options.animationDuration)}),e.isOpen=!1,this.options.onClose(e.header,e.content,t)}focusHeader(t){this.items[t]?.header.focus()}};var j=class s{constructor(t,e={}){this.trigger=null;this.content=null;this.isExpanded=!1;this.handleClick=t=>{this.content?.contains(t.target)&&t.target!==this.trigger||this.toggle()};this.handleKeydown=t=>{(t.key==="Enter"||t.key===" ")&&(t.preventDefault(),this.toggle())};if(this.element=typeof t=="string"?document.querySelector(t):t,this.options={expanded:e.expanded??!1,animationDuration:e.animationDuration??300,collapsedClass:e.collapsedClass??"collapsible--collapsed",expandedClass:e.expandedClass??"collapsible--expanded",persist:e.persist??!1,storageKey:e.storageKey??this.element?.id??"collapsible-state",onExpand:e.onExpand??(()=>{}),onCollapse:e.onCollapse??(()=>{}),triggerSelector:e.triggerSelector??"[data-ss-collapsible-trigger]",contentSelector:e.contentSelector??"[data-ss-collapsible-content]"},!this.element){console.warn("[Stylescape] CollapsibleSectionManager element not found");return}this.init()}get expanded(){return this.isExpanded}set expanded(t){t?this.expand():this.collapse()}toggle(){this.isExpanded?this.collapse():this.expand()}expand(){if(!this.element||!this.content||this.isExpanded)return;this.isExpanded=!0,this.element.classList.remove(this.options.collapsedClass),this.element.classList.add(this.options.expandedClass),this.trigger?.setAttribute("aria-expanded","true"),this.content.hidden=!1;let t=this.content.scrollHeight;this.content.style.height="0px",this.content.style.overflow="hidden",requestAnimationFrame(()=>{this.content&&(this.content.style.transition=`height ${this.options.animationDuration}ms ease`,this.content.style.height=`${t}px`,setTimeout(()=>{this.content&&(this.content.style.height="",this.content.style.overflow="",this.content.style.transition="")},this.options.animationDuration))}),this.options.persist&&localStorage.setItem(this.options.storageKey,"true"),this.options.onExpand(this.element)}collapse(){if(!this.element||!this.content||!this.isExpanded)return;this.isExpanded=!1,this.element.classList.add(this.options.collapsedClass),this.element.classList.remove(this.options.expandedClass),this.trigger?.setAttribute("aria-expanded","false");let t=this.content.scrollHeight;this.content.style.height=`${t}px`,this.content.style.overflow="hidden",requestAnimationFrame(()=>{this.content&&(this.content.style.transition=`height ${this.options.animationDuration}ms ease`,this.content.style.height="0px",setTimeout(()=>{this.content&&(this.content.hidden=!0,this.content.style.height="",this.content.style.overflow="",this.content.style.transition="")},this.options.animationDuration))}),this.options.persist&&localStorage.setItem(this.options.storageKey,"false"),this.options.onCollapse(this.element)}destroy(){this.trigger?.removeEventListener("click",this.handleClick),this.trigger?.removeEventListener("keydown",this.handleKeydown),this.element=null,this.trigger=null,this.content=null}static initCollapsibles(){let t=[];return document.querySelectorAll('[data-ss="collapsible"]').forEach(e=>{let i=e.dataset.ssCollapsibleExpanded==="true",n=e.dataset.ssCollapsiblePersist==="true";t.push(new s(e,{expanded:i,persist:n}))}),t}init(){if(!this.element)return;this.trigger=this.element.querySelector(this.options.triggerSelector)||this.element.querySelector(".collapsible-trigger")||this.element,this.content=this.element.querySelector(this.options.contentSelector)||this.element.querySelector(".collapsible-content"),this.content||(this.content=this.element);let t=this.content.id||`collapsible-content-${Date.now()}`;this.content.id=t,this.trigger.setAttribute("aria-controls",t),!this.trigger.hasAttribute("tabindex")&&this.trigger.tagName!=="BUTTON"&&this.trigger.setAttribute("tabindex","0");let e=this.options.expanded;if(this.options.persist){let i=localStorage.getItem(this.options.storageKey);i!==null&&(e=i==="true")}this.isExpanded=!e,this.toggle(),this.trigger.addEventListener("click",this.handleClick),this.trigger.addEventListener("keydown",this.handleKeydown)}};var _=class s{constructor(t,e={}){this.triggerElement=null;this.focusableElements=[];this.isOpen=!1;this.backdropElement=null;this.handleKeydown=t=>{if(t.key==="Escape"&&this.options.closeOnEscape){t.preventDefault(),this.close();return}t.key==="Tab"&&this.options.trapFocus&&this.handleTabKey(t)};this.handleCloseClick=()=>{this.close()};if(this.element=typeof t=="string"?document.querySelector(t):t,this.options={closeOnBackdrop:e.closeOnBackdrop??!0,closeOnEscape:e.closeOnEscape??!0,animationDuration:e.animationDuration??300,openClass:e.openClass??"modal--open",backdropClass:e.backdropClass??"modal-backdrop",trapFocus:e.trapFocus??!0,focusElement:e.focusElement??"",returnFocus:e.returnFocus??!0,onOpen:e.onOpen??(()=>{}),onClose:e.onClose??(()=>{}),onBeforeClose:e.onBeforeClose??(()=>!0)},!this.element){console.warn("[Stylescape] Modal element not found");return}this.init()}get opened(){return this.isOpen}open(t){!this.element||this.isOpen||(this.triggerElement=t||document.activeElement,this.createBackdrop(),this.element.hidden=!1,this.element.setAttribute("aria-hidden","false"),document.body.classList.add("modal-open"),document.body.style.overflow="hidden",requestAnimationFrame(()=>{this.element?.classList.add(this.options.openClass),this.backdropElement?.classList.add(`${this.options.backdropClass}--visible`)}),this.updateFocusableElements(),this.setInitialFocus(),document.addEventListener("keydown",this.handleKeydown),this.isOpen=!0,this.options.onOpen(this.element))}close(){!this.element||!this.isOpen||this.options.onBeforeClose(this.element)!==!1&&(this.element.classList.remove(this.options.openClass),this.backdropElement?.classList.remove(`${this.options.backdropClass}--visible`),setTimeout(()=>{this.element&&(this.element.hidden=!0,this.element.setAttribute("aria-hidden","true"),document.body.classList.remove("modal-open"),document.body.style.overflow="",this.removeBackdrop(),this.options.returnFocus&&this.triggerElement&&this.triggerElement.focus(),this.isOpen=!1,this.options.onClose(this.element))},this.options.animationDuration),document.removeEventListener("keydown",this.handleKeydown))}toggle(t){this.isOpen?this.close():this.open(t)}setContent(t){let e=this.element?.querySelector("[data-ss-modal-content], .modal-content");e&&(e.innerHTML=t,this.updateFocusableElements())}destroy(){this.close(),document.removeEventListener("keydown",this.handleKeydown),this.element?.querySelectorAll("[data-ss-modal-close]").forEach(t=>{t.removeEventListener("click",this.handleCloseClick)}),this.element=null}static initModals(){let t=[],e=new Map;return document.querySelectorAll('[data-ss="modal"]').forEach(i=>{let n=i.dataset.ssModalCloseBackdrop!=="false",o=i.dataset.ssModalCloseEscape!=="false",r=new s(i,{closeOnBackdrop:n,closeOnEscape:o});t.push(r),i.id&&e.set(`#${i.id}`,r)}),document.querySelectorAll("[data-ss-modal-trigger]").forEach(i=>{let n=i.dataset.ssModalTrigger;if(n){let o=e.get(n);o&&i.addEventListener("click",()=>o.open(i))}}),t}init(){this.element&&(this.element.setAttribute("role","dialog"),this.element.setAttribute("aria-modal","true"),this.element.setAttribute("aria-hidden","true"),this.element.hidden=!0,this.element.querySelectorAll("[data-ss-modal-close]").forEach(t=>{t.addEventListener("click",this.handleCloseClick)}))}createBackdrop(){this.backdropElement=document.createElement("div"),this.backdropElement.className=this.options.backdropClass,this.options.closeOnBackdrop&&this.backdropElement.addEventListener("click",()=>this.close()),document.body.appendChild(this.backdropElement)}removeBackdrop(){this.backdropElement?.remove(),this.backdropElement=null}updateFocusableElements(){if(!this.element)return;let t=["button:not([disabled])","input:not([disabled])","select:not([disabled])","textarea:not([disabled])","a[href]",'[tabindex]:not([tabindex="-1"])'].join(",");this.focusableElements=Array.from(this.element.querySelectorAll(t))}setInitialFocus(){if(this.element){if(this.options.focusElement){let t=this.element.querySelector(this.options.focusElement);if(t){t.focus();return}}this.focusableElements.length>0?this.focusableElements[0].focus():(this.element.setAttribute("tabindex","-1"),this.element.focus())}}handleTabKey(t){if(this.focusableElements.length===0)return;let e=this.focusableElements[0],i=this.focusableElements[this.focusableElements.length-1];t.shiftKey?document.activeElement===e&&(t.preventDefault(),i.focus()):document.activeElement===i&&(t.preventDefault(),e.focus())}};var X=class s{constructor(t={}){this.container=null;this.notifications=new Map;this.options={position:t.position??"top-right",maxNotifications:t.maxNotifications??5,cssClass:t.cssClass??"ss-notification",animationDuration:t.animationDuration??300,defaultDuration:t.defaultDuration??4e3,newestOnTop:t.newestOnTop??!0,pauseOnHover:t.pauseOnHover??!0},this.createContainer(),s.instance||(s.instance=this)}static{this.instance=null}success(t,e){return this.show({...e,message:t,type:"success"})}error(t,e){return this.show({...e,message:t,type:"error",duration:e?.duration??0})}warning(t,e){return this.show({...e,message:t,type:"warning"})}info(t,e){return this.show({...e,message:t,type:"info"})}show(t){if(this.notifications.size>=this.options.maxNotifications){let r=this.options.newestOnTop?Array.from(this.notifications.keys()).pop():Array.from(this.notifications.keys()).shift();r&&this.dismiss(r)}let e=`notification-${Date.now()}-${Math.random().toString(36).slice(2)}`,i=this.createNotification(e,t),n=t.duration??this.options.defaultDuration,o={id:e,element:i,options:t,timeout:null,startTime:Date.now(),remainingTime:n};return this.notifications.set(e,o),this.options.newestOnTop?this.container?.prepend(i):this.container?.appendChild(i),requestAnimationFrame(()