@ninebone/util 1.0.34 → 1.0.36

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.
package/dist/nine-util.js CHANGED
@@ -224,7 +224,11 @@ __privateAdd(_Fetch, _request, (method, url, data = {}, headers = {}, showLoadin
224
224
  if (!res.ok) {
225
225
  const err = await res.json().catch(() => ({}));
226
226
  const errorMessage = err.message || `API 오류 (${res.status})`;
227
- nine == null ? void 0 : nine.alert(errorMessage).rgb().shake();
227
+ if (res.status === 400) {
228
+ nine == null ? void 0 : nine.alert(errorMessage).rgb().shake();
229
+ } else {
230
+ console.error("시스템 오류:", errorMessage);
231
+ }
228
232
  throw new Error(errorMessage);
229
233
  }
230
234
  return res.json();
@@ -1309,7 +1313,7 @@ class UxSplitter extends HTMLElement {
1309
1313
  const htmlTmpl = document.createElement("template");
1310
1314
  htmlTmpl.innerHTML = `
1311
1315
  <style>
1312
- @import "https://cdn.jsdelivr.net/npm/@ninebone/util@${"1.0.34"}/dist/css/nine-util.css";
1316
+ @import "https://cdn.jsdelivr.net/npm/@ninebone/util@${"1.0.36"}/dist/css/nine-util.css";
1313
1317
  ${customImport}
1314
1318
  </style>
1315
1319
  ${gripTmpl}
@@ -1728,6 +1732,44 @@ const TreeUtil = {
1728
1732
  return result;
1729
1733
  }
1730
1734
  };
1735
+ class NineSimplePopup extends HTMLElement {
1736
+ static get tagName() {
1737
+ return "nine-simple-popup";
1738
+ }
1739
+ constructor() {
1740
+ super();
1741
+ }
1742
+ connectedCallback() {
1743
+ const titleText = this.getAttribute("subject") || "Details";
1744
+ this.innerHTML = `
1745
+ <div class="ns-popup-overlay">
1746
+ <div class="ns-popup-dialog">
1747
+ <div class="ns-popup-header">
1748
+ <span class="ns-popup-title">${titleText}</span>
1749
+ <button class="ns-popup-close-btn">&times;</button>
1750
+ </div>
1751
+ <div class="ns-popup-body"></div>
1752
+ </div>
1753
+ </div>
1754
+ `;
1755
+ this.querySelector(".ns-popup-close-btn").onclick = () => this.close(null);
1756
+ this.querySelector(".ns-popup-overlay").onclick = (e) => {
1757
+ if (e.target.classList.contains("ns-popup-overlay")) {
1758
+ this.close(null);
1759
+ }
1760
+ };
1761
+ }
1762
+ close(returnValue = null) {
1763
+ this.dispatchEvent(new CustomEvent("closed", { detail: returnValue }));
1764
+ this.remove();
1765
+ }
1766
+ get popupBody() {
1767
+ return this.querySelector(".ns-popup-body") || null;
1768
+ }
1769
+ }
1770
+ if (!customElements.get("nine-simple-popup")) {
1771
+ customElements.define("nine-simple-popup", NineSimplePopup);
1772
+ }
1731
1773
  class NineUtil {
1732
1774
  constructor() {
1733
1775
  // 📅 1. 날짜 포맷 헬퍼 (인스턴스 메서드)
@@ -1763,6 +1805,30 @@ class NineUtil {
1763
1805
  }, 0);
1764
1806
  });
1765
1807
  });
1808
+ /**
1809
+ * 🎯 Non-Shadow DOM 기반의 자유로운 팝업 오픈 메서드
1810
+ */
1811
+ __publicField(this, "simplePopup", (ContentComponent, param = {}, title = "Details") => {
1812
+ document.querySelectorAll(NineSimplePopup.tagName).forEach((el) => el.remove());
1813
+ const $popupWrapper = document.createElement(NineSimplePopup.tagName);
1814
+ if (title) $popupWrapper.setAttribute("subject", title);
1815
+ document.body.appendChild($popupWrapper);
1816
+ return new Promise((resolve) => {
1817
+ const $bodySpace = $popupWrapper.popupBody;
1818
+ const root = createRoot($bodySpace);
1819
+ $popupWrapper.addEventListener("closed", (e) => {
1820
+ resolve(e.detail);
1821
+ setTimeout(() => {
1822
+ root.unmount();
1823
+ $popupWrapper.remove();
1824
+ }, 0);
1825
+ });
1826
+ root.render(React.createElement(ContentComponent, {
1827
+ data: param,
1828
+ onClose: (result) => $popupWrapper.close(result)
1829
+ }));
1830
+ });
1831
+ });
1766
1832
  /**
1767
1833
  * 🎯 2. Shadow DOM 경계를 무력화하고 깊이 상관없이 모든 요소를 수집하는 만능 쿼리
1768
1834
  * @param {string} selector - 찾고자 하는 CSS 선택자 (예: 'input[name]')