designbase-wp-library 0.8.0 → 0.8.1

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.
@@ -1 +1 @@
1
- var DEWP=function(){"use strict";function e(e,t=document){return t.querySelector(e)}function t(e,t=document){return Array.from(t.querySelectorAll(e))}function s(e,t={}){const s=document.createElement(e);return Object.assign(s,t),s}function i(e,t){e.classList.add(t)}function n(e,t){e.classList.remove(t)}function o(e,t,s){return e.classList.toggle(t,s)}function r(e,t){return e.classList.contains(t)}function a(e,t){e.textContent=t}function d(e,t){e.innerHTML=t}function c(e,t,s,i){e.addEventListener(t,s,i)}function l(e,t,s,i){e.removeEventListener(t,s,i)}function p(e){e.remove()}function h(e,t){e.appendChild(t)}function u(e,t,s){e.insertBefore(t,s)}function m(e,t,s){e.style.setProperty(t,s)}function w(e,t,s){e.setAttribute(`data-${t}`,s)}function g(e,t){return e.getAttribute(`data-${t}`)}function v(){return"loading"!==document.readyState}function b(e){v()?e():c(document,"DOMContentLoaded",e,{once:!0})}function f(e,t=0){return new Promise(s=>{const i=new IntersectionObserver(([e])=>{i.disconnect(),s(e.isIntersecting)},{threshold:t});i.observe(e)})}function y(e,t="smooth"){e.scrollIntoView({behavior:t,block:"start"})}function E(e){return e.getBoundingClientRect()}function A(e,t){return t.contains(e)}function I(e){for(;e.firstChild;)e.removeChild(e.firstChild)}const D=new class{constructor(){this.container=null,this.init()}init(){this.createContainer()}createContainer(){const e=document.getElementById("dewp-toast-container");e&&e.remove(),this.container=document.createElement("div"),this.container.id="dewp-toast-container",this.container.className="dewp-toast-container dewp-toast-container-top-right",document.body.appendChild(this.container)}show(e,t="info",s=5e3,i="md"){this.container||this.createContainer();const n="dewp-toast-"+Date.now(),o=this.createToastElement(n,e,t,i);try{Array.from(this.container.querySelectorAll(".dewp-toast .dewp-toast-message")).some(t=>t.textContent===String(e))&&this.hideAll()}catch(e){}return this.container.appendChild(o),requestAnimationFrame(()=>{o.classList.add("show"),o.classList.add("toast-slide-in")}),s>0&&setTimeout(()=>{this.hide(n)},s),n}createToastElement(e,t,s,i="md"){const n=document.createElement("div");n.id=e,n.className=`dewp-toast dewp-toast-${s} dewp-toast-${i}`;const o=document.createElement("div");o.className="dewp-toast-content";const r=document.createElement("span");r.className="dewp-toast-icon",r.innerHTML=this.getTypeIcon(s);const a=document.createElement("div");a.className="dewp-toast-message",a.textContent=t;const d=document.createElement("button");return d.className="dewp-toast-close",d.type="button",d.innerHTML="<span>×</span>",d.setAttribute("aria-label","토스트 닫기"),d.addEventListener("click",t=>{t.preventDefault(),t.stopPropagation(),this.hide(e)}),o.appendChild(r),o.appendChild(a),o.appendChild(d),n.appendChild(o),n}getTypeIcon(e){return{info:"ℹ️",success:"✅",warning:"⚠️",error:"❌"}[e]}hide(e){const t=document.getElementById(e);t&&(t.classList.remove("show","toast-slide-in"),t.classList.add("toast-slide-out"),setTimeout(()=>{t.parentNode&&t.parentNode.removeChild(t)},300))}hideAll(){if(this.container){this.container.querySelectorAll(".dewp-toast").forEach(e=>{const t=e.id;t&&this.hide(t)})}}success(e,t,s){return this.show(e,"success",t,s)}error(e,t,s){return this.show(e,"error",t,s)}warning(e,t,s){return this.show(e,"warning",t,s)}info(e,t,s){return this.show(e,"info",t,s)}},L=(e,t,s,i)=>D.show(e,t||"info",s,i),T=(e,t,s)=>D.success(e,t,s),C=(e,t,s)=>D.error(e,t,s),x=(e,t,s)=>D.warning(e,t,s),S=(e,t,s)=>D.info(e,t,s);const k=new class{constructor(){this.modals=new Map,this.activeModal=null,this.backdrop=null,this.zIndex=1050,this.init()}init(){this.createBackdrop(),this.bindEvents()}createBackdrop(){this.backdrop=document.createElement("div"),this.backdrop.className="dewp-modal-backdrop",document.body.appendChild(this.backdrop)}bindEvents(){document.addEventListener("keydown",e=>{"Escape"===e.key&&this.activeModal&&this.close(this.activeModal.id)}),this.backdrop&&this.backdrop.addEventListener("click",()=>{this.activeModal&&this.close(this.activeModal.id)})}create(e={}){const t="dewp-modal-"+Date.now(),s=this.createModalElement(t,e);return this.modals.set(t,s),document.body.appendChild(s),t}createModalElement(e,t){const s=document.createElement("div");s.id=e,s.className="dewp-modal";const i=t.size||"md";if(s.className=`dewp-modal ${{sm:"dewp-modal-sm",md:"dewp-modal-md",lg:"dewp-modal-lg",xl:"dewp-modal-xl",full:"dewp-modal-full"}[i]}`,t.title){const i=document.createElement("div");i.className="dewp-modal-header";const n=document.createElement("h3");if(n.textContent=t.title,i.appendChild(n),!1!==t.closable){const t=document.createElement("button");t.className="dewp-modal-close",t.innerHTML="×",t.addEventListener("click",()=>{this.close(e)}),i.appendChild(t)}s.appendChild(i)}if(t.content){const e=document.createElement("div");e.className="dewp-modal-body","string"==typeof t.content?e.innerHTML=t.content:e.appendChild(t.content),s.appendChild(e)}if(t.showCancel||t.confirmText){const i=document.createElement("div");if(i.className="dewp-modal-footer",t.showCancel){const s=document.createElement("button");s.className="dewp-modal-cancel",s.textContent=t.cancelText||"취소",s.addEventListener("click",()=>{t.onCancel&&t.onCancel(),this.close(e)}),i.appendChild(s)}if(t.confirmText){const s=document.createElement("button");s.className="dewp-modal-confirm",s.textContent=t.confirmText,s.addEventListener("click",()=>{t.onConfirm&&t.onConfirm(),this.close(e)}),i.appendChild(s)}s.appendChild(i)}return s}open(e){const t=this.modals.get(e);t&&(this.activeModal=t,this.showBackdrop(),t.style.opacity="1",t.style.visibility="visible",t.style.transform="translate(-50%, -50%) scale(1)",t.querySelector("button")&&t.querySelector("button").focus())}close(e){const t=this.modals.get(e);t&&(t.style.opacity="0",t.style.visibility="hidden",t.style.transform="translate(-50%, -50%) scale(0.9)",setTimeout(()=>{t.parentNode&&t.parentNode.removeChild(t),this.modals.delete(e),this.activeModal===t&&(this.activeModal=null,this.hideBackdrop())},300))}showBackdrop(){this.backdrop&&(this.backdrop.style.opacity="1",this.backdrop.style.visibility="visible")}hideBackdrop(){this.backdrop&&(this.backdrop.style.opacity="0",this.backdrop.style.visibility="hidden")}show(e={}){const t=this.create(e);return this.open(t),t}confirm(e){const t=this.create({title:e.title||"확인",content:e.message,confirmText:e.confirmText||"확인",cancelText:"취소",showCancel:!0,onConfirm:e.onConfirm,onCancel:e.onCancel});this.open(t)}alert(e,t){const s=this.create({title:t||"알림",content:e,confirmText:"확인"});this.open(s)}getModal(e){return this.modals.get(e)}isOpen(e){const t=this.modals.get(e);return!!t&&"visible"===t.style.visibility}closeAll(){this.modals.forEach((e,t)=>{this.close(t)})}},M=(e={})=>k.create(e),$=e=>{k.open(e)},O=e=>{k.close(e)},q=(e={})=>k.show(e),P=e=>{k.confirm(e)};const N=new class{constructor(){this.dropdowns=new Map,this.activeDropdown=null,this.zIndex=1e3,this.uidCounter=0,this.init()}init(){this.bindGlobalEvents()}generateId(){return`dewp-dropdown-${"undefined"!=typeof crypto&&"randomUUID"in crypto?crypto.randomUUID():`${Date.now()}-${++this.uidCounter}`}`}bindGlobalEvents(){document.addEventListener("click",e=>{if(!this.activeDropdown)return;const t=e.target,s=this.activeDropdown.trigger.contains(t),i=this.activeDropdown.element.contains(t);s||i||!1!==this.activeDropdown.options.autoClose&&this.hide(this.activeDropdown.id)}),document.addEventListener("keydown",e=>{"Escape"===e.key&&this.activeDropdown&&!1!==this.activeDropdown.options.autoClose&&this.hide(this.activeDropdown.id)});const e=()=>{this.activeDropdown&&this.positionDropdown(this.activeDropdown)};window.addEventListener("resize",e),window.addEventListener("scroll",e,!0)}create(e){const t="string"==typeof e.trigger?document.querySelector(e.trigger):e.trigger;if(!t)throw console.error("🔽 드롭다운 트리거 요소를 찾을 수 없음:",e.trigger),new Error("드롭다운 트리거 요소를 찾을 수 없습니다.");const s=this.findDropdownContainer(t);if(!s)throw console.error("🔽 드롭다운 컨테이너를 찾을 수 없음"),new Error("드롭다운 컨테이너(.dewp-dropdown)를 찾을 수 없습니다.");const i=s.dataset.dropdownId;if(i&&this.dropdowns.has(i))return i;const n=s.querySelector(".dewp-dropdown-menu");if(!n)throw console.error("🔽 기존 드롭다운 메뉴를 찾을 수 없음"),new Error("기존 드롭다운 메뉴(.dewp-dropdown-menu)를 찾을 수 없습니다.");const o=this.generateId(),r={id:o,element:n,options:e,trigger:t,container:s};this.dropdowns.set(o,r),s.dataset.dropdownId=o;const a=r.trigger,d=r.element;return a.id||(a.id=`${o}-trigger`),d.id||(d.id=`${o}-menu`),a.setAttribute("aria-haspopup","true"),a.setAttribute("aria-controls",d.id),a.setAttribute("aria-expanded","false"),d.setAttribute("role","menu"),d.setAttribute("aria-labelledby",a.id),this.bindDropdownItemEvents(d,o),this.bindTriggerEvents(r),this.updateTriggerText(r,e.placeholder||"선택하세요"),o}findDropdownContainer(e){let t=e.parentElement,s=0;for(;t&&s<10;){if(t.classList.contains("dewp-dropdown")){if(t.querySelector(".dewp-dropdown-menu"))return t}t=t.parentElement,s++}return null}bindDropdownItemEvents(e,t){e.querySelectorAll(".dewp-dropdown-item").forEach(e=>{e.addEventListener("click",e=>{e.preventDefault(),e.stopPropagation();const s=e.currentTarget,i=s.getAttribute("data-value")||s.textContent||"",n=s.textContent||"";this.selectItem(t,i,n);const o=this.dropdowns.get(t);o&&!1!==o.options.autoClose&&this.hide(t)})})}selectItem(e,t,s){const i=this.dropdowns.get(e);i&&(i.selectedValue=t,i.selectedText=s,this.updateTriggerText(i,s),i.options.onSelect&&i.options.onSelect(t,s))}updateTriggerText(e,t){const s=e.trigger,i=s.querySelector(".dewp-dropdown-text");if(i)return void(i.textContent=t);const n=Array.from(s.childNodes).find(e=>{var t;return e.nodeType===Node.TEXT_NODE&&(null===(t=e.textContent)||void 0===t?void 0:t.trim())});if(n)n.textContent=t;else{const e=document.createTextNode(t);s.insertBefore(e,s.firstChild)}}bindTriggerEvents(e){const{trigger:t,id:s}=e,i=s;t.removeEventListener("click",t.__dewpHandler);const n=e=>{e.preventDefault(),e.stopPropagation(),this.activeDropdown&&this.activeDropdown.id===i?this.hide(i):(this.activeDropdown&&this.hide(this.activeDropdown.id),this.show(i))};t.__dewpHandler=n,t.addEventListener("click",n)}show(e){const t=this.dropdowns.get(e);t?(this.activeDropdown&&this.activeDropdown.id!==e&&this.hide(this.activeDropdown.id),this.activeDropdown=t,this.positionDropdown(t),t.element.classList.add("show"),t.trigger.setAttribute("aria-expanded","true"),t.options.onShow&&t.options.onShow()):console.error("🔽 드롭다운 인스턴스를 찾을 수 없음:",e)}hide(e){const t=this.dropdowns.get(e);if(t){t.element.classList.remove("show"),t.trigger.setAttribute("aria-expanded","false");try{t.trigger.focus()}catch{}this.activeDropdown&&this.activeDropdown.id===e&&(this.activeDropdown=null),t.options.onHide&&t.options.onHide()}else console.error("🔽 드롭다운 인스턴스를 찾을 수 없음:",e)}positionDropdown(e){var t;const{element:s,trigger:i,options:n}=e,o=n.position||"bottom",r=n.align||"start",a=null!==(t=n.offset)&&void 0!==t?t:8,d=i.getBoundingClientRect(),c=e.container.getBoundingClientRect(),l=s.getBoundingClientRect();let p=0,h=0;switch(o){case"bottom":p=d.bottom-c.top+a;break;case"top":p=d.top-c.top-l.height-a;break;case"left":h=d.left-c.left-l.width-a,p=d.top-c.top+d.height/2-l.height/2;break;case"right":h=d.right-c.left+a,p=d.top-c.top+d.height/2-l.height/2}switch(r){case"center":"top"!==o&&"bottom"!==o||(h=d.left-c.left+d.width/2-l.width/2);break;case"end":"top"!==o&&"bottom"!==o||(h=d.right-c.left-l.width);break;default:"top"!==o&&"bottom"!==o||(h=d.left-c.left)}s.style.top=`${p}px`,s.style.left=`${h}px`,s.style.zIndex=""+this.zIndex++}toggle(e){this.dropdowns.get(e)?this.activeDropdown&&this.activeDropdown.id===e?this.hide(e):this.show(e):console.error("🔽 드롭다운 인스턴스를 찾을 수 없음:",e)}getSelectedValue(e){var t;return null===(t=this.dropdowns.get(e))||void 0===t?void 0:t.selectedValue}getSelectedText(e){var t;return null===(t=this.dropdowns.get(e))||void 0===t?void 0:t.selectedText}setValue(e,t,s){this.dropdowns.get(e)&&this.selectItem(e,t,s)}getDropdown(e){var t;return null===(t=this.dropdowns.get(e))||void 0===t?void 0:t.element}isOpen(e){const t=this.dropdowns.get(e);return!!t&&t.element.classList.contains("show")}closeAll(){this.dropdowns.forEach((e,t)=>this.hide(t))}destroy(e){const t=this.dropdowns.get(e);if(!t)return;this.hide(e);const s=t.trigger;s.__dewpHandler&&(s.removeEventListener("click",s.__dewpHandler),delete s.__dewpHandler),delete t.container.dataset.dropdownId,this.dropdowns.delete(e)}autoInitialize(){document.querySelectorAll(".dewp-dropdown").forEach(e=>{var t;const s=e.dataset.dropdownId;if(s&&this.dropdowns.has(s))return;const i=e.querySelector(".dewp-dropdown-toggle"),n=e.querySelector(".dewp-dropdown-menu");if(i&&n)try{const s=this.create({trigger:i,content:"",position:"bottom",align:"start",autoClose:!0,placeholder:((null===(t=i.querySelector(".dewp-dropdown-text"))||void 0===t?void 0:t.textContent)||"선택하세요").trim(),onSelect:(t,s)=>{const i=e.querySelector(".dewp-dropdown-text");i&&(i.textContent=s),e.setAttribute("data-selected-value",t)}});n.setAttribute("data-dropdown-id",s)}catch(e){console.error("❌ 드롭다운 자동 초기화 실패:",e)}else console.warn("⚠️ 드롭다운 구조 불완전:",{container:e})})}},z=e=>N.create(e),B=e=>{N.show(e)},H=e=>{N.hide(e)},W=e=>{N.toggle(e)},_=()=>{N.closeAll()},R=e=>N.getSelectedValue(e),V=e=>N.getSelectedText(e),G=(e,t,s)=>{N.setValue(e,t,s)},F=()=>{N.autoInitialize()};const j=new class{constructor(){this.drawers=new Map,this.activeDrawer=null,this.overlay=null,this.initGlobalEvents()}create(e){const t="dewp-drawer-"+Date.now();let s=null;if(e.target&&(s="string"==typeof e.target?document.querySelector(e.target):e.target),!s)throw new Error("Drawer 대상 요소를 찾을 수 없습니다.");let i=null;!1!==e.overlay&&(i=this.createOverlay(),document.body.appendChild(i));const n={id:t,element:s,options:e,trigger:void 0,isOpen:!1,overlay:i||void 0};return this.drawers.set(t,n),this.bindDrawerEvents(n),t}createDrawerElement(e){const t=document.createElement("div");t.className="dewp-drawer",e.position&&t.classList.add(`dewp-drawer-${e.position}`),e.size&&t.classList.add(`dewp-drawer-${e.size}`),e.theme&&t.classList.add(`dewp-drawer-${e.theme}`);const s=this.getDrawerTitle(e);return t.innerHTML=`\n <div class="dewp-drawer-header">\n <h3 class="dewp-drawer-title">${s}</h3>\n <button class="dewp-drawer-close">\n <svg viewBox="0 0 24 24">\n <path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/>\n </svg>\n </button>\n </div>\n <div class="dewp-drawer-content">\n ${e.content||"<p>Drawer 내용을 여기에 입력하세요.</p>"}\n </div>\n `,t}createOverlay(){const e=document.createElement("div");return e.className="dewp-drawer-overlay",e.addEventListener("click",()=>{this.closeAll()}),e}bindDrawerEvents(e){const{element:t,id:s}=e,i=t.querySelector(".dewp-drawer-close");if(i){const e=i;e.setAttribute("type","button"),e.setAttribute("aria-label","닫기"),e.setAttribute("title","닫기"),e.setAttribute("role","button"),e.addEventListener("click",()=>{this.close(s)}),e.addEventListener("keydown",e=>{const t=e;"Enter"!==t.key&&" "!==t.key||(t.preventDefault(),this.close(s))})}!1!==e.options.closeOnEscape&&document.addEventListener("keydown",t=>{"Escape"===t.key&&e.isOpen&&this.close(s)})}bindTriggerEvents(e){const{trigger:t,id:s}=e;t&&t.addEventListener("click",t=>{t.preventDefault(),t.stopPropagation(),e.isOpen?this.close(s):this.open(s)})}open(e){const t=this.drawers.get(e);t&&!t.isOpen&&(this.closeAll(),t.options.onBeforeOpen&&t.options.onBeforeOpen(),t.element.classList.add("dewp-drawer-open"),t.isOpen=!0,this.activeDrawer=t,t.overlay&&t.overlay.classList.add("show"),document.body.style.overflow="hidden",t.options.onOpen&&t.options.onOpen())}close(e){const t=this.drawers.get(e);t&&t.isOpen&&(t.options.onBeforeClose&&t.options.onBeforeClose(),t.element.classList.remove("dewp-drawer-open"),t.isOpen=!1,this.activeDrawer=null,t.overlay&&t.overlay.classList.remove("show"),document.body.style.overflow="",t.options.onClose&&t.options.onClose())}closeAll(){this.drawers.forEach(e=>{e.isOpen&&this.close(e.id)})}toggle(e){const t=this.drawers.get(e);t&&(t.isOpen?this.close(e):this.open(e))}destroy(e){const t=this.drawers.get(e);t&&(this.close(e),t.element.parentNode&&t.element.parentNode.removeChild(t.element),this.drawers.delete(e))}getInstance(e){return this.drawers.get(e)}isOpen(e){const t=this.drawers.get(e);return!!t&&t.isOpen}initGlobalEvents(){window.addEventListener("resize",()=>{this.activeDrawer&&this.adjustDrawerPosition(this.activeDrawer)}),window.addEventListener("scroll",()=>{this.activeDrawer&&this.adjustDrawerPosition(this.activeDrawer)},!0)}adjustDrawerPosition(e){}getDrawerTitle(e){return"right"===e.position?"정보 패널":"dark"===e.theme?"다크 테마":"sm"===e.size?"작은 Drawer":"lg"===e.size?"큰 Drawer":"xl"===e.size?"매우 큰 Drawer":"네비게이션"}autoInitialize(){document.querySelectorAll(".dewp-drawer").forEach((e,t)=>{if(!e.getAttribute("data-drawer-id"))try{const t=this.create({target:e,position:this.detectPosition(e),size:this.detectSize(e),theme:this.detectTheme(e),overlay:!0,closeOnEscape:!0,closeOnOverlayClick:!0});e.setAttribute("data-drawer-id",t)}catch(e){console.error("❌ Drawer 자동 초기화 실패:",e)}})}detectPosition(e){return e.classList.contains("dewp-drawer-right")?"right":e.classList.contains("dewp-drawer-top")?"top":e.classList.contains("dewp-drawer-bottom")?"bottom":"left"}detectSize(e){return e.classList.contains("dewp-drawer-sm")?"sm":e.classList.contains("dewp-drawer-lg")?"lg":e.classList.contains("dewp-drawer-xl")?"xl":"md"}detectTheme(e){return e.classList.contains("dewp-drawer-dark")?"dark":e.classList.contains("dewp-drawer-primary")?"primary":"default"}},U=e=>j.create(e),Y=e=>{j.open(e)},X=e=>{j.close(e)},J=e=>{j.toggle(e)},K=()=>{j.closeAll()},Q=e=>{j.destroy(e)},Z=e=>j.isOpen(e),ee=()=>{j.autoInitialize()};const te=new class{constructor(){this.tabInstances=new Map,this.autoInit()}autoInit(){"loading"===document.readyState?document.addEventListener("DOMContentLoaded",()=>this.autoInitTabs()):this.autoInitTabs()}autoInitTabs(){document.querySelectorAll("[data-tabs]").forEach(e=>{e.getAttribute("data-tabs")||e.id||Date.now(),this.initTabs(e,{container:e})})}initTabs(e,t){const s=e.id||"tabs-"+Date.now();this.tabInstances.has(s)&&this.destroy(s);const i=e.querySelector(".dewp-tabs");i&&i.setAttribute("role","tablist");const n=this.findTabElements(e),o=this.findPanelElements(e);if(0===n.size||0===o.size)throw new Error("탭 또는 패널 요소를 찾을 수 없습니다.");const r={id:s,container:e,options:t,tabs:n,panels:o,activeTabId:null};this.tabInstances.set(s,r),n.forEach((e,t)=>{const i=`${s}-tab-${t}`,n=o.get(t);if(n){const o=`${s}-panel-${t}`;e.setAttribute("id",i),e.setAttribute("role","tab"),e.setAttribute("aria-controls",o),e.setAttribute("tabindex","-1"),n.setAttribute("id",o),n.setAttribute("role","tabpanel"),n.setAttribute("aria-labelledby",i),n.setAttribute("tabindex","0")}}),this.bindTabEvents(r);const a=t.activeTab||Array.from(n.keys())[0];return this.activateTab(s,a),s}findTabElements(e){const t=new Map;if(e.querySelectorAll("[data-tab]").forEach(e=>{const s=e.getAttribute("data-tab");s&&t.set(s,e)}),0===t.size){e.querySelectorAll(".dewp-tab-btn").forEach((e,s)=>{const i=e.getAttribute("data-tab")||`tab-${s}`;t.set(i,e)})}return t}findPanelElements(e){const t=new Map;if(e.querySelectorAll("[data-panel]").forEach(e=>{const s=e.getAttribute("data-panel");s&&t.set(s,e)}),0===t.size){e.querySelectorAll(".dewp-tab-panel").forEach((e,s)=>{const i=e.getAttribute("data-panel")||`panel-${s}`;t.set(i,e)})}return t}bindTabEvents(e){const{tabs:t,container:s}=e;t.forEach((s,i)=>{s.addEventListener("click",t=>{t.preventDefault(),this.activateTab(e.id,i)}),s.addEventListener("keydown",s=>{["Enter"," "].includes(s.key)&&(s.preventDefault(),this.activateTab(e.id,i));const n=Array.from(t.keys()),o=n.indexOf(i);if("ArrowRight"===s.key){const e=n[(o+1)%n.length],s=t.get(e);null==s||s.focus()}else if("ArrowLeft"===s.key){const e=n[(o-1+n.length)%n.length],s=t.get(e);null==s||s.focus()}})})}activateTab(e,t){const s=this.tabInstances.get(e);if(!s)return;const{tabs:i,panels:n,activeTabId:o,options:r}=s,a=i.get(t),d=n.get(t);if(!a||!d)return;if(o){const e=i.get(o),t=n.get(o);e&&(e.classList.remove("active"),e.setAttribute("aria-selected","false"),e.setAttribute("tabindex","-1")),t&&(t.classList.remove("active"),t.setAttribute("aria-hidden","true"))}a.classList.add("active"),a.setAttribute("aria-selected","true"),a.setAttribute("tabindex","0"),a.focus(),d.classList.add("active"),d.setAttribute("aria-hidden","false");const c=s.activeTabId;s.activeTabId=t,r.onTabChange&&r.onTabChange(t,c||void 0),!1!==r.animation&&this.animateTabChange(d)}animateTabChange(e){e.style.opacity="0",e.style.transform="translateY(10px)",requestAnimationFrame(()=>{e.style.transition="all 0.3s ease",e.style.opacity="1",e.style.transform="translateY(0)"})}getActiveTab(e){const t=this.tabInstances.get(e);return t?t.activeTabId:null}getTabInstance(e){return this.tabInstances.get(e)}destroy(e){const t=this.tabInstances.get(e);t&&(t.tabs.forEach(e=>{e.replaceWith(e.cloneNode(!0))}),this.tabInstances.delete(e))}destroyAll(){this.tabInstances.forEach((e,t)=>{this.destroy(t)})}},se=(e,t)=>te.initTabs(e,t||{container:e}),ie=(e,t)=>{te.activateTab(e,t)},ne=e=>te.getActiveTab(e),oe=e=>te.getTabInstance(e),re=e=>{te.destroy(e)};const ae=new class{constructor(){this.accordionInstances=new Map,this.autoInit()}autoInit(){"loading"===document.readyState?document.addEventListener("DOMContentLoaded",()=>{setTimeout(()=>this.autoInitAccordions(),100)}):setTimeout(()=>this.autoInitAccordions(),100)}autoInitAccordions(){document.querySelectorAll("[data-accordion]").forEach(e=>{try{e.getAttribute("data-accordion")||e.id||Date.now();this.initAccordion(e,{})}catch(e){}})}initAccordion(e,t){const s=e.getAttribute("data-accordion")||e.id||"accordion-"+Date.now();if(e.hasAttribute("data-accordion-initialized"))return s;this.accordionInstances.has(s)&&this.destroy(s);const i=this.findAccordionItems(e),n=this.findAccordionHeaders(e),o=this.findAccordionContents(e);if(0===i.size)throw new Error("아코디언 아이템을 찾을 수 없습니다.");const r={id:s,container:e,options:{...this.getDefaultOptions(),...t},items:i,headers:n,contents:o,activeItems:new Set};return this.accordionInstances.set(s,r),this.bindAccordionEvents(r),i.forEach((e,t)=>{const s=n.get(t),i=o.get(t);s&&i&&(e.classList.remove("active"),s.classList.remove("active"),s.setAttribute("aria-expanded","false"),i.style.display="none",i.style.height="",i.style.opacity="",i.style.transform="",i.style.transition="",i.style.overflow="")}),t.activeItem&&i.has(t.activeItem)&&this.toggleItem(s,t.activeItem,!0),e.setAttribute("data-accordion-initialized","true"),s}getDefaultOptions(){return{animation:!0,multiple:!1,autoClose:!0}}findAccordionItems(e){const t=new Map;if(e.querySelectorAll("[data-accordion-item]").forEach(e=>{const s=e.getAttribute("data-accordion-item");s&&t.set(s,e)}),0===t.size){e.querySelectorAll(".dewp-accordion-item").forEach((e,s)=>{const i=e.id||`accordion-item-${s}`;t.set(i,e)})}return t}findAccordionHeaders(e){const t=new Map;if(e.querySelectorAll("[data-accordion-header]").forEach(e=>{const s=this.findParentItemId(e);s&&t.set(s,e)}),0===t.size){e.querySelectorAll(".dewp-accordion-header").forEach(e=>{const s=this.findParentItemId(e);s&&t.set(s,e)})}return t}findAccordionContents(e){const t=new Map;if(e.querySelectorAll("[data-accordion-content]").forEach(e=>{const s=this.findParentItemId(e);s&&t.set(s,e)}),0===t.size){e.querySelectorAll(".dewp-accordion-content").forEach(e=>{const s=this.findParentItemId(e);s&&t.set(s,e)})}return t}findParentItemId(e){let t=e.parentElement;for(;t;){if(t.hasAttribute("data-accordion-item")||t.classList.contains("dewp-accordion-item"))return t.getAttribute("data-accordion-item")||t.id||null;t=t.parentElement}return null}bindAccordionEvents(e){const{headers:t,container:s}=e;t.forEach((t,s)=>{t.addEventListener("click",t=>{t.preventDefault(),t.stopPropagation(),this.toggleItem(e.id,s)}),t.addEventListener("keydown",t=>{"Enter"!==t.key&&" "!==t.key||(t.preventDefault(),t.stopPropagation(),this.toggleItem(e.id,s))}),t.setAttribute("tabindex","0"),t.setAttribute("role","button"),t.setAttribute("aria-expanded","false"),t.setAttribute("aria-controls",`accordion-content-${s}`)}),e.contents.forEach((e,t)=>{e.setAttribute("id",`accordion-content-${t}`),e.setAttribute("role","region"),e.setAttribute("aria-labelledby",`accordion-header-${t}`)})}toggleItem(e,t,s){const i=this.accordionInstances.get(e);if(!i)return;const{items:n,headers:o,contents:r,options:a}=i,d=n.get(t),c=o.get(t),l=r.get(t);if(!d||!c||!l)return;const p=i.activeItems.has(t),h=void 0!==s?s:!p;h?this.openItemInternal(i,t,d,c,l):this.closeItemInternal(i,t,d,c,l),a.onItemToggle&&a.onItemToggle(t,h)}openItemInternal(e,t,s,i,n){const{options:o,activeItems:r}=e;!o.multiple&&o.autoClose&&r.forEach(s=>{s!==t&&this.closeItemInternal(e,s,e.items.get(s),e.headers.get(s),e.contents.get(s))}),r.add(t),s.classList.add("active"),i.classList.add("active"),i.setAttribute("aria-expanded","true"),o.animation?this.animateContent(n,!0):n.style.display="block"}closeItemInternal(e,t,s,i,n){const{options:o,activeItems:r}=e;r.delete(t),s.classList.remove("active"),i.classList.remove("active"),i.setAttribute("aria-expanded","false"),o.animation?this.animateContent(n,!1):n.style.display="none"}animateContent(e,t){t?(e.style.display="block",e.style.overflow="hidden",e.style.height="0px",e.style.opacity="0",e.style.transform="translateY(-10px)",e.offsetHeight,e.style.transition="all 0.4s cubic-bezier(0.4, 0, 0.2, 1)",e.style.height=e.scrollHeight+"px",e.style.opacity="1",e.style.transform="translateY(0)",setTimeout(()=>{e.style.height="",e.style.overflow="",e.style.transition="",e.style.opacity="",e.style.transform=""},400)):(e.style.overflow="hidden",e.style.height=e.scrollHeight+"px",e.style.opacity="1",e.style.transform="translateY(0)",e.offsetHeight,e.style.transition="all 0.4s cubic-bezier(0.4, 0, 0.2, 1)",e.style.height="0px",e.style.opacity="0",e.style.transform="translateY(-10px)",setTimeout(()=>{e.style.display="none",e.style.height="",e.style.overflow="",e.style.transition="",e.style.opacity="",e.style.transform=""},400))}openItem(e,t){this.toggleItem(e,t,!0)}closeItem(e,t){this.toggleItem(e,t,!1)}openAllItems(e){const t=this.accordionInstances.get(e);t&&t.items.forEach((t,s)=>{this.openItem(e,s)})}closeAllItems(e){const t=this.accordionInstances.get(e);t&&t.items.forEach((t,s)=>{this.closeItem(e,s)})}getActiveItems(e){const t=this.accordionInstances.get(e);return t?Array.from(t.activeItems):[]}isItemOpen(e,t){const s=this.accordionInstances.get(e);return!!s&&s.activeItems.has(t)}getAccordionInstance(e){return this.accordionInstances.get(e)||null}destroy(e){const t=this.accordionInstances.get(e);t&&(t.headers.forEach(e=>{e.removeEventListener("click",()=>{}),e.removeEventListener("keydown",()=>{})}),this.accordionInstances.delete(e))}destroyAll(){this.accordionInstances.forEach((e,t)=>{this.destroy(t)})}},de=(e,t)=>ae.initAccordion(e,t),ce=(e,t,s)=>{ae.toggleItem(e,t,s)},le=(e,t)=>{ae.openItem(e,t)},pe=(e,t)=>{ae.closeItem(e,t)},he=e=>{ae.openAllItems(e)},ue=e=>{ae.closeAllItems(e)},me=e=>ae.getActiveItems(e),we=(e,t)=>ae.isItemOpen(e,t),ge=e=>ae.getAccordionInstance(e),ve=e=>{ae.destroy(e)},be=()=>{ae.destroyAll()};const fe=new class{constructor(){this.popovers=new Map,this.triggerIndex=new WeakMap,this.active=null,this.uid=0,this.docHandlersBound=!1,this.bindDocumentHandlers()}genId(){var e,t;const s=(++this.uid).toString(36);try{return`dewp-popover-${null!==(t=null===(e=crypto.randomUUID)||void 0===e?void 0:e.call(crypto))&&void 0!==t?t:`${Date.now().toString(36)}-${s}`}`}catch{return`dewp-popover-${Date.now().toString(36)}-${s}`}}create(e){const t=this.genId(),s="string"==typeof e.trigger?document.querySelector(e.trigger):e.trigger;if(!s)throw new Error("Popover trigger not found");let i;"string"==typeof e.content?(i=document.createElement("div"),i.className="dewp-popover-content dewp-popover-bottom",i.innerHTML=e.content):(i=e.content,i.classList.add("dewp-popover-content")),s.id||(s.id=`${t}-trigger`),i.id||(i.id=`${t}-content`),s.setAttribute("aria-haspopup","dialog"),s.setAttribute("aria-controls",i.id),s.setAttribute("aria-expanded","false"),i.setAttribute("role","dialog"),i.setAttribute("aria-labelledby",s.id);const n=s.closest(".dewp-popover")||s.parentElement;!i.parentElement&&n&&n.appendChild(i);const o=e.placement||"bottom";i.classList.remove("dewp-popover-top","dewp-popover-bottom","dewp-popover-left","dewp-popover-right"),i.classList.add(`dewp-popover-${o}`);const r={id:t,trigger:s,popover:i,options:{placement:o,closeOnEscape:!1!==e.closeOnEscape},isOpen:!1};return this.popovers.set(t,r),this.triggerIndex.set(s,t),s.addEventListener("click",e=>{e.preventDefault(),e.stopPropagation(),this.toggle(t)}),t}bindDocumentHandlers(){this.docHandlersBound||(document.addEventListener("click",e=>{const t=e.target,s=this.active;s&&(s.trigger.contains(t)||s.popover.contains(t)||this.close(s.id))}),document.addEventListener("keydown",e=>{if("Escape"!==e.key)return;const t=this.active;t&&t.options.closeOnEscape&&this.close(t.id)}),this.docHandlersBound=!0)}open(e){var t;const s=this.popovers.get(e);s&&(this.active&&this.active.id!==e&&this.close(this.active.id),null===(t=s.popover.parentElement)||void 0===t||t.classList.add("is-open"),s.popover.classList.add("is-open"),s.trigger.setAttribute("aria-expanded","true"),s.isOpen=!0,this.active=s)}close(e){var t;const s=this.popovers.get(e);if(s){null===(t=s.popover.parentElement)||void 0===t||t.classList.remove("is-open"),s.popover.classList.remove("is-open"),s.trigger.setAttribute("aria-expanded","false"),s.isOpen=!1,this.active&&this.active.id===e&&(this.active=null);try{s.trigger.focus()}catch{}}}toggle(e){const t=this.popovers.get(e);t&&(t.isOpen?this.close(e):this.open(e))}toggleByTrigger(e){const t=this.triggerIndex.get(e);t&&this.toggle(t)}destroy(e){const t=this.popovers.get(e);t&&(this.close(e),this.triggerIndex.delete(t.trigger),this.popovers.delete(e))}},ye=e=>fe.create(e),Ee=e=>fe.open(e),Ae=e=>fe.close(e),Ie=e=>fe.toggle(e);class De{constructor(e){this.sidebar=null,this.activeItemId=null,this.isCollapsed=!1,this.config=e,this.init()}init(){this.createSidebar(),this.render(),this.bindEvents(),this.setActiveItem()}createSidebar(){const e=document.querySelector(".dewp-sidebar");e&&e.remove(),this.sidebar=document.createElement("div"),this.sidebar.className="dewp-sidebar dewp-sidebar--wrapper is-sticky",this.sidebar.id="dewp-sidebar",document.body.appendChild(this.sidebar)}render(){this.sidebar&&(this.sidebar.innerHTML=`\n <div class="dewp-sidebar-inner">\n ${this.renderHeader()}\n ${this.renderGroups()}\n ${this.renderFooter()}\n </div>\n `)}renderHeader(){const e=this.config.subtitle?`<p class="dewp-sidebar-subtitle">${this.config.subtitle}</p>`:"";return`\n <div class="dewp-sidebar-header">\n <h1 class="dewp-sidebar-title">${this.config.title}</h1>\n ${e}\n </div>\n `}renderGroups(){return this.config.groups.map(e=>`\n <div class="dewp-sidebar-group" data-group-id="${e.id}">\n ${e.title?`<h2 class="dewp-sidebar-group-title">${e.title}</h2>`:""}\n <ul class="dewp-sidebar-menu">\n ${this.renderMenuItems(e.items)}\n </ul>\n </div>\n `).join("")}renderMenuItems(e){return e.map(e=>{const t=e.icon?`<span class="dewp-sidebar-menu-icon">${e.icon}</span>`:"",s=e.hasSubmenu?'\n <span class="dewp-sidebar-menu-arrow">\n <svg viewBox="0 0 24 24">\n <path d="M8.59 16.59L13.17 12 8.59 7.41 10 6l6 6-6 6-1.41-1.41z"/>\n </svg>\n </span>\n ':"",i=e.hasSubmenu&&e.submenu?`\n <ul class="dewp-sidebar-submenu" id="submenu-${e.id}" aria-hidden="true">\n ${this.renderMenuItems(e.submenu)}\n </ul>\n `:"";return`\n <li class="dewp-sidebar-menu-item ${e.isActive?"is-active":""} ${e.hasSubmenu?"has-submenu":""}" data-item-id="${e.id}">\n <a href="${e.url||"#"}" class="dewp-sidebar-menu-link" ${e.url?"":'onclick="return false;"'} ${e.hasSubmenu?'role="button" aria-expanded="false" aria-controls="submenu-'+e.id+'"':""}>\n ${t}\n <span class="dewp-sidebar-menu-text">${e.text}</span>\n ${s}\n </a>\n ${i}\n </li>\n `}).join("")}renderFooter(){return this.config.footerText?`\n <div class="dewp-sidebar-footer">\n <p class="dewp-sidebar-footer-text">${this.config.footerText}</p>\n </div>\n `:""}bindEvents(){this.sidebar&&(this.sidebar.addEventListener("click",e=>{const t=e.target.closest(".dewp-sidebar-menu-item");if(!t)return;const s=t.getAttribute("data-item-id");s&&(t.classList.contains("has-submenu")?(e.preventDefault(),this.toggleSubmenu(t)):this.setActiveItem(s))}),document.addEventListener("keydown",e=>{"Escape"===e.key&&window.innerWidth<=768&&this.closeMobileSidebar()}))}toggleSubmenu(e){var t;const s=e.querySelector(".dewp-sidebar-submenu");if(!s)return;const i=s.classList.contains("expanded"),n=null===(t=e.parentElement)||void 0===t?void 0:t.querySelectorAll(".dewp-sidebar-menu-item.has-submenu");if(null==n||n.forEach(t=>{if(t!==e){const e=t.querySelector(".dewp-sidebar-submenu"),s=t.querySelector(".dewp-sidebar-menu-link");e&&e.classList.contains("expanded")&&(e.classList.remove("expanded"),e.style.maxHeight="0",null==s||s.setAttribute("aria-expanded","false"),e.setAttribute("aria-hidden","true")),t.classList.remove("is-open")}}),i){s.classList.remove("expanded"),s.style.maxHeight="0";const t=e.querySelector(".dewp-sidebar-menu-link");null==t||t.setAttribute("aria-expanded","false"),s.setAttribute("aria-hidden","true"),e.classList.remove("is-open")}else{s.classList.add("expanded"),s.style.maxHeight=s.scrollHeight+"px";const t=e.querySelector(".dewp-sidebar-menu-link");null==t||t.setAttribute("aria-expanded","true"),s.setAttribute("aria-hidden","false"),e.classList.add("is-open")}}setActiveItem(e){var t,s;e&&(this.activeItemId=e);const i=null===(t=this.sidebar)||void 0===t?void 0:t.querySelectorAll(".dewp-sidebar-menu-item.is-active");if(null==i||i.forEach(e=>e.classList.remove("is-active")),this.activeItemId){const e=null===(s=this.sidebar)||void 0===s?void 0:s.querySelector(`[data-item-id="${this.activeItemId}"]`);null==e||e.classList.add("is-active")}}addDivider(e,t="after"){var s;const i=null===(s=this.sidebar)||void 0===s?void 0:s.querySelector(`[data-group-id="${e}"]`);if(!i)return;const n=document.createElement("div");n.className="dewp-sidebar-divider","before"===t?i.insertBefore(n,i.firstChild):i.appendChild(n)}addGroup(e){this.config.groups.push(e),this.render(),this.bindEvents()}addMenuItem(e,t){const s=this.config.groups.find(t=>t.id===e);s&&(s.items.push(t),this.render(),this.bindEvents())}removeMenuItem(e,t){const s=this.config.groups.find(t=>t.id===e);s&&(s.items=s.items.filter(e=>e.id!==t),this.render(),this.bindEvents())}toggle(){this.sidebar&&window.innerWidth<=768&&this.sidebar.classList.toggle("is-open")}toggleCollapse(){this.sidebar&&(this.isCollapsed=!this.isCollapsed,this.sidebar.classList.toggle("is-collapsed",this.isCollapsed))}collapse(){this.sidebar&&(this.isCollapsed=!0,this.sidebar.classList.add("is-collapsed"))}expand(){this.sidebar&&(this.isCollapsed=!1,this.sidebar.classList.remove("is-collapsed"))}openMobileSidebar(){this.sidebar&&this.sidebar.classList.add("is-open")}closeMobileSidebar(){this.sidebar&&this.sidebar.classList.remove("is-open")}destroy(){this.sidebar&&(this.sidebar.remove(),this.sidebar=null)}updateConfig(e){this.config={...this.config,...e},this.render(),this.bindEvents()}getActiveItemId(){return this.activeItemId}getElement(){return this.sidebar}}window.DEWPSidebar=De;class Le{constructor(e,t={}){var s,i,n;this.input=e.querySelector(".dewp-stepper-input"),this.decrementBtn=e.querySelector(".dewp-stepper-decrement"),this.incrementBtn=e.querySelector(".dewp-stepper-increment"),this.options={min:null!==(s=t.min)&&void 0!==s?s:Number.MIN_SAFE_INTEGER,max:null!==(i=t.max)&&void 0!==i?i:Number.MAX_SAFE_INTEGER,step:null!==(n=t.step)&&void 0!==n?n:1},"number"==typeof t.value&&(this.input.value=String(t.value)),this.bindEvents(t.onChange),this.syncDisabled()}bindEvents(e){const t=()=>this.clamp(parseFloat(this.input.value||"0")),s=t=>{e&&e(t)};this.decrementBtn.addEventListener("click",()=>{const e=this.clamp(t()-this.options.step);this.input.value=String(e),this.syncDisabled(),s(e)}),this.incrementBtn.addEventListener("click",()=>{const e=this.clamp(t()+this.options.step);this.input.value=String(e),this.syncDisabled(),s(e)}),this.input.addEventListener("input",()=>{const e=t();this.input.value=String(e),this.syncDisabled(),s(e)})}clamp(e){return Math.min(this.options.max,Math.max(this.options.min,isNaN(e)?0:e))}syncDisabled(){const e=parseFloat(this.input.value||"0");this.decrementBtn.disabled=e<=this.options.min,this.incrementBtn.disabled=e>=this.options.max}}const Te="0.8.0";var Ce={qs:e,qsa:t,create:s,addClass:i,removeClass:n,toggleClass:o,hasClass:r,setText:a,setHTML:d,on:c,off:l,remove:p,append:h,insertBefore:u,clearChildren:I,setStyle:m,setData:w,getData:g,isDOMReady:v,onDOMReady:b,isElementVisible:f,scrollToElement:y,getElementRect:E,isChildOf:A,showToast:L,showSuccessToast:T,showWarningToast:x,showErrorToast:C,showInfoToast:S,createModal:M,openModal:$,closeModal:O,showModal:q,showConfirmModal:P,createDropdown:z,toggleDropdown:W,showDropdown:B,hideDropdown:H,closeAllDropdowns:_,getSelectedValue:R,getSelectedText:V,setDropdownValue:G,autoInitializeDropdowns:F,initTabs:se,activateTab:ie,getActiveTab:ne,getTabInstance:oe,destroyTabs:re,initAccordion:de,toggleAccordionItem:ce,openAccordionItem:le,closeAccordionItem:pe,openAllAccordionItems:he,closeAllAccordionItems:ue,getActiveAccordionItems:me,isAccordionItemOpen:we,getAccordionInstance:ge,destroyAccordion:ve,destroyAllAccordions:be,createDrawer:U,openDrawer:Y,closeDrawer:X,toggleDrawer:J,closeAllDrawers:K,destroyDrawer:Q,isDrawerOpen:Z,autoInitializeDrawers:ee,createPopover:ye,openPopover:Ee,closePopover:Ae,togglePopover:Ie,DEWPSidebar:De,DEWPStepper:Le,initStepper:(e,t={})=>new Le(e,t),ready:b,version:Te,info:{name:"DesignBase WordPress Library",description:"간단하고 강력한 프론트엔드 라이브러리",version:Te,author:"DesignBase",license:"MIT"}};if("undefined"!=typeof window){const D=window.DEWP={},k={qs:e,qsa:t,create:s,addClass:i,removeClass:n,toggleClass:o,hasClass:r,setText:a,setHTML:d,on:c,off:l,remove:p,append:h,insertBefore:u,clearChildren:I,setStyle:m,setData:w,getData:g,isDOMReady:v,onDOMReady:b,isElementVisible:f,scrollToElement:y,getElementRect:E,isChildOf:A,showToast:L,showSuccessToast:T,showWarningToast:x,showErrorToast:C,showInfoToast:S,createModal:M,openModal:$,closeModal:O,showModal:q,showConfirmModal:P,createDropdown:z,toggleDropdown:W,showDropdown:B,hideDropdown:H,closeAllDropdowns:_,getSelectedValue:R,getSelectedText:V,setDropdownValue:G,autoInitializeDropdowns:F,createDrawer:U,openDrawer:Y,closeDrawer:X,toggleDrawer:J,closeAllDrawers:K,destroyDrawer:Q,isDrawerOpen:Z,autoInitializeDrawers:ee,initTabs:se,activateTab:ie,getActiveTab:ne,getTabInstance:oe,destroyTabs:re,initAccordion:de,toggleAccordionItem:ce,openAccordionItem:le,closeAccordionItem:pe,openAllAccordionItems:he,closeAllAccordionItems:ue,getActiveAccordionItems:me,isAccordionItemOpen:we,getAccordionInstance:ge,destroyAccordion:ve,destroyAllAccordions:be,DEWPSidebar:De,createPopover:ye,openPopover:Ee,closePopover:Ae,togglePopover:Ie,ready:b,version:Te,info:{name:"DesignBase WordPress Library",description:"간단하고 강력한 프론트엔드 라이브러리",version:Te,author:"DesignBase",license:"MIT"}};Object.keys(k).forEach(e=>{D[e]=k[e]});try{console.log(`[DEWP] v${Te} loaded`)}catch{}b(()=>{try{F()}catch{}try{ee()}catch{}});try{"loading"!==document.readyState&&(F(),ee())}catch{}}return Ce}();
1
+ var DEWP=function(){"use strict";function e(e,t=document){return t.querySelector(e)}function t(e,t=document){return Array.from(t.querySelectorAll(e))}function s(e,t={}){const s=document.createElement(e);return Object.assign(s,t),s}function i(e,t){e.classList.add(t)}function n(e,t){e.classList.remove(t)}function o(e,t,s){return e.classList.toggle(t,s)}function r(e,t){return e.classList.contains(t)}function a(e,t){e.textContent=t}function d(e,t){e.innerHTML=t}function c(e,t,s,i){e.addEventListener(t,s,i)}function l(e,t,s,i){e.removeEventListener(t,s,i)}function p(e){e.remove()}function h(e,t){e.appendChild(t)}function u(e,t,s){e.insertBefore(t,s)}function m(e,t,s){e.style.setProperty(t,s)}function w(e,t,s){e.setAttribute(`data-${t}`,s)}function g(e,t){return e.getAttribute(`data-${t}`)}function v(){return"loading"!==document.readyState}function b(e){v()?e():c(document,"DOMContentLoaded",e,{once:!0})}function f(e,t=0){return new Promise(s=>{const i=new IntersectionObserver(([e])=>{i.disconnect(),s(e.isIntersecting)},{threshold:t});i.observe(e)})}function y(e,t="smooth"){e.scrollIntoView({behavior:t,block:"start"})}function E(e){return e.getBoundingClientRect()}function A(e,t){return t.contains(e)}function I(e){for(;e.firstChild;)e.removeChild(e.firstChild)}const D=new class{constructor(){this.container=null,this.init()}init(){this.createContainer()}createContainer(){const e=document.getElementById("dewp-toast-container");e&&e.remove(),this.container=document.createElement("div"),this.container.id="dewp-toast-container",this.container.className="dewp-toast-container dewp-toast-container-top-right",document.body.appendChild(this.container)}show(e,t="info",s=5e3,i="md"){this.container||this.createContainer();const n="dewp-toast-"+Date.now(),o=this.createToastElement(n,e,t,i);try{Array.from(this.container.querySelectorAll(".dewp-toast .dewp-toast-message")).some(t=>t.textContent===String(e))&&this.hideAll()}catch(e){}return this.container.appendChild(o),requestAnimationFrame(()=>{o.classList.add("show"),o.classList.add("toast-slide-in")}),s>0&&setTimeout(()=>{this.hide(n)},s),n}createToastElement(e,t,s,i="md"){const n=document.createElement("div");n.id=e,n.className=`dewp-toast dewp-toast-${s} dewp-toast-${i}`;const o=document.createElement("div");o.className="dewp-toast-content";const r=document.createElement("span");r.className="dewp-toast-icon",r.innerHTML=this.getTypeIcon(s);const a=document.createElement("div");a.className="dewp-toast-message",a.textContent=t;const d=document.createElement("button");return d.className="dewp-toast-close",d.type="button",d.innerHTML="<span>×</span>",d.setAttribute("aria-label","토스트 닫기"),d.addEventListener("click",t=>{t.preventDefault(),t.stopPropagation(),this.hide(e)}),o.appendChild(r),o.appendChild(a),o.appendChild(d),n.appendChild(o),n}getTypeIcon(e){return{info:"ℹ️",success:"✅",warning:"⚠️",error:"❌"}[e]}hide(e){const t=document.getElementById(e);t&&(t.classList.remove("show","toast-slide-in"),t.classList.add("toast-slide-out"),setTimeout(()=>{t.parentNode&&t.parentNode.removeChild(t)},300))}hideAll(){if(this.container){this.container.querySelectorAll(".dewp-toast").forEach(e=>{const t=e.id;t&&this.hide(t)})}}success(e,t,s){return this.show(e,"success",t,s)}error(e,t,s){return this.show(e,"error",t,s)}warning(e,t,s){return this.show(e,"warning",t,s)}info(e,t,s){return this.show(e,"info",t,s)}},L=(e,t,s,i)=>D.show(e,t||"info",s,i),T=(e,t,s)=>D.success(e,t,s),C=(e,t,s)=>D.error(e,t,s),x=(e,t,s)=>D.warning(e,t,s),S=(e,t,s)=>D.info(e,t,s);const k=new class{constructor(){this.modals=new Map,this.activeModal=null,this.backdrop=null,this.zIndex=1050,this.init()}init(){this.createBackdrop(),this.bindEvents()}createBackdrop(){this.backdrop=document.createElement("div"),this.backdrop.className="dewp-modal-backdrop",document.body.appendChild(this.backdrop)}bindEvents(){document.addEventListener("keydown",e=>{"Escape"===e.key&&this.activeModal&&this.close(this.activeModal.id)}),this.backdrop&&this.backdrop.addEventListener("click",()=>{this.activeModal&&this.close(this.activeModal.id)})}create(e={}){const t="dewp-modal-"+Date.now(),s=this.createModalElement(t,e);return this.modals.set(t,s),document.body.appendChild(s),t}createModalElement(e,t){const s=document.createElement("div");s.id=e,s.className="dewp-modal";const i=t.size||"md";if(s.className=`dewp-modal ${{sm:"dewp-modal-sm",md:"dewp-modal-md",lg:"dewp-modal-lg",xl:"dewp-modal-xl",full:"dewp-modal-full"}[i]}`,t.title){const i=document.createElement("div");i.className="dewp-modal-header";const n=document.createElement("h3");if(n.textContent=t.title,i.appendChild(n),!1!==t.closable){const t=document.createElement("button");t.className="dewp-modal-close",t.innerHTML="×",t.addEventListener("click",()=>{this.close(e)}),i.appendChild(t)}s.appendChild(i)}if(t.content){const e=document.createElement("div");e.className="dewp-modal-body","string"==typeof t.content?e.innerHTML=t.content:e.appendChild(t.content),s.appendChild(e)}if(t.showCancel||t.confirmText){const i=document.createElement("div");if(i.className="dewp-modal-footer",t.showCancel){const s=document.createElement("button");s.className="dewp-modal-cancel",s.textContent=t.cancelText||"취소",s.addEventListener("click",()=>{t.onCancel&&t.onCancel(),this.close(e)}),i.appendChild(s)}if(t.confirmText){const s=document.createElement("button");s.className="dewp-modal-confirm",s.textContent=t.confirmText,s.addEventListener("click",()=>{t.onConfirm&&t.onConfirm(),this.close(e)}),i.appendChild(s)}s.appendChild(i)}return s}open(e){const t=this.modals.get(e);t&&(this.activeModal=t,this.showBackdrop(),t.style.opacity="1",t.style.visibility="visible",t.style.transform="translate(-50%, -50%) scale(1)",t.querySelector("button")&&t.querySelector("button").focus())}close(e){const t=this.modals.get(e);t&&(t.style.opacity="0",t.style.visibility="hidden",t.style.transform="translate(-50%, -50%) scale(0.9)",setTimeout(()=>{t.parentNode&&t.parentNode.removeChild(t),this.modals.delete(e),this.activeModal===t&&(this.activeModal=null,this.hideBackdrop())},300))}showBackdrop(){this.backdrop&&(this.backdrop.style.opacity="1",this.backdrop.style.visibility="visible")}hideBackdrop(){this.backdrop&&(this.backdrop.style.opacity="0",this.backdrop.style.visibility="hidden")}show(e={}){const t=this.create(e);return this.open(t),t}confirm(e){const t=this.create({title:e.title||"확인",content:e.message,confirmText:e.confirmText||"확인",cancelText:"취소",showCancel:!0,onConfirm:e.onConfirm,onCancel:e.onCancel});this.open(t)}alert(e,t){const s=this.create({title:t||"알림",content:e,confirmText:"확인"});this.open(s)}getModal(e){return this.modals.get(e)}isOpen(e){const t=this.modals.get(e);return!!t&&"visible"===t.style.visibility}closeAll(){this.modals.forEach((e,t)=>{this.close(t)})}},M=(e={})=>k.create(e),$=e=>{k.open(e)},O=e=>{k.close(e)},q=(e={})=>k.show(e),P=e=>{k.confirm(e)};const N=new class{constructor(){this.dropdowns=new Map,this.activeDropdown=null,this.zIndex=1e3,this.uidCounter=0,this.init()}init(){this.bindGlobalEvents()}generateId(){return`dewp-dropdown-${"undefined"!=typeof crypto&&"randomUUID"in crypto?crypto.randomUUID():`${Date.now()}-${++this.uidCounter}`}`}bindGlobalEvents(){document.addEventListener("click",e=>{if(!this.activeDropdown)return;const t=e.target,s=this.activeDropdown.trigger.contains(t),i=this.activeDropdown.element.contains(t);s||i||!1!==this.activeDropdown.options.autoClose&&this.hide(this.activeDropdown.id)}),document.addEventListener("keydown",e=>{"Escape"===e.key&&this.activeDropdown&&!1!==this.activeDropdown.options.autoClose&&this.hide(this.activeDropdown.id)});const e=()=>{this.activeDropdown&&this.positionDropdown(this.activeDropdown)};window.addEventListener("resize",e),window.addEventListener("scroll",e,!0)}create(e){const t="string"==typeof e.trigger?document.querySelector(e.trigger):e.trigger;if(!t)throw console.error("🔽 드롭다운 트리거 요소를 찾을 수 없음:",e.trigger),new Error("드롭다운 트리거 요소를 찾을 수 없습니다.");const s=this.findDropdownContainer(t);if(!s)throw console.error("🔽 드롭다운 컨테이너를 찾을 수 없음"),new Error("드롭다운 컨테이너(.dewp-dropdown)를 찾을 수 없습니다.");const i=s.dataset.dropdownId;if(i&&this.dropdowns.has(i))return i;const n=s.querySelector(".dewp-dropdown-menu");if(!n)throw console.error("🔽 기존 드롭다운 메뉴를 찾을 수 없음"),new Error("기존 드롭다운 메뉴(.dewp-dropdown-menu)를 찾을 수 없습니다.");const o=this.generateId(),r={id:o,element:n,options:e,trigger:t,container:s};this.dropdowns.set(o,r),s.dataset.dropdownId=o;const a=r.trigger,d=r.element;return a.id||(a.id=`${o}-trigger`),d.id||(d.id=`${o}-menu`),a.setAttribute("aria-haspopup","true"),a.setAttribute("aria-controls",d.id),a.setAttribute("aria-expanded","false"),d.setAttribute("role","menu"),d.setAttribute("aria-labelledby",a.id),this.bindDropdownItemEvents(d,o),this.bindTriggerEvents(r),this.updateTriggerText(r,e.placeholder||"선택하세요"),o}findDropdownContainer(e){let t=e.parentElement,s=0;for(;t&&s<10;){if(t.classList.contains("dewp-dropdown")){if(t.querySelector(".dewp-dropdown-menu"))return t}t=t.parentElement,s++}return null}bindDropdownItemEvents(e,t){e.querySelectorAll(".dewp-dropdown-item").forEach(e=>{e.addEventListener("click",e=>{e.preventDefault(),e.stopPropagation();const s=e.currentTarget,i=s.getAttribute("data-value")||s.textContent||"",n=s.textContent||"";this.selectItem(t,i,n);const o=this.dropdowns.get(t);o&&!1!==o.options.autoClose&&this.hide(t)})})}selectItem(e,t,s){const i=this.dropdowns.get(e);i&&(i.selectedValue=t,i.selectedText=s,this.updateTriggerText(i,s),i.options.onSelect&&i.options.onSelect(t,s))}updateTriggerText(e,t){const s=e.trigger,i=s.querySelector(".dewp-dropdown-text");if(i)return void(i.textContent=t);const n=Array.from(s.childNodes).find(e=>{var t;return e.nodeType===Node.TEXT_NODE&&(null===(t=e.textContent)||void 0===t?void 0:t.trim())});if(n)n.textContent=t;else{const e=document.createTextNode(t);s.insertBefore(e,s.firstChild)}}bindTriggerEvents(e){const{trigger:t,id:s}=e,i=s;t.removeEventListener("click",t.__dewpHandler);const n=e=>{e.preventDefault(),e.stopPropagation(),this.activeDropdown&&this.activeDropdown.id===i?this.hide(i):(this.activeDropdown&&this.hide(this.activeDropdown.id),this.show(i))};t.__dewpHandler=n,t.addEventListener("click",n)}show(e){const t=this.dropdowns.get(e);t?(this.activeDropdown&&this.activeDropdown.id!==e&&this.hide(this.activeDropdown.id),this.activeDropdown=t,this.positionDropdown(t),t.element.classList.add("show"),t.trigger.setAttribute("aria-expanded","true"),t.options.onShow&&t.options.onShow()):console.error("🔽 드롭다운 인스턴스를 찾을 수 없음:",e)}hide(e){const t=this.dropdowns.get(e);if(t){t.element.classList.remove("show"),t.trigger.setAttribute("aria-expanded","false");try{t.trigger.focus()}catch{}this.activeDropdown&&this.activeDropdown.id===e&&(this.activeDropdown=null),t.options.onHide&&t.options.onHide()}else console.error("🔽 드롭다운 인스턴스를 찾을 수 없음:",e)}positionDropdown(e){var t;const{element:s,trigger:i,options:n}=e,o=n.position||"bottom",r=n.align||"start",a=null!==(t=n.offset)&&void 0!==t?t:8,d=i.getBoundingClientRect(),c=e.container.getBoundingClientRect(),l=s.getBoundingClientRect();let p=0,h=0;switch(o){case"bottom":p=d.bottom-c.top+a;break;case"top":p=d.top-c.top-l.height-a;break;case"left":h=d.left-c.left-l.width-a,p=d.top-c.top+d.height/2-l.height/2;break;case"right":h=d.right-c.left+a,p=d.top-c.top+d.height/2-l.height/2}switch(r){case"center":"top"!==o&&"bottom"!==o||(h=d.left-c.left+d.width/2-l.width/2);break;case"end":"top"!==o&&"bottom"!==o||(h=d.right-c.left-l.width);break;default:"top"!==o&&"bottom"!==o||(h=d.left-c.left)}s.style.top=`${p}px`,s.style.left=`${h}px`,s.style.zIndex=""+this.zIndex++}toggle(e){this.dropdowns.get(e)?this.activeDropdown&&this.activeDropdown.id===e?this.hide(e):this.show(e):console.error("🔽 드롭다운 인스턴스를 찾을 수 없음:",e)}getSelectedValue(e){var t;return null===(t=this.dropdowns.get(e))||void 0===t?void 0:t.selectedValue}getSelectedText(e){var t;return null===(t=this.dropdowns.get(e))||void 0===t?void 0:t.selectedText}setValue(e,t,s){this.dropdowns.get(e)&&this.selectItem(e,t,s)}getDropdown(e){var t;return null===(t=this.dropdowns.get(e))||void 0===t?void 0:t.element}isOpen(e){const t=this.dropdowns.get(e);return!!t&&t.element.classList.contains("show")}closeAll(){this.dropdowns.forEach((e,t)=>this.hide(t))}destroy(e){const t=this.dropdowns.get(e);if(!t)return;this.hide(e);const s=t.trigger;s.__dewpHandler&&(s.removeEventListener("click",s.__dewpHandler),delete s.__dewpHandler),delete t.container.dataset.dropdownId,this.dropdowns.delete(e)}autoInitialize(){document.querySelectorAll(".dewp-dropdown").forEach(e=>{var t;const s=e.dataset.dropdownId;if(s&&this.dropdowns.has(s))return;const i=e.querySelector(".dewp-dropdown-toggle"),n=e.querySelector(".dewp-dropdown-menu");if(i&&n)try{const s=this.create({trigger:i,content:"",position:"bottom",align:"start",autoClose:!0,placeholder:((null===(t=i.querySelector(".dewp-dropdown-text"))||void 0===t?void 0:t.textContent)||"선택하세요").trim(),onSelect:(t,s)=>{const i=e.querySelector(".dewp-dropdown-text");i&&(i.textContent=s),e.setAttribute("data-selected-value",t)}});n.setAttribute("data-dropdown-id",s)}catch(e){console.error("❌ 드롭다운 자동 초기화 실패:",e)}else console.warn("⚠️ 드롭다운 구조 불완전:",{container:e})})}},z=e=>N.create(e),B=e=>{N.show(e)},H=e=>{N.hide(e)},W=e=>{N.toggle(e)},_=()=>{N.closeAll()},R=e=>N.getSelectedValue(e),V=e=>N.getSelectedText(e),G=(e,t,s)=>{N.setValue(e,t,s)},F=()=>{N.autoInitialize()};const j=new class{constructor(){this.drawers=new Map,this.activeDrawer=null,this.overlay=null,this.initGlobalEvents()}create(e){const t="dewp-drawer-"+Date.now();let s=null;if(e.target&&(s="string"==typeof e.target?document.querySelector(e.target):e.target),!s)throw new Error("Drawer 대상 요소를 찾을 수 없습니다.");let i=null;!1!==e.overlay&&(i=this.createOverlay(),document.body.appendChild(i));const n={id:t,element:s,options:e,trigger:void 0,isOpen:!1,overlay:i||void 0};return this.drawers.set(t,n),this.bindDrawerEvents(n),t}createDrawerElement(e){const t=document.createElement("div");t.className="dewp-drawer",e.position&&t.classList.add(`dewp-drawer-${e.position}`),e.size&&t.classList.add(`dewp-drawer-${e.size}`),e.theme&&t.classList.add(`dewp-drawer-${e.theme}`);const s=this.getDrawerTitle(e);return t.innerHTML=`\n <div class="dewp-drawer-header">\n <h3 class="dewp-drawer-title">${s}</h3>\n <button class="dewp-drawer-close">\n <svg viewBox="0 0 24 24">\n <path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/>\n </svg>\n </button>\n </div>\n <div class="dewp-drawer-content">\n ${e.content||"<p>Drawer 내용을 여기에 입력하세요.</p>"}\n </div>\n `,t}createOverlay(){const e=document.createElement("div");return e.className="dewp-drawer-overlay",e.addEventListener("click",()=>{this.closeAll()}),e}bindDrawerEvents(e){const{element:t,id:s}=e,i=t.querySelector(".dewp-drawer-close");if(i){const e=i;e.setAttribute("type","button"),e.setAttribute("aria-label","닫기"),e.setAttribute("title","닫기"),e.setAttribute("role","button"),e.addEventListener("click",()=>{this.close(s)}),e.addEventListener("keydown",e=>{const t=e;"Enter"!==t.key&&" "!==t.key||(t.preventDefault(),this.close(s))})}!1!==e.options.closeOnEscape&&document.addEventListener("keydown",t=>{"Escape"===t.key&&e.isOpen&&this.close(s)})}bindTriggerEvents(e){const{trigger:t,id:s}=e;t&&t.addEventListener("click",t=>{t.preventDefault(),t.stopPropagation(),e.isOpen?this.close(s):this.open(s)})}open(e){const t=this.drawers.get(e);t&&!t.isOpen&&(this.closeAll(),t.options.onBeforeOpen&&t.options.onBeforeOpen(),t.element.classList.add("dewp-drawer-open"),t.isOpen=!0,this.activeDrawer=t,t.overlay&&t.overlay.classList.add("show"),document.body.style.overflow="hidden",t.options.onOpen&&t.options.onOpen())}close(e){const t=this.drawers.get(e);t&&t.isOpen&&(t.options.onBeforeClose&&t.options.onBeforeClose(),t.element.classList.remove("dewp-drawer-open"),t.isOpen=!1,this.activeDrawer=null,t.overlay&&t.overlay.classList.remove("show"),document.body.style.overflow="",t.options.onClose&&t.options.onClose())}closeAll(){this.drawers.forEach(e=>{e.isOpen&&this.close(e.id)})}toggle(e){const t=this.drawers.get(e);t&&(t.isOpen?this.close(e):this.open(e))}destroy(e){const t=this.drawers.get(e);t&&(this.close(e),t.element.parentNode&&t.element.parentNode.removeChild(t.element),this.drawers.delete(e))}getInstance(e){return this.drawers.get(e)}isOpen(e){const t=this.drawers.get(e);return!!t&&t.isOpen}initGlobalEvents(){window.addEventListener("resize",()=>{this.activeDrawer&&this.adjustDrawerPosition(this.activeDrawer)}),window.addEventListener("scroll",()=>{this.activeDrawer&&this.adjustDrawerPosition(this.activeDrawer)},!0)}adjustDrawerPosition(e){}getDrawerTitle(e){return"right"===e.position?"정보 패널":"dark"===e.theme?"다크 테마":"sm"===e.size?"작은 Drawer":"lg"===e.size?"큰 Drawer":"xl"===e.size?"매우 큰 Drawer":"네비게이션"}autoInitialize(){document.querySelectorAll(".dewp-drawer").forEach((e,t)=>{if(!e.getAttribute("data-drawer-id"))try{const t=this.create({target:e,position:this.detectPosition(e),size:this.detectSize(e),theme:this.detectTheme(e),overlay:!0,closeOnEscape:!0,closeOnOverlayClick:!0});e.setAttribute("data-drawer-id",t)}catch(e){console.error("❌ Drawer 자동 초기화 실패:",e)}})}detectPosition(e){return e.classList.contains("dewp-drawer-right")?"right":e.classList.contains("dewp-drawer-top")?"top":e.classList.contains("dewp-drawer-bottom")?"bottom":"left"}detectSize(e){return e.classList.contains("dewp-drawer-sm")?"sm":e.classList.contains("dewp-drawer-lg")?"lg":e.classList.contains("dewp-drawer-xl")?"xl":"md"}detectTheme(e){return e.classList.contains("dewp-drawer-dark")?"dark":e.classList.contains("dewp-drawer-primary")?"primary":"default"}},U=e=>j.create(e),Y=e=>{j.open(e)},X=e=>{j.close(e)},J=e=>{j.toggle(e)},K=()=>{j.closeAll()},Q=e=>{j.destroy(e)},Z=e=>j.isOpen(e),ee=()=>{j.autoInitialize()};const te=new class{constructor(){this.tabInstances=new Map,this.autoInit()}autoInit(){"loading"===document.readyState?document.addEventListener("DOMContentLoaded",()=>this.autoInitTabs()):this.autoInitTabs()}autoInitTabs(){document.querySelectorAll("[data-tabs]").forEach(e=>{e.getAttribute("data-tabs")||e.id||Date.now(),this.initTabs(e,{container:e})})}initTabs(e,t){const s=e.id||"tabs-"+Date.now();this.tabInstances.has(s)&&this.destroy(s);const i=e.querySelector(".dewp-tabs");i&&i.setAttribute("role","tablist");const n=this.findTabElements(e),o=this.findPanelElements(e);if(0===n.size||0===o.size)throw new Error("탭 또는 패널 요소를 찾을 수 없습니다.");const r={id:s,container:e,options:t,tabs:n,panels:o,activeTabId:null};this.tabInstances.set(s,r),n.forEach((e,t)=>{const i=`${s}-tab-${t}`,n=o.get(t);if(n){const o=`${s}-panel-${t}`;e.setAttribute("id",i),e.setAttribute("role","tab"),e.setAttribute("aria-controls",o),e.setAttribute("tabindex","-1"),n.setAttribute("id",o),n.setAttribute("role","tabpanel"),n.setAttribute("aria-labelledby",i),n.setAttribute("tabindex","0")}}),this.bindTabEvents(r);const a=t.activeTab||Array.from(n.keys())[0];return this.activateTab(s,a),s}findTabElements(e){const t=new Map;if(e.querySelectorAll("[data-tab]").forEach(e=>{const s=e.getAttribute("data-tab");s&&t.set(s,e)}),0===t.size){e.querySelectorAll(".dewp-tab-btn").forEach((e,s)=>{const i=e.getAttribute("data-tab")||`tab-${s}`;t.set(i,e)})}return t}findPanelElements(e){const t=new Map;if(e.querySelectorAll("[data-panel]").forEach(e=>{const s=e.getAttribute("data-panel");s&&t.set(s,e)}),0===t.size){e.querySelectorAll(".dewp-tab-panel").forEach((e,s)=>{const i=e.getAttribute("data-panel")||`panel-${s}`;t.set(i,e)})}return t}bindTabEvents(e){const{tabs:t,container:s}=e;t.forEach((s,i)=>{s.addEventListener("click",t=>{t.preventDefault(),this.activateTab(e.id,i)}),s.addEventListener("keydown",s=>{["Enter"," "].includes(s.key)&&(s.preventDefault(),this.activateTab(e.id,i));const n=Array.from(t.keys()),o=n.indexOf(i);if("ArrowRight"===s.key){const e=n[(o+1)%n.length],s=t.get(e);null==s||s.focus()}else if("ArrowLeft"===s.key){const e=n[(o-1+n.length)%n.length],s=t.get(e);null==s||s.focus()}})})}activateTab(e,t){const s=this.tabInstances.get(e);if(!s)return;const{tabs:i,panels:n,activeTabId:o,options:r}=s,a=i.get(t),d=n.get(t);if(!a||!d)return;if(o){const e=i.get(o),t=n.get(o);e&&(e.classList.remove("active"),e.setAttribute("aria-selected","false"),e.setAttribute("tabindex","-1")),t&&(t.classList.remove("active"),t.setAttribute("aria-hidden","true"))}a.classList.add("active"),a.setAttribute("aria-selected","true"),a.setAttribute("tabindex","0"),a.focus(),d.classList.add("active"),d.setAttribute("aria-hidden","false");const c=s.activeTabId;s.activeTabId=t,r.onTabChange&&r.onTabChange(t,c||void 0),!1!==r.animation&&this.animateTabChange(d)}animateTabChange(e){e.style.opacity="0",e.style.transform="translateY(10px)",requestAnimationFrame(()=>{e.style.transition="all 0.3s ease",e.style.opacity="1",e.style.transform="translateY(0)"})}getActiveTab(e){const t=this.tabInstances.get(e);return t?t.activeTabId:null}getTabInstance(e){return this.tabInstances.get(e)}destroy(e){const t=this.tabInstances.get(e);t&&(t.tabs.forEach(e=>{e.replaceWith(e.cloneNode(!0))}),this.tabInstances.delete(e))}destroyAll(){this.tabInstances.forEach((e,t)=>{this.destroy(t)})}},se=(e,t)=>te.initTabs(e,t||{container:e}),ie=(e,t)=>{te.activateTab(e,t)},ne=e=>te.getActiveTab(e),oe=e=>te.getTabInstance(e),re=e=>{te.destroy(e)};const ae=new class{constructor(){this.accordionInstances=new Map,this.autoInit()}autoInit(){"loading"===document.readyState?document.addEventListener("DOMContentLoaded",()=>{setTimeout(()=>this.autoInitAccordions(),100)}):setTimeout(()=>this.autoInitAccordions(),100)}autoInitAccordions(){document.querySelectorAll("[data-accordion]").forEach(e=>{try{e.getAttribute("data-accordion")||e.id||Date.now();this.initAccordion(e,{})}catch(e){}})}initAccordion(e,t){const s=e.getAttribute("data-accordion")||e.id||"accordion-"+Date.now();if(e.hasAttribute("data-accordion-initialized"))return s;this.accordionInstances.has(s)&&this.destroy(s);const i=this.findAccordionItems(e),n=this.findAccordionHeaders(e),o=this.findAccordionContents(e);if(0===i.size)throw new Error("아코디언 아이템을 찾을 수 없습니다.");const r={id:s,container:e,options:{...this.getDefaultOptions(),...t},items:i,headers:n,contents:o,activeItems:new Set};return this.accordionInstances.set(s,r),this.bindAccordionEvents(r),i.forEach((e,t)=>{const s=n.get(t),i=o.get(t);s&&i&&(e.classList.remove("active"),s.classList.remove("active"),s.setAttribute("aria-expanded","false"),i.style.display="none",i.style.height="",i.style.opacity="",i.style.transform="",i.style.transition="",i.style.overflow="")}),t.activeItem&&i.has(t.activeItem)&&this.toggleItem(s,t.activeItem,!0),e.setAttribute("data-accordion-initialized","true"),s}getDefaultOptions(){return{animation:!0,multiple:!1,autoClose:!0}}findAccordionItems(e){const t=new Map;if(e.querySelectorAll("[data-accordion-item]").forEach(e=>{const s=e.getAttribute("data-accordion-item");s&&t.set(s,e)}),0===t.size){e.querySelectorAll(".dewp-accordion-item").forEach((e,s)=>{const i=e.id||`accordion-item-${s}`;t.set(i,e)})}return t}findAccordionHeaders(e){const t=new Map;if(e.querySelectorAll("[data-accordion-header]").forEach(e=>{const s=this.findParentItemId(e);s&&t.set(s,e)}),0===t.size){e.querySelectorAll(".dewp-accordion-header").forEach(e=>{const s=this.findParentItemId(e);s&&t.set(s,e)})}return t}findAccordionContents(e){const t=new Map;if(e.querySelectorAll("[data-accordion-content]").forEach(e=>{const s=this.findParentItemId(e);s&&t.set(s,e)}),0===t.size){e.querySelectorAll(".dewp-accordion-content").forEach(e=>{const s=this.findParentItemId(e);s&&t.set(s,e)})}return t}findParentItemId(e){let t=e.parentElement;for(;t;){if(t.hasAttribute("data-accordion-item")||t.classList.contains("dewp-accordion-item"))return t.getAttribute("data-accordion-item")||t.id||null;t=t.parentElement}return null}bindAccordionEvents(e){const{headers:t,container:s}=e;t.forEach((t,s)=>{t.addEventListener("click",t=>{t.preventDefault(),t.stopPropagation(),this.toggleItem(e.id,s)}),t.addEventListener("keydown",t=>{"Enter"!==t.key&&" "!==t.key||(t.preventDefault(),t.stopPropagation(),this.toggleItem(e.id,s))}),t.setAttribute("tabindex","0"),t.setAttribute("role","button"),t.setAttribute("aria-expanded","false"),t.setAttribute("aria-controls",`accordion-content-${s}`)}),e.contents.forEach((e,t)=>{e.setAttribute("id",`accordion-content-${t}`),e.setAttribute("role","region"),e.setAttribute("aria-labelledby",`accordion-header-${t}`)})}toggleItem(e,t,s){const i=this.accordionInstances.get(e);if(!i)return;const{items:n,headers:o,contents:r,options:a}=i,d=n.get(t),c=o.get(t),l=r.get(t);if(!d||!c||!l)return;const p=i.activeItems.has(t),h=void 0!==s?s:!p;h?this.openItemInternal(i,t,d,c,l):this.closeItemInternal(i,t,d,c,l),a.onItemToggle&&a.onItemToggle(t,h)}openItemInternal(e,t,s,i,n){const{options:o,activeItems:r}=e;!o.multiple&&o.autoClose&&r.forEach(s=>{s!==t&&this.closeItemInternal(e,s,e.items.get(s),e.headers.get(s),e.contents.get(s))}),r.add(t),s.classList.add("active"),i.classList.add("active"),i.setAttribute("aria-expanded","true"),o.animation?this.animateContent(n,!0):n.style.display="block"}closeItemInternal(e,t,s,i,n){const{options:o,activeItems:r}=e;r.delete(t),s.classList.remove("active"),i.classList.remove("active"),i.setAttribute("aria-expanded","false"),o.animation?this.animateContent(n,!1):n.style.display="none"}animateContent(e,t){t?(e.style.display="block",e.style.overflow="hidden",e.style.height="0px",e.style.opacity="0",e.style.transform="translateY(-10px)",e.offsetHeight,e.style.transition="all 0.4s cubic-bezier(0.4, 0, 0.2, 1)",e.style.height=e.scrollHeight+"px",e.style.opacity="1",e.style.transform="translateY(0)",setTimeout(()=>{e.style.height="",e.style.overflow="",e.style.transition="",e.style.opacity="",e.style.transform=""},400)):(e.style.overflow="hidden",e.style.height=e.scrollHeight+"px",e.style.opacity="1",e.style.transform="translateY(0)",e.offsetHeight,e.style.transition="all 0.4s cubic-bezier(0.4, 0, 0.2, 1)",e.style.height="0px",e.style.opacity="0",e.style.transform="translateY(-10px)",setTimeout(()=>{e.style.display="none",e.style.height="",e.style.overflow="",e.style.transition="",e.style.opacity="",e.style.transform=""},400))}openItem(e,t){this.toggleItem(e,t,!0)}closeItem(e,t){this.toggleItem(e,t,!1)}openAllItems(e){const t=this.accordionInstances.get(e);t&&t.items.forEach((t,s)=>{this.openItem(e,s)})}closeAllItems(e){const t=this.accordionInstances.get(e);t&&t.items.forEach((t,s)=>{this.closeItem(e,s)})}getActiveItems(e){const t=this.accordionInstances.get(e);return t?Array.from(t.activeItems):[]}isItemOpen(e,t){const s=this.accordionInstances.get(e);return!!s&&s.activeItems.has(t)}getAccordionInstance(e){return this.accordionInstances.get(e)||null}destroy(e){const t=this.accordionInstances.get(e);t&&(t.headers.forEach(e=>{e.removeEventListener("click",()=>{}),e.removeEventListener("keydown",()=>{})}),this.accordionInstances.delete(e))}destroyAll(){this.accordionInstances.forEach((e,t)=>{this.destroy(t)})}},de=(e,t)=>ae.initAccordion(e,t),ce=(e,t,s)=>{ae.toggleItem(e,t,s)},le=(e,t)=>{ae.openItem(e,t)},pe=(e,t)=>{ae.closeItem(e,t)},he=e=>{ae.openAllItems(e)},ue=e=>{ae.closeAllItems(e)},me=e=>ae.getActiveItems(e),we=(e,t)=>ae.isItemOpen(e,t),ge=e=>ae.getAccordionInstance(e),ve=e=>{ae.destroy(e)},be=()=>{ae.destroyAll()};const fe=new class{constructor(){this.popovers=new Map,this.triggerIndex=new WeakMap,this.active=null,this.uid=0,this.docHandlersBound=!1,this.bindDocumentHandlers()}genId(){var e,t;const s=(++this.uid).toString(36);try{return`dewp-popover-${null!==(t=null===(e=crypto.randomUUID)||void 0===e?void 0:e.call(crypto))&&void 0!==t?t:`${Date.now().toString(36)}-${s}`}`}catch{return`dewp-popover-${Date.now().toString(36)}-${s}`}}create(e){const t=this.genId(),s="string"==typeof e.trigger?document.querySelector(e.trigger):e.trigger;if(!s)throw new Error("Popover trigger not found");let i;"string"==typeof e.content?(i=document.createElement("div"),i.className="dewp-popover-content dewp-popover-bottom",i.innerHTML=e.content):(i=e.content,i.classList.add("dewp-popover-content")),s.id||(s.id=`${t}-trigger`),i.id||(i.id=`${t}-content`),s.setAttribute("aria-haspopup","dialog"),s.setAttribute("aria-controls",i.id),s.setAttribute("aria-expanded","false"),i.setAttribute("role","dialog"),i.setAttribute("aria-labelledby",s.id);const n=s.closest(".dewp-popover")||s.parentElement;!i.parentElement&&n&&n.appendChild(i);const o=e.placement||"bottom";i.classList.remove("dewp-popover-top","dewp-popover-bottom","dewp-popover-left","dewp-popover-right"),i.classList.add(`dewp-popover-${o}`);const r={id:t,trigger:s,popover:i,options:{placement:o,closeOnEscape:!1!==e.closeOnEscape},isOpen:!1};return this.popovers.set(t,r),this.triggerIndex.set(s,t),s.addEventListener("click",e=>{e.preventDefault(),e.stopPropagation(),this.toggle(t)}),t}bindDocumentHandlers(){this.docHandlersBound||(document.addEventListener("click",e=>{const t=e.target,s=this.active;s&&(s.trigger.contains(t)||s.popover.contains(t)||this.close(s.id))}),document.addEventListener("keydown",e=>{if("Escape"!==e.key)return;const t=this.active;t&&t.options.closeOnEscape&&this.close(t.id)}),this.docHandlersBound=!0)}open(e){var t;const s=this.popovers.get(e);s&&(this.active&&this.active.id!==e&&this.close(this.active.id),null===(t=s.popover.parentElement)||void 0===t||t.classList.add("is-open"),s.popover.classList.add("is-open"),s.trigger.setAttribute("aria-expanded","true"),s.isOpen=!0,this.active=s)}close(e){var t;const s=this.popovers.get(e);if(s){null===(t=s.popover.parentElement)||void 0===t||t.classList.remove("is-open"),s.popover.classList.remove("is-open"),s.trigger.setAttribute("aria-expanded","false"),s.isOpen=!1,this.active&&this.active.id===e&&(this.active=null);try{s.trigger.focus()}catch{}}}toggle(e){const t=this.popovers.get(e);t&&(t.isOpen?this.close(e):this.open(e))}toggleByTrigger(e){const t=this.triggerIndex.get(e);t&&this.toggle(t)}destroy(e){const t=this.popovers.get(e);t&&(this.close(e),this.triggerIndex.delete(t.trigger),this.popovers.delete(e))}},ye=e=>fe.create(e),Ee=e=>fe.open(e),Ae=e=>fe.close(e),Ie=e=>fe.toggle(e);class De{constructor(e){this.sidebar=null,this.activeItemId=null,this.isCollapsed=!1,this.config=e,this.init()}init(){this.createSidebar(),this.render(),this.bindEvents(),this.setActiveItem()}createSidebar(){const e=document.querySelector(".dewp-sidebar");e&&e.remove(),this.sidebar=document.createElement("div"),this.sidebar.className="dewp-sidebar dewp-sidebar--wrapper is-sticky",this.sidebar.id="dewp-sidebar",document.body.appendChild(this.sidebar)}render(){this.sidebar&&(this.sidebar.innerHTML=`\n <div class="dewp-sidebar-inner">\n ${this.renderHeader()}\n ${this.renderGroups()}\n ${this.renderFooter()}\n </div>\n `)}renderHeader(){const e=this.config.subtitle?`<p class="dewp-sidebar-subtitle">${this.config.subtitle}</p>`:"";return`\n <div class="dewp-sidebar-header">\n <h1 class="dewp-sidebar-title">${this.config.title}</h1>\n ${e}\n </div>\n `}renderGroups(){return this.config.groups.map(e=>`\n <div class="dewp-sidebar-group" data-group-id="${e.id}">\n ${e.title?`<h2 class="dewp-sidebar-group-title">${e.title}</h2>`:""}\n <ul class="dewp-sidebar-menu">\n ${this.renderMenuItems(e.items)}\n </ul>\n </div>\n `).join("")}renderMenuItems(e){return e.map(e=>{const t=e.icon?`<span class="dewp-sidebar-menu-icon">${e.icon}</span>`:"",s=e.hasSubmenu?'\n <span class="dewp-sidebar-menu-arrow">\n <svg viewBox="0 0 24 24">\n <path d="M8.59 16.59L13.17 12 8.59 7.41 10 6l6 6-6 6-1.41-1.41z"/>\n </svg>\n </span>\n ':"",i=e.hasSubmenu&&e.submenu?`\n <ul class="dewp-sidebar-submenu" id="submenu-${e.id}" aria-hidden="true">\n ${this.renderMenuItems(e.submenu)}\n </ul>\n `:"";return`\n <li class="dewp-sidebar-menu-item ${e.isActive?"is-active":""} ${e.hasSubmenu?"has-submenu":""}" data-item-id="${e.id}">\n <a href="${e.url||"#"}" class="dewp-sidebar-menu-link" ${e.url?"":'onclick="return false;"'} ${e.hasSubmenu?'role="button" aria-expanded="false" aria-controls="submenu-'+e.id+'"':""}>\n ${t}\n <span class="dewp-sidebar-menu-text">${e.text}</span>\n ${s}\n </a>\n ${i}\n </li>\n `}).join("")}renderFooter(){return this.config.footerText?`\n <div class="dewp-sidebar-footer">\n <p class="dewp-sidebar-footer-text">${this.config.footerText}</p>\n </div>\n `:""}bindEvents(){this.sidebar&&(this.sidebar.addEventListener("click",e=>{const t=e.target.closest(".dewp-sidebar-menu-item");if(!t)return;const s=t.getAttribute("data-item-id");s&&(t.classList.contains("has-submenu")?(e.preventDefault(),this.toggleSubmenu(t)):this.setActiveItem(s))}),document.addEventListener("keydown",e=>{"Escape"===e.key&&window.innerWidth<=768&&this.closeMobileSidebar()}))}toggleSubmenu(e){var t;const s=e.querySelector(".dewp-sidebar-submenu");if(!s)return;const i=s.classList.contains("expanded"),n=null===(t=e.parentElement)||void 0===t?void 0:t.querySelectorAll(".dewp-sidebar-menu-item.has-submenu");if(null==n||n.forEach(t=>{if(t!==e){const e=t.querySelector(".dewp-sidebar-submenu"),s=t.querySelector(".dewp-sidebar-menu-link");e&&e.classList.contains("expanded")&&(e.classList.remove("expanded"),e.style.maxHeight="0",null==s||s.setAttribute("aria-expanded","false"),e.setAttribute("aria-hidden","true")),t.classList.remove("is-open")}}),i){s.classList.remove("expanded"),s.style.maxHeight="0";const t=e.querySelector(".dewp-sidebar-menu-link");null==t||t.setAttribute("aria-expanded","false"),s.setAttribute("aria-hidden","true"),e.classList.remove("is-open")}else{s.classList.add("expanded"),s.style.maxHeight=s.scrollHeight+"px";const t=e.querySelector(".dewp-sidebar-menu-link");null==t||t.setAttribute("aria-expanded","true"),s.setAttribute("aria-hidden","false"),e.classList.add("is-open")}}setActiveItem(e){var t,s;e&&(this.activeItemId=e);const i=null===(t=this.sidebar)||void 0===t?void 0:t.querySelectorAll(".dewp-sidebar-menu-item.is-active");if(null==i||i.forEach(e=>e.classList.remove("is-active")),this.activeItemId){const e=null===(s=this.sidebar)||void 0===s?void 0:s.querySelector(`[data-item-id="${this.activeItemId}"]`);null==e||e.classList.add("is-active")}}addDivider(e,t="after"){var s;const i=null===(s=this.sidebar)||void 0===s?void 0:s.querySelector(`[data-group-id="${e}"]`);if(!i)return;const n=document.createElement("div");n.className="dewp-sidebar-divider","before"===t?i.insertBefore(n,i.firstChild):i.appendChild(n)}addGroup(e){this.config.groups.push(e),this.render(),this.bindEvents()}addMenuItem(e,t){const s=this.config.groups.find(t=>t.id===e);s&&(s.items.push(t),this.render(),this.bindEvents())}removeMenuItem(e,t){const s=this.config.groups.find(t=>t.id===e);s&&(s.items=s.items.filter(e=>e.id!==t),this.render(),this.bindEvents())}toggle(){this.sidebar&&window.innerWidth<=768&&this.sidebar.classList.toggle("is-open")}toggleCollapse(){this.sidebar&&(this.isCollapsed=!this.isCollapsed,this.sidebar.classList.toggle("is-collapsed",this.isCollapsed))}collapse(){this.sidebar&&(this.isCollapsed=!0,this.sidebar.classList.add("is-collapsed"))}expand(){this.sidebar&&(this.isCollapsed=!1,this.sidebar.classList.remove("is-collapsed"))}openMobileSidebar(){this.sidebar&&this.sidebar.classList.add("is-open")}closeMobileSidebar(){this.sidebar&&this.sidebar.classList.remove("is-open")}destroy(){this.sidebar&&(this.sidebar.remove(),this.sidebar=null)}updateConfig(e){this.config={...this.config,...e},this.render(),this.bindEvents()}getActiveItemId(){return this.activeItemId}getElement(){return this.sidebar}}window.DEWPSidebar=De;class Le{constructor(e,t={}){var s,i,n;this.input=e.querySelector(".dewp-stepper-input"),this.decrementBtn=e.querySelector(".dewp-stepper-decrement"),this.incrementBtn=e.querySelector(".dewp-stepper-increment"),this.options={min:null!==(s=t.min)&&void 0!==s?s:Number.MIN_SAFE_INTEGER,max:null!==(i=t.max)&&void 0!==i?i:Number.MAX_SAFE_INTEGER,step:null!==(n=t.step)&&void 0!==n?n:1},"number"==typeof t.value&&(this.input.value=String(t.value)),this.bindEvents(t.onChange),this.syncDisabled()}bindEvents(e){const t=()=>this.clamp(parseFloat(this.input.value||"0")),s=t=>{e&&e(t)};this.decrementBtn.addEventListener("click",()=>{const e=this.clamp(t()-this.options.step);this.input.value=String(e),this.syncDisabled(),s(e)}),this.incrementBtn.addEventListener("click",()=>{const e=this.clamp(t()+this.options.step);this.input.value=String(e),this.syncDisabled(),s(e)}),this.input.addEventListener("input",()=>{const e=t();this.input.value=String(e),this.syncDisabled(),s(e)})}clamp(e){return Math.min(this.options.max,Math.max(this.options.min,isNaN(e)?0:e))}syncDisabled(){const e=parseFloat(this.input.value||"0");this.decrementBtn.disabled=e<=this.options.min,this.incrementBtn.disabled=e>=this.options.max}}const Te="0.8.1";var Ce={qs:e,qsa:t,create:s,addClass:i,removeClass:n,toggleClass:o,hasClass:r,setText:a,setHTML:d,on:c,off:l,remove:p,append:h,insertBefore:u,clearChildren:I,setStyle:m,setData:w,getData:g,isDOMReady:v,onDOMReady:b,isElementVisible:f,scrollToElement:y,getElementRect:E,isChildOf:A,showToast:L,showSuccessToast:T,showWarningToast:x,showErrorToast:C,showInfoToast:S,createModal:M,openModal:$,closeModal:O,showModal:q,showConfirmModal:P,createDropdown:z,toggleDropdown:W,showDropdown:B,hideDropdown:H,closeAllDropdowns:_,getSelectedValue:R,getSelectedText:V,setDropdownValue:G,autoInitializeDropdowns:F,initTabs:se,activateTab:ie,getActiveTab:ne,getTabInstance:oe,destroyTabs:re,initAccordion:de,toggleAccordionItem:ce,openAccordionItem:le,closeAccordionItem:pe,openAllAccordionItems:he,closeAllAccordionItems:ue,getActiveAccordionItems:me,isAccordionItemOpen:we,getAccordionInstance:ge,destroyAccordion:ve,destroyAllAccordions:be,createDrawer:U,openDrawer:Y,closeDrawer:X,toggleDrawer:J,closeAllDrawers:K,destroyDrawer:Q,isDrawerOpen:Z,autoInitializeDrawers:ee,createPopover:ye,openPopover:Ee,closePopover:Ae,togglePopover:Ie,DEWPSidebar:De,DEWPStepper:Le,initStepper:(e,t={})=>new Le(e,t),ready:b,version:Te,info:{name:"DesignBase WordPress Library",description:"간단하고 강력한 프론트엔드 라이브러리",version:Te,author:"DesignBase",license:"MIT"}};if("undefined"!=typeof window){const D=window.DEWP={},k={qs:e,qsa:t,create:s,addClass:i,removeClass:n,toggleClass:o,hasClass:r,setText:a,setHTML:d,on:c,off:l,remove:p,append:h,insertBefore:u,clearChildren:I,setStyle:m,setData:w,getData:g,isDOMReady:v,onDOMReady:b,isElementVisible:f,scrollToElement:y,getElementRect:E,isChildOf:A,showToast:L,showSuccessToast:T,showWarningToast:x,showErrorToast:C,showInfoToast:S,createModal:M,openModal:$,closeModal:O,showModal:q,showConfirmModal:P,createDropdown:z,toggleDropdown:W,showDropdown:B,hideDropdown:H,closeAllDropdowns:_,getSelectedValue:R,getSelectedText:V,setDropdownValue:G,autoInitializeDropdowns:F,createDrawer:U,openDrawer:Y,closeDrawer:X,toggleDrawer:J,closeAllDrawers:K,destroyDrawer:Q,isDrawerOpen:Z,autoInitializeDrawers:ee,initTabs:se,activateTab:ie,getActiveTab:ne,getTabInstance:oe,destroyTabs:re,initAccordion:de,toggleAccordionItem:ce,openAccordionItem:le,closeAccordionItem:pe,openAllAccordionItems:he,closeAllAccordionItems:ue,getActiveAccordionItems:me,isAccordionItemOpen:we,getAccordionInstance:ge,destroyAccordion:ve,destroyAllAccordions:be,DEWPSidebar:De,createPopover:ye,openPopover:Ee,closePopover:Ae,togglePopover:Ie,ready:b,version:Te,info:{name:"DesignBase WordPress Library",description:"간단하고 강력한 프론트엔드 라이브러리",version:Te,author:"DesignBase",license:"MIT"}};Object.keys(k).forEach(e=>{D[e]=k[e]});try{console.log(`[DEWP] v${Te} loaded`)}catch{}b(()=>{try{F()}catch{}try{ee()}catch{}});try{"loading"!==document.readyState&&(F(),ee())}catch{}}return Ce}();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "designbase-wp-library",
3
- "version": "0.8.0",
3
+ "version": "0.8.1",
4
4
  "description": "Reusable CSS/JS kit for WordPress plugins (frontend/admin).",
5
5
  "license": "MIT",
6
6
  "type": "module",