class UIHandler{constructor(){this.elements={},this.activeComponents=new Set,this.componentStates=new Map,this.observers=new Map,this.handleOutsideClick=this.handleOutsideClick.bind(this),this.handleEscapeKey=this.handleEscapeKey.bind(this)}bindElements(){console.error("bindElements must be implemented by child class")}bindComponentEvents(){this.handlers&&Object.entries(this.handlers).forEach((([e,t])=>{const n=this.elements[e];n&&(n instanceof NodeList||Array.isArray(n)?n.forEach((e=>{this.bindEventsToElement(e,t)})):this.bindEventsToElement(n,t))}))}bindEventsToElement(e,t){"function"==typeof t?e.addEventListener("click",t.bind(this)):"object"==typeof t&&Object.entries(t).forEach((([t,n])=>{"forEach"!==t&&"function"==typeof n&&e.addEventListener(t,n)}))}bindEvents(){document.addEventListener("click",this.handleOutsideClick),document.addEventListener("keydown",this.handleEscapeKey)}isComponentActive(e){return this.activeComponents.has(e)}setComponentState(e,t,n={}){const{element:s,toggle:i,activeClass:r="open",focusElement:o=null,ariaLabel:c=null,ariaHidden:a=null,cleanup:l=null}=n;s&&(t?this.activeComponents.add(e):this.activeComponents.delete(e),s.classList.toggle(r,t),i&&(i.setAttribute("aria-expanded",t.toString()),c&&i.setAttribute("aria-label",c)),null!==a&&s.setAttribute("aria-hidden",(!t).toString()),o&&"function"==typeof o.focus&&o.focus(),!t&&l&&l(),this.componentStates.set(e,{isActive:t,activeClass:r,options:n}))}initializeKeyboardNavigation(e){this.keyboardConfig=e,Object.entries(e).forEach((([e,t])=>{const n=this.elements[e];n&&n.addEventListener("keydown",(e=>{const n=t[e.key];n&&n.call(this,e)}))}))}handleOutsideClick(e){console.error("handleOutsideClick must be implemented by child class")}handleEscapeKey(e){console.error("handleEscapeKey must be implemented by child class")}initializeHandlers(e){e&&"object"==typeof e?this.handlers=Object.entries(e).reduce(((e,[t,n])=>("function"==typeof n?e[t]=n.bind(this):n.forEach?e[t]={...n,handler:n.handler?.bind(this)}:"object"==typeof n&&(e[t]=Object.entries(n).reduce(((e,[t,n])=>(e[t]="function"==typeof n?n.bind(this):n,e)),{})),e)),{}):console.error("Invalid handlers configuration")}createObserver(e,t){return new IntersectionObserver(t,{root:null,rootMargin:"0px",threshold:0,...e})}initializeObserver(e,t,n,s){if(!t||!t.length)return;this.cleanupObserver(e);const i=this.createObserver(n,s);return this.observers.set(e,{observer:i,elements:new Set(t)}),t.forEach((e=>{e&&i.observe(e)})),i}cleanupObserver(e){const t=this.observers.get(e);if(t){const{observer:n,elements:s}=t;s.forEach((e=>{e&&n.unobserve(e)})),n.disconnect(),this.observers.delete(e)}}cleanupAllObservers(){this.observers.forEach(((e,t)=>{this.cleanupObserver(t)}))}cleanup(){document.removeEventListener("click",this.handleOutsideClick),document.removeEventListener("keydown",this.handleEscapeKey),this.cleanupComponentEvents(),this.cleanupAllObservers()}cleanupComponentEvents(){Object.entries(this.handlers).forEach((([e,t])=>{const n=this.elements[e];n&&(t.forEach&&n.forEach?n.forEach((e=>{e._boundHandler&&(e.removeEventListener("click",e._boundHandler),delete e._boundHandler)})):"object"==typeof t&&Object.entries(t).forEach((([e,t])=>{"forEach"!==e&&n.removeEventListener(e,t)})))}))}handleSearchCheckboxes(e){if(!e)return;const t=e.querySelector('input[type="checkbox"][value="1"]'),n=e.querySelectorAll('input[type="checkbox"]:not([value="1"])');if(!t)return;const s=e=>{const s=e.target;if(s===t)s.checked&&n.forEach((e=>{e.checked=!1}));else if(s.checked)t.checked=!1;else{Array.from(n).some((e=>e.checked))||(t.checked=!0)}};e.querySelectorAll('input[type="checkbox"]').forEach((e=>{e.addEventListener("change",s)})),e._removeCheckboxListeners=()=>{e.querySelectorAll('input[type="checkbox"]').forEach((e=>{e.removeEventListener("change",s)}))}}}