@nine-lab/nine-util 0.9.147 → 0.9.150

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
@@ -982,19 +982,19 @@ const dayjs = /* @__PURE__ */ getDefaultExportFromCjs(dayjs_minExports);
982
982
  class NineUtil {
983
983
  constructor() {
984
984
  __privateAdd(this, _NineUtil_instances);
985
+ __publicField(this, "alert", (message, title = "Alert") => {
986
+ return __privateMethod(this, _NineUtil_instances, prepare_fn).call(this, "alert", message, title, "classic");
987
+ });
988
+ __publicField(this, "confirm", (message, title = "Confirm") => {
989
+ return __privateMethod(this, _NineUtil_instances, prepare_fn).call(this, "confirm", message, title, "classic");
990
+ });
991
+ __publicField(this, "prompt", (message, title = "Prompt") => {
992
+ return __privateMethod(this, _NineUtil_instances, prepare_fn).call(this, "prompt", message, title, "classic");
993
+ });
985
994
  __publicField(this, "formatDate", (v, fmt) => {
986
995
  return dayjs(v).format(fmt);
987
996
  });
988
997
  }
989
- alert(message, title = "Alert") {
990
- return __privateMethod(this, _NineUtil_instances, prepare_fn).call(this, "alert", message, title, "classic");
991
- }
992
- confirm(message, title = "Confirm") {
993
- return __privateMethod(this, _NineUtil_instances, prepare_fn).call(this, "confirm", message, title, "classic");
994
- }
995
- prompt(message, title = "Prompt") {
996
- return __privateMethod(this, _NineUtil_instances, prepare_fn).call(this, "prompt", message, title, "classic");
997
- }
998
998
  }
999
999
  _NineUtil_instances = new WeakSet();
1000
1000
  /**
@@ -1481,7 +1481,7 @@ class UxSplitter extends HTMLElement {
1481
1481
  const htmlTmpl = document.createElement("template");
1482
1482
  htmlTmpl.innerHTML = `
1483
1483
  <style>
1484
- @import "https://cdn.jsdelivr.net/npm/@nine-lab/nine-util@${"0.9.147"}/dist/css/nine-util.css";
1484
+ @import "https://cdn.jsdelivr.net/npm/@nine-lab/nine-util@${"0.9.150"}/dist/css/nine-util.css";
1485
1485
  ${this.cssPath ? `@import "${this.cssPath}";` : ""}
1486
1486
  </style>
1487
1487
  ${gripTmpl}
@@ -1529,10 +1529,7 @@ if (!customElements.get("nine-splitter")) {
1529
1529
  customElements.define("nine-splitter", UxSplitter);
1530
1530
  }
1531
1531
  const utilInstance = new NineUtil();
1532
- nine.alert = utilInstance.alert.bind(utilInstance);
1533
- nine.confirm = utilInstance.confirm.bind(utilInstance);
1534
- nine.prompt = utilInstance.prompt.bind(utilInstance);
1535
- nine.formatDate = utilInstance.formatDate.bind(utilInstance);
1532
+ Object.assign(nine, utilInstance);
1536
1533
  nine.safe = safe;
1537
1534
  nine.api = api;
1538
1535
  nine.trace = trace$2;
@@ -1 +1 @@
1
- {"version":3,"file":"nine-util.js","sources":["../src/ux/dialog/style.dialog.js","../src/ux/dialog/nineDialog.js","../src/ux/dialog/nineConfirm.js","../src/ux/dialog/ninePrompt.js","../node_modules/dayjs/dayjs.min.js","../src/ux/dialog/NineUtil.js","../src/core/Config.js","../src/core/Trace.js","../src/core/TaskDebouncer.js","../src/external/NoPeer.js","../src/ux/Loading.js","../src/net/Fetch.js","../src/utils/promise.js","../src/ux/UxSplitter.js","../src/index.js"],"sourcesContent":["// nxDialog.styles.js\nexport const dialogStyles = `\n\tdialog::backdrop {\n\t\tbackground: rgba(0, 0, 0, 0.3);\n\t}\n\t\n\tdialog:modal {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tpadding: 0;\n\t\toverflow: hidden;\n\t\tborder: 1px solid darkgreen;\n\t\toutline: none;\n\t\tresize: both;\n\t\tbox-shadow: 0 0 4px 0 darkgreen;\n width: 500px;\n height: fit-content;\n min-width: 330px;\n min-height: 60px;\n max-height: 100%;\n }\n \n \n \n \n\tdiv.head .rect1, div.head .rect2, div.head .rect3 {\n\t\tdisplay: none;\n\t\twidth: 50px;\n\t\theight: 100%;\n\t}\n\tdiv.head .rect1 {\n\t\tbackground-color: red;\n\t}\n\tdiv.head .rect2 {\n\t\tbackground-color: darkgreen;\n\t}\n\tdiv.head .rect3 {\n\t\tbackground-color: olive;\n\t}\n\t\n\tdiv.head {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\t--height: 30px;\n\t\tbackground-color: darkgreen;\n\t\tpadding: 4px;\n\t\tcursor: move;\n\t}\n\tdiv.head:hover {\n\t\tfilter: brightness(110%);\n\t}\n\t\n\tdiv.head span {\n\t\tfont-size: 12px;\n\t\tposition: relative;\n\t}\n\t\n\tdiv.head span.title {\n\t\tcolor: #ddd;\n\t\tmargin-left: 4px;\n\t\tfont-weight: bold;\n\t}\n\t\n\tdiv.head span.sub-title {\n\t\tcolor: #ccc;\n\t\tmargin-left: 8px;\n\t\tfont-style: italic;\n\t}\n\t\n\tdiv.head form {\n\t\tmargin: 0;\n\t}\n\tdiv.head button {\n\t\tmargin-right: 4px;\n\t\tbackground-color: transparent;\n\t\tborder: none;\n\t\tcolor: #ccc;\n\t\tfont-size: x-small;\n\t}\n\tdiv.head button:hover {\n\t\tcursor: pointer;\n\t}\n\t\n\tdiv.contents {\n\t\tdisplay: flex;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\toverflow: hidden;\n\t}\n\tdiv.left {\n\t\tposition: relative;\n\t\twidth: 16px;\n\t\theight: 100%;\n\t\tbackground-color: #ddd;\n\t\tdisplay: none;\n\t}\n\t\n\tdiv.left span {\n\t\twriting-mode: vertical-rl;\n\t\t-moz-user-select: none;\n\t\t-webkit-user-select: none;\n\t\t-ms-user-select: none;\n\t\tuser-select: none;\n\t\tcolor: #ccc;\n\t\tfont-weight: 700;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tmargin-left: 3px;\n\t\tmargin-top: 3px;\n\t}\n\tdiv.close2 {\n\t\tdisplay: none;\n\t\tposition: absolute;\n\t\tright: 0;\n\t\ttop: 3px;\n\t\tcursor: pointer;\n\t\tcolor: #666;\n\t}\n\tdiv.close2 svg:hover {\n\t\tcolor: #999;\n\t}\n\t\n\tdiv.body {\n\t\tdisplay: flex;\n\t\twidth: 100%;\n\t\theight: unset;\n\t\t--border: 3px solid #999;\n\t\t--border-top: none;\n\t\toverflow-x: hidden;\n\t\toverflow-y: auto;\n\t\tpadding: 10px;\n\t\tgap: 8px;\n\t\tflex-direction: column;\n\t}\n\t\n\t\n\t\n\t\n\tng-sphere.icon {\n\t\tmargin-left: 8px;\n\t}\n\t\n\t.buttons {\n\t\tdisplay: flex;\n\t\tposition: absolute;\n\t\tright: 4px;\n\t}\n\t\n\tng-sphere {\n\t\tposition: relative;\n\t\t--width: 16px;\n\t\t--height: 16px;\n\t\tcursor: pointer;\n\t\tmargin-right: 4px;\n\t\tdisplay: flex;\n\t}\n\tng-sphere:hover {\n\t\tfilter: brightness(90%);\n\t}\n\tng-sphere:active {\n\t\tfilter: brightness(80%);\n\t}\n\t\n\tng-sphere:hover::after {\n\t\tcontent: \"\";\n\t\tposition: absolute;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tbackground-repeat: no-repeat;\n\t\tbackground-position: center;\n\t}\n\tng-sphere.apply:hover::after {\n\t\tbackground-size: 14px 14px;\n\t\tbackground-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\"><polyline points=\"2.5,7 6,10 11,3\" style=\"fill:none;stroke:white;stroke-width:2px;\" /></svg>');\n\t}\n\t\n\tng-sphere.reset:hover::after {\n\t\tbackground-size: 12px 12px;\n\t\tbackground-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\" style=\"fill:none;stroke:white;stroke-width:2px;\" focusable=\"false\" aria-hidden=\"true\"><path d=\"M10 5h5V0\"></path><path d=\"M15 8a6.957 6.957 0 0 1-7 7 6.957 6.957 0 0 1-7-7 6.957 6.957 0 0 1 7-7 6.87 6.87 0 0 1 6.3 4\"></path></svg>');\n\t}\n\t\n\tng-sphere.close:hover::after {\n\t\tbackground-size: 12px 12px;\n\t\tbackground-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" style=\"fill:none;stroke:white;stroke-width:2px;\" focusable=\"false\" aria-hidden=\"true\" viewBox=\"0 0 16 16\"><path d=\"M2 2l12 12M14 2L2 14\"></path></svg>');\n\t}\n\t\n\t\n\tbutton {\n cursor: pointer;\n }\n \n .input-area {\n position: relative;\n height: 100%;\n --display: flex;\n textarea {\n width: 100%;\n height: 100%;\n min-height: 100px;\n padding: 8px;\n box-sizing: border-box;\n resize: none;\n border-radius: 2px;\n border-color: #ccc;\n }\n textarea:focus {\n border-color: green;\n outline: none; /* 브라우저 기본 파란색 테두리 제거 */\n }\n }\n \n .buttons-confirm {\n position: absolute;\n display: flex;\n justify-content: flex-end;\n bottom: 8px;\n right: 8px;\n }\n \n \n .buttons-confirm button {\n height: 32px;\n margin-right: 8px;\n border: none;\n outline: none;\n width: 60px;\n -moz-user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n }\n .buttons-confirm button:hover {\n filter: brightness(90%);\n }\n .buttons-confirm button:active {\n color: #ccc;\n }\n \n button.ok {\n --display: none;\n background-color: darkgreen;\n color: white;\n }\n button.cancel {\n color: white;\n background-color: #6c757d;\n }\n \n \n \n div.msg {\n position: relative;\n height: 100%;\n font-size: 14px;\n color: #333;\n padding-bottom: 48px;\n }\n \n .reset, .apply {\n display: none;\n }\n \n \n \n :host(.classic) dialog:modal {\n border: 1px solid #007bff;\n box-shadow: 0 0 4px 0 #007bff;\n }\n \n :host(.classic) div.head {\n background-color: #007bff;\n }\n :host(.classic) div.head:hover {\n filter: brightness(110%);\n }\n \n :host(.classic) div.head span {\n font-size: 12px;\n }\n \n :host(.classic) div.head span.title {\n color: #ddd;\n margin-left: 4px;\n font-weight: bold;\n }\n \n :host(.classic) div.head span.sub-title {\n color: #ccc;\n margin-left: 8px;\n font-style: italic;\n }\n :host(.classic) div.head button {\n margin-right: 4px;\n background-color: transparent;\n border: none;\n color: #ccc;\n font-size: x-small;\n }\n \n \n \n \n :host(.rgb) dialog:modal {\n border: none;\n box-shadow: unset;\n border-top: none;\n }\n \n :host(.rgb) div.left {\n display: block;\n background-color: #ddd;\n }\n :host(.rgb) div.left span {\n color: #ccc;\n }\n :host(.rgb) div.close2 {\n display: block;\n color: #666;\n }\n :host(.rgb) div.close2 svg:hover {\n color: #999;\n }\n :host(.rgb) div.head {\n height: 4px;\n background-color: #999;\n padding: 0;\n }\n :host(.rgb) div.contents {\n height: calc(100% - 4px);\n }\n \n :host(.rgb) div.head ng-sphere,\n :host(.rgb) div.head span,\n :host(.rgb) div.head .buttons {\n display: none;\n }\n \n :host(.rgb) div.head .rect1,\n :host(.rgb) div.head .rect2,\n :host(.rgb) div.head .rect3 {\n display: flex;\n }\n \n \n :host(.rgb) div.head:hover {\n filter: unset;\n }\n \n \n /* --- Animation Core --- */\n:host {\n --nx-duration: 0.4s;\n --nx-timing: cubic-bezier(0.34, 1.56, 0.64, 1);\n}\n\n/* 🎯 수정: 애니메이션 클래스가 붙은 경우에만 초기 opacity를 0으로 설정 */\n:host(.fade) dialog,\n:host(.zoom) dialog,\n:host(.moveUp) dialog,\n:host(.moveDown) dialog,\n:host(.moveLeft) dialog,\n:host(.moveRight) dialog,\n:host(.roadRunner) dialog {\n opacity: 0;\n}\n\n/* shake는 애니메이션 내부에서 opacity를 다루므로 제외하거나 별도 처리 */\n:host(.shake) dialog { \n opacity: 1; \n}\n\n/* 1. Fade (서서히 나타남) */\n:host(.fade) dialog { animation: nx-fade-in var(--nx-duration) forwards; }\n@keyframes nx-fade-in { from { opacity: 0; } to { opacity: 1; } }\n\n/* 2. Zoom (커지며 나타남) */\n:host(.zoom) dialog { animation: nx-zoom-in var(--nx-duration) var(--nx-timing) forwards; }\n@keyframes nx-zoom-in { from { opacity: 0; transform: scale(0.5); } to { opacity: 1; transform: scale(1); } }\n\n/* 3. Slide (상하좌우) */\n:host(.moveUp) dialog { animation: nx-move-up var(--nx-duration) var(--nx-timing) forwards; }\n:host(.moveDown) dialog { animation: nx-move-down var(--nx-duration) var(--nx-timing) forwards; }\n:host(.moveLeft) dialog { animation: nx-move-left var(--nx-duration) var(--nx-timing) forwards; }\n:host(.moveRight) dialog { animation: nx-move-right var(--nx-duration) var(--nx-timing) forwards; }\n\n@keyframes nx-move-up { from { opacity: 0; transform: translateY(100px); } to { opacity: 1; transform: translateY(0); } }\n@keyframes nx-move-down { from { opacity: 0; transform: translateY(-100px); } to { opacity: 1; transform: translateY(0); } }\n@keyframes nx-move-left { from { opacity: 0; transform: translateX(100px); } to { opacity: 1; transform: translateX(0); } }\n@keyframes nx-move-right { from { opacity: 0; transform: translateX(-100px); } to { opacity: 1; transform: translateY(0); } }\n\n/* 4. Shake (상하좌우 격렬한 진동 - 에러 인지용) */\n:host(.shake) dialog { \n animation: nx-heavy-shake 0.5s cubic-bezier(.36,.07,.19,.97) both;\n opacity: 1; \n}\n\n@keyframes nx-heavy-shake {\n 10%, 90% { transform: translate3d(-1px, -2px, 0); }\n 20%, 80% { transform: translate3d(2px, 4px, 0); }\n 30%, 50%, 70% { transform: translate3d(-6px, -6px, 0); }\n 40%, 60% { transform: translate3d(6px, 6px, 0); }\n}\n\n/* 5. Road Runner (등장: 왼쪽에서 탄력 있게 / 퇴장: 움츠렸다가 광속 탈출) */\n:host(.roadRunner) dialog { \n animation: roadRunnerIn 0.5s cubic-bezier(0.175, 0.885, 0.32, 1.275) forwards; \n}\n\n@keyframes roadRunnerIn {\n 0% { transform: translateX(-1500px) skewX(30deg); opacity: 1; }\n 70% { transform: translateX(30px) skewX(-10deg); opacity: 1; }\n 100% { transform: translateX(0) skewX(0deg); opacity: 1; }\n}\n\n/* --- Out Animations (닫힐 때) --- */\ndialog.out { pointer-events: none; }\n\n/* Road Runner 퇴장: 슥 움츠렸다가(Anticipation) 쌩~! */\n:host(.roadRunner) dialog.out { \n animation: roadRunnerOut 0.5s cubic-bezier(0.6, -0.28, 0.735, 0.045) forwards; \n}\n\n@keyframes roadRunnerOut {\n 0% { \n transform: translateX(0) scale(1) skewX(0deg); \n opacity: 1; \n }\n 30% { \n /* 예비 동작: 뒤로 살짝 갔다가 움츠러들기 */\n transform: translateX(50px) scaleX(1.2) scaleY(0.8) skewX(-20deg); \n opacity: 1; \n }\n 100% { \n /* 발사: 길게 늘어나며 광속 탈출 */\n transform: translateX(2000px) scaleX(4) scaleY(0.3) skewX(50deg); \n opacity: 0; \n filter: blur(10px); /* 👈 잔상 느낌 추가 */\n }\n}\n\n/* 일반 퇴장 (기본) */\ndialog.out { animation: nx-fade-out 0.3s forwards; }\n@keyframes nx-fade-out { from { opacity: 1; transform: scale(1); } to { opacity: 0; transform: scale(0.9); } }\n`;","import { dialogStyles } from './style.dialog.js';\n\nexport class nineDialog extends HTMLElement\n{\n\t#shift;\n\t#dialog;\n\n\n\tconstructor () {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\n\t\tconst v = this.innerHTML;\n\t\tconst titleText = this.getAttribute(\"subject\") || \"Details\";\n\n\t\t//trace.log(dialogStyles);\n\n\t\tthis.innerHTML = `\n\t\t\t<style>${dialogStyles}</style>\n\t\t\n\t\t\t<dialog>\n\t\t\t\t<div class=\"head\">\n\t\t\t\t\t<div class=\"rect1\"></div>\n\t\t\t\t\t<div class=\"rect2\"></div>\n\t\t\t\t\t<div class=\"rect3\"></div>\n\t\t\t\t\t<ng-sphere class=\"icon\" end-fill=\"#666\" size=\"8\"></ng-sphere>\n\t\t\t\t\t<span class=\"title\">${titleText}</span>\n\t\t\t\t\t<span class=\"sub-title\"></span>\n\t\t\t\t\t<div class=\"buttons\">\n\t\t\t\t\t\t<ng-sphere class=\"apply\" start-fill=\"#cc6\" end-fill=\"#660\" size=\"16\" title=\"apply\"></ng-sphere>\n\t\t\t\t\t\t<ng-sphere class=\"reset\" start-fill=\"#99f\" end-fill=\"#00f\" size=\"16\" title=\"reset\"></ng-sphere>\n\t\t\t\t\t\t<ng-sphere class=\"close\" start-fill=\"#f99\" end-fill=\"#f00\" size=\"16\" title=\"close\"></ng-sphere>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"contents\">\n\t\t\t\t\t<div class=\"left\">\n\t\t\t\t\t\t<span>가나다라마바사아자차카타파하가나다라마바사아자차카타파하가나다라마바사아자차카타파하가나다라마바사아자차카타파하가나다라마바사아자차카타파하가나다라마바사아자차카타파하가나다라마바사아자차카타파하가나다라마바사아자차카타파하</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"body\">\n\t\t\t\t\t\t${v}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"close2\">\n\t\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n\t\t\t\t\t\t\t<path d=\"M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708\"/>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</dialog>\n\t\t`;\n\n\t\t//this.#owner = this.getRootNode().host.closest(\"nine-grid\");\n\n\t\t//$(\".title\", this).html(\"Details\");\n\n\t\tthis.#dialog = this.querySelector('dialog');\n\t\tthis.#init();\n\t};\n\n\tshowModal = () => {\n\t\tthis.#dialog.showModal();\n\t};\n\n\tclose = () => {\n\t\t// 이벤트 리스너 제거 (표준 방식은 핸들러 참조가 필요하지만,\n\t\t// 여기서는 요소가 사라지므로 메모리 관리를 위해 정리)\n\t\tthis.#dialog.close();\n\t\tthis.remove();\n\t};\n\n\t#init = () => {\n\t\tconst head = this.querySelector('.head');\n\n\t\tif (head) {\n\t\t\thead.addEventListener('mousedown', this.#onMouseDown);\n\t\t\thead.addEventListener('touchstart', this.#onTouchStart);\n\n\t\t\t// 마우스 커서를 드래그 가능 아이콘(이동 십자가) 모양으로 변경하여 UX 개선\n\t\t\t//head.style.cursor = 'move';\n\t\t}\n\n\t\t// 1. 모든 닫기 성격의 버튼 (.close, .close2, .cancel) 공통 처리\n\t\tthis.querySelectorAll('.close, .close2, .cancel').forEach(btn => {\n\t\t\tbtn.onclick = () => this.closeWithAnimation(null); // 취소/닫기는 null 리턴\n\t\t});\n\n\t\t// 2. 확인 버튼 (.ok) 처리\n\t\t// 확인 버튼은 텍스트 입력값 등 데이터가 필요하므로\n\t\t// 실제 데이터 추출은 각 팝업 클래스(prompt 등)에서 하되,\n\t\t// 닫기 애니메이션 실행은 여기서 담당하도록 가이드합니다.\n\t\tthis.querySelectorAll('.ok').forEach(btn => {\n\t\t\t// .ok 버튼의 로직은 각 팝업의 setupEvents에서 덮어쓰거나\n\t\t\t// 델리게이트 이벤트를 통해 처리합니다.\n\t\t});\n\n\t\t// 드래그 로직 생략...\n\t};\n\n\t// --- 드래그 로직 (Vanilla JS) ---\n\t#onMouseDown = e => {\n\n\t\tif (e.target.closest(\"buttons\")) return;\n\t\tif (e.button !== 0 || e.altKey || e.ctrlKey || e.shiftKey) return;\n\n\t\tconst rect = this.#dialog.getBoundingClientRect();\n\t\tthis.#shift = {\n\t\t\tx: e.clientX - rect.left,\n\t\t\ty: e.clientY - rect.top\n\t\t};\n\n\t\tconst onMouseMove = (ev) => {\n\t\t\tthis.#dialog.style.position = 'fixed';\n\t\t\tthis.#dialog.style.margin = '0';\n\t\t\tthis.#dialog.style.left = `${ev.clientX - this.#shift.x}px`;\n\t\t\tthis.#dialog.style.top = `${ev.clientY - this.#shift.y}px`;\n\t\t};\n\n\t\tconst onMouseUp = () => {\n\t\t\tdocument.removeEventListener('mousemove', onMouseMove);\n\t\t\tdocument.removeEventListener('mouseup', onMouseUp);\n\t\t};\n\n\t\tdocument.addEventListener('mousemove', onMouseMove);\n\t\tdocument.addEventListener('mouseup', onMouseUp);\n\t};\n\n\t#onTouchStart = e => {\n\t\tif (e.target.closest(\"buttons\")) return;\n\n\t\tconst rect = this.#dialog.getBoundingClientRect();\n\t\tconst touch = e.changedTouches[0];\n\t\tthis.#shift = {\n\t\t\tx: touch.pageX - rect.left,\n\t\t\ty: touch.pageY - rect.top\n\t\t};\n\n\t\tconst onTouchMove = (ev) => {\n\t\t\tconst t = ev.changedTouches[0];\n\t\t\tthis.#dialog.style.position = 'fixed';\n\t\t\tthis.#dialog.style.margin = '0';\n\t\t\tthis.#dialog.style.left = `${t.pageX - this.#shift.x}px`;\n\t\t\tthis.#dialog.style.top = `${t.pageY - this.#shift.y}px`;\n\t\t};\n\n\t\tconst onTouchEnd = () => {\n\t\t\tdocument.removeEventListener('touchmove', onTouchMove);\n\t\t\tdocument.removeEventListener('touchend', onTouchEnd);\n\t\t};\n\n\t\tdocument.addEventListener('touchmove', onTouchMove);\n\t\tdocument.addEventListener('touchend', onTouchEnd);\n\t};\n\n\tcloseWithAnimation(returnValue) {\n\t\tthis.#dialog.classList.add(\"out\"); // 퇴장 애니메이션 시작\n\n\t\t// 애니메이션(0.3s)이 끝난 후 제거 및 이벤트 발생\n\t\tsetTimeout(() => {\n\t\t\tthis.#dialog.close();\n\t\t\t// 부모(BasePopup)에게 작업 완료와 결과값을 알림\n\t\t\tthis.dispatchEvent(new CustomEvent('closed', { detail: returnValue }));\n\t\t\tthis.remove();\n\t\t}, 300);\n\t}\n}\n\n// BasePopup.js\nexport class BasePopup extends HTMLElement {\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.attachShadow({ mode: 'open' });\n\t}\n\n\tstatic async open(PopupClass, message, title, options, renderFn) {\n\t\t// 1. 설정 병합\n\t\tconst tagName = PopupClass.tagName.toLowerCase();\n\t\tconst config = {\n\t\t\t\"true-text\": \"확인\",\n\t\t\t\"false-text\": \"취소\",\n\t\t\tclass: \"classic\",\n\t\t\tanimation: \"fade\",\n\t\t\t...(window.nine?.config?.ux?.[tagName.replace('nine-', '').replace('-popup', '')] || {}),\n\t\t\t...options\n\t\t};\n\n\t\t// 2. 중복 제거 및 엘리먼트 생성\n\t\tdocument.querySelectorAll(tagName).forEach(el => el.remove());\n\t\tconst el = document.createElement(tagName);\n\t\tif (config.class) el.classList.add(config.class);\n\t\tif (config.animation) el.classList.add(config.animation);\n\t\tdocument.body.appendChild(el);\n\n\t\t// 3. 렌더링 (각 팝업의 UI 그리기)\n\t\trenderFn(el, message, config);\n\n\t\tconst dialogComp = el.shadowRoot.querySelector(\"nine-dialog\");\n\t\tif (title) dialogComp.setAttribute(\"subject\", title);\n\n\t\treturn new Promise((resolve) => {\n\t\t\t// [중요] nine-dialog의 애니메이션이 끝난 후 던지는 이벤트를 수신\n\t\t\tdialogComp.addEventListener('closed', (e) => resolve(e.detail));\n\n\t\t\t// 각 팝업 클래스에서 버튼 클릭 시 dialogComp.closeWithAnimation(값)을\n\t\t\t// 호출하도록 이벤트를 바인딩해줌\n\t\t\tel.setupEvents(resolve, dialogComp);\n\n\t\t\tdialogComp.showModal();\n\t\t});\n\t}\n}\n\nif (!customElements.get('nine-dialog')) {\n\tcustomElements.define(\"nine-dialog\", nineDialog);\n}\n","import { BasePopup } from \"./nineDialog.js\";\n\nexport class nineConfirmPopup extends BasePopup {\n\tstatic tagName = 'nine-confirm-popup';\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\n\trender(message, config) {\n\t\tthis.shadowRoot.innerHTML = `\n <nine-dialog>\n <div class=\"msg\">${message.replace(/\\n/g, \"<br/>\")}</div>\n <div class=\"buttons-confirm\">\n <button class=\"cancel\">${config[\"false-text\"]}</button>\n <button class=\"ok\">${config[\"true-text\"]}</button>\n </div>\n </nine-dialog>`;\n\t}\n\n\tsetupEvents(resolve, dialogComp) {\n\t\tthis.shadowRoot.querySelector(\".ok\").onclick = () => dialogComp.closeWithAnimation(true);\n\t\t// 취소는 nine-dialog 내부 기본 로직(closeWithAnimation(null))이 처리함\n\t}\n\n\tstatic confirm = (m, t, o) => BasePopup.open(nineConfirmPopup, m, t, o, (el, msg, conf) => el.render(msg, conf));\n}\n\n// --- 3. ALERT (단순 알림) ---\nexport class nineAlertPopup extends BasePopup {\n\tstatic tagName = 'nine-alert-popup';\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\trender(message, config) {\n\t\tthis.shadowRoot.innerHTML = `\n <nine-dialog>\n <div class=\"msg\">${message.replace(/\\n/g, \"<br/>\")}</div>\n <div class=\"buttons-confirm\">\n <button class=\"cancel\">확인</button>\n </div>\n </nine-dialog>`;\n\t}\n\n\tsetupEvents(resolve, dialogComp) {\n\t\t// 얼럿은 취소 버튼 하나만 두거나, 확인 버튼이 cancel 역할을 수행하게 함\n\t}\n\n\tstatic alert = (m, t, o) => BasePopup.open(nineAlertPopup, m, t, o, (el, msg, conf) => el.render(msg, conf));\n}\n\n// Custom Element 등록\nif (!customElements.get('nine-confirm-popup')) customElements.define('nine-confirm-popup', nineConfirmPopup);\nif (!customElements.get('nine-alert-popup')) customElements.define(\"nine-alert-popup\", nineAlertPopup);","import { BasePopup } from \"./nineDialog.js\";\n\n/**\n *\n */\nexport class ninePromptPopup extends BasePopup {\n\tstatic tagName = 'nine-prompt-popup';\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\trender(message, config) {\n\n\t\ttrace.log(this);\n\t\ttrace.log(this.shadowRoot);\n\n\t\tthis.shadowRoot.innerHTML = `\n\t\t\t<style>\n\t\t\t\tdialog {\n\t\t\t\t\theight: 300px !important;\n\t\t\t\t}\n\t\t\t\t.msg {\n\t\t\t\t\theight: unset !important;\n\t\t\t\t}\n\t\t\t</style>\n\t\t\t\n <nine-dialog>\n <div class=\"msg\">${message.replace(/\\n/g, \"<br/>\")}</div>\n <div class=\"input-area\">\n <textarea placeholder=\"내용을 입력하세요...\"></textarea>\n </div>\n <div class=\"buttons-confirm\">\n <button class=\"cancel\">${config[\"false-text\"]}</button>\n <button class=\"ok\">${config[\"true-text\"]}</button>\n </div>\n </nine-dialog>`;\n\t}\n\n\tsetupEvents(resolve, dialogComp) {\n\t\tconst textarea = this.shadowRoot.querySelector(\"textarea\");\n\t\tconst okBtn = this.shadowRoot.querySelector(\".ok\");\n\n\t\t// 확인 버튼 클릭 시 textarea 값을 가지고 애니메이션 닫기\n\t\tokBtn.onclick = () => dialogComp.closeWithAnimation(textarea.value);\n\n\t\t// 렌더링 후 포커스\n\t\trequestAnimationFrame(() => textarea.focus());\n\t}\n\n\tstatic prompt = (m, t, o) => BasePopup.open(ninePromptPopup, m, t, o, (el, msg, conf) => el.render(msg, conf));\n}\n\nif (!customElements.get('nine-prompt-popup')) {\n\tcustomElements.define('nine-prompt-popup', ninePromptPopup);\n}","!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs=e()}(this,(function(){\"use strict\";var t=1e3,e=6e4,n=36e5,r=\"millisecond\",i=\"second\",s=\"minute\",u=\"hour\",a=\"day\",o=\"week\",c=\"month\",f=\"quarter\",h=\"year\",d=\"date\",l=\"Invalid Date\",$=/^(\\d{4})[-/]?(\\d{1,2})?[-/]?(\\d{0,2})[Tt\\s]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?[.:]?(\\d+)?$/,y=/\\[([^\\]]+)]|YYYY|YY|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,M={name:\"en\",weekdays:\"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday\".split(\"_\"),months:\"January_February_March_April_May_June_July_August_September_October_November_December\".split(\"_\"),ordinal:function(t){var e=[\"th\",\"st\",\"nd\",\"rd\"],n=t%100;return\"[\"+t+(e[(n-20)%10]||e[n]||e[0])+\"]\"}},m=function(t,e,n){var r=String(t);return!r||r.length>=e?t:\"\"+Array(e+1-r.length).join(n)+t},v={s:m,z:function(t){var e=-t.utcOffset(),n=Math.abs(e),r=Math.floor(n/60),i=n%60;return(e<=0?\"+\":\"-\")+m(r,2,\"0\")+\":\"+m(i,2,\"0\")},m:function t(e,n){if(e.date()<n.date())return-t(n,e);var r=12*(n.year()-e.year())+(n.month()-e.month()),i=e.clone().add(r,c),s=n-i<0,u=e.clone().add(r+(s?-1:1),c);return+(-(r+(n-i)/(s?i-u:u-i))||0)},a:function(t){return t<0?Math.ceil(t)||0:Math.floor(t)},p:function(t){return{M:c,y:h,w:o,d:a,D:d,h:u,m:s,s:i,ms:r,Q:f}[t]||String(t||\"\").toLowerCase().replace(/s$/,\"\")},u:function(t){return void 0===t}},g=\"en\",D={};D[g]=M;var p=\"$isDayjsObject\",S=function(t){return t instanceof _||!(!t||!t[p])},w=function t(e,n,r){var i;if(!e)return g;if(\"string\"==typeof e){var s=e.toLowerCase();D[s]&&(i=s),n&&(D[s]=n,i=s);var u=e.split(\"-\");if(!i&&u.length>1)return t(u[0])}else{var a=e.name;D[a]=e,i=a}return!r&&i&&(g=i),i||!r&&g},O=function(t,e){if(S(t))return t.clone();var n=\"object\"==typeof e?e:{};return n.date=t,n.args=arguments,new _(n)},b=v;b.l=w,b.i=S,b.w=function(t,e){return O(t,{locale:e.$L,utc:e.$u,x:e.$x,$offset:e.$offset})};var _=function(){function M(t){this.$L=w(t.locale,null,!0),this.parse(t),this.$x=this.$x||t.x||{},this[p]=!0}var m=M.prototype;return m.parse=function(t){this.$d=function(t){var e=t.date,n=t.utc;if(null===e)return new Date(NaN);if(b.u(e))return new Date;if(e instanceof Date)return new Date(e);if(\"string\"==typeof e&&!/Z$/i.test(e)){var r=e.match($);if(r){var i=r[2]-1||0,s=(r[7]||\"0\").substring(0,3);return n?new Date(Date.UTC(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)):new Date(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)}}return new Date(e)}(t),this.init()},m.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},m.$utils=function(){return b},m.isValid=function(){return!(this.$d.toString()===l)},m.isSame=function(t,e){var n=O(t);return this.startOf(e)<=n&&n<=this.endOf(e)},m.isAfter=function(t,e){return O(t)<this.startOf(e)},m.isBefore=function(t,e){return this.endOf(e)<O(t)},m.$g=function(t,e,n){return b.u(t)?this[e]:this.set(n,t)},m.unix=function(){return Math.floor(this.valueOf()/1e3)},m.valueOf=function(){return this.$d.getTime()},m.startOf=function(t,e){var n=this,r=!!b.u(e)||e,f=b.p(t),l=function(t,e){var i=b.w(n.$u?Date.UTC(n.$y,e,t):new Date(n.$y,e,t),n);return r?i:i.endOf(a)},$=function(t,e){return b.w(n.toDate()[t].apply(n.toDate(\"s\"),(r?[0,0,0,0]:[23,59,59,999]).slice(e)),n)},y=this.$W,M=this.$M,m=this.$D,v=\"set\"+(this.$u?\"UTC\":\"\");switch(f){case h:return r?l(1,0):l(31,11);case c:return r?l(1,M):l(0,M+1);case o:var g=this.$locale().weekStart||0,D=(y<g?y+7:y)-g;return l(r?m-D:m+(6-D),M);case a:case d:return $(v+\"Hours\",0);case u:return $(v+\"Minutes\",1);case s:return $(v+\"Seconds\",2);case i:return $(v+\"Milliseconds\",3);default:return this.clone()}},m.endOf=function(t){return this.startOf(t,!1)},m.$set=function(t,e){var n,o=b.p(t),f=\"set\"+(this.$u?\"UTC\":\"\"),l=(n={},n[a]=f+\"Date\",n[d]=f+\"Date\",n[c]=f+\"Month\",n[h]=f+\"FullYear\",n[u]=f+\"Hours\",n[s]=f+\"Minutes\",n[i]=f+\"Seconds\",n[r]=f+\"Milliseconds\",n)[o],$=o===a?this.$D+(e-this.$W):e;if(o===c||o===h){var y=this.clone().set(d,1);y.$d[l]($),y.init(),this.$d=y.set(d,Math.min(this.$D,y.daysInMonth())).$d}else l&&this.$d[l]($);return this.init(),this},m.set=function(t,e){return this.clone().$set(t,e)},m.get=function(t){return this[b.p(t)]()},m.add=function(r,f){var d,l=this;r=Number(r);var $=b.p(f),y=function(t){var e=O(l);return b.w(e.date(e.date()+Math.round(t*r)),l)};if($===c)return this.set(c,this.$M+r);if($===h)return this.set(h,this.$y+r);if($===a)return y(1);if($===o)return y(7);var M=(d={},d[s]=e,d[u]=n,d[i]=t,d)[$]||1,m=this.$d.getTime()+r*M;return b.w(m,this)},m.subtract=function(t,e){return this.add(-1*t,e)},m.format=function(t){var e=this,n=this.$locale();if(!this.isValid())return n.invalidDate||l;var r=t||\"YYYY-MM-DDTHH:mm:ssZ\",i=b.z(this),s=this.$H,u=this.$m,a=this.$M,o=n.weekdays,c=n.months,f=n.meridiem,h=function(t,n,i,s){return t&&(t[n]||t(e,r))||i[n].slice(0,s)},d=function(t){return b.s(s%12||12,t,\"0\")},$=f||function(t,e,n){var r=t<12?\"AM\":\"PM\";return n?r.toLowerCase():r};return r.replace(y,(function(t,r){return r||function(t){switch(t){case\"YY\":return String(e.$y).slice(-2);case\"YYYY\":return b.s(e.$y,4,\"0\");case\"M\":return a+1;case\"MM\":return b.s(a+1,2,\"0\");case\"MMM\":return h(n.monthsShort,a,c,3);case\"MMMM\":return h(c,a);case\"D\":return e.$D;case\"DD\":return b.s(e.$D,2,\"0\");case\"d\":return String(e.$W);case\"dd\":return h(n.weekdaysMin,e.$W,o,2);case\"ddd\":return h(n.weekdaysShort,e.$W,o,3);case\"dddd\":return o[e.$W];case\"H\":return String(s);case\"HH\":return b.s(s,2,\"0\");case\"h\":return d(1);case\"hh\":return d(2);case\"a\":return $(s,u,!0);case\"A\":return $(s,u,!1);case\"m\":return String(u);case\"mm\":return b.s(u,2,\"0\");case\"s\":return String(e.$s);case\"ss\":return b.s(e.$s,2,\"0\");case\"SSS\":return b.s(e.$ms,3,\"0\");case\"Z\":return i}return null}(t)||i.replace(\":\",\"\")}))},m.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},m.diff=function(r,d,l){var $,y=this,M=b.p(d),m=O(r),v=(m.utcOffset()-this.utcOffset())*e,g=this-m,D=function(){return b.m(y,m)};switch(M){case h:$=D()/12;break;case c:$=D();break;case f:$=D()/3;break;case o:$=(g-v)/6048e5;break;case a:$=(g-v)/864e5;break;case u:$=g/n;break;case s:$=g/e;break;case i:$=g/t;break;default:$=g}return l?$:b.a($)},m.daysInMonth=function(){return this.endOf(c).$D},m.$locale=function(){return D[this.$L]},m.locale=function(t,e){if(!t)return this.$L;var n=this.clone(),r=w(t,e,!0);return r&&(n.$L=r),n},m.clone=function(){return b.w(this.$d,this)},m.toDate=function(){return new Date(this.valueOf())},m.toJSON=function(){return this.isValid()?this.toISOString():null},m.toISOString=function(){return this.$d.toISOString()},m.toString=function(){return this.$d.toUTCString()},M}(),Y=_.prototype;return O.prototype=Y,[[\"$ms\",r],[\"$s\",i],[\"$m\",s],[\"$H\",u],[\"$W\",a],[\"$M\",c],[\"$y\",h],[\"$D\",d]].forEach((function(t){Y[t[1]]=function(e){return this.$g(e,t[0],t[1])}})),O.extend=function(t,e){return t.$i||(t(e,_,O),t.$i=!0),O},O.locale=w,O.isDayjs=S,O.unix=function(t){return O(1e3*t)},O.en=D[g],O.Ls=D,O.p={},O}));","// src/core/NineUtil.js\r\nimport { nineAlertPopup, nineConfirmPopup } from './nineConfirm.js';\r\nimport { ninePromptPopup } from \"./ninePrompt.js\";\r\nimport dayjs from 'dayjs';\r\n\r\nexport class NineUtil {\r\n\t// static 필드는 클래스 자체에 저장됨\r\n\tstatic cssPath = \"\";\r\n\r\n\t/**\r\n\t * 팝업 준비 로직 (Private 메서드)\r\n\t */\r\n\t#prepare(type, message, title, defaultClass) {\r\n\r\n\t\tconst options = { class: defaultClass, animation: 'fade' };\r\n\t\t//const popup = type === 'alert' ? nineAlertPopup : (type === 'confirm' ? nineConfirmPopup : ninePromptPopup);\r\n\t\tlet isExecuted = false;\r\n\r\n\t\tconst popupMap = {\r\n\t\t\talert: nineAlertPopup,\r\n\t\t\tconfirm: nineConfirmPopup,\r\n\t\t\tprompt: ninePromptPopup\r\n\t\t};\r\n\r\n\t\tconst popup = popupMap[type];\r\n\r\n\t\tconst runner = {\r\n\t\t\trgb: () => { options.class = 'rgb'; return runner; },\r\n\t\t\tclassic: () => { options.class = 'classic'; return runner; },\r\n\t\t\tshake: () => { options.animation = 'shake'; return runner; },\r\n\t\t\trun: () => { options.animation = 'roadRunner'; return runner; },\r\n\t\t\tzoom: () => { options.animation = 'zoom'; return runner; },\r\n\r\n\t\t\tthen: (resolve, reject) => {\r\n\t\t\t\tisExecuted = true;\r\n\t\t\t\treturn popup[type](message, title, options).then(resolve, reject);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t// Microtask: 동기 체이닝이 모두 끝난 후 실행\r\n\t\tPromise.resolve().then(() => {\r\n\t\t\tif (!isExecuted) {\r\n\t\t\t\tisExecuted = true;\r\n\t\t\t\tpopup[type](message, title, options);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn runner;\r\n\t}\r\n\r\n\talert(message, title = \"Alert\") {\r\n\t\treturn this.#prepare('alert', message, title, 'classic');\r\n\t}\r\n\r\n\tconfirm(message, title = \"Confirm\") {\r\n\t\treturn this.#prepare('confirm', message, title, 'classic');\r\n\t}\r\n\r\n\tprompt(message, title = \"Prompt\") {\r\n\t\treturn this.#prepare('prompt', message, title, 'classic');\r\n\t}\r\n\r\n\tformatDate = (v, fmt) => {\r\n\t\treturn dayjs(v).format(fmt)\r\n\t}\r\n}","const listeners = new Set();\r\n\r\n// 💡 [핵심] 전역 저장소를 단일화합니다.\r\n// window에 이미 있으면 그것을 쓰고, 없으면 초기값을 생성하여 등록합니다.\r\nconst _initialConfig = {\r\n\tux: { nativeOverride: false, theme: 'light' },\r\n\tboard: { readOnly: false },\r\n\tcssPath: \"\",\r\n\tdebug: false\r\n};\r\n\r\nif (typeof window !== 'undefined' && !window.__NINE_GLOBAL_CONFIG__) {\r\n\twindow.__NINE_GLOBAL_CONFIG__ = _initialConfig;\r\n}\r\n\r\n// 이제 모든 모듈의 _config는 동일한 window 객체 메모리를 가리킵니다.\r\nconst _config = typeof window !== 'undefined' ? window.__NINE_GLOBAL_CONFIG__ : _initialConfig;\r\n\r\nexport const subscribeConfig = (fn) => {\r\n\tlisteners.add(fn);\r\n\tfn('all', _config);\r\n\treturn () => listeners.delete(fn);\r\n};\r\n\r\n// Proxy 역시 전역 저장소인 _config를 조작합니다.\r\nexport const config = new Proxy(_config, {\r\n\tset(target, prop, value) {\r\n\t\ttarget[prop] = value;\r\n\t\tlisteners.forEach(fn => fn(prop, target));\r\n\t\treturn true;\r\n\t},\r\n\tget(target, prop) {\r\n\t\treturn target[prop];\r\n\t}\r\n});\r\n\r\nexport const nine = {\r\n\tconfig: config,\r\n\r\n\t// Getter에서 window.nine까지 확인할 필요도 없습니다.\r\n\t// 이미 config 자체가 전역 저장소(__NINE_GLOBAL_CONFIG__)를 바라보고 있기 때문입니다.\r\n\tget cssPath() {\r\n\t\treturn this.config.cssPath || \"\";\r\n\t},\r\n\r\n\tsetup(options = {}) {\r\n\t\tObject.entries(options).forEach(([key, value]) => {\r\n\t\t\t// 깊은 병합 지원\r\n\t\t\tif (typeof value === 'object' && value !== null && !Array.isArray(value)) {\r\n\t\t\t\tthis.config[key] = { ...this.config[key], ...value };\r\n\t\t\t} else {\r\n\t\t\t\tthis.config[key] = value;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// 다른 모듈에서 window.nine으로 접근할 수 있도록 보장\r\n\t\tif (typeof window !== 'undefined') {\r\n\t\t\twindow.nine = window.nine || this;\r\n\t\t}\r\n\t}\r\n};","export class Trace {\r\n\t#name;\r\n\t#color;\r\n\t#enabled = true;\r\n\r\n\tconstructor(name = null, color = \"green\") {\r\n\t\tthis.#name = name;\r\n\t\tthis.#color = color;\r\n\t\tthis.#autoConfig();\r\n\t\t/**\r\n\t\t// 1. 쪼개진 인스턴스들을 하나로 합치는 '본드' 역할 (이게 핵심!)\r\n\t\tif (typeof window !== 'undefined' && window.__NINE_TRACE__) {\r\n\t\t\treturn window.__NINE_TRACE__;\r\n\t\t}\r\n\t\tthis.#autoConfig();\r\n\t\tif (typeof window !== 'undefined') window.__NINE_TRACE__ = this;\r\n\t\t\t*/\r\n\t}\r\n\r\n\t#autoConfig() {\r\n\t\tif (typeof window === 'undefined') return;\r\n\t\tconst isLocal = window.location.hostname === 'localhost' ||\r\n\t\t\twindow.location.hostname === '127.0.0.1' ||\r\n\t\t\twindow.location.hostname.startsWith('192.168.');\r\n\r\n\t\tif (isLocal) {\r\n\t\t\tthis.enable();\r\n\t\t} else {\r\n\t\t\tthis.disable();\r\n\t\t\tconsole.log(\r\n\t\t\t\t`%c[${this.#name || 'Trace'}]%c 운영 모드: 로그 비활성화. %ctrace.enable()%c 로 활성화 가능`,\r\n\t\t\t\t\"color: #4CAF50; font-weight: bold;\", \"\",\r\n\t\t\t\t\"background: #333; color: yellow; padding: 2px 5px;\", \"\"\r\n\t\t\t);\r\n\t\t}\r\n\t}\r\n\r\n\t// 🟢 빼먹었던 init 메서드 다시 추가!\r\n\tinitBAK(name, color = \"green\") {\r\n\t\tthis.#name = name;\r\n\t\tthis.#color = color;\r\n\t}\r\n\r\n\tinit(name, color = \"green\") {\r\n\t\t//const style = `color: ${color}; font-weight: bold;`;\r\n\t\tthis.#name = name;\r\n\t\tthis.#color = color;\r\n\r\n\t\treturn this;\r\n\t\t/**\r\n\t\tconsole.log(name, color);\r\n\t\treturn {\r\n\t\t\tlog: console.log.bind(console, `%c[${name}]`, style),\r\n\t\t\twarn: console.warn.bind(console, `%c[${name}]`, \"color: cyan; font-weight: bold;\"),\r\n\t\t\terror: console.error.bind(console, `%c[${name}]`, \"color: red; font-weight: bold;\")\r\n\t\t}; */\r\n\t}\r\n\r\n\t//get log() { return console.log.bind(console); }\r\n\r\n\t// 🔴 핵심: 소스 위치를 호출부로 찍어주는 Getter 로직\r\n\tget log() {\r\n\t\t//if (!this.#enabled) return () => {};\r\n\t\tconst style = `color: ${this.#color}; font-weight: bold;`;\r\n\t\t// 이름이 있으면 프리픽스를 붙이고, 없으면 그냥 로그를 바인딩합니다.\r\n\t\treturn (this.#name)\r\n\t\t\t? console.log.bind(console, `%c[${this.#name}]`, style)\r\n\t\t\t: console.log.bind(console);\r\n\t}\r\n\r\n\tget warn() {\r\n\t\tif (!this.#enabled) return () => {};\r\n\t\treturn (this.#name)\r\n\t\t\t? console.warn.bind(console, `%c[${this.#name}]`, \"color: cyan; font-weight: bold;\")\r\n\t\t\t: console.warn.bind(console);\r\n\t}\r\n\r\n\tget error() {\r\n\t\t// 에러는 enabled 상태와 상관없이 찍고 싶으시면 if 체크를 주석 처리하세요.\r\n\t\t// if (!this.#enabled) return () => {};\r\n\t\treturn (this.#name)\r\n\t\t\t? console.error.bind(console, `%c[${this.#name}]`, \"color: red; font-weight: bold;\")\r\n\t\t\t: console.error.bind(console);\r\n\t}\r\n\r\n\tenable() { this.#enabled = true; }\r\n\tdisable() { this.#enabled = false; }\r\n}\r\n\r\nexport const trace = new Trace();\r\nif (typeof window !== 'undefined') window.trace = trace;","export class TaskDebouncer {\r\n\t#timer = null;\r\n\t#queue = [];\r\n\t#delay;\r\n\r\n\tconstructor(delay = 50) {\r\n\t\tthis.#delay = delay;\r\n\t}\r\n\r\n\t/**\r\n\t * @param {Function} func - 실행할 함수\r\n\t * @param {...any} args - 함수에 전달할 임의의 파라미터들\r\n\t */\r\n\texec(func, ...args) {\r\n\t\t// 1. 어떤 함수와 어떤 인자들이 들어왔는지 큐에 저장\r\n\t\tthis.#queue.push({ func, args });\r\n\r\n\t\t// 2. 디바운스 타이머 설정\r\n\t\tif (this.#timer) clearTimeout(this.#timer);\r\n\r\n\t\tthis.#timer = setTimeout(() => this.#flush(), this.#delay);\r\n\t}\r\n\r\n\texecWithKey(key, func, ...args) {\r\n\t\t// 1. 같은 키(예: 'resize')가 들어오면 이전 큐에서 해당 키 삭제 (중복 제거)\r\n\t\tthis.#queue = this.#queue.filter(task => task.key !== key);\r\n\r\n\t\t// 2. 새로운 태스크 추가\r\n\t\tthis.#queue.push({ key, func, args });\r\n\r\n\t\tif (this.#timer) clearTimeout(this.#timer);\r\n\t\tthis.#timer = setTimeout(() => this.#flush(), this.#delay);\r\n\t}\r\n\r\n\t#flush() {\r\n\t\tif (this.#queue.length === 0) return;\r\n\r\n\t\t// 3. 현재까지 쌓인 큐를 쏙 빼옴\r\n\t\tconst tasks = this.#queue.splice(0, this.#queue.length);\r\n\t\tconst seen = new Set();\r\n\r\n\t\ttasks.forEach(task => {\r\n\t\t\t// 4. 핵심: 함수 이름과 인자들을 문자열로 합쳐서 유니크 키 생성\r\n\t\t\t// JSON.stringify를 통해 [1, {a:1}] 같은 파라미터도 문자열로 비교 가능\r\n\t\t\tconst identifier = `${task.func.name}_${JSON.stringify(task.args)}`;\r\n\r\n\t\t\tif (!seen.has(identifier)) {\r\n\t\t\t\t// 5. 중복이 아닐 때만 원래 인자들(...args) 그대로 실행\r\n\t\t\t\ttask.func(...task.args);\r\n\t\t\t\tseen.add(identifier);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tthis.#timer = null;\r\n\t}\r\n}","import { trace as traceOrigin } from '../core/Trace.js';\n\nexport class Trace extends traceOrigin.constructor {\n constructor() {\n super();\n this.init(\"nine-util\", \"green\");\n }\n}\n\nexport const trace = new Trace();","export class Loading {\n\tstatic show() {\n\t\tlet overlay = document.getElementById(\"global-loading-overlay\");\n\t\tif (!overlay) {\n\t\t\toverlay = document.createElement(\"div\");\n\t\t\toverlay.id = \"global-loading-overlay\";\n\t\t\toverlay.style.cssText = `\n position: fixed; inset: 0; z-index: 9999;\n background: rgba(0, 0, 0, 0.4); display: flex; \n justify-content: center; align-items: center;\n backdrop-filter: blur(2px);\n `;\n\t\t\toverlay.innerHTML = `<div class=\"loading-spinner\"></div>`;\n\t\t\tdocument.body.appendChild(overlay);\n\n\t\t\tif (!document.getElementById(\"nine-util-style\")) {\n\t\t\t\tconst style = document.createElement(\"style\");\n\t\t\t\tstyle.id = \"nine-util-style\";\n\t\t\t\tstyle.innerHTML = `\n .loading-spinner {\n width: 48px; height: 48px;\n border: 5px solid rgba(255, 255, 255, 0.3);\n border-top-color: white; border-radius: 50%;\n animation: nine-spin 1s linear infinite;\n }\n @keyframes nine-spin { to { transform: rotate(360deg); } }\n `;\n\t\t\t\tdocument.head.appendChild(style);\n\t\t\t}\n\t\t}\n\t\toverlay.style.display = \"flex\";\n\t}\n\n\tstatic hide() {\n\t\tconst overlay = document.getElementById(\"global-loading-overlay\");\n\t\tif (overlay) overlay.style.display = \"none\";\n\t}\n}","import { trace } from \"@nopeer\";\nimport { Loading } from \"../ux/Loading.js\";\n\nexport class Fetch {\n\tstatic BASE_URL = window.__API_BASE_URL__ || \"\";\n\n\tstatic #request = (method, url, data = {}, showLoading = true) => {\n\t\tconst finalUrl = url.startsWith('http') ? url : `${this.BASE_URL}${url}`;\n\n\t\tif (showLoading) {\n\t\t\tLoading.show();\n\t\t}\n\n\t\t// 1. 기본 헤더 설정\n\t\tconst headers = {};\n\n\t\t// 🔴 핵심: 데이터가 FormData가 아닐 때만 JSON 헤더를 추가합니다.\n\t\tif (!(data instanceof FormData)) {\n\t\t\theaders[\"Content-Type\"] = \"application/json\";\n\t\t}\n\n\t\tconst options = {\n\t\t\tmethod,\n\t\t\theaders\n\t\t};\n\n\t\tlet targetUrl = finalUrl;\n\t\tif (method === \"GET\") {\n\t\t\ttargetUrl += `?${new URLSearchParams(data)}`;\n\t\t} else {\n\t\t\t// 🔴 핵심: FormData는 그대로 body에 넣고, 일반 객체는 JSON.stringify 처리합니다.\n\t\t\toptions.body = data instanceof FormData ? data : JSON.stringify(data);\n\t\t}\n\n\t\treturn fetch(targetUrl, options)\n\t\t\t.then(async res => {\n\t\t\t\tif (!res.ok) {\n\t\t\t\t\tconst text = await res.text();\n\t\t\t\t\tthrow new Error(`API 오류 (${res.status}): ${text}`);\n\t\t\t\t}\n\t\t\t\treturn res.json();\n\t\t\t})\n\t\t\t.catch(err => {\n\t\t\t\ttrace.error(`[IdeFetch.${method.toLowerCase()}] ${finalUrl} 실패:`, err);\n\t\t\t\tthrow err;\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\tif (showLoading) {\n\t\t\t\t\tLoading.hide();\n\t\t\t\t}\n\t\t\t});\n\t};\n\n\t// 기존 post/get 메서드도 인자를 넘겨주도록 수정\n\tstatic get = (url, data = {}, showLoading = true) => this.#request(\"GET\", url, data, showLoading);\n\tstatic post = (url, data = {}, showLoading = true) => this.#request(\"POST\", url, data, showLoading);\n\n\t/**\n\t * 🚀 범용 청크 전송 (파라미터 이름까지 동적 설정)\n\t * @param {string} url - API 주소\n\t * @param {Array} rows - 데이터 배열\n\t * @param {object} options - 상세 옵션\n\t * - fileKey: 객체 내 파일 속성명 (기본: 'fileContents')\n\t * - filePartName: 서버에서 받을 파일 파트명 (기본: 'files')\n\t * - jsonPartName: 서버에서 받을 JSON 파트명 (기본: 'dataList')\n\t * - chunkSize: 분할 단위 (기본: 10)\n\t */\n\tstatic postMultipart = async (url, rows = [], options = {}) => {\n\t\tconst {\n\t\t\tfileKey = 'fileContents',\n\t\t\tfilePartName = 'files',\n\t\t\tjsonPartName = 'dataList',\n\t\t\tchunkSize = 10\n\t\t} = options;\n\n\t\t// 1. 시작 전 로딩바 띄우기\n\t\tLoading.show();\n\n\t\tlet totalCount = 0;\n\t\tlet lastResponse = null;\n\n\t\t// 🔴 2. 전체 루프를 Promise 체인처럼 관리 (내부는 await 유지)\n\t\treturn (async () => {\n\t\t\tfor (let i = 0; i < rows.length; i += chunkSize) {\n\t\t\t\tconst formData = new FormData();\n\t\t\t\tconst chunk = rows.slice(i, i + chunkSize);\n\t\t\t\tconst rowDataList = [];\n\n\t\t\t\tchunk.forEach((row) => {\n\t\t\t\t\tconst { [fileKey]: fileObj, _fileObj, ...rest } = row;\n\t\t\t\t\trowDataList.push(rest);\n\t\t\t\t\tif (fileObj instanceof File) {\n\t\t\t\t\t\tformData.append(filePartName, fileObj);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tconst jsonBlob = new Blob([JSON.stringify(rowDataList)], { type: 'application/json' });\n\t\t\t\tformData.append(jsonPartName, jsonBlob);\n\n\t\t\t\t// showLoading = false로 내부 호출\n\t\t\t\tlastResponse = await this.post(url, formData, false);\n\n\t\t\t\tif (lastResponse && (lastResponse.success || lastResponse.status === 'OK')) {\n\t\t\t\t\ttotalCount += chunk.length;\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(`청크 전송 실패: ${i}번째 섹션`);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn { ...lastResponse, success: true, totalCount };\n\t\t})()\n\t\t\t.catch(err => {\n\t\t\t\ttrace.error(\"[postChunk] Error:\", err);\n\t\t\t\tthrow err;\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\t// 🔴 3. 성공하든 실패하든 여기서 깔끔하게 닫기!\n\t\t\t\tLoading.hide();\n\t\t\t});\n\t};\n}\n\nexport const api = Fetch;","/**\r\n * 비동기 함수를 try-catch 없이 안전하게 실행하게 도와주는 유틸리티\r\n * @param {Promise} promise\r\n * @returns {Promise<[any, Error|null]>}\r\n */\r\nexport const safe = async (promise) => {\r\n\ttry {\r\n\t\tconst data = await promise;\r\n\t\treturn [data, null];\r\n\t} catch (err) {\r\n\t\treturn [null, err];\r\n\t}\r\n};","import { trace } from \"@nopeer\";\r\nimport { NineUtil } from \"./dialog/NineUtil.js\";\r\n\r\nclass UxSplitter extends HTMLElement {\r\n\r\n\t#mode;\r\n\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.attachShadow({ mode: \"open\" });\r\n\t}\r\n\r\n\tconnectedCallback() {\r\n\r\n\t\tthis.#init();\r\n\t}\r\n\r\n\t#detectMode = (el) => {\r\n\t\tconst prev = el.previousElementSibling;\r\n\t\tconst next = el.nextElementSibling;\r\n\t\tif (!prev || !next) {\r\n\t\t\tthis.#mode = this.classList.contains('h') ? \"h\" : \"v\";\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst prevRect = prev.getBoundingClientRect();\r\n\t\tconst nextRect = next.getBoundingClientRect();\r\n\r\n\t\tif (this.classList.contains('h')) {\r\n\t\t\tthis.#mode = \"h\";\r\n\t\t} else if (this.classList.contains('v')) {\r\n\t\t\tthis.#mode = \"v\";\r\n\t\t} else {\r\n\t\t\tthis.#mode = (Math.abs(prevRect.top - nextRect.top) < 5) ? \"h\" : \"v\";\r\n\t\t}\r\n\t};\r\n\r\n\t#startDrag = (e) => {\r\n\t\te.preventDefault();\r\n\t\te.stopPropagation();\r\n\r\n\t\tconst splitterRect = this.getBoundingClientRect();\r\n\t\tconst isHorizontal = this.#mode === \"h\";\r\n\r\n\t\t// 마우스 포인터와 스플리터 시작점 사이의 거리\r\n\t\tconst clickOffset = isHorizontal\r\n\t\t\t? e.clientX - splitterRect.left\r\n\t\t\t: e.clientY - splitterRect.top;\r\n\r\n\t\tconst dragBar = document.createElement(\"div\");\r\n\t\tdragBar.className = `nx-splitter-drag-bar-${this.#mode}`;\r\n\r\n\t\tObject.assign(dragBar.style, {\r\n\t\t\tposition: \"absolute\",\r\n\t\t\tzIndex: \"999\",\r\n\t\t\tbackground: \"#666\",\r\n\t\t\topacity: \"0.6\",\r\n\t\t\tpointerEvents: \"none\"\r\n\t\t});\r\n\r\n\t\tconst root = this.getRootNode({ composed: true });\r\n\t\tconst parent = root instanceof ShadowRoot ? root.host : this.parentElement;\r\n\t\tconst prev = this.previousElementSibling;\r\n\t\tconst next = this.nextElementSibling;\r\n\r\n\t\tif (!parent || !prev || !next) {\r\n\t\t\ttrace.warn(\"Spliter's parent or siblings not found.\");\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t(parent.shadowRoot || parent).appendChild(dragBar);\r\n\t\tconst dragBarOffsetParentRect = dragBar.offsetParent.getBoundingClientRect();\r\n\r\n\t\tconst prevRect = prev.getBoundingClientRect();\r\n\t\tconst nextRect = next.getBoundingClientRect();\r\n\r\n\t\t// 드래그 바의 초기 위치와 크기 설정\r\n\t\tconst initialSplitterPosInParent = (isHorizontal\r\n\t\t\t? splitterRect.left - dragBarOffsetParentRect.left\r\n\t\t\t: splitterRect.top - dragBarOffsetParentRect.top) + clickOffset;\r\n\r\n\t\tif (isHorizontal) {\r\n\t\t\tdragBar.style.top = \"0\";\r\n\t\t\tdragBar.style.left = `${initialSplitterPosInParent}px`;\r\n\t\t\tdragBar.style.width = \"2px\";\r\n\t\t\tdragBar.style.height = \"100%\";\r\n\t\t} else {\r\n\t\t\tdragBar.style.left = \"0\";\r\n\t\t\tdragBar.style.top = `${initialSplitterPosInParent}px`;\r\n\t\t\tdragBar.style.height = \"2px\";\r\n\t\t\tdragBar.style.width = \"100%\";\r\n\t\t}\r\n\r\n\t\tdragBar.style.mixBlendMode = \"difference\";\r\n\t\tdragBar.style.zIndex = \"99999\";\r\n\r\n\t\tconst minLimit = isHorizontal\r\n\t\t\t? prevRect.left - dragBarOffsetParentRect.left\r\n\t\t\t: prevRect.top - dragBarOffsetParentRect.top;\r\n\t\tconst maxLimit = isHorizontal\r\n\t\t\t? nextRect.right - dragBarOffsetParentRect.left - splitterRect.width\r\n\t\t\t: nextRect.bottom - dragBarOffsetParentRect.top - splitterRect.height;\r\n\r\n\t\tconst onMove = moveEvent => {\r\n\t\t\tconst clientPos = isHorizontal ? moveEvent.clientX : moveEvent.clientY;\r\n\t\t\tconst currentPosInParent = isHorizontal\r\n\t\t\t\t? clientPos - dragBarOffsetParentRect.left\r\n\t\t\t\t: clientPos - dragBarOffsetParentRect.top;\r\n\r\n\t\t\tconst clampedPos = Math.max(minLimit, Math.min(currentPosInParent, maxLimit));\r\n\r\n\t\t\tif (isHorizontal) {\r\n\t\t\t\tdragBar.style.left = `${clampedPos}px`;\r\n\t\t\t} else {\r\n\t\t\t\tdragBar.style.top = `${clampedPos}px`;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tconst onUp = () => {\r\n\t\t\twindow.removeEventListener(\"mousemove\", onMove);\r\n\t\t\twindow.removeEventListener(\"mouseup\", onUp);\r\n\t\t\tdragBar.remove();\r\n\r\n\t\t\tconst allChildren = Array.from(parent.children);\r\n\t\t\tconst allPanels = allChildren.filter(el => el.tagName.toLowerCase() !== 'nx-splitter');\r\n\r\n\t\t\t// ⭐⭐ gap 크기 계산 ⭐⭐\r\n\t\t\tconst style = window.getComputedStyle(parent);\r\n\t\t\tconst gapValue = isHorizontal ? style.getPropertyValue('column-gap') : style.getPropertyValue('row-gap');\r\n\t\t\tconst gapSize = parseFloat(gapValue) || 0;\r\n\t\t\tconst gapCount = allChildren.length > 1 ? allChildren.length - 1 : 0;\r\n\t\t\tconst totalGapSize = gapCount * gapSize;\r\n\r\n\t\t\tconst finalDragBarPos = isHorizontal ? parseFloat(dragBar.style.left) : parseFloat(dragBar.style.top);\r\n\t\t\tconst dragOffset = finalDragBarPos - initialSplitterPosInParent;\r\n\r\n\t\t\tconst prevSize = isHorizontal ? prev.getBoundingClientRect().width : prev.getBoundingClientRect().height;\r\n\t\t\tconst nextSize = isHorizontal ? next.getBoundingClientRect().width : next.getBoundingClientRect().height;\r\n\r\n\t\t\tlet newPrevSize = prevSize + dragOffset;\r\n\t\t\tlet newNextSize = nextSize - dragOffset;\r\n\r\n\t\t\t// 패널 크기가 음수가 되지 않도록 제한하고, 다른 패널에 차이를 보정\r\n\t\t\tif (newPrevSize < 0) {\r\n\t\t\t\tnewNextSize += newPrevSize;\r\n\t\t\t\tnewPrevSize = 0;\r\n\t\t\t}\r\n\t\t\tif (newNextSize < 0) {\r\n\t\t\t\tnewPrevSize += newNextSize;\r\n\t\t\t\tnewNextSize = 0;\r\n\t\t\t}\r\n\r\n\t\t\tconst initialSizes = allPanels.map(panel => isHorizontal ? panel.getBoundingClientRect().width : panel.getBoundingClientRect().height);\r\n\r\n\t\t\tconst totalSplitterSize = allChildren.reduce((sum, child) => {\r\n\t\t\t\tif (child.tagName.toLowerCase() === 'nx-splitter') {\r\n\t\t\t\t\treturn sum + (isHorizontal ? child.getBoundingClientRect().width : child.getBoundingClientRect().height);\r\n\t\t\t\t}\r\n\t\t\t\treturn sum;\r\n\t\t\t}, 0);\r\n\r\n\t\t\tconst totalContainerSize = (isHorizontal ? parent.getBoundingClientRect().width : parent.getBoundingClientRect().height);\r\n\t\t\tconst totalFlexSpace = totalContainerSize - totalSplitterSize - totalGapSize;\r\n\r\n\t\t\tlet flexSum = 0;\r\n\t\t\tallPanels.forEach((panel, index) => {\r\n\t\t\t\tlet newSize;\r\n\t\t\t\tif (panel === prev) {\r\n\t\t\t\t\tnewSize = newPrevSize;\r\n\t\t\t\t} else if (panel === next) {\r\n\t\t\t\t\tnewSize = newNextSize;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tnewSize = initialSizes[index];\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst newFlexBasis = newSize / totalFlexSpace;\r\n\t\t\t\t//panel.style.flex = `${newFlexBasis} ${newFlexBasis} 0`;\r\n\r\n\t\t\t\ttrace.log(panel);\r\n\r\n\t\t\t\tif (panel.classList.contains('sidebar')) {\r\n\t\t\t\t\t// 드래그가 끝난 시점의 newSize(px)를 그대로 고정값으로 할당\r\n\t\t\t\t\t// 이렇게 하면 비율(%)이 아니라 딱 그 픽셀만큼만 자리를 차지하게 됩니다.\r\n\t\t\t\t\tpanel.style.flex = `0 0 ${newSize}px`;\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// 나머지 메인 보드 같은 유연한 패널은 비율(%)로 처리\r\n\t\t\t\t\t//const newFlexBasis = newSize / totalFlexSpace;\r\n\t\t\t\t\tpanel.style.flex = `${newFlexBasis} ${newFlexBasis} 0`;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tflexSum += newFlexBasis;\r\n\t\t\t});\r\n\r\n\t\t\ttrace.log(`dragOffset: ${dragOffset}`);\r\n\t\t\ttrace.log(`Calculated FlexSum: ${flexSum}`);\r\n\t\t};\r\n\r\n\t\twindow.addEventListener(\"mousemove\", onMove);\r\n\t\twindow.addEventListener(\"mouseup\", onUp);\r\n\t};\r\n\r\n\tget cssPath() {\r\n\t\treturn this.getAttribute(\"css-path\") || NineUtil.cssPath;\r\n\t}\r\n\r\n\t#init = () => {\r\n\t\tthis.#detectMode(this);\r\n\t\tthis.classList.add(this.#mode);\r\n\r\n\t\tconst contents = this.innerHTML.trim();\r\n\t\t//const gripClass = `grip-${this.#mode}`;\r\n\t\tconst gripTmpl = (contents === \"\") ? `<div class=\"grip\"></div>` : `<div class=\"grip\"></div><div class=\"inner-container\">${contents}</div><div class=\"grip\"></div>`;\r\n\r\n\t\tthis.innerHTML = \"\";\r\n\t\tconst htmlTmpl = document.createElement(\"template\");\r\n\t\thtmlTmpl.innerHTML = `\r\n\t\t\t<style>\r\n\t\t\t\t@import \"https://cdn.jsdelivr.net/npm/@nine-lab/nine-util@${__APP_VERSION__}/dist/css/nine-util.css\";\r\n\t\t\t\t${this.cssPath ? `@import \"${this.cssPath}\";` : \"\"}\r\n\t\t\t</style>\r\n\t\t\t${gripTmpl}\r\n `;\r\n\r\n\t\tthis.shadowRoot.appendChild(htmlTmpl.content.cloneNode(true));\r\n\r\n\t\tthis.shadowRoot.querySelectorAll(\".grip\").forEach(el => {\r\n\t\t\tel.addEventListener(\"mousedown\", e => this.#startDrag(e));\r\n\t\t});\r\n\r\n\t\tthis.#prepareLayout();\r\n\r\n\t\twindow.addEventListener(\"resize\", () => this.#prepareLayout());\r\n\t};\r\n\r\n\t#prepareLayout = () => {\r\n\t\tconst isHorizontal = this.#mode === \"h\";\r\n\t\tconst parent = this.parentElement;\r\n\t\tconst allPanels = Array.from(parent.children).filter(el => el.tagName.toLowerCase() !== 'nx-splitter');\r\n\t\tif (allPanels.length < 2) return;\r\n\r\n\t\tconst parentRect = parent.getBoundingClientRect();\r\n\t\tconst totalContentSize = allPanels.reduce((sum, el) => {\r\n\t\t\tconst size = isHorizontal ? el.getBoundingClientRect().width : el.getBoundingClientRect().height;\r\n\t\t\treturn sum + size;\r\n\t\t}, 0);\r\n\t\tconst totalParentSize = isHorizontal ? parentRect.width : parentRect.height;\r\n\r\n\t\tallPanels.forEach(panel => {\r\n\t\t\tconst size = isHorizontal ? panel.getBoundingClientRect().width : panel.getBoundingClientRect().height;\r\n\t\t\tconst newSize = totalParentSize * (size / totalContentSize);\r\n\t\t\tconst flexGrow = newSize / totalParentSize;\r\n\t\t\tpanel.style.flex = `${flexGrow} ${flexGrow} 0`;\r\n\t\t});\r\n\t};\r\n}\r\n\r\nif (!customElements.get('nine-splitter')) {\r\n\tcustomElements.define(\"nine-splitter\", UxSplitter);\r\n}","// 1. 기존 core 모듈\r\nimport { NineUtil } from './ux/dialog/NineUtil.js';\r\nimport { nine, subscribeConfig, config } from './core/Config.js';\r\nimport { Trace, trace } from './core/Trace.js';\r\nimport { TaskDebouncer } from './core/TaskDebouncer.js';\r\n\r\n// 2. 신규 net 및 ux 모듈 추가\r\nimport { api, Fetch } from './net/Fetch.js';\r\nimport { Loading } from './ux/Loading.js';\r\n\r\nimport { nineDialog } from './ux/dialog/nineDialog.js';\r\nimport { nineConfirmPopup, nineAlertPopup } from './ux/dialog/nineConfirm.js';\r\nimport { ninePromptPopup } from './ux/dialog/ninePrompt.js';\r\n\r\nimport { safe } from \"./utils/promise.js\"; // 경로에 맞춰 임포트\r\n// ux\r\nimport './ux/UxSplitter.js';\r\n\r\nconst utilInstance = new NineUtil();\r\nnine.alert = utilInstance.alert.bind(utilInstance);\r\nnine.confirm = utilInstance.confirm.bind(utilInstance);\r\nnine.prompt = utilInstance.prompt.bind(utilInstance);\r\nnine.formatDate = utilInstance.formatDate.bind(utilInstance);\r\n\r\nnine.safe = safe;\r\n\r\n// 기존 nine 객체(Config)와 Util 기능을 합성\r\n//Object.assign(nine, utilInstance);\r\n\r\nnine.api = api;\r\nnine.trace = trace;\r\nnine.subscribeConfig = subscribeConfig;\r\nnine.config = config || {};\r\n\r\nexport {\r\n\tnine,\r\n\tsubscribeConfig,\r\n\tconfig,\r\n\tNineUtil,\r\n\tTrace,\r\n\ttrace,\r\n\tTaskDebouncer,\r\n\tapi, // 🚀 추가: 이제 서비스에서 api.get() 가능\r\n\tFetch, // 🚀 추가: 클래스 자체도 혹시 모르니 노출\r\n\tLoading as loading, // 🚀 추가: loading.show() 로 쓰기 편하게 alias\r\n\tnineDialog,\r\n\tnineAlertPopup, nineConfirmPopup, ninePromptPopup\r\n};\r\n\r\nif (typeof window !== 'undefined') {\r\n\twindow.nine = nine;\r\n}\r\n"],"names":["_init","_a","config","el","this","t","e","n","r","i","s","u","a","M","m","f","l","$","y","v","g","D","o","d","c","h","trace","Trace","traceOrigin"],"mappings":";;;;;;;;;;;AAAA,8PAAAA,QAAA;AACO,MAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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","x_google_ignoreList":[4]}
1
+ {"version":3,"file":"nine-util.js","sources":["../src/ux/dialog/style.dialog.js","../src/ux/dialog/nineDialog.js","../src/ux/dialog/nineConfirm.js","../src/ux/dialog/ninePrompt.js","../node_modules/dayjs/dayjs.min.js","../src/ux/dialog/NineUtil.js","../src/core/Config.js","../src/core/Trace.js","../src/core/TaskDebouncer.js","../src/external/NoPeer.js","../src/ux/Loading.js","../src/net/Fetch.js","../src/utils/promise.js","../src/ux/UxSplitter.js","../src/index.js"],"sourcesContent":["// nxDialog.styles.js\nexport const dialogStyles = `\n\tdialog::backdrop {\n\t\tbackground: rgba(0, 0, 0, 0.3);\n\t}\n\t\n\tdialog:modal {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tpadding: 0;\n\t\toverflow: hidden;\n\t\tborder: 1px solid darkgreen;\n\t\toutline: none;\n\t\tresize: both;\n\t\tbox-shadow: 0 0 4px 0 darkgreen;\n width: 500px;\n height: fit-content;\n min-width: 330px;\n min-height: 60px;\n max-height: 100%;\n }\n \n \n \n \n\tdiv.head .rect1, div.head .rect2, div.head .rect3 {\n\t\tdisplay: none;\n\t\twidth: 50px;\n\t\theight: 100%;\n\t}\n\tdiv.head .rect1 {\n\t\tbackground-color: red;\n\t}\n\tdiv.head .rect2 {\n\t\tbackground-color: darkgreen;\n\t}\n\tdiv.head .rect3 {\n\t\tbackground-color: olive;\n\t}\n\t\n\tdiv.head {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\t--height: 30px;\n\t\tbackground-color: darkgreen;\n\t\tpadding: 4px;\n\t\tcursor: move;\n\t}\n\tdiv.head:hover {\n\t\tfilter: brightness(110%);\n\t}\n\t\n\tdiv.head span {\n\t\tfont-size: 12px;\n\t\tposition: relative;\n\t}\n\t\n\tdiv.head span.title {\n\t\tcolor: #ddd;\n\t\tmargin-left: 4px;\n\t\tfont-weight: bold;\n\t}\n\t\n\tdiv.head span.sub-title {\n\t\tcolor: #ccc;\n\t\tmargin-left: 8px;\n\t\tfont-style: italic;\n\t}\n\t\n\tdiv.head form {\n\t\tmargin: 0;\n\t}\n\tdiv.head button {\n\t\tmargin-right: 4px;\n\t\tbackground-color: transparent;\n\t\tborder: none;\n\t\tcolor: #ccc;\n\t\tfont-size: x-small;\n\t}\n\tdiv.head button:hover {\n\t\tcursor: pointer;\n\t}\n\t\n\tdiv.contents {\n\t\tdisplay: flex;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\toverflow: hidden;\n\t}\n\tdiv.left {\n\t\tposition: relative;\n\t\twidth: 16px;\n\t\theight: 100%;\n\t\tbackground-color: #ddd;\n\t\tdisplay: none;\n\t}\n\t\n\tdiv.left span {\n\t\twriting-mode: vertical-rl;\n\t\t-moz-user-select: none;\n\t\t-webkit-user-select: none;\n\t\t-ms-user-select: none;\n\t\tuser-select: none;\n\t\tcolor: #ccc;\n\t\tfont-weight: 700;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tmargin-left: 3px;\n\t\tmargin-top: 3px;\n\t}\n\tdiv.close2 {\n\t\tdisplay: none;\n\t\tposition: absolute;\n\t\tright: 0;\n\t\ttop: 3px;\n\t\tcursor: pointer;\n\t\tcolor: #666;\n\t}\n\tdiv.close2 svg:hover {\n\t\tcolor: #999;\n\t}\n\t\n\tdiv.body {\n\t\tdisplay: flex;\n\t\twidth: 100%;\n\t\theight: unset;\n\t\t--border: 3px solid #999;\n\t\t--border-top: none;\n\t\toverflow-x: hidden;\n\t\toverflow-y: auto;\n\t\tpadding: 10px;\n\t\tgap: 8px;\n\t\tflex-direction: column;\n\t}\n\t\n\t\n\t\n\t\n\tng-sphere.icon {\n\t\tmargin-left: 8px;\n\t}\n\t\n\t.buttons {\n\t\tdisplay: flex;\n\t\tposition: absolute;\n\t\tright: 4px;\n\t}\n\t\n\tng-sphere {\n\t\tposition: relative;\n\t\t--width: 16px;\n\t\t--height: 16px;\n\t\tcursor: pointer;\n\t\tmargin-right: 4px;\n\t\tdisplay: flex;\n\t}\n\tng-sphere:hover {\n\t\tfilter: brightness(90%);\n\t}\n\tng-sphere:active {\n\t\tfilter: brightness(80%);\n\t}\n\t\n\tng-sphere:hover::after {\n\t\tcontent: \"\";\n\t\tposition: absolute;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tbackground-repeat: no-repeat;\n\t\tbackground-position: center;\n\t}\n\tng-sphere.apply:hover::after {\n\t\tbackground-size: 14px 14px;\n\t\tbackground-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\"><polyline points=\"2.5,7 6,10 11,3\" style=\"fill:none;stroke:white;stroke-width:2px;\" /></svg>');\n\t}\n\t\n\tng-sphere.reset:hover::after {\n\t\tbackground-size: 12px 12px;\n\t\tbackground-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\" style=\"fill:none;stroke:white;stroke-width:2px;\" focusable=\"false\" aria-hidden=\"true\"><path d=\"M10 5h5V0\"></path><path d=\"M15 8a6.957 6.957 0 0 1-7 7 6.957 6.957 0 0 1-7-7 6.957 6.957 0 0 1 7-7 6.87 6.87 0 0 1 6.3 4\"></path></svg>');\n\t}\n\t\n\tng-sphere.close:hover::after {\n\t\tbackground-size: 12px 12px;\n\t\tbackground-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" style=\"fill:none;stroke:white;stroke-width:2px;\" focusable=\"false\" aria-hidden=\"true\" viewBox=\"0 0 16 16\"><path d=\"M2 2l12 12M14 2L2 14\"></path></svg>');\n\t}\n\t\n\t\n\tbutton {\n cursor: pointer;\n }\n \n .input-area {\n position: relative;\n height: 100%;\n --display: flex;\n textarea {\n width: 100%;\n height: 100%;\n min-height: 100px;\n padding: 8px;\n box-sizing: border-box;\n resize: none;\n border-radius: 2px;\n border-color: #ccc;\n }\n textarea:focus {\n border-color: green;\n outline: none; /* 브라우저 기본 파란색 테두리 제거 */\n }\n }\n \n .buttons-confirm {\n position: absolute;\n display: flex;\n justify-content: flex-end;\n bottom: 8px;\n right: 8px;\n }\n \n \n .buttons-confirm button {\n height: 32px;\n margin-right: 8px;\n border: none;\n outline: none;\n width: 60px;\n -moz-user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n }\n .buttons-confirm button:hover {\n filter: brightness(90%);\n }\n .buttons-confirm button:active {\n color: #ccc;\n }\n \n button.ok {\n --display: none;\n background-color: darkgreen;\n color: white;\n }\n button.cancel {\n color: white;\n background-color: #6c757d;\n }\n \n \n \n div.msg {\n position: relative;\n height: 100%;\n font-size: 14px;\n color: #333;\n padding-bottom: 48px;\n }\n \n .reset, .apply {\n display: none;\n }\n \n \n \n :host(.classic) dialog:modal {\n border: 1px solid #007bff;\n box-shadow: 0 0 4px 0 #007bff;\n }\n \n :host(.classic) div.head {\n background-color: #007bff;\n }\n :host(.classic) div.head:hover {\n filter: brightness(110%);\n }\n \n :host(.classic) div.head span {\n font-size: 12px;\n }\n \n :host(.classic) div.head span.title {\n color: #ddd;\n margin-left: 4px;\n font-weight: bold;\n }\n \n :host(.classic) div.head span.sub-title {\n color: #ccc;\n margin-left: 8px;\n font-style: italic;\n }\n :host(.classic) div.head button {\n margin-right: 4px;\n background-color: transparent;\n border: none;\n color: #ccc;\n font-size: x-small;\n }\n \n \n \n \n :host(.rgb) dialog:modal {\n border: none;\n box-shadow: unset;\n border-top: none;\n }\n \n :host(.rgb) div.left {\n display: block;\n background-color: #ddd;\n }\n :host(.rgb) div.left span {\n color: #ccc;\n }\n :host(.rgb) div.close2 {\n display: block;\n color: #666;\n }\n :host(.rgb) div.close2 svg:hover {\n color: #999;\n }\n :host(.rgb) div.head {\n height: 4px;\n background-color: #999;\n padding: 0;\n }\n :host(.rgb) div.contents {\n height: calc(100% - 4px);\n }\n \n :host(.rgb) div.head ng-sphere,\n :host(.rgb) div.head span,\n :host(.rgb) div.head .buttons {\n display: none;\n }\n \n :host(.rgb) div.head .rect1,\n :host(.rgb) div.head .rect2,\n :host(.rgb) div.head .rect3 {\n display: flex;\n }\n \n \n :host(.rgb) div.head:hover {\n filter: unset;\n }\n \n \n /* --- Animation Core --- */\n:host {\n --nx-duration: 0.4s;\n --nx-timing: cubic-bezier(0.34, 1.56, 0.64, 1);\n}\n\n/* 🎯 수정: 애니메이션 클래스가 붙은 경우에만 초기 opacity를 0으로 설정 */\n:host(.fade) dialog,\n:host(.zoom) dialog,\n:host(.moveUp) dialog,\n:host(.moveDown) dialog,\n:host(.moveLeft) dialog,\n:host(.moveRight) dialog,\n:host(.roadRunner) dialog {\n opacity: 0;\n}\n\n/* shake는 애니메이션 내부에서 opacity를 다루므로 제외하거나 별도 처리 */\n:host(.shake) dialog { \n opacity: 1; \n}\n\n/* 1. Fade (서서히 나타남) */\n:host(.fade) dialog { animation: nx-fade-in var(--nx-duration) forwards; }\n@keyframes nx-fade-in { from { opacity: 0; } to { opacity: 1; } }\n\n/* 2. Zoom (커지며 나타남) */\n:host(.zoom) dialog { animation: nx-zoom-in var(--nx-duration) var(--nx-timing) forwards; }\n@keyframes nx-zoom-in { from { opacity: 0; transform: scale(0.5); } to { opacity: 1; transform: scale(1); } }\n\n/* 3. Slide (상하좌우) */\n:host(.moveUp) dialog { animation: nx-move-up var(--nx-duration) var(--nx-timing) forwards; }\n:host(.moveDown) dialog { animation: nx-move-down var(--nx-duration) var(--nx-timing) forwards; }\n:host(.moveLeft) dialog { animation: nx-move-left var(--nx-duration) var(--nx-timing) forwards; }\n:host(.moveRight) dialog { animation: nx-move-right var(--nx-duration) var(--nx-timing) forwards; }\n\n@keyframes nx-move-up { from { opacity: 0; transform: translateY(100px); } to { opacity: 1; transform: translateY(0); } }\n@keyframes nx-move-down { from { opacity: 0; transform: translateY(-100px); } to { opacity: 1; transform: translateY(0); } }\n@keyframes nx-move-left { from { opacity: 0; transform: translateX(100px); } to { opacity: 1; transform: translateX(0); } }\n@keyframes nx-move-right { from { opacity: 0; transform: translateX(-100px); } to { opacity: 1; transform: translateY(0); } }\n\n/* 4. Shake (상하좌우 격렬한 진동 - 에러 인지용) */\n:host(.shake) dialog { \n animation: nx-heavy-shake 0.5s cubic-bezier(.36,.07,.19,.97) both;\n opacity: 1; \n}\n\n@keyframes nx-heavy-shake {\n 10%, 90% { transform: translate3d(-1px, -2px, 0); }\n 20%, 80% { transform: translate3d(2px, 4px, 0); }\n 30%, 50%, 70% { transform: translate3d(-6px, -6px, 0); }\n 40%, 60% { transform: translate3d(6px, 6px, 0); }\n}\n\n/* 5. Road Runner (등장: 왼쪽에서 탄력 있게 / 퇴장: 움츠렸다가 광속 탈출) */\n:host(.roadRunner) dialog { \n animation: roadRunnerIn 0.5s cubic-bezier(0.175, 0.885, 0.32, 1.275) forwards; \n}\n\n@keyframes roadRunnerIn {\n 0% { transform: translateX(-1500px) skewX(30deg); opacity: 1; }\n 70% { transform: translateX(30px) skewX(-10deg); opacity: 1; }\n 100% { transform: translateX(0) skewX(0deg); opacity: 1; }\n}\n\n/* --- Out Animations (닫힐 때) --- */\ndialog.out { pointer-events: none; }\n\n/* Road Runner 퇴장: 슥 움츠렸다가(Anticipation) 쌩~! */\n:host(.roadRunner) dialog.out { \n animation: roadRunnerOut 0.5s cubic-bezier(0.6, -0.28, 0.735, 0.045) forwards; \n}\n\n@keyframes roadRunnerOut {\n 0% { \n transform: translateX(0) scale(1) skewX(0deg); \n opacity: 1; \n }\n 30% { \n /* 예비 동작: 뒤로 살짝 갔다가 움츠러들기 */\n transform: translateX(50px) scaleX(1.2) scaleY(0.8) skewX(-20deg); \n opacity: 1; \n }\n 100% { \n /* 발사: 길게 늘어나며 광속 탈출 */\n transform: translateX(2000px) scaleX(4) scaleY(0.3) skewX(50deg); \n opacity: 0; \n filter: blur(10px); /* 👈 잔상 느낌 추가 */\n }\n}\n\n/* 일반 퇴장 (기본) */\ndialog.out { animation: nx-fade-out 0.3s forwards; }\n@keyframes nx-fade-out { from { opacity: 1; transform: scale(1); } to { opacity: 0; transform: scale(0.9); } }\n`;","import { dialogStyles } from './style.dialog.js';\n\nexport class nineDialog extends HTMLElement\n{\n\t#shift;\n\t#dialog;\n\n\n\tconstructor () {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\n\t\tconst v = this.innerHTML;\n\t\tconst titleText = this.getAttribute(\"subject\") || \"Details\";\n\n\t\t//trace.log(dialogStyles);\n\n\t\tthis.innerHTML = `\n\t\t\t<style>${dialogStyles}</style>\n\t\t\n\t\t\t<dialog>\n\t\t\t\t<div class=\"head\">\n\t\t\t\t\t<div class=\"rect1\"></div>\n\t\t\t\t\t<div class=\"rect2\"></div>\n\t\t\t\t\t<div class=\"rect3\"></div>\n\t\t\t\t\t<ng-sphere class=\"icon\" end-fill=\"#666\" size=\"8\"></ng-sphere>\n\t\t\t\t\t<span class=\"title\">${titleText}</span>\n\t\t\t\t\t<span class=\"sub-title\"></span>\n\t\t\t\t\t<div class=\"buttons\">\n\t\t\t\t\t\t<ng-sphere class=\"apply\" start-fill=\"#cc6\" end-fill=\"#660\" size=\"16\" title=\"apply\"></ng-sphere>\n\t\t\t\t\t\t<ng-sphere class=\"reset\" start-fill=\"#99f\" end-fill=\"#00f\" size=\"16\" title=\"reset\"></ng-sphere>\n\t\t\t\t\t\t<ng-sphere class=\"close\" start-fill=\"#f99\" end-fill=\"#f00\" size=\"16\" title=\"close\"></ng-sphere>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"contents\">\n\t\t\t\t\t<div class=\"left\">\n\t\t\t\t\t\t<span>가나다라마바사아자차카타파하가나다라마바사아자차카타파하가나다라마바사아자차카타파하가나다라마바사아자차카타파하가나다라마바사아자차카타파하가나다라마바사아자차카타파하가나다라마바사아자차카타파하가나다라마바사아자차카타파하</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"body\">\n\t\t\t\t\t\t${v}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"close2\">\n\t\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n\t\t\t\t\t\t\t<path d=\"M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708\"/>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</dialog>\n\t\t`;\n\n\t\t//this.#owner = this.getRootNode().host.closest(\"nine-grid\");\n\n\t\t//$(\".title\", this).html(\"Details\");\n\n\t\tthis.#dialog = this.querySelector('dialog');\n\t\tthis.#init();\n\t};\n\n\tshowModal = () => {\n\t\tthis.#dialog.showModal();\n\t};\n\n\tclose = () => {\n\t\t// 이벤트 리스너 제거 (표준 방식은 핸들러 참조가 필요하지만,\n\t\t// 여기서는 요소가 사라지므로 메모리 관리를 위해 정리)\n\t\tthis.#dialog.close();\n\t\tthis.remove();\n\t};\n\n\t#init = () => {\n\t\tconst head = this.querySelector('.head');\n\n\t\tif (head) {\n\t\t\thead.addEventListener('mousedown', this.#onMouseDown);\n\t\t\thead.addEventListener('touchstart', this.#onTouchStart);\n\n\t\t\t// 마우스 커서를 드래그 가능 아이콘(이동 십자가) 모양으로 변경하여 UX 개선\n\t\t\t//head.style.cursor = 'move';\n\t\t}\n\n\t\t// 1. 모든 닫기 성격의 버튼 (.close, .close2, .cancel) 공통 처리\n\t\tthis.querySelectorAll('.close, .close2, .cancel').forEach(btn => {\n\t\t\tbtn.onclick = () => this.closeWithAnimation(null); // 취소/닫기는 null 리턴\n\t\t});\n\n\t\t// 2. 확인 버튼 (.ok) 처리\n\t\t// 확인 버튼은 텍스트 입력값 등 데이터가 필요하므로\n\t\t// 실제 데이터 추출은 각 팝업 클래스(prompt 등)에서 하되,\n\t\t// 닫기 애니메이션 실행은 여기서 담당하도록 가이드합니다.\n\t\tthis.querySelectorAll('.ok').forEach(btn => {\n\t\t\t// .ok 버튼의 로직은 각 팝업의 setupEvents에서 덮어쓰거나\n\t\t\t// 델리게이트 이벤트를 통해 처리합니다.\n\t\t});\n\n\t\t// 드래그 로직 생략...\n\t};\n\n\t// --- 드래그 로직 (Vanilla JS) ---\n\t#onMouseDown = e => {\n\n\t\tif (e.target.closest(\"buttons\")) return;\n\t\tif (e.button !== 0 || e.altKey || e.ctrlKey || e.shiftKey) return;\n\n\t\tconst rect = this.#dialog.getBoundingClientRect();\n\t\tthis.#shift = {\n\t\t\tx: e.clientX - rect.left,\n\t\t\ty: e.clientY - rect.top\n\t\t};\n\n\t\tconst onMouseMove = (ev) => {\n\t\t\tthis.#dialog.style.position = 'fixed';\n\t\t\tthis.#dialog.style.margin = '0';\n\t\t\tthis.#dialog.style.left = `${ev.clientX - this.#shift.x}px`;\n\t\t\tthis.#dialog.style.top = `${ev.clientY - this.#shift.y}px`;\n\t\t};\n\n\t\tconst onMouseUp = () => {\n\t\t\tdocument.removeEventListener('mousemove', onMouseMove);\n\t\t\tdocument.removeEventListener('mouseup', onMouseUp);\n\t\t};\n\n\t\tdocument.addEventListener('mousemove', onMouseMove);\n\t\tdocument.addEventListener('mouseup', onMouseUp);\n\t};\n\n\t#onTouchStart = e => {\n\t\tif (e.target.closest(\"buttons\")) return;\n\n\t\tconst rect = this.#dialog.getBoundingClientRect();\n\t\tconst touch = e.changedTouches[0];\n\t\tthis.#shift = {\n\t\t\tx: touch.pageX - rect.left,\n\t\t\ty: touch.pageY - rect.top\n\t\t};\n\n\t\tconst onTouchMove = (ev) => {\n\t\t\tconst t = ev.changedTouches[0];\n\t\t\tthis.#dialog.style.position = 'fixed';\n\t\t\tthis.#dialog.style.margin = '0';\n\t\t\tthis.#dialog.style.left = `${t.pageX - this.#shift.x}px`;\n\t\t\tthis.#dialog.style.top = `${t.pageY - this.#shift.y}px`;\n\t\t};\n\n\t\tconst onTouchEnd = () => {\n\t\t\tdocument.removeEventListener('touchmove', onTouchMove);\n\t\t\tdocument.removeEventListener('touchend', onTouchEnd);\n\t\t};\n\n\t\tdocument.addEventListener('touchmove', onTouchMove);\n\t\tdocument.addEventListener('touchend', onTouchEnd);\n\t};\n\n\tcloseWithAnimation(returnValue) {\n\t\tthis.#dialog.classList.add(\"out\"); // 퇴장 애니메이션 시작\n\n\t\t// 애니메이션(0.3s)이 끝난 후 제거 및 이벤트 발생\n\t\tsetTimeout(() => {\n\t\t\tthis.#dialog.close();\n\t\t\t// 부모(BasePopup)에게 작업 완료와 결과값을 알림\n\t\t\tthis.dispatchEvent(new CustomEvent('closed', { detail: returnValue }));\n\t\t\tthis.remove();\n\t\t}, 300);\n\t}\n}\n\n// BasePopup.js\nexport class BasePopup extends HTMLElement {\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.attachShadow({ mode: 'open' });\n\t}\n\n\tstatic async open(PopupClass, message, title, options, renderFn) {\n\t\t// 1. 설정 병합\n\t\tconst tagName = PopupClass.tagName.toLowerCase();\n\t\tconst config = {\n\t\t\t\"true-text\": \"확인\",\n\t\t\t\"false-text\": \"취소\",\n\t\t\tclass: \"classic\",\n\t\t\tanimation: \"fade\",\n\t\t\t...(window.nine?.config?.ux?.[tagName.replace('nine-', '').replace('-popup', '')] || {}),\n\t\t\t...options\n\t\t};\n\n\t\t// 2. 중복 제거 및 엘리먼트 생성\n\t\tdocument.querySelectorAll(tagName).forEach(el => el.remove());\n\t\tconst el = document.createElement(tagName);\n\t\tif (config.class) el.classList.add(config.class);\n\t\tif (config.animation) el.classList.add(config.animation);\n\t\tdocument.body.appendChild(el);\n\n\t\t// 3. 렌더링 (각 팝업의 UI 그리기)\n\t\trenderFn(el, message, config);\n\n\t\tconst dialogComp = el.shadowRoot.querySelector(\"nine-dialog\");\n\t\tif (title) dialogComp.setAttribute(\"subject\", title);\n\n\t\treturn new Promise((resolve) => {\n\t\t\t// [중요] nine-dialog의 애니메이션이 끝난 후 던지는 이벤트를 수신\n\t\t\tdialogComp.addEventListener('closed', (e) => resolve(e.detail));\n\n\t\t\t// 각 팝업 클래스에서 버튼 클릭 시 dialogComp.closeWithAnimation(값)을\n\t\t\t// 호출하도록 이벤트를 바인딩해줌\n\t\t\tel.setupEvents(resolve, dialogComp);\n\n\t\t\tdialogComp.showModal();\n\t\t});\n\t}\n}\n\nif (!customElements.get('nine-dialog')) {\n\tcustomElements.define(\"nine-dialog\", nineDialog);\n}\n","import { BasePopup } from \"./nineDialog.js\";\n\nexport class nineConfirmPopup extends BasePopup {\n\tstatic tagName = 'nine-confirm-popup';\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\n\trender(message, config) {\n\t\tthis.shadowRoot.innerHTML = `\n <nine-dialog>\n <div class=\"msg\">${message.replace(/\\n/g, \"<br/>\")}</div>\n <div class=\"buttons-confirm\">\n <button class=\"cancel\">${config[\"false-text\"]}</button>\n <button class=\"ok\">${config[\"true-text\"]}</button>\n </div>\n </nine-dialog>`;\n\t}\n\n\tsetupEvents(resolve, dialogComp) {\n\t\tthis.shadowRoot.querySelector(\".ok\").onclick = () => dialogComp.closeWithAnimation(true);\n\t\t// 취소는 nine-dialog 내부 기본 로직(closeWithAnimation(null))이 처리함\n\t}\n\n\tstatic confirm = (m, t, o) => BasePopup.open(nineConfirmPopup, m, t, o, (el, msg, conf) => el.render(msg, conf));\n}\n\n// --- 3. ALERT (단순 알림) ---\nexport class nineAlertPopup extends BasePopup {\n\tstatic tagName = 'nine-alert-popup';\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\trender(message, config) {\n\t\tthis.shadowRoot.innerHTML = `\n <nine-dialog>\n <div class=\"msg\">${message.replace(/\\n/g, \"<br/>\")}</div>\n <div class=\"buttons-confirm\">\n <button class=\"cancel\">확인</button>\n </div>\n </nine-dialog>`;\n\t}\n\n\tsetupEvents(resolve, dialogComp) {\n\t\t// 얼럿은 취소 버튼 하나만 두거나, 확인 버튼이 cancel 역할을 수행하게 함\n\t}\n\n\tstatic alert = (m, t, o) => BasePopup.open(nineAlertPopup, m, t, o, (el, msg, conf) => el.render(msg, conf));\n}\n\n// Custom Element 등록\nif (!customElements.get('nine-confirm-popup')) customElements.define('nine-confirm-popup', nineConfirmPopup);\nif (!customElements.get('nine-alert-popup')) customElements.define(\"nine-alert-popup\", nineAlertPopup);","import { BasePopup } from \"./nineDialog.js\";\n\n/**\n *\n */\nexport class ninePromptPopup extends BasePopup {\n\tstatic tagName = 'nine-prompt-popup';\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\trender(message, config) {\n\n\t\ttrace.log(this);\n\t\ttrace.log(this.shadowRoot);\n\n\t\tthis.shadowRoot.innerHTML = `\n\t\t\t<style>\n\t\t\t\tdialog {\n\t\t\t\t\theight: 300px !important;\n\t\t\t\t}\n\t\t\t\t.msg {\n\t\t\t\t\theight: unset !important;\n\t\t\t\t}\n\t\t\t</style>\n\t\t\t\n <nine-dialog>\n <div class=\"msg\">${message.replace(/\\n/g, \"<br/>\")}</div>\n <div class=\"input-area\">\n <textarea placeholder=\"내용을 입력하세요...\"></textarea>\n </div>\n <div class=\"buttons-confirm\">\n <button class=\"cancel\">${config[\"false-text\"]}</button>\n <button class=\"ok\">${config[\"true-text\"]}</button>\n </div>\n </nine-dialog>`;\n\t}\n\n\tsetupEvents(resolve, dialogComp) {\n\t\tconst textarea = this.shadowRoot.querySelector(\"textarea\");\n\t\tconst okBtn = this.shadowRoot.querySelector(\".ok\");\n\n\t\t// 확인 버튼 클릭 시 textarea 값을 가지고 애니메이션 닫기\n\t\tokBtn.onclick = () => dialogComp.closeWithAnimation(textarea.value);\n\n\t\t// 렌더링 후 포커스\n\t\trequestAnimationFrame(() => textarea.focus());\n\t}\n\n\tstatic prompt = (m, t, o) => BasePopup.open(ninePromptPopup, m, t, o, (el, msg, conf) => el.render(msg, conf));\n}\n\nif (!customElements.get('nine-prompt-popup')) {\n\tcustomElements.define('nine-prompt-popup', ninePromptPopup);\n}","!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs=e()}(this,(function(){\"use strict\";var t=1e3,e=6e4,n=36e5,r=\"millisecond\",i=\"second\",s=\"minute\",u=\"hour\",a=\"day\",o=\"week\",c=\"month\",f=\"quarter\",h=\"year\",d=\"date\",l=\"Invalid Date\",$=/^(\\d{4})[-/]?(\\d{1,2})?[-/]?(\\d{0,2})[Tt\\s]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?[.:]?(\\d+)?$/,y=/\\[([^\\]]+)]|YYYY|YY|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,M={name:\"en\",weekdays:\"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday\".split(\"_\"),months:\"January_February_March_April_May_June_July_August_September_October_November_December\".split(\"_\"),ordinal:function(t){var e=[\"th\",\"st\",\"nd\",\"rd\"],n=t%100;return\"[\"+t+(e[(n-20)%10]||e[n]||e[0])+\"]\"}},m=function(t,e,n){var r=String(t);return!r||r.length>=e?t:\"\"+Array(e+1-r.length).join(n)+t},v={s:m,z:function(t){var e=-t.utcOffset(),n=Math.abs(e),r=Math.floor(n/60),i=n%60;return(e<=0?\"+\":\"-\")+m(r,2,\"0\")+\":\"+m(i,2,\"0\")},m:function t(e,n){if(e.date()<n.date())return-t(n,e);var r=12*(n.year()-e.year())+(n.month()-e.month()),i=e.clone().add(r,c),s=n-i<0,u=e.clone().add(r+(s?-1:1),c);return+(-(r+(n-i)/(s?i-u:u-i))||0)},a:function(t){return t<0?Math.ceil(t)||0:Math.floor(t)},p:function(t){return{M:c,y:h,w:o,d:a,D:d,h:u,m:s,s:i,ms:r,Q:f}[t]||String(t||\"\").toLowerCase().replace(/s$/,\"\")},u:function(t){return void 0===t}},g=\"en\",D={};D[g]=M;var p=\"$isDayjsObject\",S=function(t){return t instanceof _||!(!t||!t[p])},w=function t(e,n,r){var i;if(!e)return g;if(\"string\"==typeof e){var s=e.toLowerCase();D[s]&&(i=s),n&&(D[s]=n,i=s);var u=e.split(\"-\");if(!i&&u.length>1)return t(u[0])}else{var a=e.name;D[a]=e,i=a}return!r&&i&&(g=i),i||!r&&g},O=function(t,e){if(S(t))return t.clone();var n=\"object\"==typeof e?e:{};return n.date=t,n.args=arguments,new _(n)},b=v;b.l=w,b.i=S,b.w=function(t,e){return O(t,{locale:e.$L,utc:e.$u,x:e.$x,$offset:e.$offset})};var _=function(){function M(t){this.$L=w(t.locale,null,!0),this.parse(t),this.$x=this.$x||t.x||{},this[p]=!0}var m=M.prototype;return m.parse=function(t){this.$d=function(t){var e=t.date,n=t.utc;if(null===e)return new Date(NaN);if(b.u(e))return new Date;if(e instanceof Date)return new Date(e);if(\"string\"==typeof e&&!/Z$/i.test(e)){var r=e.match($);if(r){var i=r[2]-1||0,s=(r[7]||\"0\").substring(0,3);return n?new Date(Date.UTC(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)):new Date(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)}}return new Date(e)}(t),this.init()},m.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},m.$utils=function(){return b},m.isValid=function(){return!(this.$d.toString()===l)},m.isSame=function(t,e){var n=O(t);return this.startOf(e)<=n&&n<=this.endOf(e)},m.isAfter=function(t,e){return O(t)<this.startOf(e)},m.isBefore=function(t,e){return this.endOf(e)<O(t)},m.$g=function(t,e,n){return b.u(t)?this[e]:this.set(n,t)},m.unix=function(){return Math.floor(this.valueOf()/1e3)},m.valueOf=function(){return this.$d.getTime()},m.startOf=function(t,e){var n=this,r=!!b.u(e)||e,f=b.p(t),l=function(t,e){var i=b.w(n.$u?Date.UTC(n.$y,e,t):new Date(n.$y,e,t),n);return r?i:i.endOf(a)},$=function(t,e){return b.w(n.toDate()[t].apply(n.toDate(\"s\"),(r?[0,0,0,0]:[23,59,59,999]).slice(e)),n)},y=this.$W,M=this.$M,m=this.$D,v=\"set\"+(this.$u?\"UTC\":\"\");switch(f){case h:return r?l(1,0):l(31,11);case c:return r?l(1,M):l(0,M+1);case o:var g=this.$locale().weekStart||0,D=(y<g?y+7:y)-g;return l(r?m-D:m+(6-D),M);case a:case d:return $(v+\"Hours\",0);case u:return $(v+\"Minutes\",1);case s:return $(v+\"Seconds\",2);case i:return $(v+\"Milliseconds\",3);default:return this.clone()}},m.endOf=function(t){return this.startOf(t,!1)},m.$set=function(t,e){var n,o=b.p(t),f=\"set\"+(this.$u?\"UTC\":\"\"),l=(n={},n[a]=f+\"Date\",n[d]=f+\"Date\",n[c]=f+\"Month\",n[h]=f+\"FullYear\",n[u]=f+\"Hours\",n[s]=f+\"Minutes\",n[i]=f+\"Seconds\",n[r]=f+\"Milliseconds\",n)[o],$=o===a?this.$D+(e-this.$W):e;if(o===c||o===h){var y=this.clone().set(d,1);y.$d[l]($),y.init(),this.$d=y.set(d,Math.min(this.$D,y.daysInMonth())).$d}else l&&this.$d[l]($);return this.init(),this},m.set=function(t,e){return this.clone().$set(t,e)},m.get=function(t){return this[b.p(t)]()},m.add=function(r,f){var d,l=this;r=Number(r);var $=b.p(f),y=function(t){var e=O(l);return b.w(e.date(e.date()+Math.round(t*r)),l)};if($===c)return this.set(c,this.$M+r);if($===h)return this.set(h,this.$y+r);if($===a)return y(1);if($===o)return y(7);var M=(d={},d[s]=e,d[u]=n,d[i]=t,d)[$]||1,m=this.$d.getTime()+r*M;return b.w(m,this)},m.subtract=function(t,e){return this.add(-1*t,e)},m.format=function(t){var e=this,n=this.$locale();if(!this.isValid())return n.invalidDate||l;var r=t||\"YYYY-MM-DDTHH:mm:ssZ\",i=b.z(this),s=this.$H,u=this.$m,a=this.$M,o=n.weekdays,c=n.months,f=n.meridiem,h=function(t,n,i,s){return t&&(t[n]||t(e,r))||i[n].slice(0,s)},d=function(t){return b.s(s%12||12,t,\"0\")},$=f||function(t,e,n){var r=t<12?\"AM\":\"PM\";return n?r.toLowerCase():r};return r.replace(y,(function(t,r){return r||function(t){switch(t){case\"YY\":return String(e.$y).slice(-2);case\"YYYY\":return b.s(e.$y,4,\"0\");case\"M\":return a+1;case\"MM\":return b.s(a+1,2,\"0\");case\"MMM\":return h(n.monthsShort,a,c,3);case\"MMMM\":return h(c,a);case\"D\":return e.$D;case\"DD\":return b.s(e.$D,2,\"0\");case\"d\":return String(e.$W);case\"dd\":return h(n.weekdaysMin,e.$W,o,2);case\"ddd\":return h(n.weekdaysShort,e.$W,o,3);case\"dddd\":return o[e.$W];case\"H\":return String(s);case\"HH\":return b.s(s,2,\"0\");case\"h\":return d(1);case\"hh\":return d(2);case\"a\":return $(s,u,!0);case\"A\":return $(s,u,!1);case\"m\":return String(u);case\"mm\":return b.s(u,2,\"0\");case\"s\":return String(e.$s);case\"ss\":return b.s(e.$s,2,\"0\");case\"SSS\":return b.s(e.$ms,3,\"0\");case\"Z\":return i}return null}(t)||i.replace(\":\",\"\")}))},m.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},m.diff=function(r,d,l){var $,y=this,M=b.p(d),m=O(r),v=(m.utcOffset()-this.utcOffset())*e,g=this-m,D=function(){return b.m(y,m)};switch(M){case h:$=D()/12;break;case c:$=D();break;case f:$=D()/3;break;case o:$=(g-v)/6048e5;break;case a:$=(g-v)/864e5;break;case u:$=g/n;break;case s:$=g/e;break;case i:$=g/t;break;default:$=g}return l?$:b.a($)},m.daysInMonth=function(){return this.endOf(c).$D},m.$locale=function(){return D[this.$L]},m.locale=function(t,e){if(!t)return this.$L;var n=this.clone(),r=w(t,e,!0);return r&&(n.$L=r),n},m.clone=function(){return b.w(this.$d,this)},m.toDate=function(){return new Date(this.valueOf())},m.toJSON=function(){return this.isValid()?this.toISOString():null},m.toISOString=function(){return this.$d.toISOString()},m.toString=function(){return this.$d.toUTCString()},M}(),Y=_.prototype;return O.prototype=Y,[[\"$ms\",r],[\"$s\",i],[\"$m\",s],[\"$H\",u],[\"$W\",a],[\"$M\",c],[\"$y\",h],[\"$D\",d]].forEach((function(t){Y[t[1]]=function(e){return this.$g(e,t[0],t[1])}})),O.extend=function(t,e){return t.$i||(t(e,_,O),t.$i=!0),O},O.locale=w,O.isDayjs=S,O.unix=function(t){return O(1e3*t)},O.en=D[g],O.Ls=D,O.p={},O}));","// src/core/NineUtil.js\r\nimport { nineAlertPopup, nineConfirmPopup } from './nineConfirm.js';\r\nimport { ninePromptPopup } from \"./ninePrompt.js\";\r\nimport dayjs from 'dayjs';\r\n\r\nexport class NineUtil {\r\n\t// static 필드는 클래스 자체에 저장됨\r\n\tstatic cssPath = \"\";\r\n\r\n\t/**\r\n\t * 팝업 준비 로직 (Private 메서드)\r\n\t */\r\n\t#prepare(type, message, title, defaultClass) {\r\n\r\n\t\tconst options = { class: defaultClass, animation: 'fade' };\r\n\t\t//const popup = type === 'alert' ? nineAlertPopup : (type === 'confirm' ? nineConfirmPopup : ninePromptPopup);\r\n\t\tlet isExecuted = false;\r\n\r\n\t\tconst popupMap = {\r\n\t\t\talert: nineAlertPopup,\r\n\t\t\tconfirm: nineConfirmPopup,\r\n\t\t\tprompt: ninePromptPopup\r\n\t\t};\r\n\r\n\t\tconst popup = popupMap[type];\r\n\r\n\t\tconst runner = {\r\n\t\t\trgb: () => { options.class = 'rgb'; return runner; },\r\n\t\t\tclassic: () => { options.class = 'classic'; return runner; },\r\n\t\t\tshake: () => { options.animation = 'shake'; return runner; },\r\n\t\t\trun: () => { options.animation = 'roadRunner'; return runner; },\r\n\t\t\tzoom: () => { options.animation = 'zoom'; return runner; },\r\n\r\n\t\t\tthen: (resolve, reject) => {\r\n\t\t\t\tisExecuted = true;\r\n\t\t\t\treturn popup[type](message, title, options).then(resolve, reject);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t// Microtask: 동기 체이닝이 모두 끝난 후 실행\r\n\t\tPromise.resolve().then(() => {\r\n\t\t\tif (!isExecuted) {\r\n\t\t\t\tisExecuted = true;\r\n\t\t\t\tpopup[type](message, title, options);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn runner;\r\n\t}\r\n\r\n\talert = (message, title = \"Alert\") => {\r\n\t\treturn this.#prepare('alert', message, title, 'classic');\r\n\t}\r\n\r\n\tconfirm = (message, title = \"Confirm\") => {\r\n\t\treturn this.#prepare('confirm', message, title, 'classic');\r\n\t}\r\n\r\n\tprompt = (message, title = \"Prompt\") => {\r\n\t\treturn this.#prepare('prompt', message, title, 'classic');\r\n\t}\r\n\r\n\tformatDate = (v, fmt) => {\r\n\t\treturn dayjs(v).format(fmt)\r\n\t}\r\n}","const listeners = new Set();\r\n\r\n// 💡 [핵심] 전역 저장소를 단일화합니다.\r\n// window에 이미 있으면 그것을 쓰고, 없으면 초기값을 생성하여 등록합니다.\r\nconst _initialConfig = {\r\n\tux: { nativeOverride: false, theme: 'light' },\r\n\tboard: { readOnly: false },\r\n\tcssPath: \"\",\r\n\tdebug: false\r\n};\r\n\r\nif (typeof window !== 'undefined' && !window.__NINE_GLOBAL_CONFIG__) {\r\n\twindow.__NINE_GLOBAL_CONFIG__ = _initialConfig;\r\n}\r\n\r\n// 이제 모든 모듈의 _config는 동일한 window 객체 메모리를 가리킵니다.\r\nconst _config = typeof window !== 'undefined' ? window.__NINE_GLOBAL_CONFIG__ : _initialConfig;\r\n\r\nexport const subscribeConfig = (fn) => {\r\n\tlisteners.add(fn);\r\n\tfn('all', _config);\r\n\treturn () => listeners.delete(fn);\r\n};\r\n\r\n// Proxy 역시 전역 저장소인 _config를 조작합니다.\r\nexport const config = new Proxy(_config, {\r\n\tset(target, prop, value) {\r\n\t\ttarget[prop] = value;\r\n\t\tlisteners.forEach(fn => fn(prop, target));\r\n\t\treturn true;\r\n\t},\r\n\tget(target, prop) {\r\n\t\treturn target[prop];\r\n\t}\r\n});\r\n\r\nexport const nine = {\r\n\tconfig: config,\r\n\r\n\t// Getter에서 window.nine까지 확인할 필요도 없습니다.\r\n\t// 이미 config 자체가 전역 저장소(__NINE_GLOBAL_CONFIG__)를 바라보고 있기 때문입니다.\r\n\tget cssPath() {\r\n\t\treturn this.config.cssPath || \"\";\r\n\t},\r\n\r\n\tsetup(options = {}) {\r\n\t\tObject.entries(options).forEach(([key, value]) => {\r\n\t\t\t// 깊은 병합 지원\r\n\t\t\tif (typeof value === 'object' && value !== null && !Array.isArray(value)) {\r\n\t\t\t\tthis.config[key] = { ...this.config[key], ...value };\r\n\t\t\t} else {\r\n\t\t\t\tthis.config[key] = value;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// 다른 모듈에서 window.nine으로 접근할 수 있도록 보장\r\n\t\tif (typeof window !== 'undefined') {\r\n\t\t\twindow.nine = window.nine || this;\r\n\t\t}\r\n\t}\r\n};","export class Trace {\r\n\t#name;\r\n\t#color;\r\n\t#enabled = true;\r\n\r\n\tconstructor(name = null, color = \"green\") {\r\n\t\tthis.#name = name;\r\n\t\tthis.#color = color;\r\n\t\tthis.#autoConfig();\r\n\t\t/**\r\n\t\t// 1. 쪼개진 인스턴스들을 하나로 합치는 '본드' 역할 (이게 핵심!)\r\n\t\tif (typeof window !== 'undefined' && window.__NINE_TRACE__) {\r\n\t\t\treturn window.__NINE_TRACE__;\r\n\t\t}\r\n\t\tthis.#autoConfig();\r\n\t\tif (typeof window !== 'undefined') window.__NINE_TRACE__ = this;\r\n\t\t\t*/\r\n\t}\r\n\r\n\t#autoConfig() {\r\n\t\tif (typeof window === 'undefined') return;\r\n\t\tconst isLocal = window.location.hostname === 'localhost' ||\r\n\t\t\twindow.location.hostname === '127.0.0.1' ||\r\n\t\t\twindow.location.hostname.startsWith('192.168.');\r\n\r\n\t\tif (isLocal) {\r\n\t\t\tthis.enable();\r\n\t\t} else {\r\n\t\t\tthis.disable();\r\n\t\t\tconsole.log(\r\n\t\t\t\t`%c[${this.#name || 'Trace'}]%c 운영 모드: 로그 비활성화. %ctrace.enable()%c 로 활성화 가능`,\r\n\t\t\t\t\"color: #4CAF50; font-weight: bold;\", \"\",\r\n\t\t\t\t\"background: #333; color: yellow; padding: 2px 5px;\", \"\"\r\n\t\t\t);\r\n\t\t}\r\n\t}\r\n\r\n\t// 🟢 빼먹었던 init 메서드 다시 추가!\r\n\tinitBAK(name, color = \"green\") {\r\n\t\tthis.#name = name;\r\n\t\tthis.#color = color;\r\n\t}\r\n\r\n\tinit(name, color = \"green\") {\r\n\t\t//const style = `color: ${color}; font-weight: bold;`;\r\n\t\tthis.#name = name;\r\n\t\tthis.#color = color;\r\n\r\n\t\treturn this;\r\n\t\t/**\r\n\t\tconsole.log(name, color);\r\n\t\treturn {\r\n\t\t\tlog: console.log.bind(console, `%c[${name}]`, style),\r\n\t\t\twarn: console.warn.bind(console, `%c[${name}]`, \"color: cyan; font-weight: bold;\"),\r\n\t\t\terror: console.error.bind(console, `%c[${name}]`, \"color: red; font-weight: bold;\")\r\n\t\t}; */\r\n\t}\r\n\r\n\t//get log() { return console.log.bind(console); }\r\n\r\n\t// 🔴 핵심: 소스 위치를 호출부로 찍어주는 Getter 로직\r\n\tget log() {\r\n\t\t//if (!this.#enabled) return () => {};\r\n\t\tconst style = `color: ${this.#color}; font-weight: bold;`;\r\n\t\t// 이름이 있으면 프리픽스를 붙이고, 없으면 그냥 로그를 바인딩합니다.\r\n\t\treturn (this.#name)\r\n\t\t\t? console.log.bind(console, `%c[${this.#name}]`, style)\r\n\t\t\t: console.log.bind(console);\r\n\t}\r\n\r\n\tget warn() {\r\n\t\tif (!this.#enabled) return () => {};\r\n\t\treturn (this.#name)\r\n\t\t\t? console.warn.bind(console, `%c[${this.#name}]`, \"color: cyan; font-weight: bold;\")\r\n\t\t\t: console.warn.bind(console);\r\n\t}\r\n\r\n\tget error() {\r\n\t\t// 에러는 enabled 상태와 상관없이 찍고 싶으시면 if 체크를 주석 처리하세요.\r\n\t\t// if (!this.#enabled) return () => {};\r\n\t\treturn (this.#name)\r\n\t\t\t? console.error.bind(console, `%c[${this.#name}]`, \"color: red; font-weight: bold;\")\r\n\t\t\t: console.error.bind(console);\r\n\t}\r\n\r\n\tenable() { this.#enabled = true; }\r\n\tdisable() { this.#enabled = false; }\r\n}\r\n\r\nexport const trace = new Trace();\r\nif (typeof window !== 'undefined') window.trace = trace;","export class TaskDebouncer {\r\n\t#timer = null;\r\n\t#queue = [];\r\n\t#delay;\r\n\r\n\tconstructor(delay = 50) {\r\n\t\tthis.#delay = delay;\r\n\t}\r\n\r\n\t/**\r\n\t * @param {Function} func - 실행할 함수\r\n\t * @param {...any} args - 함수에 전달할 임의의 파라미터들\r\n\t */\r\n\texec(func, ...args) {\r\n\t\t// 1. 어떤 함수와 어떤 인자들이 들어왔는지 큐에 저장\r\n\t\tthis.#queue.push({ func, args });\r\n\r\n\t\t// 2. 디바운스 타이머 설정\r\n\t\tif (this.#timer) clearTimeout(this.#timer);\r\n\r\n\t\tthis.#timer = setTimeout(() => this.#flush(), this.#delay);\r\n\t}\r\n\r\n\texecWithKey(key, func, ...args) {\r\n\t\t// 1. 같은 키(예: 'resize')가 들어오면 이전 큐에서 해당 키 삭제 (중복 제거)\r\n\t\tthis.#queue = this.#queue.filter(task => task.key !== key);\r\n\r\n\t\t// 2. 새로운 태스크 추가\r\n\t\tthis.#queue.push({ key, func, args });\r\n\r\n\t\tif (this.#timer) clearTimeout(this.#timer);\r\n\t\tthis.#timer = setTimeout(() => this.#flush(), this.#delay);\r\n\t}\r\n\r\n\t#flush() {\r\n\t\tif (this.#queue.length === 0) return;\r\n\r\n\t\t// 3. 현재까지 쌓인 큐를 쏙 빼옴\r\n\t\tconst tasks = this.#queue.splice(0, this.#queue.length);\r\n\t\tconst seen = new Set();\r\n\r\n\t\ttasks.forEach(task => {\r\n\t\t\t// 4. 핵심: 함수 이름과 인자들을 문자열로 합쳐서 유니크 키 생성\r\n\t\t\t// JSON.stringify를 통해 [1, {a:1}] 같은 파라미터도 문자열로 비교 가능\r\n\t\t\tconst identifier = `${task.func.name}_${JSON.stringify(task.args)}`;\r\n\r\n\t\t\tif (!seen.has(identifier)) {\r\n\t\t\t\t// 5. 중복이 아닐 때만 원래 인자들(...args) 그대로 실행\r\n\t\t\t\ttask.func(...task.args);\r\n\t\t\t\tseen.add(identifier);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tthis.#timer = null;\r\n\t}\r\n}","import { trace as traceOrigin } from '../core/Trace.js';\n\nexport class Trace extends traceOrigin.constructor {\n constructor() {\n super();\n this.init(\"nine-util\", \"green\");\n }\n}\n\nexport const trace = new Trace();","export class Loading {\n\tstatic show() {\n\t\tlet overlay = document.getElementById(\"global-loading-overlay\");\n\t\tif (!overlay) {\n\t\t\toverlay = document.createElement(\"div\");\n\t\t\toverlay.id = \"global-loading-overlay\";\n\t\t\toverlay.style.cssText = `\n position: fixed; inset: 0; z-index: 9999;\n background: rgba(0, 0, 0, 0.4); display: flex; \n justify-content: center; align-items: center;\n backdrop-filter: blur(2px);\n `;\n\t\t\toverlay.innerHTML = `<div class=\"loading-spinner\"></div>`;\n\t\t\tdocument.body.appendChild(overlay);\n\n\t\t\tif (!document.getElementById(\"nine-util-style\")) {\n\t\t\t\tconst style = document.createElement(\"style\");\n\t\t\t\tstyle.id = \"nine-util-style\";\n\t\t\t\tstyle.innerHTML = `\n .loading-spinner {\n width: 48px; height: 48px;\n border: 5px solid rgba(255, 255, 255, 0.3);\n border-top-color: white; border-radius: 50%;\n animation: nine-spin 1s linear infinite;\n }\n @keyframes nine-spin { to { transform: rotate(360deg); } }\n `;\n\t\t\t\tdocument.head.appendChild(style);\n\t\t\t}\n\t\t}\n\t\toverlay.style.display = \"flex\";\n\t}\n\n\tstatic hide() {\n\t\tconst overlay = document.getElementById(\"global-loading-overlay\");\n\t\tif (overlay) overlay.style.display = \"none\";\n\t}\n}","import { trace } from \"@nopeer\";\nimport { Loading } from \"../ux/Loading.js\";\n\nexport class Fetch {\n\tstatic BASE_URL = window.__API_BASE_URL__ || \"\";\n\n\tstatic #request = (method, url, data = {}, showLoading = true) => {\n\t\tconst finalUrl = url.startsWith('http') ? url : `${this.BASE_URL}${url}`;\n\n\t\tif (showLoading) {\n\t\t\tLoading.show();\n\t\t}\n\n\t\t// 1. 기본 헤더 설정\n\t\tconst headers = {};\n\n\t\t// 🔴 핵심: 데이터가 FormData가 아닐 때만 JSON 헤더를 추가합니다.\n\t\tif (!(data instanceof FormData)) {\n\t\t\theaders[\"Content-Type\"] = \"application/json\";\n\t\t}\n\n\t\tconst options = {\n\t\t\tmethod,\n\t\t\theaders\n\t\t};\n\n\t\tlet targetUrl = finalUrl;\n\t\tif (method === \"GET\") {\n\t\t\ttargetUrl += `?${new URLSearchParams(data)}`;\n\t\t} else {\n\t\t\t// 🔴 핵심: FormData는 그대로 body에 넣고, 일반 객체는 JSON.stringify 처리합니다.\n\t\t\toptions.body = data instanceof FormData ? data : JSON.stringify(data);\n\t\t}\n\n\t\treturn fetch(targetUrl, options)\n\t\t\t.then(async res => {\n\t\t\t\tif (!res.ok) {\n\t\t\t\t\tconst text = await res.text();\n\t\t\t\t\tthrow new Error(`API 오류 (${res.status}): ${text}`);\n\t\t\t\t}\n\t\t\t\treturn res.json();\n\t\t\t})\n\t\t\t.catch(err => {\n\t\t\t\ttrace.error(`[IdeFetch.${method.toLowerCase()}] ${finalUrl} 실패:`, err);\n\t\t\t\tthrow err;\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\tif (showLoading) {\n\t\t\t\t\tLoading.hide();\n\t\t\t\t}\n\t\t\t});\n\t};\n\n\t// 기존 post/get 메서드도 인자를 넘겨주도록 수정\n\tstatic get = (url, data = {}, showLoading = true) => this.#request(\"GET\", url, data, showLoading);\n\tstatic post = (url, data = {}, showLoading = true) => this.#request(\"POST\", url, data, showLoading);\n\n\t/**\n\t * 🚀 범용 청크 전송 (파라미터 이름까지 동적 설정)\n\t * @param {string} url - API 주소\n\t * @param {Array} rows - 데이터 배열\n\t * @param {object} options - 상세 옵션\n\t * - fileKey: 객체 내 파일 속성명 (기본: 'fileContents')\n\t * - filePartName: 서버에서 받을 파일 파트명 (기본: 'files')\n\t * - jsonPartName: 서버에서 받을 JSON 파트명 (기본: 'dataList')\n\t * - chunkSize: 분할 단위 (기본: 10)\n\t */\n\tstatic postMultipart = async (url, rows = [], options = {}) => {\n\t\tconst {\n\t\t\tfileKey = 'fileContents',\n\t\t\tfilePartName = 'files',\n\t\t\tjsonPartName = 'dataList',\n\t\t\tchunkSize = 10\n\t\t} = options;\n\n\t\t// 1. 시작 전 로딩바 띄우기\n\t\tLoading.show();\n\n\t\tlet totalCount = 0;\n\t\tlet lastResponse = null;\n\n\t\t// 🔴 2. 전체 루프를 Promise 체인처럼 관리 (내부는 await 유지)\n\t\treturn (async () => {\n\t\t\tfor (let i = 0; i < rows.length; i += chunkSize) {\n\t\t\t\tconst formData = new FormData();\n\t\t\t\tconst chunk = rows.slice(i, i + chunkSize);\n\t\t\t\tconst rowDataList = [];\n\n\t\t\t\tchunk.forEach((row) => {\n\t\t\t\t\tconst { [fileKey]: fileObj, _fileObj, ...rest } = row;\n\t\t\t\t\trowDataList.push(rest);\n\t\t\t\t\tif (fileObj instanceof File) {\n\t\t\t\t\t\tformData.append(filePartName, fileObj);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tconst jsonBlob = new Blob([JSON.stringify(rowDataList)], { type: 'application/json' });\n\t\t\t\tformData.append(jsonPartName, jsonBlob);\n\n\t\t\t\t// showLoading = false로 내부 호출\n\t\t\t\tlastResponse = await this.post(url, formData, false);\n\n\t\t\t\tif (lastResponse && (lastResponse.success || lastResponse.status === 'OK')) {\n\t\t\t\t\ttotalCount += chunk.length;\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(`청크 전송 실패: ${i}번째 섹션`);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn { ...lastResponse, success: true, totalCount };\n\t\t})()\n\t\t\t.catch(err => {\n\t\t\t\ttrace.error(\"[postChunk] Error:\", err);\n\t\t\t\tthrow err;\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\t// 🔴 3. 성공하든 실패하든 여기서 깔끔하게 닫기!\n\t\t\t\tLoading.hide();\n\t\t\t});\n\t};\n}\n\nexport const api = Fetch;","/**\r\n * 비동기 함수를 try-catch 없이 안전하게 실행하게 도와주는 유틸리티\r\n * @param {Promise} promise\r\n * @returns {Promise<[any, Error|null]>}\r\n */\r\nexport const safe = async (promise) => {\r\n\ttry {\r\n\t\tconst data = await promise;\r\n\t\treturn [data, null];\r\n\t} catch (err) {\r\n\t\treturn [null, err];\r\n\t}\r\n};","import { trace } from \"@nopeer\";\r\nimport { NineUtil } from \"./dialog/NineUtil.js\";\r\n\r\nclass UxSplitter extends HTMLElement {\r\n\r\n\t#mode;\r\n\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.attachShadow({ mode: \"open\" });\r\n\t}\r\n\r\n\tconnectedCallback() {\r\n\r\n\t\tthis.#init();\r\n\t}\r\n\r\n\t#detectMode = (el) => {\r\n\t\tconst prev = el.previousElementSibling;\r\n\t\tconst next = el.nextElementSibling;\r\n\t\tif (!prev || !next) {\r\n\t\t\tthis.#mode = this.classList.contains('h') ? \"h\" : \"v\";\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst prevRect = prev.getBoundingClientRect();\r\n\t\tconst nextRect = next.getBoundingClientRect();\r\n\r\n\t\tif (this.classList.contains('h')) {\r\n\t\t\tthis.#mode = \"h\";\r\n\t\t} else if (this.classList.contains('v')) {\r\n\t\t\tthis.#mode = \"v\";\r\n\t\t} else {\r\n\t\t\tthis.#mode = (Math.abs(prevRect.top - nextRect.top) < 5) ? \"h\" : \"v\";\r\n\t\t}\r\n\t};\r\n\r\n\t#startDrag = (e) => {\r\n\t\te.preventDefault();\r\n\t\te.stopPropagation();\r\n\r\n\t\tconst splitterRect = this.getBoundingClientRect();\r\n\t\tconst isHorizontal = this.#mode === \"h\";\r\n\r\n\t\t// 마우스 포인터와 스플리터 시작점 사이의 거리\r\n\t\tconst clickOffset = isHorizontal\r\n\t\t\t? e.clientX - splitterRect.left\r\n\t\t\t: e.clientY - splitterRect.top;\r\n\r\n\t\tconst dragBar = document.createElement(\"div\");\r\n\t\tdragBar.className = `nx-splitter-drag-bar-${this.#mode}`;\r\n\r\n\t\tObject.assign(dragBar.style, {\r\n\t\t\tposition: \"absolute\",\r\n\t\t\tzIndex: \"999\",\r\n\t\t\tbackground: \"#666\",\r\n\t\t\topacity: \"0.6\",\r\n\t\t\tpointerEvents: \"none\"\r\n\t\t});\r\n\r\n\t\tconst root = this.getRootNode({ composed: true });\r\n\t\tconst parent = root instanceof ShadowRoot ? root.host : this.parentElement;\r\n\t\tconst prev = this.previousElementSibling;\r\n\t\tconst next = this.nextElementSibling;\r\n\r\n\t\tif (!parent || !prev || !next) {\r\n\t\t\ttrace.warn(\"Spliter's parent or siblings not found.\");\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t(parent.shadowRoot || parent).appendChild(dragBar);\r\n\t\tconst dragBarOffsetParentRect = dragBar.offsetParent.getBoundingClientRect();\r\n\r\n\t\tconst prevRect = prev.getBoundingClientRect();\r\n\t\tconst nextRect = next.getBoundingClientRect();\r\n\r\n\t\t// 드래그 바의 초기 위치와 크기 설정\r\n\t\tconst initialSplitterPosInParent = (isHorizontal\r\n\t\t\t? splitterRect.left - dragBarOffsetParentRect.left\r\n\t\t\t: splitterRect.top - dragBarOffsetParentRect.top) + clickOffset;\r\n\r\n\t\tif (isHorizontal) {\r\n\t\t\tdragBar.style.top = \"0\";\r\n\t\t\tdragBar.style.left = `${initialSplitterPosInParent}px`;\r\n\t\t\tdragBar.style.width = \"2px\";\r\n\t\t\tdragBar.style.height = \"100%\";\r\n\t\t} else {\r\n\t\t\tdragBar.style.left = \"0\";\r\n\t\t\tdragBar.style.top = `${initialSplitterPosInParent}px`;\r\n\t\t\tdragBar.style.height = \"2px\";\r\n\t\t\tdragBar.style.width = \"100%\";\r\n\t\t}\r\n\r\n\t\tdragBar.style.mixBlendMode = \"difference\";\r\n\t\tdragBar.style.zIndex = \"99999\";\r\n\r\n\t\tconst minLimit = isHorizontal\r\n\t\t\t? prevRect.left - dragBarOffsetParentRect.left\r\n\t\t\t: prevRect.top - dragBarOffsetParentRect.top;\r\n\t\tconst maxLimit = isHorizontal\r\n\t\t\t? nextRect.right - dragBarOffsetParentRect.left - splitterRect.width\r\n\t\t\t: nextRect.bottom - dragBarOffsetParentRect.top - splitterRect.height;\r\n\r\n\t\tconst onMove = moveEvent => {\r\n\t\t\tconst clientPos = isHorizontal ? moveEvent.clientX : moveEvent.clientY;\r\n\t\t\tconst currentPosInParent = isHorizontal\r\n\t\t\t\t? clientPos - dragBarOffsetParentRect.left\r\n\t\t\t\t: clientPos - dragBarOffsetParentRect.top;\r\n\r\n\t\t\tconst clampedPos = Math.max(minLimit, Math.min(currentPosInParent, maxLimit));\r\n\r\n\t\t\tif (isHorizontal) {\r\n\t\t\t\tdragBar.style.left = `${clampedPos}px`;\r\n\t\t\t} else {\r\n\t\t\t\tdragBar.style.top = `${clampedPos}px`;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tconst onUp = () => {\r\n\t\t\twindow.removeEventListener(\"mousemove\", onMove);\r\n\t\t\twindow.removeEventListener(\"mouseup\", onUp);\r\n\t\t\tdragBar.remove();\r\n\r\n\t\t\tconst allChildren = Array.from(parent.children);\r\n\t\t\tconst allPanels = allChildren.filter(el => el.tagName.toLowerCase() !== 'nx-splitter');\r\n\r\n\t\t\t// ⭐⭐ gap 크기 계산 ⭐⭐\r\n\t\t\tconst style = window.getComputedStyle(parent);\r\n\t\t\tconst gapValue = isHorizontal ? style.getPropertyValue('column-gap') : style.getPropertyValue('row-gap');\r\n\t\t\tconst gapSize = parseFloat(gapValue) || 0;\r\n\t\t\tconst gapCount = allChildren.length > 1 ? allChildren.length - 1 : 0;\r\n\t\t\tconst totalGapSize = gapCount * gapSize;\r\n\r\n\t\t\tconst finalDragBarPos = isHorizontal ? parseFloat(dragBar.style.left) : parseFloat(dragBar.style.top);\r\n\t\t\tconst dragOffset = finalDragBarPos - initialSplitterPosInParent;\r\n\r\n\t\t\tconst prevSize = isHorizontal ? prev.getBoundingClientRect().width : prev.getBoundingClientRect().height;\r\n\t\t\tconst nextSize = isHorizontal ? next.getBoundingClientRect().width : next.getBoundingClientRect().height;\r\n\r\n\t\t\tlet newPrevSize = prevSize + dragOffset;\r\n\t\t\tlet newNextSize = nextSize - dragOffset;\r\n\r\n\t\t\t// 패널 크기가 음수가 되지 않도록 제한하고, 다른 패널에 차이를 보정\r\n\t\t\tif (newPrevSize < 0) {\r\n\t\t\t\tnewNextSize += newPrevSize;\r\n\t\t\t\tnewPrevSize = 0;\r\n\t\t\t}\r\n\t\t\tif (newNextSize < 0) {\r\n\t\t\t\tnewPrevSize += newNextSize;\r\n\t\t\t\tnewNextSize = 0;\r\n\t\t\t}\r\n\r\n\t\t\tconst initialSizes = allPanels.map(panel => isHorizontal ? panel.getBoundingClientRect().width : panel.getBoundingClientRect().height);\r\n\r\n\t\t\tconst totalSplitterSize = allChildren.reduce((sum, child) => {\r\n\t\t\t\tif (child.tagName.toLowerCase() === 'nx-splitter') {\r\n\t\t\t\t\treturn sum + (isHorizontal ? child.getBoundingClientRect().width : child.getBoundingClientRect().height);\r\n\t\t\t\t}\r\n\t\t\t\treturn sum;\r\n\t\t\t}, 0);\r\n\r\n\t\t\tconst totalContainerSize = (isHorizontal ? parent.getBoundingClientRect().width : parent.getBoundingClientRect().height);\r\n\t\t\tconst totalFlexSpace = totalContainerSize - totalSplitterSize - totalGapSize;\r\n\r\n\t\t\tlet flexSum = 0;\r\n\t\t\tallPanels.forEach((panel, index) => {\r\n\t\t\t\tlet newSize;\r\n\t\t\t\tif (panel === prev) {\r\n\t\t\t\t\tnewSize = newPrevSize;\r\n\t\t\t\t} else if (panel === next) {\r\n\t\t\t\t\tnewSize = newNextSize;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tnewSize = initialSizes[index];\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst newFlexBasis = newSize / totalFlexSpace;\r\n\t\t\t\t//panel.style.flex = `${newFlexBasis} ${newFlexBasis} 0`;\r\n\r\n\t\t\t\ttrace.log(panel);\r\n\r\n\t\t\t\tif (panel.classList.contains('sidebar')) {\r\n\t\t\t\t\t// 드래그가 끝난 시점의 newSize(px)를 그대로 고정값으로 할당\r\n\t\t\t\t\t// 이렇게 하면 비율(%)이 아니라 딱 그 픽셀만큼만 자리를 차지하게 됩니다.\r\n\t\t\t\t\tpanel.style.flex = `0 0 ${newSize}px`;\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// 나머지 메인 보드 같은 유연한 패널은 비율(%)로 처리\r\n\t\t\t\t\t//const newFlexBasis = newSize / totalFlexSpace;\r\n\t\t\t\t\tpanel.style.flex = `${newFlexBasis} ${newFlexBasis} 0`;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tflexSum += newFlexBasis;\r\n\t\t\t});\r\n\r\n\t\t\ttrace.log(`dragOffset: ${dragOffset}`);\r\n\t\t\ttrace.log(`Calculated FlexSum: ${flexSum}`);\r\n\t\t};\r\n\r\n\t\twindow.addEventListener(\"mousemove\", onMove);\r\n\t\twindow.addEventListener(\"mouseup\", onUp);\r\n\t};\r\n\r\n\tget cssPath() {\r\n\t\treturn this.getAttribute(\"css-path\") || NineUtil.cssPath;\r\n\t}\r\n\r\n\t#init = () => {\r\n\t\tthis.#detectMode(this);\r\n\t\tthis.classList.add(this.#mode);\r\n\r\n\t\tconst contents = this.innerHTML.trim();\r\n\t\t//const gripClass = `grip-${this.#mode}`;\r\n\t\tconst gripTmpl = (contents === \"\") ? `<div class=\"grip\"></div>` : `<div class=\"grip\"></div><div class=\"inner-container\">${contents}</div><div class=\"grip\"></div>`;\r\n\r\n\t\tthis.innerHTML = \"\";\r\n\t\tconst htmlTmpl = document.createElement(\"template\");\r\n\t\thtmlTmpl.innerHTML = `\r\n\t\t\t<style>\r\n\t\t\t\t@import \"https://cdn.jsdelivr.net/npm/@nine-lab/nine-util@${__APP_VERSION__}/dist/css/nine-util.css\";\r\n\t\t\t\t${this.cssPath ? `@import \"${this.cssPath}\";` : \"\"}\r\n\t\t\t</style>\r\n\t\t\t${gripTmpl}\r\n `;\r\n\r\n\t\tthis.shadowRoot.appendChild(htmlTmpl.content.cloneNode(true));\r\n\r\n\t\tthis.shadowRoot.querySelectorAll(\".grip\").forEach(el => {\r\n\t\t\tel.addEventListener(\"mousedown\", e => this.#startDrag(e));\r\n\t\t});\r\n\r\n\t\tthis.#prepareLayout();\r\n\r\n\t\twindow.addEventListener(\"resize\", () => this.#prepareLayout());\r\n\t};\r\n\r\n\t#prepareLayout = () => {\r\n\t\tconst isHorizontal = this.#mode === \"h\";\r\n\t\tconst parent = this.parentElement;\r\n\t\tconst allPanels = Array.from(parent.children).filter(el => el.tagName.toLowerCase() !== 'nx-splitter');\r\n\t\tif (allPanels.length < 2) return;\r\n\r\n\t\tconst parentRect = parent.getBoundingClientRect();\r\n\t\tconst totalContentSize = allPanels.reduce((sum, el) => {\r\n\t\t\tconst size = isHorizontal ? el.getBoundingClientRect().width : el.getBoundingClientRect().height;\r\n\t\t\treturn sum + size;\r\n\t\t}, 0);\r\n\t\tconst totalParentSize = isHorizontal ? parentRect.width : parentRect.height;\r\n\r\n\t\tallPanels.forEach(panel => {\r\n\t\t\tconst size = isHorizontal ? panel.getBoundingClientRect().width : panel.getBoundingClientRect().height;\r\n\t\t\tconst newSize = totalParentSize * (size / totalContentSize);\r\n\t\t\tconst flexGrow = newSize / totalParentSize;\r\n\t\t\tpanel.style.flex = `${flexGrow} ${flexGrow} 0`;\r\n\t\t});\r\n\t};\r\n}\r\n\r\nif (!customElements.get('nine-splitter')) {\r\n\tcustomElements.define(\"nine-splitter\", UxSplitter);\r\n}","// 1. 기존 core 모듈\r\nimport { NineUtil } from './ux/dialog/NineUtil.js';\r\nimport { nine, subscribeConfig, config } from './core/Config.js';\r\nimport { Trace, trace } from './core/Trace.js';\r\nimport { TaskDebouncer } from './core/TaskDebouncer.js';\r\n\r\n// 2. 신규 net 및 ux 모듈 추가\r\nimport { api, Fetch } from './net/Fetch.js';\r\nimport { Loading } from './ux/Loading.js';\r\n\r\nimport { nineDialog } from './ux/dialog/nineDialog.js';\r\nimport { nineConfirmPopup, nineAlertPopup } from './ux/dialog/nineConfirm.js';\r\nimport { ninePromptPopup } from './ux/dialog/ninePrompt.js';\r\n\r\nimport { safe } from \"./utils/promise.js\"; // 경로에 맞춰 임포트\r\n// ux\r\nimport './ux/UxSplitter.js';\r\n\r\n/**\r\nconst utilInstance = new NineUtil();\r\nnine.alert = utilInstance.alert.bind(utilInstance);\r\nnine.confirm = utilInstance.confirm.bind(utilInstance);\r\nnine.prompt = utilInstance.prompt.bind(utilInstance);\r\nnine.formatDate = utilInstance.formatDate.bind(utilInstance);\r\n\t*/\r\nconst utilInstance = new NineUtil();\r\n\r\n// 💡 이미 화살표 함수로 바인딩되어 있으므로, 객체 통째로 복사해주면 끝납니다!\r\nObject.assign(nine, utilInstance);\r\n\r\nnine.safe = safe;\r\n\r\n// 기존 nine 객체(Config)와 Util 기능을 합성\r\n//Object.assign(nine, utilInstance);\r\n\r\nnine.api = api;\r\nnine.trace = trace;\r\nnine.subscribeConfig = subscribeConfig;\r\nnine.config = config || {};\r\n\r\nexport {\r\n\tnine,\r\n\tsubscribeConfig,\r\n\tconfig,\r\n\tNineUtil,\r\n\tTrace,\r\n\ttrace,\r\n\tTaskDebouncer,\r\n\tapi, // 🚀 추가: 이제 서비스에서 api.get() 가능\r\n\tFetch, // 🚀 추가: 클래스 자체도 혹시 모르니 노출\r\n\tLoading as loading, // 🚀 추가: loading.show() 로 쓰기 편하게 alias\r\n\tnineDialog,\r\n\tnineAlertPopup, nineConfirmPopup, ninePromptPopup\r\n};\r\n\r\nif (typeof window !== 'undefined') {\r\n\twindow.nine = nine;\r\n}\r\n"],"names":["_init","_a","config","el","this","t","e","n","r","i","s","u","a","M","m","f","l","$","y","v","g","D","o","d","c","h","trace","Trace","traceOrigin"],"mappings":";;;;;;;;;;;AAAA,8PAAAA,QAAA;AACO,MAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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","x_google_ignoreList":[4]}
@@ -1,2 +1,2 @@
1
- !function(t,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((t="undefined"!=typeof globalThis?globalThis:t||self)["nine-util"]={})}(this,function(t){"use strict";var n,e,i,o,s,r,a,l,c,d,h,u,p,f,g,m,v,w,b,y,x,$,k,M,E=Object.defineProperty,S=t=>{throw TypeError(t)},L=(t,n,e)=>((t,n,e)=>n in t?E(t,n,{enumerable:!0,configurable:!0,writable:!0,value:e}):t[n]=e)(t,"symbol"!=typeof n?n+"":n,e),C=(t,n,e)=>n.has(t)||S("Cannot "+e),R=(t,n,e)=>(C(t,n,"read from private field"),e?e.call(t):n.get(t)),D=(t,n,e)=>n.has(t)?S("Cannot add the same private member more than once"):n instanceof WeakSet?n.add(t):n.set(t,e),_=(t,n,e,i)=>(C(t,n,"write to private field"),i?i.call(t,e):n.set(t,e),e),O=(t,n,e)=>(C(t,n,"access private method"),e);class T extends HTMLElement{constructor(){super(),D(this,n),D(this,e),L(this,"showModal",()=>{R(this,e).showModal()}),L(this,"close",()=>{R(this,e).close(),this.remove()}),D(this,i,()=>{const t=this.querySelector(".head");t&&(t.addEventListener("mousedown",R(this,o)),t.addEventListener("touchstart",R(this,s))),this.querySelectorAll(".close, .close2, .cancel").forEach(t=>{t.onclick=()=>this.closeWithAnimation(null)}),this.querySelectorAll(".ok").forEach(t=>{})}),D(this,o,t=>{if(t.target.closest("buttons"))return;if(0!==t.button||t.altKey||t.ctrlKey||t.shiftKey)return;const i=R(this,e).getBoundingClientRect();_(this,n,{x:t.clientX-i.left,y:t.clientY-i.top});const o=t=>{R(this,e).style.position="fixed",R(this,e).style.margin="0",R(this,e).style.left=t.clientX-R(this,n).x+"px",R(this,e).style.top=t.clientY-R(this,n).y+"px"},s=()=>{document.removeEventListener("mousemove",o),document.removeEventListener("mouseup",s)};document.addEventListener("mousemove",o),document.addEventListener("mouseup",s)}),D(this,s,t=>{if(t.target.closest("buttons"))return;const i=R(this,e).getBoundingClientRect(),o=t.changedTouches[0];_(this,n,{x:o.pageX-i.left,y:o.pageY-i.top});const s=t=>{const i=t.changedTouches[0];R(this,e).style.position="fixed",R(this,e).style.margin="0",R(this,e).style.left=i.pageX-R(this,n).x+"px",R(this,e).style.top=i.pageY-R(this,n).y+"px"},r=()=>{document.removeEventListener("touchmove",s),document.removeEventListener("touchend",r)};document.addEventListener("touchmove",s),document.addEventListener("touchend",r)})}connectedCallback(){const t=this.innerHTML,n=this.getAttribute("subject")||"Details";this.innerHTML=`\n\t\t\t<style>\n\tdialog::backdrop {\n\t\tbackground: rgba(0, 0, 0, 0.3);\n\t}\n\t\n\tdialog:modal {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tpadding: 0;\n\t\toverflow: hidden;\n\t\tborder: 1px solid darkgreen;\n\t\toutline: none;\n\t\tresize: both;\n\t\tbox-shadow: 0 0 4px 0 darkgreen;\n width: 500px;\n height: fit-content;\n min-width: 330px;\n min-height: 60px;\n max-height: 100%;\n }\n \n \n \n \n\tdiv.head .rect1, div.head .rect2, div.head .rect3 {\n\t\tdisplay: none;\n\t\twidth: 50px;\n\t\theight: 100%;\n\t}\n\tdiv.head .rect1 {\n\t\tbackground-color: red;\n\t}\n\tdiv.head .rect2 {\n\t\tbackground-color: darkgreen;\n\t}\n\tdiv.head .rect3 {\n\t\tbackground-color: olive;\n\t}\n\t\n\tdiv.head {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\t--height: 30px;\n\t\tbackground-color: darkgreen;\n\t\tpadding: 4px;\n\t\tcursor: move;\n\t}\n\tdiv.head:hover {\n\t\tfilter: brightness(110%);\n\t}\n\t\n\tdiv.head span {\n\t\tfont-size: 12px;\n\t\tposition: relative;\n\t}\n\t\n\tdiv.head span.title {\n\t\tcolor: #ddd;\n\t\tmargin-left: 4px;\n\t\tfont-weight: bold;\n\t}\n\t\n\tdiv.head span.sub-title {\n\t\tcolor: #ccc;\n\t\tmargin-left: 8px;\n\t\tfont-style: italic;\n\t}\n\t\n\tdiv.head form {\n\t\tmargin: 0;\n\t}\n\tdiv.head button {\n\t\tmargin-right: 4px;\n\t\tbackground-color: transparent;\n\t\tborder: none;\n\t\tcolor: #ccc;\n\t\tfont-size: x-small;\n\t}\n\tdiv.head button:hover {\n\t\tcursor: pointer;\n\t}\n\t\n\tdiv.contents {\n\t\tdisplay: flex;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\toverflow: hidden;\n\t}\n\tdiv.left {\n\t\tposition: relative;\n\t\twidth: 16px;\n\t\theight: 100%;\n\t\tbackground-color: #ddd;\n\t\tdisplay: none;\n\t}\n\t\n\tdiv.left span {\n\t\twriting-mode: vertical-rl;\n\t\t-moz-user-select: none;\n\t\t-webkit-user-select: none;\n\t\t-ms-user-select: none;\n\t\tuser-select: none;\n\t\tcolor: #ccc;\n\t\tfont-weight: 700;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tmargin-left: 3px;\n\t\tmargin-top: 3px;\n\t}\n\tdiv.close2 {\n\t\tdisplay: none;\n\t\tposition: absolute;\n\t\tright: 0;\n\t\ttop: 3px;\n\t\tcursor: pointer;\n\t\tcolor: #666;\n\t}\n\tdiv.close2 svg:hover {\n\t\tcolor: #999;\n\t}\n\t\n\tdiv.body {\n\t\tdisplay: flex;\n\t\twidth: 100%;\n\t\theight: unset;\n\t\t--border: 3px solid #999;\n\t\t--border-top: none;\n\t\toverflow-x: hidden;\n\t\toverflow-y: auto;\n\t\tpadding: 10px;\n\t\tgap: 8px;\n\t\tflex-direction: column;\n\t}\n\t\n\t\n\t\n\t\n\tng-sphere.icon {\n\t\tmargin-left: 8px;\n\t}\n\t\n\t.buttons {\n\t\tdisplay: flex;\n\t\tposition: absolute;\n\t\tright: 4px;\n\t}\n\t\n\tng-sphere {\n\t\tposition: relative;\n\t\t--width: 16px;\n\t\t--height: 16px;\n\t\tcursor: pointer;\n\t\tmargin-right: 4px;\n\t\tdisplay: flex;\n\t}\n\tng-sphere:hover {\n\t\tfilter: brightness(90%);\n\t}\n\tng-sphere:active {\n\t\tfilter: brightness(80%);\n\t}\n\t\n\tng-sphere:hover::after {\n\t\tcontent: "";\n\t\tposition: absolute;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tbackground-repeat: no-repeat;\n\t\tbackground-position: center;\n\t}\n\tng-sphere.apply:hover::after {\n\t\tbackground-size: 14px 14px;\n\t\tbackground-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg"><polyline points="2.5,7 6,10 11,3" style="fill:none;stroke:white;stroke-width:2px;" /></svg>');\n\t}\n\t\n\tng-sphere.reset:hover::after {\n\t\tbackground-size: 12px 12px;\n\t\tbackground-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" style="fill:none;stroke:white;stroke-width:2px;" focusable="false" aria-hidden="true"><path d="M10 5h5V0"></path><path d="M15 8a6.957 6.957 0 0 1-7 7 6.957 6.957 0 0 1-7-7 6.957 6.957 0 0 1 7-7 6.87 6.87 0 0 1 6.3 4"></path></svg>');\n\t}\n\t\n\tng-sphere.close:hover::after {\n\t\tbackground-size: 12px 12px;\n\t\tbackground-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" style="fill:none;stroke:white;stroke-width:2px;" focusable="false" aria-hidden="true" viewBox="0 0 16 16"><path d="M2 2l12 12M14 2L2 14"></path></svg>');\n\t}\n\t\n\t\n\tbutton {\n cursor: pointer;\n }\n \n .input-area {\n position: relative;\n height: 100%;\n --display: flex;\n textarea {\n width: 100%;\n height: 100%;\n min-height: 100px;\n padding: 8px;\n box-sizing: border-box;\n resize: none;\n border-radius: 2px;\n border-color: #ccc;\n }\n textarea:focus {\n border-color: green;\n outline: none; /* 브라우저 기본 파란색 테두리 제거 */\n }\n }\n \n .buttons-confirm {\n position: absolute;\n display: flex;\n justify-content: flex-end;\n bottom: 8px;\n right: 8px;\n }\n \n \n .buttons-confirm button {\n height: 32px;\n margin-right: 8px;\n border: none;\n outline: none;\n width: 60px;\n -moz-user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n }\n .buttons-confirm button:hover {\n filter: brightness(90%);\n }\n .buttons-confirm button:active {\n color: #ccc;\n }\n \n button.ok {\n --display: none;\n background-color: darkgreen;\n color: white;\n }\n button.cancel {\n color: white;\n background-color: #6c757d;\n }\n \n \n \n div.msg {\n position: relative;\n height: 100%;\n font-size: 14px;\n color: #333;\n padding-bottom: 48px;\n }\n \n .reset, .apply {\n display: none;\n }\n \n \n \n :host(.classic) dialog:modal {\n border: 1px solid #007bff;\n box-shadow: 0 0 4px 0 #007bff;\n }\n \n :host(.classic) div.head {\n background-color: #007bff;\n }\n :host(.classic) div.head:hover {\n filter: brightness(110%);\n }\n \n :host(.classic) div.head span {\n font-size: 12px;\n }\n \n :host(.classic) div.head span.title {\n color: #ddd;\n margin-left: 4px;\n font-weight: bold;\n }\n \n :host(.classic) div.head span.sub-title {\n color: #ccc;\n margin-left: 8px;\n font-style: italic;\n }\n :host(.classic) div.head button {\n margin-right: 4px;\n background-color: transparent;\n border: none;\n color: #ccc;\n font-size: x-small;\n }\n \n \n \n \n :host(.rgb) dialog:modal {\n border: none;\n box-shadow: unset;\n border-top: none;\n }\n \n :host(.rgb) div.left {\n display: block;\n background-color: #ddd;\n }\n :host(.rgb) div.left span {\n color: #ccc;\n }\n :host(.rgb) div.close2 {\n display: block;\n color: #666;\n }\n :host(.rgb) div.close2 svg:hover {\n color: #999;\n }\n :host(.rgb) div.head {\n height: 4px;\n background-color: #999;\n padding: 0;\n }\n :host(.rgb) div.contents {\n height: calc(100% - 4px);\n }\n \n :host(.rgb) div.head ng-sphere,\n :host(.rgb) div.head span,\n :host(.rgb) div.head .buttons {\n display: none;\n }\n \n :host(.rgb) div.head .rect1,\n :host(.rgb) div.head .rect2,\n :host(.rgb) div.head .rect3 {\n display: flex;\n }\n \n \n :host(.rgb) div.head:hover {\n filter: unset;\n }\n \n \n /* --- Animation Core --- */\n:host {\n --nx-duration: 0.4s;\n --nx-timing: cubic-bezier(0.34, 1.56, 0.64, 1);\n}\n\n/* 🎯 수정: 애니메이션 클래스가 붙은 경우에만 초기 opacity를 0으로 설정 */\n:host(.fade) dialog,\n:host(.zoom) dialog,\n:host(.moveUp) dialog,\n:host(.moveDown) dialog,\n:host(.moveLeft) dialog,\n:host(.moveRight) dialog,\n:host(.roadRunner) dialog {\n opacity: 0;\n}\n\n/* shake는 애니메이션 내부에서 opacity를 다루므로 제외하거나 별도 처리 */\n:host(.shake) dialog { \n opacity: 1; \n}\n\n/* 1. Fade (서서히 나타남) */\n:host(.fade) dialog { animation: nx-fade-in var(--nx-duration) forwards; }\n@keyframes nx-fade-in { from { opacity: 0; } to { opacity: 1; } }\n\n/* 2. Zoom (커지며 나타남) */\n:host(.zoom) dialog { animation: nx-zoom-in var(--nx-duration) var(--nx-timing) forwards; }\n@keyframes nx-zoom-in { from { opacity: 0; transform: scale(0.5); } to { opacity: 1; transform: scale(1); } }\n\n/* 3. Slide (상하좌우) */\n:host(.moveUp) dialog { animation: nx-move-up var(--nx-duration) var(--nx-timing) forwards; }\n:host(.moveDown) dialog { animation: nx-move-down var(--nx-duration) var(--nx-timing) forwards; }\n:host(.moveLeft) dialog { animation: nx-move-left var(--nx-duration) var(--nx-timing) forwards; }\n:host(.moveRight) dialog { animation: nx-move-right var(--nx-duration) var(--nx-timing) forwards; }\n\n@keyframes nx-move-up { from { opacity: 0; transform: translateY(100px); } to { opacity: 1; transform: translateY(0); } }\n@keyframes nx-move-down { from { opacity: 0; transform: translateY(-100px); } to { opacity: 1; transform: translateY(0); } }\n@keyframes nx-move-left { from { opacity: 0; transform: translateX(100px); } to { opacity: 1; transform: translateX(0); } }\n@keyframes nx-move-right { from { opacity: 0; transform: translateX(-100px); } to { opacity: 1; transform: translateY(0); } }\n\n/* 4. Shake (상하좌우 격렬한 진동 - 에러 인지용) */\n:host(.shake) dialog { \n animation: nx-heavy-shake 0.5s cubic-bezier(.36,.07,.19,.97) both;\n opacity: 1; \n}\n\n@keyframes nx-heavy-shake {\n 10%, 90% { transform: translate3d(-1px, -2px, 0); }\n 20%, 80% { transform: translate3d(2px, 4px, 0); }\n 30%, 50%, 70% { transform: translate3d(-6px, -6px, 0); }\n 40%, 60% { transform: translate3d(6px, 6px, 0); }\n}\n\n/* 5. Road Runner (등장: 왼쪽에서 탄력 있게 / 퇴장: 움츠렸다가 광속 탈출) */\n:host(.roadRunner) dialog { \n animation: roadRunnerIn 0.5s cubic-bezier(0.175, 0.885, 0.32, 1.275) forwards; \n}\n\n@keyframes roadRunnerIn {\n 0% { transform: translateX(-1500px) skewX(30deg); opacity: 1; }\n 70% { transform: translateX(30px) skewX(-10deg); opacity: 1; }\n 100% { transform: translateX(0) skewX(0deg); opacity: 1; }\n}\n\n/* --- Out Animations (닫힐 때) --- */\ndialog.out { pointer-events: none; }\n\n/* Road Runner 퇴장: 슥 움츠렸다가(Anticipation) 쌩~! */\n:host(.roadRunner) dialog.out { \n animation: roadRunnerOut 0.5s cubic-bezier(0.6, -0.28, 0.735, 0.045) forwards; \n}\n\n@keyframes roadRunnerOut {\n 0% { \n transform: translateX(0) scale(1) skewX(0deg); \n opacity: 1; \n }\n 30% { \n /* 예비 동작: 뒤로 살짝 갔다가 움츠러들기 */\n transform: translateX(50px) scaleX(1.2) scaleY(0.8) skewX(-20deg); \n opacity: 1; \n }\n 100% { \n /* 발사: 길게 늘어나며 광속 탈출 */\n transform: translateX(2000px) scaleX(4) scaleY(0.3) skewX(50deg); \n opacity: 0; \n filter: blur(10px); /* 👈 잔상 느낌 추가 */\n }\n}\n\n/* 일반 퇴장 (기본) */\ndialog.out { animation: nx-fade-out 0.3s forwards; }\n@keyframes nx-fade-out { from { opacity: 1; transform: scale(1); } to { opacity: 0; transform: scale(0.9); } }\n</style>\n\t\t\n\t\t\t<dialog>\n\t\t\t\t<div class="head">\n\t\t\t\t\t<div class="rect1"></div>\n\t\t\t\t\t<div class="rect2"></div>\n\t\t\t\t\t<div class="rect3"></div>\n\t\t\t\t\t<ng-sphere class="icon" end-fill="#666" size="8"></ng-sphere>\n\t\t\t\t\t<span class="title">${n}</span>\n\t\t\t\t\t<span class="sub-title"></span>\n\t\t\t\t\t<div class="buttons">\n\t\t\t\t\t\t<ng-sphere class="apply" start-fill="#cc6" end-fill="#660" size="16" title="apply"></ng-sphere>\n\t\t\t\t\t\t<ng-sphere class="reset" start-fill="#99f" end-fill="#00f" size="16" title="reset"></ng-sphere>\n\t\t\t\t\t\t<ng-sphere class="close" start-fill="#f99" end-fill="#f00" size="16" title="close"></ng-sphere>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class="contents">\n\t\t\t\t\t<div class="left">\n\t\t\t\t\t\t<span>가나다라마바사아자차카타파하가나다라마바사아자차카타파하가나다라마바사아자차카타파하가나다라마바사아자차카타파하가나다라마바사아자차카타파하가나다라마바사아자차카타파하가나다라마바사아자차카타파하가나다라마바사아자차카타파하</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="body">\n\t\t\t\t\t\t${t}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="close2">\n\t\t\t\t\t\t<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">\n\t\t\t\t\t\t\t<path d="M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708"/>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</dialog>\n\t\t`,_(this,e,this.querySelector("dialog")),R(this,i).call(this)}closeWithAnimation(t){R(this,e).classList.add("out"),setTimeout(()=>{R(this,e).close(),this.dispatchEvent(new CustomEvent("closed",{detail:t})),this.remove()},300)}}n=new WeakMap,e=new WeakMap,i=new WeakMap,o=new WeakMap,s=new WeakMap;class B extends HTMLElement{constructor(){super(),this.attachShadow({mode:"open"})}static async open(t,n,e,i,o){var s,r,a;const l=t.tagName.toLowerCase(),c={"true-text":"확인","false-text":"취소",class:"classic",animation:"fade",...(null==(a=null==(r=null==(s=window.nine)?void 0:s.config)?void 0:r.ux)?void 0:a[l.replace("nine-","").replace("-popup","")])||{},...i};document.querySelectorAll(l).forEach(t=>t.remove());const d=document.createElement(l);c.class&&d.classList.add(c.class),c.animation&&d.classList.add(c.animation),document.body.appendChild(d),o(d,n,c);const h=d.shadowRoot.querySelector("nine-dialog");return e&&h.setAttribute("subject",e),new Promise(t=>{h.addEventListener("closed",n=>t(n.detail)),d.setupEvents(t,h),h.showModal()})}}customElements.get("nine-dialog")||customElements.define("nine-dialog",T);const A=class extends B{constructor(){super()}render(t,n){this.shadowRoot.innerHTML=`\n <nine-dialog>\n <div class="msg">${t.replace(/\n/g,"<br/>")}</div>\n <div class="buttons-confirm">\n <button class="cancel">${n["false-text"]}</button>\n <button class="ok">${n["true-text"]}</button>\n </div>\n </nine-dialog>`}setupEvents(t,n){this.shadowRoot.querySelector(".ok").onclick=()=>n.closeWithAnimation(!0)}};L(A,"tagName","nine-confirm-popup"),L(A,"confirm",(t,n,e)=>B.open(A,t,n,e,(t,n,e)=>t.render(n,e)));let W=A;const z=class extends B{constructor(){super()}render(t,n){this.shadowRoot.innerHTML=`\n <nine-dialog>\n <div class="msg">${t.replace(/\n/g,"<br/>")}</div>\n <div class="buttons-confirm">\n <button class="cancel">확인</button>\n </div>\n </nine-dialog>`}setupEvents(t,n){}};L(z,"tagName","nine-alert-popup"),L(z,"alert",(t,n,e)=>B.open(z,t,n,e,(t,n,e)=>t.render(n,e)));let Y=z;customElements.get("nine-confirm-popup")||customElements.define("nine-confirm-popup",W),customElements.get("nine-alert-popup")||customElements.define("nine-alert-popup",Y);const N=class extends B{constructor(){super()}render(t,n){trace.log(this),trace.log(this.shadowRoot),this.shadowRoot.innerHTML=`\n\t\t\t<style>\n\t\t\t\tdialog {\n\t\t\t\t\theight: 300px !important;\n\t\t\t\t}\n\t\t\t\t.msg {\n\t\t\t\t\theight: unset !important;\n\t\t\t\t}\n\t\t\t</style>\n\t\t\t\n <nine-dialog>\n <div class="msg">${t.replace(/\n/g,"<br/>")}</div>\n <div class="input-area">\n <textarea placeholder="내용을 입력하세요..."></textarea>\n </div>\n <div class="buttons-confirm">\n <button class="cancel">${n["false-text"]}</button>\n <button class="ok">${n["true-text"]}</button>\n </div>\n </nine-dialog>`}setupEvents(t,n){const e=this.shadowRoot.querySelector("textarea");this.shadowRoot.querySelector(".ok").onclick=()=>n.closeWithAnimation(e.value),requestAnimationFrame(()=>e.focus())}};L(N,"tagName","nine-prompt-popup"),L(N,"prompt",(t,n,e)=>B.open(N,t,n,e,(t,n,e)=>t.render(n,e)));let P=N;function H(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}customElements.get("nine-prompt-popup")||customElements.define("nine-prompt-popup",P);var X,j={exports:{}};var I=(X||(X=1,j.exports=function(){var t=1e3,n=6e4,e=36e5,i="millisecond",o="second",s="minute",r="hour",a="day",l="week",c="month",d="quarter",h="year",u="date",p="Invalid Date",f=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,g=/\[([^\]]+)]|YYYY|YY|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,m={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:function(t){var n=["th","st","nd","rd"],e=t%100;return"["+t+(n[(e-20)%10]||n[e]||n[0])+"]"}},v=function(t,n,e){var i=String(t);return!i||i.length>=n?t:""+Array(n+1-i.length).join(e)+t},w={s:v,z:function(t){var n=-t.utcOffset(),e=Math.abs(n),i=Math.floor(e/60),o=e%60;return(n<=0?"+":"-")+v(i,2,"0")+":"+v(o,2,"0")},m:function t(n,e){if(n.date()<e.date())return-t(e,n);var i=12*(e.year()-n.year())+(e.month()-n.month()),o=n.clone().add(i,c),s=e-o<0,r=n.clone().add(i+(s?-1:1),c);return+(-(i+(e-o)/(s?o-r:r-o))||0)},a:function(t){return t<0?Math.ceil(t)||0:Math.floor(t)},p:function(t){return{M:c,y:h,w:l,d:a,D:u,h:r,m:s,s:o,ms:i,Q:d}[t]||String(t||"").toLowerCase().replace(/s$/,"")},u:function(t){return void 0===t}},b="en",y={};y[b]=m;var x="$isDayjsObject",$=function(t){return t instanceof S||!(!t||!t[x])},k=function t(n,e,i){var o;if(!n)return b;if("string"==typeof n){var s=n.toLowerCase();y[s]&&(o=s),e&&(y[s]=e,o=s);var r=n.split("-");if(!o&&r.length>1)return t(r[0])}else{var a=n.name;y[a]=n,o=a}return!i&&o&&(b=o),o||!i&&b},M=function(t,n){if($(t))return t.clone();var e="object"==typeof n?n:{};return e.date=t,e.args=arguments,new S(e)},E=w;E.l=k,E.i=$,E.w=function(t,n){return M(t,{locale:n.$L,utc:n.$u,x:n.$x,$offset:n.$offset})};var S=function(){function m(t){this.$L=k(t.locale,null,!0),this.parse(t),this.$x=this.$x||t.x||{},this[x]=!0}var v=m.prototype;return v.parse=function(t){this.$d=function(t){var n=t.date,e=t.utc;if(null===n)return new Date(NaN);if(E.u(n))return new Date;if(n instanceof Date)return new Date(n);if("string"==typeof n&&!/Z$/i.test(n)){var i=n.match(f);if(i){var o=i[2]-1||0,s=(i[7]||"0").substring(0,3);return e?new Date(Date.UTC(i[1],o,i[3]||1,i[4]||0,i[5]||0,i[6]||0,s)):new Date(i[1],o,i[3]||1,i[4]||0,i[5]||0,i[6]||0,s)}}return new Date(n)}(t),this.init()},v.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},v.$utils=function(){return E},v.isValid=function(){return!(this.$d.toString()===p)},v.isSame=function(t,n){var e=M(t);return this.startOf(n)<=e&&e<=this.endOf(n)},v.isAfter=function(t,n){return M(t)<this.startOf(n)},v.isBefore=function(t,n){return this.endOf(n)<M(t)},v.$g=function(t,n,e){return E.u(t)?this[n]:this.set(e,t)},v.unix=function(){return Math.floor(this.valueOf()/1e3)},v.valueOf=function(){return this.$d.getTime()},v.startOf=function(t,n){var e=this,i=!!E.u(n)||n,d=E.p(t),p=function(t,n){var o=E.w(e.$u?Date.UTC(e.$y,n,t):new Date(e.$y,n,t),e);return i?o:o.endOf(a)},f=function(t,n){return E.w(e.toDate()[t].apply(e.toDate("s"),(i?[0,0,0,0]:[23,59,59,999]).slice(n)),e)},g=this.$W,m=this.$M,v=this.$D,w="set"+(this.$u?"UTC":"");switch(d){case h:return i?p(1,0):p(31,11);case c:return i?p(1,m):p(0,m+1);case l:var b=this.$locale().weekStart||0,y=(g<b?g+7:g)-b;return p(i?v-y:v+(6-y),m);case a:case u:return f(w+"Hours",0);case r:return f(w+"Minutes",1);case s:return f(w+"Seconds",2);case o:return f(w+"Milliseconds",3);default:return this.clone()}},v.endOf=function(t){return this.startOf(t,!1)},v.$set=function(t,n){var e,l=E.p(t),d="set"+(this.$u?"UTC":""),p=(e={},e[a]=d+"Date",e[u]=d+"Date",e[c]=d+"Month",e[h]=d+"FullYear",e[r]=d+"Hours",e[s]=d+"Minutes",e[o]=d+"Seconds",e[i]=d+"Milliseconds",e)[l],f=l===a?this.$D+(n-this.$W):n;if(l===c||l===h){var g=this.clone().set(u,1);g.$d[p](f),g.init(),this.$d=g.set(u,Math.min(this.$D,g.daysInMonth())).$d}else p&&this.$d[p](f);return this.init(),this},v.set=function(t,n){return this.clone().$set(t,n)},v.get=function(t){return this[E.p(t)]()},v.add=function(i,d){var u,p=this;i=Number(i);var f=E.p(d),g=function(t){var n=M(p);return E.w(n.date(n.date()+Math.round(t*i)),p)};if(f===c)return this.set(c,this.$M+i);if(f===h)return this.set(h,this.$y+i);if(f===a)return g(1);if(f===l)return g(7);var m=(u={},u[s]=n,u[r]=e,u[o]=t,u)[f]||1,v=this.$d.getTime()+i*m;return E.w(v,this)},v.subtract=function(t,n){return this.add(-1*t,n)},v.format=function(t){var n=this,e=this.$locale();if(!this.isValid())return e.invalidDate||p;var i=t||"YYYY-MM-DDTHH:mm:ssZ",o=E.z(this),s=this.$H,r=this.$m,a=this.$M,l=e.weekdays,c=e.months,d=e.meridiem,h=function(t,e,o,s){return t&&(t[e]||t(n,i))||o[e].slice(0,s)},u=function(t){return E.s(s%12||12,t,"0")},f=d||function(t,n,e){var i=t<12?"AM":"PM";return e?i.toLowerCase():i};return i.replace(g,function(t,i){return i||function(t){switch(t){case"YY":return String(n.$y).slice(-2);case"YYYY":return E.s(n.$y,4,"0");case"M":return a+1;case"MM":return E.s(a+1,2,"0");case"MMM":return h(e.monthsShort,a,c,3);case"MMMM":return h(c,a);case"D":return n.$D;case"DD":return E.s(n.$D,2,"0");case"d":return String(n.$W);case"dd":return h(e.weekdaysMin,n.$W,l,2);case"ddd":return h(e.weekdaysShort,n.$W,l,3);case"dddd":return l[n.$W];case"H":return String(s);case"HH":return E.s(s,2,"0");case"h":return u(1);case"hh":return u(2);case"a":return f(s,r,!0);case"A":return f(s,r,!1);case"m":return String(r);case"mm":return E.s(r,2,"0");case"s":return String(n.$s);case"ss":return E.s(n.$s,2,"0");case"SSS":return E.s(n.$ms,3,"0");case"Z":return o}return null}(t)||o.replace(":","")})},v.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},v.diff=function(i,u,p){var f,g=this,m=E.p(u),v=M(i),w=(v.utcOffset()-this.utcOffset())*n,b=this-v,y=function(){return E.m(g,v)};switch(m){case h:f=y()/12;break;case c:f=y();break;case d:f=y()/3;break;case l:f=(b-w)/6048e5;break;case a:f=(b-w)/864e5;break;case r:f=b/e;break;case s:f=b/n;break;case o:f=b/t;break;default:f=b}return p?f:E.a(f)},v.daysInMonth=function(){return this.endOf(c).$D},v.$locale=function(){return y[this.$L]},v.locale=function(t,n){if(!t)return this.$L;var e=this.clone(),i=k(t,n,!0);return i&&(e.$L=i),e},v.clone=function(){return E.w(this.$d,this)},v.toDate=function(){return new Date(this.valueOf())},v.toJSON=function(){return this.isValid()?this.toISOString():null},v.toISOString=function(){return this.$d.toISOString()},v.toString=function(){return this.$d.toUTCString()},m}(),L=S.prototype;return M.prototype=L,[["$ms",i],["$s",o],["$m",s],["$H",r],["$W",a],["$M",c],["$y",h],["$D",u]].forEach(function(t){L[t[1]]=function(n){return this.$g(n,t[0],t[1])}}),M.extend=function(t,n){return t.$i||(t(n,S,M),t.$i=!0),M},M.locale=k,M.isDayjs=$,M.unix=function(t){return M(1e3*t)},M.en=y[b],M.Ls=y,M.p={},M}()),j.exports);const F=H(I);class q{constructor(){D(this,r),L(this,"formatDate",(t,n)=>F(t).format(n))}alert(t,n="Alert"){return O(this,r,a).call(this,"alert",t,n,"classic")}confirm(t,n="Confirm"){return O(this,r,a).call(this,"confirm",t,n,"classic")}prompt(t,n="Prompt"){return O(this,r,a).call(this,"prompt",t,n,"classic")}}r=new WeakSet,a=function(t,n,e,i){const o={class:i,animation:"fade"};let s=!1;const r={alert:Y,confirm:W,prompt:P}[t],a={rgb:()=>(o.class="rgb",a),classic:()=>(o.class="classic",a),shake:()=>(o.animation="shake",a),run:()=>(o.animation="roadRunner",a),zoom:()=>(o.animation="zoom",a),then:(i,a)=>(s=!0,r[t](n,e,o).then(i,a))};return Promise.resolve().then(()=>{s||(s=!0,r[t](n,e,o))}),a},L(q,"cssPath","");const U=new Set,G={ux:{nativeOverride:!1,theme:"light"},board:{readOnly:!1},cssPath:"",debug:!1};"undefined"==typeof window||window.__NINE_GLOBAL_CONFIG__||(window.__NINE_GLOBAL_CONFIG__=G);const J="undefined"!=typeof window?window.__NINE_GLOBAL_CONFIG__:G,K=t=>(U.add(t),t("all",J),()=>U.delete(t)),V=new Proxy(J,{set:(t,n,e)=>(t[n]=e,U.forEach(e=>e(n,t)),!0),get:(t,n)=>t[n]}),Z={config:V,get cssPath(){return this.config.cssPath||""},setup(t={}){Object.entries(t).forEach(([t,n])=>{"object"!=typeof n||null===n||Array.isArray(n)?this.config[t]=n:this.config[t]={...this.config[t],...n}}),"undefined"!=typeof window&&(window.nine=window.nine||this)}};let Q=(p=class{constructor(t=null,n="green"){D(this,h),D(this,l),D(this,c),D(this,d,!0),_(this,l,t),_(this,c,n),O(this,h,u).call(this)}initBAK(t,n="green"){_(this,l,t),_(this,c,n)}init(t,n="green"){return _(this,l,t),_(this,c,n),this}get log(){const t=`color: ${R(this,c)}; font-weight: bold;`;return R(this,l)?console.log.bind(console,`%c[${R(this,l)}]`,t):console.log.bind(console)}get warn(){return R(this,d)?R(this,l)?console.warn.bind(console,`%c[${R(this,l)}]`,"color: cyan; font-weight: bold;"):console.warn.bind(console):()=>{}}get error(){return R(this,l)?console.error.bind(console,`%c[${R(this,l)}]`,"color: red; font-weight: bold;"):console.error.bind(console)}enable(){_(this,d,!0)}disable(){_(this,d,!1)}},l=new WeakMap,c=new WeakMap,d=new WeakMap,h=new WeakSet,u=function(){if("undefined"==typeof window)return;"localhost"===window.location.hostname||"127.0.0.1"===window.location.hostname||window.location.hostname.startsWith("192.168.")?this.enable():(this.disable(),console.log(`%c[${R(this,l)||"Trace"}]%c 운영 모드: 로그 비활성화. %ctrace.enable()%c 로 활성화 가능`,"color: #4CAF50; font-weight: bold;","","background: #333; color: yellow; padding: 2px 5px;",""))},p);const tt=new Q;"undefined"!=typeof window&&(window.trace=tt);f=new WeakMap,g=new WeakMap,m=new WeakMap,v=new WeakSet,w=function(){if(0===R(this,g).length)return;const t=R(this,g).splice(0,R(this,g).length),n=new Set;t.forEach(t=>{const e=`${t.func.name}_${JSON.stringify(t.args)}`;n.has(e)||(t.func(...t.args),n.add(e))}),_(this,f,null)};class nt extends tt.constructor{constructor(){super(),this.init("nine-util","green")}}const et=new nt;class it{static show(){let t=document.getElementById("global-loading-overlay");if(!t&&(t=document.createElement("div"),t.id="global-loading-overlay",t.style.cssText="\n position: fixed; inset: 0; z-index: 9999;\n background: rgba(0, 0, 0, 0.4); display: flex; \n justify-content: center; align-items: center;\n backdrop-filter: blur(2px);\n ",t.innerHTML='<div class="loading-spinner"></div>',document.body.appendChild(t),!document.getElementById("nine-util-style"))){const t=document.createElement("style");t.id="nine-util-style",t.innerHTML="\n .loading-spinner {\n width: 48px; height: 48px;\n border: 5px solid rgba(255, 255, 255, 0.3);\n border-top-color: white; border-radius: 50%;\n animation: nine-spin 1s linear infinite;\n }\n @keyframes nine-spin { to { transform: rotate(360deg); } }\n ",document.head.appendChild(t)}t.style.display="flex"}static hide(){const t=document.getElementById("global-loading-overlay");t&&(t.style.display="none")}}const ot=class{};b=new WeakMap,L(ot,"BASE_URL",window.__API_BASE_URL__||""),D(ot,b,(t,n,e={},i=!0)=>{const o=n.startsWith("http")?n:`${ot.BASE_URL}${n}`;i&&it.show();const s={};e instanceof FormData||(s["Content-Type"]="application/json");const r={method:t,headers:s};let a=o;return"GET"===t?a+=`?${new URLSearchParams(e)}`:r.body=e instanceof FormData?e:JSON.stringify(e),fetch(a,r).then(async t=>{if(!t.ok){const n=await t.text();throw new Error(`API 오류 (${t.status}): ${n}`)}return t.json()}).catch(n=>{throw et.error(`[IdeFetch.${t.toLowerCase()}] ${o} 실패:`,n),n}).finally(()=>{i&&it.hide()})}),L(ot,"get",(t,n={},e=!0)=>{var i;return R(i=ot,b).call(i,"GET",t,n,e)}),L(ot,"post",(t,n={},e=!0)=>{var i;return R(i=ot,b).call(i,"POST",t,n,e)}),L(ot,"postMultipart",async(t,n=[],e={})=>{const{fileKey:i="fileContents",filePartName:o="files",jsonPartName:s="dataList",chunkSize:r=10}=e;it.show();let a=0,l=null;return(async()=>{for(let e=0;e<n.length;e+=r){const c=new FormData,d=n.slice(e,e+r),h=[];d.forEach(t=>{const{[i]:n,_fileObj:e,...s}=t;h.push(s),n instanceof File&&c.append(o,n)});const u=new Blob([JSON.stringify(h)],{type:"application/json"});if(c.append(s,u),l=await ot.post(t,c,!1),!l||!l.success&&"OK"!==l.status)throw new Error(`청크 전송 실패: ${e}번째 섹션`);a+=d.length}return{...l,success:!0,totalCount:a}})().catch(t=>{throw et.error("[postChunk] Error:",t),t}).finally(()=>{it.hide()})});let st=ot;const rt=st;class at extends HTMLElement{constructor(){super(),D(this,y),D(this,x,t=>{const n=t.previousElementSibling,e=t.nextElementSibling;if(!n||!e)return void _(this,y,this.classList.contains("h")?"h":"v");const i=n.getBoundingClientRect(),o=e.getBoundingClientRect();this.classList.contains("h")?_(this,y,"h"):this.classList.contains("v")?_(this,y,"v"):_(this,y,Math.abs(i.top-o.top)<5?"h":"v")}),D(this,$,t=>{t.preventDefault(),t.stopPropagation();const n=this.getBoundingClientRect(),e="h"===R(this,y),i=e?t.clientX-n.left:t.clientY-n.top,o=document.createElement("div");o.className=`nx-splitter-drag-bar-${R(this,y)}`,Object.assign(o.style,{position:"absolute",zIndex:"999",background:"#666",opacity:"0.6",pointerEvents:"none"});const s=this.getRootNode({composed:!0}),r=s instanceof ShadowRoot?s.host:this.parentElement,a=this.previousElementSibling,l=this.nextElementSibling;if(!r||!a||!l)return void et.warn("Spliter's parent or siblings not found.");(r.shadowRoot||r).appendChild(o);const c=o.offsetParent.getBoundingClientRect(),d=a.getBoundingClientRect(),h=l.getBoundingClientRect(),u=(e?n.left-c.left:n.top-c.top)+i;e?(o.style.top="0",o.style.left=`${u}px`,o.style.width="2px",o.style.height="100%"):(o.style.left="0",o.style.top=`${u}px`,o.style.height="2px",o.style.width="100%"),o.style.mixBlendMode="difference",o.style.zIndex="99999";const p=e?d.left-c.left:d.top-c.top,f=e?h.right-c.left-n.width:h.bottom-c.top-n.height,g=t=>{const n=e?t.clientX:t.clientY,i=e?n-c.left:n-c.top,s=Math.max(p,Math.min(i,f));e?o.style.left=`${s}px`:o.style.top=`${s}px`},m=()=>{window.removeEventListener("mousemove",g),window.removeEventListener("mouseup",m),o.remove();const t=Array.from(r.children),n=t.filter(t=>"nx-splitter"!==t.tagName.toLowerCase()),i=window.getComputedStyle(r),s=e?i.getPropertyValue("column-gap"):i.getPropertyValue("row-gap"),c=parseFloat(s)||0,d=(t.length>1?t.length-1:0)*c,h=(e?parseFloat(o.style.left):parseFloat(o.style.top))-u,p=e?a.getBoundingClientRect().width:a.getBoundingClientRect().height,f=e?l.getBoundingClientRect().width:l.getBoundingClientRect().height;let v=p+h,w=f-h;v<0&&(w+=v,v=0),w<0&&(v+=w,w=0);const b=n.map(t=>e?t.getBoundingClientRect().width:t.getBoundingClientRect().height),y=t.reduce((t,n)=>"nx-splitter"===n.tagName.toLowerCase()?t+(e?n.getBoundingClientRect().width:n.getBoundingClientRect().height):t,0),x=(e?r.getBoundingClientRect().width:r.getBoundingClientRect().height)-y-d;let $=0;n.forEach((t,n)=>{let e;e=t===a?v:t===l?w:b[n];const i=e/x;et.log(t),t.classList.contains("sidebar")?t.style.flex=`0 0 ${e}px`:t.style.flex=`${i} ${i} 0`,$+=i}),et.log(`dragOffset: ${h}`),et.log(`Calculated FlexSum: ${$}`)};window.addEventListener("mousemove",g),window.addEventListener("mouseup",m)}),D(this,k,()=>{R(this,x).call(this,this),this.classList.add(R(this,y));const t=this.innerHTML.trim(),n=""===t?'<div class="grip"></div>':`<div class="grip"></div><div class="inner-container">${t}</div><div class="grip"></div>`;this.innerHTML="";const e=document.createElement("template");e.innerHTML=`\n\t\t\t<style>\n\t\t\t\t@import "https://cdn.jsdelivr.net/npm/@nine-lab/nine-util@0.9.147/dist/css/nine-util.css";\n\t\t\t\t${this.cssPath?`@import "${this.cssPath}";`:""}\n\t\t\t</style>\n\t\t\t${n}\n `,this.shadowRoot.appendChild(e.content.cloneNode(!0)),this.shadowRoot.querySelectorAll(".grip").forEach(t=>{t.addEventListener("mousedown",t=>R(this,$).call(this,t))}),R(this,M).call(this),window.addEventListener("resize",()=>R(this,M).call(this))}),D(this,M,()=>{const t="h"===R(this,y),n=this.parentElement,e=Array.from(n.children).filter(t=>"nx-splitter"!==t.tagName.toLowerCase());if(e.length<2)return;const i=n.getBoundingClientRect(),o=e.reduce((n,e)=>n+(t?e.getBoundingClientRect().width:e.getBoundingClientRect().height),0),s=t?i.width:i.height;e.forEach(n=>{const e=t?n.getBoundingClientRect().width:n.getBoundingClientRect().height,i=s*(e/o)/s;n.style.flex=`${i} ${i} 0`})}),this.attachShadow({mode:"open"})}connectedCallback(){R(this,k).call(this)}get cssPath(){return this.getAttribute("css-path")||q.cssPath}}y=new WeakMap,x=new WeakMap,$=new WeakMap,k=new WeakMap,M=new WeakMap,customElements.get("nine-splitter")||customElements.define("nine-splitter",at);const lt=new q;Z.alert=lt.alert.bind(lt),Z.confirm=lt.confirm.bind(lt),Z.prompt=lt.prompt.bind(lt),Z.formatDate=lt.formatDate.bind(lt),Z.safe=async t=>{try{return[await t,null]}catch(n){return[null,n]}},Z.api=rt,Z.trace=tt,Z.subscribeConfig=K,Z.config=V||{},"undefined"!=typeof window&&(window.nine=Z),t.Fetch=st,t.NineUtil=q,t.TaskDebouncer=class{constructor(t=50){D(this,v),D(this,f,null),D(this,g,[]),D(this,m),_(this,m,t)}exec(t,...n){R(this,g).push({func:t,args:n}),R(this,f)&&clearTimeout(R(this,f)),_(this,f,setTimeout(()=>O(this,v,w).call(this),R(this,m)))}execWithKey(t,n,...e){_(this,g,R(this,g).filter(n=>n.key!==t)),R(this,g).push({key:t,func:n,args:e}),R(this,f)&&clearTimeout(R(this,f)),_(this,f,setTimeout(()=>O(this,v,w).call(this),R(this,m)))}},t.Trace=Q,t.api=rt,t.config=V,t.loading=it,t.nine=Z,t.nineAlertPopup=Y,t.nineConfirmPopup=W,t.nineDialog=T,t.ninePromptPopup=P,t.subscribeConfig=K,t.trace=tt,Object.defineProperty(t,Symbol.toStringTag,{value:"Module"})});
1
+ !function(t,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((t="undefined"!=typeof globalThis?globalThis:t||self)["nine-util"]={})}(this,function(t){"use strict";var n,e,i,o,s,r,a,l,c,d,h,u,p,g,f,m,v,w,y,b,x,$,k,M,E=Object.defineProperty,S=t=>{throw TypeError(t)},L=(t,n,e)=>((t,n,e)=>n in t?E(t,n,{enumerable:!0,configurable:!0,writable:!0,value:e}):t[n]=e)(t,"symbol"!=typeof n?n+"":n,e),C=(t,n,e)=>n.has(t)||S("Cannot "+e),R=(t,n,e)=>(C(t,n,"read from private field"),e?e.call(t):n.get(t)),_=(t,n,e)=>n.has(t)?S("Cannot add the same private member more than once"):n instanceof WeakSet?n.add(t):n.set(t,e),D=(t,n,e,i)=>(C(t,n,"write to private field"),i?i.call(t,e):n.set(t,e),e),O=(t,n,e)=>(C(t,n,"access private method"),e);class T extends HTMLElement{constructor(){super(),_(this,n),_(this,e),L(this,"showModal",()=>{R(this,e).showModal()}),L(this,"close",()=>{R(this,e).close(),this.remove()}),_(this,i,()=>{const t=this.querySelector(".head");t&&(t.addEventListener("mousedown",R(this,o)),t.addEventListener("touchstart",R(this,s))),this.querySelectorAll(".close, .close2, .cancel").forEach(t=>{t.onclick=()=>this.closeWithAnimation(null)}),this.querySelectorAll(".ok").forEach(t=>{})}),_(this,o,t=>{if(t.target.closest("buttons"))return;if(0!==t.button||t.altKey||t.ctrlKey||t.shiftKey)return;const i=R(this,e).getBoundingClientRect();D(this,n,{x:t.clientX-i.left,y:t.clientY-i.top});const o=t=>{R(this,e).style.position="fixed",R(this,e).style.margin="0",R(this,e).style.left=t.clientX-R(this,n).x+"px",R(this,e).style.top=t.clientY-R(this,n).y+"px"},s=()=>{document.removeEventListener("mousemove",o),document.removeEventListener("mouseup",s)};document.addEventListener("mousemove",o),document.addEventListener("mouseup",s)}),_(this,s,t=>{if(t.target.closest("buttons"))return;const i=R(this,e).getBoundingClientRect(),o=t.changedTouches[0];D(this,n,{x:o.pageX-i.left,y:o.pageY-i.top});const s=t=>{const i=t.changedTouches[0];R(this,e).style.position="fixed",R(this,e).style.margin="0",R(this,e).style.left=i.pageX-R(this,n).x+"px",R(this,e).style.top=i.pageY-R(this,n).y+"px"},r=()=>{document.removeEventListener("touchmove",s),document.removeEventListener("touchend",r)};document.addEventListener("touchmove",s),document.addEventListener("touchend",r)})}connectedCallback(){const t=this.innerHTML,n=this.getAttribute("subject")||"Details";this.innerHTML=`\n\t\t\t<style>\n\tdialog::backdrop {\n\t\tbackground: rgba(0, 0, 0, 0.3);\n\t}\n\t\n\tdialog:modal {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tpadding: 0;\n\t\toverflow: hidden;\n\t\tborder: 1px solid darkgreen;\n\t\toutline: none;\n\t\tresize: both;\n\t\tbox-shadow: 0 0 4px 0 darkgreen;\n width: 500px;\n height: fit-content;\n min-width: 330px;\n min-height: 60px;\n max-height: 100%;\n }\n \n \n \n \n\tdiv.head .rect1, div.head .rect2, div.head .rect3 {\n\t\tdisplay: none;\n\t\twidth: 50px;\n\t\theight: 100%;\n\t}\n\tdiv.head .rect1 {\n\t\tbackground-color: red;\n\t}\n\tdiv.head .rect2 {\n\t\tbackground-color: darkgreen;\n\t}\n\tdiv.head .rect3 {\n\t\tbackground-color: olive;\n\t}\n\t\n\tdiv.head {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\t--height: 30px;\n\t\tbackground-color: darkgreen;\n\t\tpadding: 4px;\n\t\tcursor: move;\n\t}\n\tdiv.head:hover {\n\t\tfilter: brightness(110%);\n\t}\n\t\n\tdiv.head span {\n\t\tfont-size: 12px;\n\t\tposition: relative;\n\t}\n\t\n\tdiv.head span.title {\n\t\tcolor: #ddd;\n\t\tmargin-left: 4px;\n\t\tfont-weight: bold;\n\t}\n\t\n\tdiv.head span.sub-title {\n\t\tcolor: #ccc;\n\t\tmargin-left: 8px;\n\t\tfont-style: italic;\n\t}\n\t\n\tdiv.head form {\n\t\tmargin: 0;\n\t}\n\tdiv.head button {\n\t\tmargin-right: 4px;\n\t\tbackground-color: transparent;\n\t\tborder: none;\n\t\tcolor: #ccc;\n\t\tfont-size: x-small;\n\t}\n\tdiv.head button:hover {\n\t\tcursor: pointer;\n\t}\n\t\n\tdiv.contents {\n\t\tdisplay: flex;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\toverflow: hidden;\n\t}\n\tdiv.left {\n\t\tposition: relative;\n\t\twidth: 16px;\n\t\theight: 100%;\n\t\tbackground-color: #ddd;\n\t\tdisplay: none;\n\t}\n\t\n\tdiv.left span {\n\t\twriting-mode: vertical-rl;\n\t\t-moz-user-select: none;\n\t\t-webkit-user-select: none;\n\t\t-ms-user-select: none;\n\t\tuser-select: none;\n\t\tcolor: #ccc;\n\t\tfont-weight: 700;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tmargin-left: 3px;\n\t\tmargin-top: 3px;\n\t}\n\tdiv.close2 {\n\t\tdisplay: none;\n\t\tposition: absolute;\n\t\tright: 0;\n\t\ttop: 3px;\n\t\tcursor: pointer;\n\t\tcolor: #666;\n\t}\n\tdiv.close2 svg:hover {\n\t\tcolor: #999;\n\t}\n\t\n\tdiv.body {\n\t\tdisplay: flex;\n\t\twidth: 100%;\n\t\theight: unset;\n\t\t--border: 3px solid #999;\n\t\t--border-top: none;\n\t\toverflow-x: hidden;\n\t\toverflow-y: auto;\n\t\tpadding: 10px;\n\t\tgap: 8px;\n\t\tflex-direction: column;\n\t}\n\t\n\t\n\t\n\t\n\tng-sphere.icon {\n\t\tmargin-left: 8px;\n\t}\n\t\n\t.buttons {\n\t\tdisplay: flex;\n\t\tposition: absolute;\n\t\tright: 4px;\n\t}\n\t\n\tng-sphere {\n\t\tposition: relative;\n\t\t--width: 16px;\n\t\t--height: 16px;\n\t\tcursor: pointer;\n\t\tmargin-right: 4px;\n\t\tdisplay: flex;\n\t}\n\tng-sphere:hover {\n\t\tfilter: brightness(90%);\n\t}\n\tng-sphere:active {\n\t\tfilter: brightness(80%);\n\t}\n\t\n\tng-sphere:hover::after {\n\t\tcontent: "";\n\t\tposition: absolute;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tbackground-repeat: no-repeat;\n\t\tbackground-position: center;\n\t}\n\tng-sphere.apply:hover::after {\n\t\tbackground-size: 14px 14px;\n\t\tbackground-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg"><polyline points="2.5,7 6,10 11,3" style="fill:none;stroke:white;stroke-width:2px;" /></svg>');\n\t}\n\t\n\tng-sphere.reset:hover::after {\n\t\tbackground-size: 12px 12px;\n\t\tbackground-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" style="fill:none;stroke:white;stroke-width:2px;" focusable="false" aria-hidden="true"><path d="M10 5h5V0"></path><path d="M15 8a6.957 6.957 0 0 1-7 7 6.957 6.957 0 0 1-7-7 6.957 6.957 0 0 1 7-7 6.87 6.87 0 0 1 6.3 4"></path></svg>');\n\t}\n\t\n\tng-sphere.close:hover::after {\n\t\tbackground-size: 12px 12px;\n\t\tbackground-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" style="fill:none;stroke:white;stroke-width:2px;" focusable="false" aria-hidden="true" viewBox="0 0 16 16"><path d="M2 2l12 12M14 2L2 14"></path></svg>');\n\t}\n\t\n\t\n\tbutton {\n cursor: pointer;\n }\n \n .input-area {\n position: relative;\n height: 100%;\n --display: flex;\n textarea {\n width: 100%;\n height: 100%;\n min-height: 100px;\n padding: 8px;\n box-sizing: border-box;\n resize: none;\n border-radius: 2px;\n border-color: #ccc;\n }\n textarea:focus {\n border-color: green;\n outline: none; /* 브라우저 기본 파란색 테두리 제거 */\n }\n }\n \n .buttons-confirm {\n position: absolute;\n display: flex;\n justify-content: flex-end;\n bottom: 8px;\n right: 8px;\n }\n \n \n .buttons-confirm button {\n height: 32px;\n margin-right: 8px;\n border: none;\n outline: none;\n width: 60px;\n -moz-user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n }\n .buttons-confirm button:hover {\n filter: brightness(90%);\n }\n .buttons-confirm button:active {\n color: #ccc;\n }\n \n button.ok {\n --display: none;\n background-color: darkgreen;\n color: white;\n }\n button.cancel {\n color: white;\n background-color: #6c757d;\n }\n \n \n \n div.msg {\n position: relative;\n height: 100%;\n font-size: 14px;\n color: #333;\n padding-bottom: 48px;\n }\n \n .reset, .apply {\n display: none;\n }\n \n \n \n :host(.classic) dialog:modal {\n border: 1px solid #007bff;\n box-shadow: 0 0 4px 0 #007bff;\n }\n \n :host(.classic) div.head {\n background-color: #007bff;\n }\n :host(.classic) div.head:hover {\n filter: brightness(110%);\n }\n \n :host(.classic) div.head span {\n font-size: 12px;\n }\n \n :host(.classic) div.head span.title {\n color: #ddd;\n margin-left: 4px;\n font-weight: bold;\n }\n \n :host(.classic) div.head span.sub-title {\n color: #ccc;\n margin-left: 8px;\n font-style: italic;\n }\n :host(.classic) div.head button {\n margin-right: 4px;\n background-color: transparent;\n border: none;\n color: #ccc;\n font-size: x-small;\n }\n \n \n \n \n :host(.rgb) dialog:modal {\n border: none;\n box-shadow: unset;\n border-top: none;\n }\n \n :host(.rgb) div.left {\n display: block;\n background-color: #ddd;\n }\n :host(.rgb) div.left span {\n color: #ccc;\n }\n :host(.rgb) div.close2 {\n display: block;\n color: #666;\n }\n :host(.rgb) div.close2 svg:hover {\n color: #999;\n }\n :host(.rgb) div.head {\n height: 4px;\n background-color: #999;\n padding: 0;\n }\n :host(.rgb) div.contents {\n height: calc(100% - 4px);\n }\n \n :host(.rgb) div.head ng-sphere,\n :host(.rgb) div.head span,\n :host(.rgb) div.head .buttons {\n display: none;\n }\n \n :host(.rgb) div.head .rect1,\n :host(.rgb) div.head .rect2,\n :host(.rgb) div.head .rect3 {\n display: flex;\n }\n \n \n :host(.rgb) div.head:hover {\n filter: unset;\n }\n \n \n /* --- Animation Core --- */\n:host {\n --nx-duration: 0.4s;\n --nx-timing: cubic-bezier(0.34, 1.56, 0.64, 1);\n}\n\n/* 🎯 수정: 애니메이션 클래스가 붙은 경우에만 초기 opacity를 0으로 설정 */\n:host(.fade) dialog,\n:host(.zoom) dialog,\n:host(.moveUp) dialog,\n:host(.moveDown) dialog,\n:host(.moveLeft) dialog,\n:host(.moveRight) dialog,\n:host(.roadRunner) dialog {\n opacity: 0;\n}\n\n/* shake는 애니메이션 내부에서 opacity를 다루므로 제외하거나 별도 처리 */\n:host(.shake) dialog { \n opacity: 1; \n}\n\n/* 1. Fade (서서히 나타남) */\n:host(.fade) dialog { animation: nx-fade-in var(--nx-duration) forwards; }\n@keyframes nx-fade-in { from { opacity: 0; } to { opacity: 1; } }\n\n/* 2. Zoom (커지며 나타남) */\n:host(.zoom) dialog { animation: nx-zoom-in var(--nx-duration) var(--nx-timing) forwards; }\n@keyframes nx-zoom-in { from { opacity: 0; transform: scale(0.5); } to { opacity: 1; transform: scale(1); } }\n\n/* 3. Slide (상하좌우) */\n:host(.moveUp) dialog { animation: nx-move-up var(--nx-duration) var(--nx-timing) forwards; }\n:host(.moveDown) dialog { animation: nx-move-down var(--nx-duration) var(--nx-timing) forwards; }\n:host(.moveLeft) dialog { animation: nx-move-left var(--nx-duration) var(--nx-timing) forwards; }\n:host(.moveRight) dialog { animation: nx-move-right var(--nx-duration) var(--nx-timing) forwards; }\n\n@keyframes nx-move-up { from { opacity: 0; transform: translateY(100px); } to { opacity: 1; transform: translateY(0); } }\n@keyframes nx-move-down { from { opacity: 0; transform: translateY(-100px); } to { opacity: 1; transform: translateY(0); } }\n@keyframes nx-move-left { from { opacity: 0; transform: translateX(100px); } to { opacity: 1; transform: translateX(0); } }\n@keyframes nx-move-right { from { opacity: 0; transform: translateX(-100px); } to { opacity: 1; transform: translateY(0); } }\n\n/* 4. Shake (상하좌우 격렬한 진동 - 에러 인지용) */\n:host(.shake) dialog { \n animation: nx-heavy-shake 0.5s cubic-bezier(.36,.07,.19,.97) both;\n opacity: 1; \n}\n\n@keyframes nx-heavy-shake {\n 10%, 90% { transform: translate3d(-1px, -2px, 0); }\n 20%, 80% { transform: translate3d(2px, 4px, 0); }\n 30%, 50%, 70% { transform: translate3d(-6px, -6px, 0); }\n 40%, 60% { transform: translate3d(6px, 6px, 0); }\n}\n\n/* 5. Road Runner (등장: 왼쪽에서 탄력 있게 / 퇴장: 움츠렸다가 광속 탈출) */\n:host(.roadRunner) dialog { \n animation: roadRunnerIn 0.5s cubic-bezier(0.175, 0.885, 0.32, 1.275) forwards; \n}\n\n@keyframes roadRunnerIn {\n 0% { transform: translateX(-1500px) skewX(30deg); opacity: 1; }\n 70% { transform: translateX(30px) skewX(-10deg); opacity: 1; }\n 100% { transform: translateX(0) skewX(0deg); opacity: 1; }\n}\n\n/* --- Out Animations (닫힐 때) --- */\ndialog.out { pointer-events: none; }\n\n/* Road Runner 퇴장: 슥 움츠렸다가(Anticipation) 쌩~! */\n:host(.roadRunner) dialog.out { \n animation: roadRunnerOut 0.5s cubic-bezier(0.6, -0.28, 0.735, 0.045) forwards; \n}\n\n@keyframes roadRunnerOut {\n 0% { \n transform: translateX(0) scale(1) skewX(0deg); \n opacity: 1; \n }\n 30% { \n /* 예비 동작: 뒤로 살짝 갔다가 움츠러들기 */\n transform: translateX(50px) scaleX(1.2) scaleY(0.8) skewX(-20deg); \n opacity: 1; \n }\n 100% { \n /* 발사: 길게 늘어나며 광속 탈출 */\n transform: translateX(2000px) scaleX(4) scaleY(0.3) skewX(50deg); \n opacity: 0; \n filter: blur(10px); /* 👈 잔상 느낌 추가 */\n }\n}\n\n/* 일반 퇴장 (기본) */\ndialog.out { animation: nx-fade-out 0.3s forwards; }\n@keyframes nx-fade-out { from { opacity: 1; transform: scale(1); } to { opacity: 0; transform: scale(0.9); } }\n</style>\n\t\t\n\t\t\t<dialog>\n\t\t\t\t<div class="head">\n\t\t\t\t\t<div class="rect1"></div>\n\t\t\t\t\t<div class="rect2"></div>\n\t\t\t\t\t<div class="rect3"></div>\n\t\t\t\t\t<ng-sphere class="icon" end-fill="#666" size="8"></ng-sphere>\n\t\t\t\t\t<span class="title">${n}</span>\n\t\t\t\t\t<span class="sub-title"></span>\n\t\t\t\t\t<div class="buttons">\n\t\t\t\t\t\t<ng-sphere class="apply" start-fill="#cc6" end-fill="#660" size="16" title="apply"></ng-sphere>\n\t\t\t\t\t\t<ng-sphere class="reset" start-fill="#99f" end-fill="#00f" size="16" title="reset"></ng-sphere>\n\t\t\t\t\t\t<ng-sphere class="close" start-fill="#f99" end-fill="#f00" size="16" title="close"></ng-sphere>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class="contents">\n\t\t\t\t\t<div class="left">\n\t\t\t\t\t\t<span>가나다라마바사아자차카타파하가나다라마바사아자차카타파하가나다라마바사아자차카타파하가나다라마바사아자차카타파하가나다라마바사아자차카타파하가나다라마바사아자차카타파하가나다라마바사아자차카타파하가나다라마바사아자차카타파하</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="body">\n\t\t\t\t\t\t${t}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="close2">\n\t\t\t\t\t\t<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">\n\t\t\t\t\t\t\t<path d="M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708"/>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</dialog>\n\t\t`,D(this,e,this.querySelector("dialog")),R(this,i).call(this)}closeWithAnimation(t){R(this,e).classList.add("out"),setTimeout(()=>{R(this,e).close(),this.dispatchEvent(new CustomEvent("closed",{detail:t})),this.remove()},300)}}n=new WeakMap,e=new WeakMap,i=new WeakMap,o=new WeakMap,s=new WeakMap;class B extends HTMLElement{constructor(){super(),this.attachShadow({mode:"open"})}static async open(t,n,e,i,o){var s,r,a;const l=t.tagName.toLowerCase(),c={"true-text":"확인","false-text":"취소",class:"classic",animation:"fade",...(null==(a=null==(r=null==(s=window.nine)?void 0:s.config)?void 0:r.ux)?void 0:a[l.replace("nine-","").replace("-popup","")])||{},...i};document.querySelectorAll(l).forEach(t=>t.remove());const d=document.createElement(l);c.class&&d.classList.add(c.class),c.animation&&d.classList.add(c.animation),document.body.appendChild(d),o(d,n,c);const h=d.shadowRoot.querySelector("nine-dialog");return e&&h.setAttribute("subject",e),new Promise(t=>{h.addEventListener("closed",n=>t(n.detail)),d.setupEvents(t,h),h.showModal()})}}customElements.get("nine-dialog")||customElements.define("nine-dialog",T);const A=class extends B{constructor(){super()}render(t,n){this.shadowRoot.innerHTML=`\n <nine-dialog>\n <div class="msg">${t.replace(/\n/g,"<br/>")}</div>\n <div class="buttons-confirm">\n <button class="cancel">${n["false-text"]}</button>\n <button class="ok">${n["true-text"]}</button>\n </div>\n </nine-dialog>`}setupEvents(t,n){this.shadowRoot.querySelector(".ok").onclick=()=>n.closeWithAnimation(!0)}};L(A,"tagName","nine-confirm-popup"),L(A,"confirm",(t,n,e)=>B.open(A,t,n,e,(t,n,e)=>t.render(n,e)));let W=A;const z=class extends B{constructor(){super()}render(t,n){this.shadowRoot.innerHTML=`\n <nine-dialog>\n <div class="msg">${t.replace(/\n/g,"<br/>")}</div>\n <div class="buttons-confirm">\n <button class="cancel">확인</button>\n </div>\n </nine-dialog>`}setupEvents(t,n){}};L(z,"tagName","nine-alert-popup"),L(z,"alert",(t,n,e)=>B.open(z,t,n,e,(t,n,e)=>t.render(n,e)));let Y=z;customElements.get("nine-confirm-popup")||customElements.define("nine-confirm-popup",W),customElements.get("nine-alert-popup")||customElements.define("nine-alert-popup",Y);const N=class extends B{constructor(){super()}render(t,n){trace.log(this),trace.log(this.shadowRoot),this.shadowRoot.innerHTML=`\n\t\t\t<style>\n\t\t\t\tdialog {\n\t\t\t\t\theight: 300px !important;\n\t\t\t\t}\n\t\t\t\t.msg {\n\t\t\t\t\theight: unset !important;\n\t\t\t\t}\n\t\t\t</style>\n\t\t\t\n <nine-dialog>\n <div class="msg">${t.replace(/\n/g,"<br/>")}</div>\n <div class="input-area">\n <textarea placeholder="내용을 입력하세요..."></textarea>\n </div>\n <div class="buttons-confirm">\n <button class="cancel">${n["false-text"]}</button>\n <button class="ok">${n["true-text"]}</button>\n </div>\n </nine-dialog>`}setupEvents(t,n){const e=this.shadowRoot.querySelector("textarea");this.shadowRoot.querySelector(".ok").onclick=()=>n.closeWithAnimation(e.value),requestAnimationFrame(()=>e.focus())}};L(N,"tagName","nine-prompt-popup"),L(N,"prompt",(t,n,e)=>B.open(N,t,n,e,(t,n,e)=>t.render(n,e)));let P=N;function H(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}customElements.get("nine-prompt-popup")||customElements.define("nine-prompt-popup",P);var j,X={exports:{}};var I=(j||(j=1,X.exports=function(){var t=1e3,n=6e4,e=36e5,i="millisecond",o="second",s="minute",r="hour",a="day",l="week",c="month",d="quarter",h="year",u="date",p="Invalid Date",g=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,f=/\[([^\]]+)]|YYYY|YY|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,m={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:function(t){var n=["th","st","nd","rd"],e=t%100;return"["+t+(n[(e-20)%10]||n[e]||n[0])+"]"}},v=function(t,n,e){var i=String(t);return!i||i.length>=n?t:""+Array(n+1-i.length).join(e)+t},w={s:v,z:function(t){var n=-t.utcOffset(),e=Math.abs(n),i=Math.floor(e/60),o=e%60;return(n<=0?"+":"-")+v(i,2,"0")+":"+v(o,2,"0")},m:function t(n,e){if(n.date()<e.date())return-t(e,n);var i=12*(e.year()-n.year())+(e.month()-n.month()),o=n.clone().add(i,c),s=e-o<0,r=n.clone().add(i+(s?-1:1),c);return+(-(i+(e-o)/(s?o-r:r-o))||0)},a:function(t){return t<0?Math.ceil(t)||0:Math.floor(t)},p:function(t){return{M:c,y:h,w:l,d:a,D:u,h:r,m:s,s:o,ms:i,Q:d}[t]||String(t||"").toLowerCase().replace(/s$/,"")},u:function(t){return void 0===t}},y="en",b={};b[y]=m;var x="$isDayjsObject",$=function(t){return t instanceof S||!(!t||!t[x])},k=function t(n,e,i){var o;if(!n)return y;if("string"==typeof n){var s=n.toLowerCase();b[s]&&(o=s),e&&(b[s]=e,o=s);var r=n.split("-");if(!o&&r.length>1)return t(r[0])}else{var a=n.name;b[a]=n,o=a}return!i&&o&&(y=o),o||!i&&y},M=function(t,n){if($(t))return t.clone();var e="object"==typeof n?n:{};return e.date=t,e.args=arguments,new S(e)},E=w;E.l=k,E.i=$,E.w=function(t,n){return M(t,{locale:n.$L,utc:n.$u,x:n.$x,$offset:n.$offset})};var S=function(){function m(t){this.$L=k(t.locale,null,!0),this.parse(t),this.$x=this.$x||t.x||{},this[x]=!0}var v=m.prototype;return v.parse=function(t){this.$d=function(t){var n=t.date,e=t.utc;if(null===n)return new Date(NaN);if(E.u(n))return new Date;if(n instanceof Date)return new Date(n);if("string"==typeof n&&!/Z$/i.test(n)){var i=n.match(g);if(i){var o=i[2]-1||0,s=(i[7]||"0").substring(0,3);return e?new Date(Date.UTC(i[1],o,i[3]||1,i[4]||0,i[5]||0,i[6]||0,s)):new Date(i[1],o,i[3]||1,i[4]||0,i[5]||0,i[6]||0,s)}}return new Date(n)}(t),this.init()},v.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},v.$utils=function(){return E},v.isValid=function(){return!(this.$d.toString()===p)},v.isSame=function(t,n){var e=M(t);return this.startOf(n)<=e&&e<=this.endOf(n)},v.isAfter=function(t,n){return M(t)<this.startOf(n)},v.isBefore=function(t,n){return this.endOf(n)<M(t)},v.$g=function(t,n,e){return E.u(t)?this[n]:this.set(e,t)},v.unix=function(){return Math.floor(this.valueOf()/1e3)},v.valueOf=function(){return this.$d.getTime()},v.startOf=function(t,n){var e=this,i=!!E.u(n)||n,d=E.p(t),p=function(t,n){var o=E.w(e.$u?Date.UTC(e.$y,n,t):new Date(e.$y,n,t),e);return i?o:o.endOf(a)},g=function(t,n){return E.w(e.toDate()[t].apply(e.toDate("s"),(i?[0,0,0,0]:[23,59,59,999]).slice(n)),e)},f=this.$W,m=this.$M,v=this.$D,w="set"+(this.$u?"UTC":"");switch(d){case h:return i?p(1,0):p(31,11);case c:return i?p(1,m):p(0,m+1);case l:var y=this.$locale().weekStart||0,b=(f<y?f+7:f)-y;return p(i?v-b:v+(6-b),m);case a:case u:return g(w+"Hours",0);case r:return g(w+"Minutes",1);case s:return g(w+"Seconds",2);case o:return g(w+"Milliseconds",3);default:return this.clone()}},v.endOf=function(t){return this.startOf(t,!1)},v.$set=function(t,n){var e,l=E.p(t),d="set"+(this.$u?"UTC":""),p=(e={},e[a]=d+"Date",e[u]=d+"Date",e[c]=d+"Month",e[h]=d+"FullYear",e[r]=d+"Hours",e[s]=d+"Minutes",e[o]=d+"Seconds",e[i]=d+"Milliseconds",e)[l],g=l===a?this.$D+(n-this.$W):n;if(l===c||l===h){var f=this.clone().set(u,1);f.$d[p](g),f.init(),this.$d=f.set(u,Math.min(this.$D,f.daysInMonth())).$d}else p&&this.$d[p](g);return this.init(),this},v.set=function(t,n){return this.clone().$set(t,n)},v.get=function(t){return this[E.p(t)]()},v.add=function(i,d){var u,p=this;i=Number(i);var g=E.p(d),f=function(t){var n=M(p);return E.w(n.date(n.date()+Math.round(t*i)),p)};if(g===c)return this.set(c,this.$M+i);if(g===h)return this.set(h,this.$y+i);if(g===a)return f(1);if(g===l)return f(7);var m=(u={},u[s]=n,u[r]=e,u[o]=t,u)[g]||1,v=this.$d.getTime()+i*m;return E.w(v,this)},v.subtract=function(t,n){return this.add(-1*t,n)},v.format=function(t){var n=this,e=this.$locale();if(!this.isValid())return e.invalidDate||p;var i=t||"YYYY-MM-DDTHH:mm:ssZ",o=E.z(this),s=this.$H,r=this.$m,a=this.$M,l=e.weekdays,c=e.months,d=e.meridiem,h=function(t,e,o,s){return t&&(t[e]||t(n,i))||o[e].slice(0,s)},u=function(t){return E.s(s%12||12,t,"0")},g=d||function(t,n,e){var i=t<12?"AM":"PM";return e?i.toLowerCase():i};return i.replace(f,function(t,i){return i||function(t){switch(t){case"YY":return String(n.$y).slice(-2);case"YYYY":return E.s(n.$y,4,"0");case"M":return a+1;case"MM":return E.s(a+1,2,"0");case"MMM":return h(e.monthsShort,a,c,3);case"MMMM":return h(c,a);case"D":return n.$D;case"DD":return E.s(n.$D,2,"0");case"d":return String(n.$W);case"dd":return h(e.weekdaysMin,n.$W,l,2);case"ddd":return h(e.weekdaysShort,n.$W,l,3);case"dddd":return l[n.$W];case"H":return String(s);case"HH":return E.s(s,2,"0");case"h":return u(1);case"hh":return u(2);case"a":return g(s,r,!0);case"A":return g(s,r,!1);case"m":return String(r);case"mm":return E.s(r,2,"0");case"s":return String(n.$s);case"ss":return E.s(n.$s,2,"0");case"SSS":return E.s(n.$ms,3,"0");case"Z":return o}return null}(t)||o.replace(":","")})},v.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},v.diff=function(i,u,p){var g,f=this,m=E.p(u),v=M(i),w=(v.utcOffset()-this.utcOffset())*n,y=this-v,b=function(){return E.m(f,v)};switch(m){case h:g=b()/12;break;case c:g=b();break;case d:g=b()/3;break;case l:g=(y-w)/6048e5;break;case a:g=(y-w)/864e5;break;case r:g=y/e;break;case s:g=y/n;break;case o:g=y/t;break;default:g=y}return p?g:E.a(g)},v.daysInMonth=function(){return this.endOf(c).$D},v.$locale=function(){return b[this.$L]},v.locale=function(t,n){if(!t)return this.$L;var e=this.clone(),i=k(t,n,!0);return i&&(e.$L=i),e},v.clone=function(){return E.w(this.$d,this)},v.toDate=function(){return new Date(this.valueOf())},v.toJSON=function(){return this.isValid()?this.toISOString():null},v.toISOString=function(){return this.$d.toISOString()},v.toString=function(){return this.$d.toUTCString()},m}(),L=S.prototype;return M.prototype=L,[["$ms",i],["$s",o],["$m",s],["$H",r],["$W",a],["$M",c],["$y",h],["$D",u]].forEach(function(t){L[t[1]]=function(n){return this.$g(n,t[0],t[1])}}),M.extend=function(t,n){return t.$i||(t(n,S,M),t.$i=!0),M},M.locale=k,M.isDayjs=$,M.unix=function(t){return M(1e3*t)},M.en=b[y],M.Ls=b,M.p={},M}()),X.exports);const F=H(I);class q{constructor(){_(this,r),L(this,"alert",(t,n="Alert")=>O(this,r,a).call(this,"alert",t,n,"classic")),L(this,"confirm",(t,n="Confirm")=>O(this,r,a).call(this,"confirm",t,n,"classic")),L(this,"prompt",(t,n="Prompt")=>O(this,r,a).call(this,"prompt",t,n,"classic")),L(this,"formatDate",(t,n)=>F(t).format(n))}}r=new WeakSet,a=function(t,n,e,i){const o={class:i,animation:"fade"};let s=!1;const r={alert:Y,confirm:W,prompt:P}[t],a={rgb:()=>(o.class="rgb",a),classic:()=>(o.class="classic",a),shake:()=>(o.animation="shake",a),run:()=>(o.animation="roadRunner",a),zoom:()=>(o.animation="zoom",a),then:(i,a)=>(s=!0,r[t](n,e,o).then(i,a))};return Promise.resolve().then(()=>{s||(s=!0,r[t](n,e,o))}),a},L(q,"cssPath","");const U=new Set,G={ux:{nativeOverride:!1,theme:"light"},board:{readOnly:!1},cssPath:"",debug:!1};"undefined"==typeof window||window.__NINE_GLOBAL_CONFIG__||(window.__NINE_GLOBAL_CONFIG__=G);const J="undefined"!=typeof window?window.__NINE_GLOBAL_CONFIG__:G,K=t=>(U.add(t),t("all",J),()=>U.delete(t)),V=new Proxy(J,{set:(t,n,e)=>(t[n]=e,U.forEach(e=>e(n,t)),!0),get:(t,n)=>t[n]}),Z={config:V,get cssPath(){return this.config.cssPath||""},setup(t={}){Object.entries(t).forEach(([t,n])=>{"object"!=typeof n||null===n||Array.isArray(n)?this.config[t]=n:this.config[t]={...this.config[t],...n}}),"undefined"!=typeof window&&(window.nine=window.nine||this)}};let Q=(p=class{constructor(t=null,n="green"){_(this,h),_(this,l),_(this,c),_(this,d,!0),D(this,l,t),D(this,c,n),O(this,h,u).call(this)}initBAK(t,n="green"){D(this,l,t),D(this,c,n)}init(t,n="green"){return D(this,l,t),D(this,c,n),this}get log(){const t=`color: ${R(this,c)}; font-weight: bold;`;return R(this,l)?console.log.bind(console,`%c[${R(this,l)}]`,t):console.log.bind(console)}get warn(){return R(this,d)?R(this,l)?console.warn.bind(console,`%c[${R(this,l)}]`,"color: cyan; font-weight: bold;"):console.warn.bind(console):()=>{}}get error(){return R(this,l)?console.error.bind(console,`%c[${R(this,l)}]`,"color: red; font-weight: bold;"):console.error.bind(console)}enable(){D(this,d,!0)}disable(){D(this,d,!1)}},l=new WeakMap,c=new WeakMap,d=new WeakMap,h=new WeakSet,u=function(){if("undefined"==typeof window)return;"localhost"===window.location.hostname||"127.0.0.1"===window.location.hostname||window.location.hostname.startsWith("192.168.")?this.enable():(this.disable(),console.log(`%c[${R(this,l)||"Trace"}]%c 운영 모드: 로그 비활성화. %ctrace.enable()%c 로 활성화 가능`,"color: #4CAF50; font-weight: bold;","","background: #333; color: yellow; padding: 2px 5px;",""))},p);const tt=new Q;"undefined"!=typeof window&&(window.trace=tt);g=new WeakMap,f=new WeakMap,m=new WeakMap,v=new WeakSet,w=function(){if(0===R(this,f).length)return;const t=R(this,f).splice(0,R(this,f).length),n=new Set;t.forEach(t=>{const e=`${t.func.name}_${JSON.stringify(t.args)}`;n.has(e)||(t.func(...t.args),n.add(e))}),D(this,g,null)};class nt extends tt.constructor{constructor(){super(),this.init("nine-util","green")}}const et=new nt;class it{static show(){let t=document.getElementById("global-loading-overlay");if(!t&&(t=document.createElement("div"),t.id="global-loading-overlay",t.style.cssText="\n position: fixed; inset: 0; z-index: 9999;\n background: rgba(0, 0, 0, 0.4); display: flex; \n justify-content: center; align-items: center;\n backdrop-filter: blur(2px);\n ",t.innerHTML='<div class="loading-spinner"></div>',document.body.appendChild(t),!document.getElementById("nine-util-style"))){const t=document.createElement("style");t.id="nine-util-style",t.innerHTML="\n .loading-spinner {\n width: 48px; height: 48px;\n border: 5px solid rgba(255, 255, 255, 0.3);\n border-top-color: white; border-radius: 50%;\n animation: nine-spin 1s linear infinite;\n }\n @keyframes nine-spin { to { transform: rotate(360deg); } }\n ",document.head.appendChild(t)}t.style.display="flex"}static hide(){const t=document.getElementById("global-loading-overlay");t&&(t.style.display="none")}}const ot=class{};y=new WeakMap,L(ot,"BASE_URL",window.__API_BASE_URL__||""),_(ot,y,(t,n,e={},i=!0)=>{const o=n.startsWith("http")?n:`${ot.BASE_URL}${n}`;i&&it.show();const s={};e instanceof FormData||(s["Content-Type"]="application/json");const r={method:t,headers:s};let a=o;return"GET"===t?a+=`?${new URLSearchParams(e)}`:r.body=e instanceof FormData?e:JSON.stringify(e),fetch(a,r).then(async t=>{if(!t.ok){const n=await t.text();throw new Error(`API 오류 (${t.status}): ${n}`)}return t.json()}).catch(n=>{throw et.error(`[IdeFetch.${t.toLowerCase()}] ${o} 실패:`,n),n}).finally(()=>{i&&it.hide()})}),L(ot,"get",(t,n={},e=!0)=>{var i;return R(i=ot,y).call(i,"GET",t,n,e)}),L(ot,"post",(t,n={},e=!0)=>{var i;return R(i=ot,y).call(i,"POST",t,n,e)}),L(ot,"postMultipart",async(t,n=[],e={})=>{const{fileKey:i="fileContents",filePartName:o="files",jsonPartName:s="dataList",chunkSize:r=10}=e;it.show();let a=0,l=null;return(async()=>{for(let e=0;e<n.length;e+=r){const c=new FormData,d=n.slice(e,e+r),h=[];d.forEach(t=>{const{[i]:n,_fileObj:e,...s}=t;h.push(s),n instanceof File&&c.append(o,n)});const u=new Blob([JSON.stringify(h)],{type:"application/json"});if(c.append(s,u),l=await ot.post(t,c,!1),!l||!l.success&&"OK"!==l.status)throw new Error(`청크 전송 실패: ${e}번째 섹션`);a+=d.length}return{...l,success:!0,totalCount:a}})().catch(t=>{throw et.error("[postChunk] Error:",t),t}).finally(()=>{it.hide()})});let st=ot;const rt=st;class at extends HTMLElement{constructor(){super(),_(this,b),_(this,x,t=>{const n=t.previousElementSibling,e=t.nextElementSibling;if(!n||!e)return void D(this,b,this.classList.contains("h")?"h":"v");const i=n.getBoundingClientRect(),o=e.getBoundingClientRect();this.classList.contains("h")?D(this,b,"h"):this.classList.contains("v")?D(this,b,"v"):D(this,b,Math.abs(i.top-o.top)<5?"h":"v")}),_(this,$,t=>{t.preventDefault(),t.stopPropagation();const n=this.getBoundingClientRect(),e="h"===R(this,b),i=e?t.clientX-n.left:t.clientY-n.top,o=document.createElement("div");o.className=`nx-splitter-drag-bar-${R(this,b)}`,Object.assign(o.style,{position:"absolute",zIndex:"999",background:"#666",opacity:"0.6",pointerEvents:"none"});const s=this.getRootNode({composed:!0}),r=s instanceof ShadowRoot?s.host:this.parentElement,a=this.previousElementSibling,l=this.nextElementSibling;if(!r||!a||!l)return void et.warn("Spliter's parent or siblings not found.");(r.shadowRoot||r).appendChild(o);const c=o.offsetParent.getBoundingClientRect(),d=a.getBoundingClientRect(),h=l.getBoundingClientRect(),u=(e?n.left-c.left:n.top-c.top)+i;e?(o.style.top="0",o.style.left=`${u}px`,o.style.width="2px",o.style.height="100%"):(o.style.left="0",o.style.top=`${u}px`,o.style.height="2px",o.style.width="100%"),o.style.mixBlendMode="difference",o.style.zIndex="99999";const p=e?d.left-c.left:d.top-c.top,g=e?h.right-c.left-n.width:h.bottom-c.top-n.height,f=t=>{const n=e?t.clientX:t.clientY,i=e?n-c.left:n-c.top,s=Math.max(p,Math.min(i,g));e?o.style.left=`${s}px`:o.style.top=`${s}px`},m=()=>{window.removeEventListener("mousemove",f),window.removeEventListener("mouseup",m),o.remove();const t=Array.from(r.children),n=t.filter(t=>"nx-splitter"!==t.tagName.toLowerCase()),i=window.getComputedStyle(r),s=e?i.getPropertyValue("column-gap"):i.getPropertyValue("row-gap"),c=parseFloat(s)||0,d=(t.length>1?t.length-1:0)*c,h=(e?parseFloat(o.style.left):parseFloat(o.style.top))-u,p=e?a.getBoundingClientRect().width:a.getBoundingClientRect().height,g=e?l.getBoundingClientRect().width:l.getBoundingClientRect().height;let v=p+h,w=g-h;v<0&&(w+=v,v=0),w<0&&(v+=w,w=0);const y=n.map(t=>e?t.getBoundingClientRect().width:t.getBoundingClientRect().height),b=t.reduce((t,n)=>"nx-splitter"===n.tagName.toLowerCase()?t+(e?n.getBoundingClientRect().width:n.getBoundingClientRect().height):t,0),x=(e?r.getBoundingClientRect().width:r.getBoundingClientRect().height)-b-d;let $=0;n.forEach((t,n)=>{let e;e=t===a?v:t===l?w:y[n];const i=e/x;et.log(t),t.classList.contains("sidebar")?t.style.flex=`0 0 ${e}px`:t.style.flex=`${i} ${i} 0`,$+=i}),et.log(`dragOffset: ${h}`),et.log(`Calculated FlexSum: ${$}`)};window.addEventListener("mousemove",f),window.addEventListener("mouseup",m)}),_(this,k,()=>{R(this,x).call(this,this),this.classList.add(R(this,b));const t=this.innerHTML.trim(),n=""===t?'<div class="grip"></div>':`<div class="grip"></div><div class="inner-container">${t}</div><div class="grip"></div>`;this.innerHTML="";const e=document.createElement("template");e.innerHTML=`\n\t\t\t<style>\n\t\t\t\t@import "https://cdn.jsdelivr.net/npm/@nine-lab/nine-util@0.9.150/dist/css/nine-util.css";\n\t\t\t\t${this.cssPath?`@import "${this.cssPath}";`:""}\n\t\t\t</style>\n\t\t\t${n}\n `,this.shadowRoot.appendChild(e.content.cloneNode(!0)),this.shadowRoot.querySelectorAll(".grip").forEach(t=>{t.addEventListener("mousedown",t=>R(this,$).call(this,t))}),R(this,M).call(this),window.addEventListener("resize",()=>R(this,M).call(this))}),_(this,M,()=>{const t="h"===R(this,b),n=this.parentElement,e=Array.from(n.children).filter(t=>"nx-splitter"!==t.tagName.toLowerCase());if(e.length<2)return;const i=n.getBoundingClientRect(),o=e.reduce((n,e)=>n+(t?e.getBoundingClientRect().width:e.getBoundingClientRect().height),0),s=t?i.width:i.height;e.forEach(n=>{const e=t?n.getBoundingClientRect().width:n.getBoundingClientRect().height,i=s*(e/o)/s;n.style.flex=`${i} ${i} 0`})}),this.attachShadow({mode:"open"})}connectedCallback(){R(this,k).call(this)}get cssPath(){return this.getAttribute("css-path")||q.cssPath}}b=new WeakMap,x=new WeakMap,$=new WeakMap,k=new WeakMap,M=new WeakMap,customElements.get("nine-splitter")||customElements.define("nine-splitter",at);const lt=new q;Object.assign(Z,lt),Z.safe=async t=>{try{return[await t,null]}catch(n){return[null,n]}},Z.api=rt,Z.trace=tt,Z.subscribeConfig=K,Z.config=V||{},"undefined"!=typeof window&&(window.nine=Z),t.Fetch=st,t.NineUtil=q,t.TaskDebouncer=class{constructor(t=50){_(this,v),_(this,g,null),_(this,f,[]),_(this,m),D(this,m,t)}exec(t,...n){R(this,f).push({func:t,args:n}),R(this,g)&&clearTimeout(R(this,g)),D(this,g,setTimeout(()=>O(this,v,w).call(this),R(this,m)))}execWithKey(t,n,...e){D(this,f,R(this,f).filter(n=>n.key!==t)),R(this,f).push({key:t,func:n,args:e}),R(this,g)&&clearTimeout(R(this,g)),D(this,g,setTimeout(()=>O(this,v,w).call(this),R(this,m)))}},t.Trace=Q,t.api=rt,t.config=V,t.loading=it,t.nine=Z,t.nineAlertPopup=Y,t.nineConfirmPopup=W,t.nineDialog=T,t.ninePromptPopup=P,t.subscribeConfig=K,t.trace=tt,Object.defineProperty(t,Symbol.toStringTag,{value:"Module"})});
2
2
  //# sourceMappingURL=nine-util.umd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"nine-util.umd.js","sources":["../src/ux/dialog/nineDialog.js","../src/ux/dialog/nineConfirm.js","../src/ux/dialog/ninePrompt.js","../node_modules/dayjs/dayjs.min.js","../src/ux/dialog/NineUtil.js","../src/core/Config.js","../src/core/Trace.js","../src/core/TaskDebouncer.js","../src/external/NoPeer.js","../src/ux/Loading.js","../src/net/Fetch.js","../src/ux/UxSplitter.js","../src/index.js","../src/utils/promise.js"],"sourcesContent":["import { dialogStyles } from './style.dialog.js';\n\nexport class nineDialog extends HTMLElement\n{\n\t#shift;\n\t#dialog;\n\n\n\tconstructor () {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\n\t\tconst v = this.innerHTML;\n\t\tconst titleText = this.getAttribute(\"subject\") || \"Details\";\n\n\t\t//trace.log(dialogStyles);\n\n\t\tthis.innerHTML = `\n\t\t\t<style>${dialogStyles}</style>\n\t\t\n\t\t\t<dialog>\n\t\t\t\t<div class=\"head\">\n\t\t\t\t\t<div class=\"rect1\"></div>\n\t\t\t\t\t<div class=\"rect2\"></div>\n\t\t\t\t\t<div class=\"rect3\"></div>\n\t\t\t\t\t<ng-sphere class=\"icon\" end-fill=\"#666\" size=\"8\"></ng-sphere>\n\t\t\t\t\t<span class=\"title\">${titleText}</span>\n\t\t\t\t\t<span class=\"sub-title\"></span>\n\t\t\t\t\t<div class=\"buttons\">\n\t\t\t\t\t\t<ng-sphere class=\"apply\" start-fill=\"#cc6\" end-fill=\"#660\" size=\"16\" title=\"apply\"></ng-sphere>\n\t\t\t\t\t\t<ng-sphere class=\"reset\" start-fill=\"#99f\" end-fill=\"#00f\" size=\"16\" title=\"reset\"></ng-sphere>\n\t\t\t\t\t\t<ng-sphere class=\"close\" start-fill=\"#f99\" end-fill=\"#f00\" size=\"16\" title=\"close\"></ng-sphere>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"contents\">\n\t\t\t\t\t<div class=\"left\">\n\t\t\t\t\t\t<span>가나다라마바사아자차카타파하가나다라마바사아자차카타파하가나다라마바사아자차카타파하가나다라마바사아자차카타파하가나다라마바사아자차카타파하가나다라마바사아자차카타파하가나다라마바사아자차카타파하가나다라마바사아자차카타파하</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"body\">\n\t\t\t\t\t\t${v}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"close2\">\n\t\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n\t\t\t\t\t\t\t<path d=\"M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708\"/>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</dialog>\n\t\t`;\n\n\t\t//this.#owner = this.getRootNode().host.closest(\"nine-grid\");\n\n\t\t//$(\".title\", this).html(\"Details\");\n\n\t\tthis.#dialog = this.querySelector('dialog');\n\t\tthis.#init();\n\t};\n\n\tshowModal = () => {\n\t\tthis.#dialog.showModal();\n\t};\n\n\tclose = () => {\n\t\t// 이벤트 리스너 제거 (표준 방식은 핸들러 참조가 필요하지만,\n\t\t// 여기서는 요소가 사라지므로 메모리 관리를 위해 정리)\n\t\tthis.#dialog.close();\n\t\tthis.remove();\n\t};\n\n\t#init = () => {\n\t\tconst head = this.querySelector('.head');\n\n\t\tif (head) {\n\t\t\thead.addEventListener('mousedown', this.#onMouseDown);\n\t\t\thead.addEventListener('touchstart', this.#onTouchStart);\n\n\t\t\t// 마우스 커서를 드래그 가능 아이콘(이동 십자가) 모양으로 변경하여 UX 개선\n\t\t\t//head.style.cursor = 'move';\n\t\t}\n\n\t\t// 1. 모든 닫기 성격의 버튼 (.close, .close2, .cancel) 공통 처리\n\t\tthis.querySelectorAll('.close, .close2, .cancel').forEach(btn => {\n\t\t\tbtn.onclick = () => this.closeWithAnimation(null); // 취소/닫기는 null 리턴\n\t\t});\n\n\t\t// 2. 확인 버튼 (.ok) 처리\n\t\t// 확인 버튼은 텍스트 입력값 등 데이터가 필요하므로\n\t\t// 실제 데이터 추출은 각 팝업 클래스(prompt 등)에서 하되,\n\t\t// 닫기 애니메이션 실행은 여기서 담당하도록 가이드합니다.\n\t\tthis.querySelectorAll('.ok').forEach(btn => {\n\t\t\t// .ok 버튼의 로직은 각 팝업의 setupEvents에서 덮어쓰거나\n\t\t\t// 델리게이트 이벤트를 통해 처리합니다.\n\t\t});\n\n\t\t// 드래그 로직 생략...\n\t};\n\n\t// --- 드래그 로직 (Vanilla JS) ---\n\t#onMouseDown = e => {\n\n\t\tif (e.target.closest(\"buttons\")) return;\n\t\tif (e.button !== 0 || e.altKey || e.ctrlKey || e.shiftKey) return;\n\n\t\tconst rect = this.#dialog.getBoundingClientRect();\n\t\tthis.#shift = {\n\t\t\tx: e.clientX - rect.left,\n\t\t\ty: e.clientY - rect.top\n\t\t};\n\n\t\tconst onMouseMove = (ev) => {\n\t\t\tthis.#dialog.style.position = 'fixed';\n\t\t\tthis.#dialog.style.margin = '0';\n\t\t\tthis.#dialog.style.left = `${ev.clientX - this.#shift.x}px`;\n\t\t\tthis.#dialog.style.top = `${ev.clientY - this.#shift.y}px`;\n\t\t};\n\n\t\tconst onMouseUp = () => {\n\t\t\tdocument.removeEventListener('mousemove', onMouseMove);\n\t\t\tdocument.removeEventListener('mouseup', onMouseUp);\n\t\t};\n\n\t\tdocument.addEventListener('mousemove', onMouseMove);\n\t\tdocument.addEventListener('mouseup', onMouseUp);\n\t};\n\n\t#onTouchStart = e => {\n\t\tif (e.target.closest(\"buttons\")) return;\n\n\t\tconst rect = this.#dialog.getBoundingClientRect();\n\t\tconst touch = e.changedTouches[0];\n\t\tthis.#shift = {\n\t\t\tx: touch.pageX - rect.left,\n\t\t\ty: touch.pageY - rect.top\n\t\t};\n\n\t\tconst onTouchMove = (ev) => {\n\t\t\tconst t = ev.changedTouches[0];\n\t\t\tthis.#dialog.style.position = 'fixed';\n\t\t\tthis.#dialog.style.margin = '0';\n\t\t\tthis.#dialog.style.left = `${t.pageX - this.#shift.x}px`;\n\t\t\tthis.#dialog.style.top = `${t.pageY - this.#shift.y}px`;\n\t\t};\n\n\t\tconst onTouchEnd = () => {\n\t\t\tdocument.removeEventListener('touchmove', onTouchMove);\n\t\t\tdocument.removeEventListener('touchend', onTouchEnd);\n\t\t};\n\n\t\tdocument.addEventListener('touchmove', onTouchMove);\n\t\tdocument.addEventListener('touchend', onTouchEnd);\n\t};\n\n\tcloseWithAnimation(returnValue) {\n\t\tthis.#dialog.classList.add(\"out\"); // 퇴장 애니메이션 시작\n\n\t\t// 애니메이션(0.3s)이 끝난 후 제거 및 이벤트 발생\n\t\tsetTimeout(() => {\n\t\t\tthis.#dialog.close();\n\t\t\t// 부모(BasePopup)에게 작업 완료와 결과값을 알림\n\t\t\tthis.dispatchEvent(new CustomEvent('closed', { detail: returnValue }));\n\t\t\tthis.remove();\n\t\t}, 300);\n\t}\n}\n\n// BasePopup.js\nexport class BasePopup extends HTMLElement {\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.attachShadow({ mode: 'open' });\n\t}\n\n\tstatic async open(PopupClass, message, title, options, renderFn) {\n\t\t// 1. 설정 병합\n\t\tconst tagName = PopupClass.tagName.toLowerCase();\n\t\tconst config = {\n\t\t\t\"true-text\": \"확인\",\n\t\t\t\"false-text\": \"취소\",\n\t\t\tclass: \"classic\",\n\t\t\tanimation: \"fade\",\n\t\t\t...(window.nine?.config?.ux?.[tagName.replace('nine-', '').replace('-popup', '')] || {}),\n\t\t\t...options\n\t\t};\n\n\t\t// 2. 중복 제거 및 엘리먼트 생성\n\t\tdocument.querySelectorAll(tagName).forEach(el => el.remove());\n\t\tconst el = document.createElement(tagName);\n\t\tif (config.class) el.classList.add(config.class);\n\t\tif (config.animation) el.classList.add(config.animation);\n\t\tdocument.body.appendChild(el);\n\n\t\t// 3. 렌더링 (각 팝업의 UI 그리기)\n\t\trenderFn(el, message, config);\n\n\t\tconst dialogComp = el.shadowRoot.querySelector(\"nine-dialog\");\n\t\tif (title) dialogComp.setAttribute(\"subject\", title);\n\n\t\treturn new Promise((resolve) => {\n\t\t\t// [중요] nine-dialog의 애니메이션이 끝난 후 던지는 이벤트를 수신\n\t\t\tdialogComp.addEventListener('closed', (e) => resolve(e.detail));\n\n\t\t\t// 각 팝업 클래스에서 버튼 클릭 시 dialogComp.closeWithAnimation(값)을\n\t\t\t// 호출하도록 이벤트를 바인딩해줌\n\t\t\tel.setupEvents(resolve, dialogComp);\n\n\t\t\tdialogComp.showModal();\n\t\t});\n\t}\n}\n\nif (!customElements.get('nine-dialog')) {\n\tcustomElements.define(\"nine-dialog\", nineDialog);\n}\n","import { BasePopup } from \"./nineDialog.js\";\n\nexport class nineConfirmPopup extends BasePopup {\n\tstatic tagName = 'nine-confirm-popup';\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\n\trender(message, config) {\n\t\tthis.shadowRoot.innerHTML = `\n <nine-dialog>\n <div class=\"msg\">${message.replace(/\\n/g, \"<br/>\")}</div>\n <div class=\"buttons-confirm\">\n <button class=\"cancel\">${config[\"false-text\"]}</button>\n <button class=\"ok\">${config[\"true-text\"]}</button>\n </div>\n </nine-dialog>`;\n\t}\n\n\tsetupEvents(resolve, dialogComp) {\n\t\tthis.shadowRoot.querySelector(\".ok\").onclick = () => dialogComp.closeWithAnimation(true);\n\t\t// 취소는 nine-dialog 내부 기본 로직(closeWithAnimation(null))이 처리함\n\t}\n\n\tstatic confirm = (m, t, o) => BasePopup.open(nineConfirmPopup, m, t, o, (el, msg, conf) => el.render(msg, conf));\n}\n\n// --- 3. ALERT (단순 알림) ---\nexport class nineAlertPopup extends BasePopup {\n\tstatic tagName = 'nine-alert-popup';\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\trender(message, config) {\n\t\tthis.shadowRoot.innerHTML = `\n <nine-dialog>\n <div class=\"msg\">${message.replace(/\\n/g, \"<br/>\")}</div>\n <div class=\"buttons-confirm\">\n <button class=\"cancel\">확인</button>\n </div>\n </nine-dialog>`;\n\t}\n\n\tsetupEvents(resolve, dialogComp) {\n\t\t// 얼럿은 취소 버튼 하나만 두거나, 확인 버튼이 cancel 역할을 수행하게 함\n\t}\n\n\tstatic alert = (m, t, o) => BasePopup.open(nineAlertPopup, m, t, o, (el, msg, conf) => el.render(msg, conf));\n}\n\n// Custom Element 등록\nif (!customElements.get('nine-confirm-popup')) customElements.define('nine-confirm-popup', nineConfirmPopup);\nif (!customElements.get('nine-alert-popup')) customElements.define(\"nine-alert-popup\", nineAlertPopup);","import { BasePopup } from \"./nineDialog.js\";\n\n/**\n *\n */\nexport class ninePromptPopup extends BasePopup {\n\tstatic tagName = 'nine-prompt-popup';\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\trender(message, config) {\n\n\t\ttrace.log(this);\n\t\ttrace.log(this.shadowRoot);\n\n\t\tthis.shadowRoot.innerHTML = `\n\t\t\t<style>\n\t\t\t\tdialog {\n\t\t\t\t\theight: 300px !important;\n\t\t\t\t}\n\t\t\t\t.msg {\n\t\t\t\t\theight: unset !important;\n\t\t\t\t}\n\t\t\t</style>\n\t\t\t\n <nine-dialog>\n <div class=\"msg\">${message.replace(/\\n/g, \"<br/>\")}</div>\n <div class=\"input-area\">\n <textarea placeholder=\"내용을 입력하세요...\"></textarea>\n </div>\n <div class=\"buttons-confirm\">\n <button class=\"cancel\">${config[\"false-text\"]}</button>\n <button class=\"ok\">${config[\"true-text\"]}</button>\n </div>\n </nine-dialog>`;\n\t}\n\n\tsetupEvents(resolve, dialogComp) {\n\t\tconst textarea = this.shadowRoot.querySelector(\"textarea\");\n\t\tconst okBtn = this.shadowRoot.querySelector(\".ok\");\n\n\t\t// 확인 버튼 클릭 시 textarea 값을 가지고 애니메이션 닫기\n\t\tokBtn.onclick = () => dialogComp.closeWithAnimation(textarea.value);\n\n\t\t// 렌더링 후 포커스\n\t\trequestAnimationFrame(() => textarea.focus());\n\t}\n\n\tstatic prompt = (m, t, o) => BasePopup.open(ninePromptPopup, m, t, o, (el, msg, conf) => el.render(msg, conf));\n}\n\nif (!customElements.get('nine-prompt-popup')) {\n\tcustomElements.define('nine-prompt-popup', ninePromptPopup);\n}","!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs=e()}(this,(function(){\"use strict\";var t=1e3,e=6e4,n=36e5,r=\"millisecond\",i=\"second\",s=\"minute\",u=\"hour\",a=\"day\",o=\"week\",c=\"month\",f=\"quarter\",h=\"year\",d=\"date\",l=\"Invalid Date\",$=/^(\\d{4})[-/]?(\\d{1,2})?[-/]?(\\d{0,2})[Tt\\s]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?[.:]?(\\d+)?$/,y=/\\[([^\\]]+)]|YYYY|YY|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,M={name:\"en\",weekdays:\"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday\".split(\"_\"),months:\"January_February_March_April_May_June_July_August_September_October_November_December\".split(\"_\"),ordinal:function(t){var e=[\"th\",\"st\",\"nd\",\"rd\"],n=t%100;return\"[\"+t+(e[(n-20)%10]||e[n]||e[0])+\"]\"}},m=function(t,e,n){var r=String(t);return!r||r.length>=e?t:\"\"+Array(e+1-r.length).join(n)+t},v={s:m,z:function(t){var e=-t.utcOffset(),n=Math.abs(e),r=Math.floor(n/60),i=n%60;return(e<=0?\"+\":\"-\")+m(r,2,\"0\")+\":\"+m(i,2,\"0\")},m:function t(e,n){if(e.date()<n.date())return-t(n,e);var r=12*(n.year()-e.year())+(n.month()-e.month()),i=e.clone().add(r,c),s=n-i<0,u=e.clone().add(r+(s?-1:1),c);return+(-(r+(n-i)/(s?i-u:u-i))||0)},a:function(t){return t<0?Math.ceil(t)||0:Math.floor(t)},p:function(t){return{M:c,y:h,w:o,d:a,D:d,h:u,m:s,s:i,ms:r,Q:f}[t]||String(t||\"\").toLowerCase().replace(/s$/,\"\")},u:function(t){return void 0===t}},g=\"en\",D={};D[g]=M;var p=\"$isDayjsObject\",S=function(t){return t instanceof _||!(!t||!t[p])},w=function t(e,n,r){var i;if(!e)return g;if(\"string\"==typeof e){var s=e.toLowerCase();D[s]&&(i=s),n&&(D[s]=n,i=s);var u=e.split(\"-\");if(!i&&u.length>1)return t(u[0])}else{var a=e.name;D[a]=e,i=a}return!r&&i&&(g=i),i||!r&&g},O=function(t,e){if(S(t))return t.clone();var n=\"object\"==typeof e?e:{};return n.date=t,n.args=arguments,new _(n)},b=v;b.l=w,b.i=S,b.w=function(t,e){return O(t,{locale:e.$L,utc:e.$u,x:e.$x,$offset:e.$offset})};var _=function(){function M(t){this.$L=w(t.locale,null,!0),this.parse(t),this.$x=this.$x||t.x||{},this[p]=!0}var m=M.prototype;return m.parse=function(t){this.$d=function(t){var e=t.date,n=t.utc;if(null===e)return new Date(NaN);if(b.u(e))return new Date;if(e instanceof Date)return new Date(e);if(\"string\"==typeof e&&!/Z$/i.test(e)){var r=e.match($);if(r){var i=r[2]-1||0,s=(r[7]||\"0\").substring(0,3);return n?new Date(Date.UTC(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)):new Date(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)}}return new Date(e)}(t),this.init()},m.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},m.$utils=function(){return b},m.isValid=function(){return!(this.$d.toString()===l)},m.isSame=function(t,e){var n=O(t);return this.startOf(e)<=n&&n<=this.endOf(e)},m.isAfter=function(t,e){return O(t)<this.startOf(e)},m.isBefore=function(t,e){return this.endOf(e)<O(t)},m.$g=function(t,e,n){return b.u(t)?this[e]:this.set(n,t)},m.unix=function(){return Math.floor(this.valueOf()/1e3)},m.valueOf=function(){return this.$d.getTime()},m.startOf=function(t,e){var n=this,r=!!b.u(e)||e,f=b.p(t),l=function(t,e){var i=b.w(n.$u?Date.UTC(n.$y,e,t):new Date(n.$y,e,t),n);return r?i:i.endOf(a)},$=function(t,e){return b.w(n.toDate()[t].apply(n.toDate(\"s\"),(r?[0,0,0,0]:[23,59,59,999]).slice(e)),n)},y=this.$W,M=this.$M,m=this.$D,v=\"set\"+(this.$u?\"UTC\":\"\");switch(f){case h:return r?l(1,0):l(31,11);case c:return r?l(1,M):l(0,M+1);case o:var g=this.$locale().weekStart||0,D=(y<g?y+7:y)-g;return l(r?m-D:m+(6-D),M);case a:case d:return $(v+\"Hours\",0);case u:return $(v+\"Minutes\",1);case s:return $(v+\"Seconds\",2);case i:return $(v+\"Milliseconds\",3);default:return this.clone()}},m.endOf=function(t){return this.startOf(t,!1)},m.$set=function(t,e){var n,o=b.p(t),f=\"set\"+(this.$u?\"UTC\":\"\"),l=(n={},n[a]=f+\"Date\",n[d]=f+\"Date\",n[c]=f+\"Month\",n[h]=f+\"FullYear\",n[u]=f+\"Hours\",n[s]=f+\"Minutes\",n[i]=f+\"Seconds\",n[r]=f+\"Milliseconds\",n)[o],$=o===a?this.$D+(e-this.$W):e;if(o===c||o===h){var y=this.clone().set(d,1);y.$d[l]($),y.init(),this.$d=y.set(d,Math.min(this.$D,y.daysInMonth())).$d}else l&&this.$d[l]($);return this.init(),this},m.set=function(t,e){return this.clone().$set(t,e)},m.get=function(t){return this[b.p(t)]()},m.add=function(r,f){var d,l=this;r=Number(r);var $=b.p(f),y=function(t){var e=O(l);return b.w(e.date(e.date()+Math.round(t*r)),l)};if($===c)return this.set(c,this.$M+r);if($===h)return this.set(h,this.$y+r);if($===a)return y(1);if($===o)return y(7);var M=(d={},d[s]=e,d[u]=n,d[i]=t,d)[$]||1,m=this.$d.getTime()+r*M;return b.w(m,this)},m.subtract=function(t,e){return this.add(-1*t,e)},m.format=function(t){var e=this,n=this.$locale();if(!this.isValid())return n.invalidDate||l;var r=t||\"YYYY-MM-DDTHH:mm:ssZ\",i=b.z(this),s=this.$H,u=this.$m,a=this.$M,o=n.weekdays,c=n.months,f=n.meridiem,h=function(t,n,i,s){return t&&(t[n]||t(e,r))||i[n].slice(0,s)},d=function(t){return b.s(s%12||12,t,\"0\")},$=f||function(t,e,n){var r=t<12?\"AM\":\"PM\";return n?r.toLowerCase():r};return r.replace(y,(function(t,r){return r||function(t){switch(t){case\"YY\":return String(e.$y).slice(-2);case\"YYYY\":return b.s(e.$y,4,\"0\");case\"M\":return a+1;case\"MM\":return b.s(a+1,2,\"0\");case\"MMM\":return h(n.monthsShort,a,c,3);case\"MMMM\":return h(c,a);case\"D\":return e.$D;case\"DD\":return b.s(e.$D,2,\"0\");case\"d\":return String(e.$W);case\"dd\":return h(n.weekdaysMin,e.$W,o,2);case\"ddd\":return h(n.weekdaysShort,e.$W,o,3);case\"dddd\":return o[e.$W];case\"H\":return String(s);case\"HH\":return b.s(s,2,\"0\");case\"h\":return d(1);case\"hh\":return d(2);case\"a\":return $(s,u,!0);case\"A\":return $(s,u,!1);case\"m\":return String(u);case\"mm\":return b.s(u,2,\"0\");case\"s\":return String(e.$s);case\"ss\":return b.s(e.$s,2,\"0\");case\"SSS\":return b.s(e.$ms,3,\"0\");case\"Z\":return i}return null}(t)||i.replace(\":\",\"\")}))},m.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},m.diff=function(r,d,l){var $,y=this,M=b.p(d),m=O(r),v=(m.utcOffset()-this.utcOffset())*e,g=this-m,D=function(){return b.m(y,m)};switch(M){case h:$=D()/12;break;case c:$=D();break;case f:$=D()/3;break;case o:$=(g-v)/6048e5;break;case a:$=(g-v)/864e5;break;case u:$=g/n;break;case s:$=g/e;break;case i:$=g/t;break;default:$=g}return l?$:b.a($)},m.daysInMonth=function(){return this.endOf(c).$D},m.$locale=function(){return D[this.$L]},m.locale=function(t,e){if(!t)return this.$L;var n=this.clone(),r=w(t,e,!0);return r&&(n.$L=r),n},m.clone=function(){return b.w(this.$d,this)},m.toDate=function(){return new Date(this.valueOf())},m.toJSON=function(){return this.isValid()?this.toISOString():null},m.toISOString=function(){return this.$d.toISOString()},m.toString=function(){return this.$d.toUTCString()},M}(),Y=_.prototype;return O.prototype=Y,[[\"$ms\",r],[\"$s\",i],[\"$m\",s],[\"$H\",u],[\"$W\",a],[\"$M\",c],[\"$y\",h],[\"$D\",d]].forEach((function(t){Y[t[1]]=function(e){return this.$g(e,t[0],t[1])}})),O.extend=function(t,e){return t.$i||(t(e,_,O),t.$i=!0),O},O.locale=w,O.isDayjs=S,O.unix=function(t){return O(1e3*t)},O.en=D[g],O.Ls=D,O.p={},O}));","// src/core/NineUtil.js\r\nimport { nineAlertPopup, nineConfirmPopup } from './nineConfirm.js';\r\nimport { ninePromptPopup } from \"./ninePrompt.js\";\r\nimport dayjs from 'dayjs';\r\n\r\nexport class NineUtil {\r\n\t// static 필드는 클래스 자체에 저장됨\r\n\tstatic cssPath = \"\";\r\n\r\n\t/**\r\n\t * 팝업 준비 로직 (Private 메서드)\r\n\t */\r\n\t#prepare(type, message, title, defaultClass) {\r\n\r\n\t\tconst options = { class: defaultClass, animation: 'fade' };\r\n\t\t//const popup = type === 'alert' ? nineAlertPopup : (type === 'confirm' ? nineConfirmPopup : ninePromptPopup);\r\n\t\tlet isExecuted = false;\r\n\r\n\t\tconst popupMap = {\r\n\t\t\talert: nineAlertPopup,\r\n\t\t\tconfirm: nineConfirmPopup,\r\n\t\t\tprompt: ninePromptPopup\r\n\t\t};\r\n\r\n\t\tconst popup = popupMap[type];\r\n\r\n\t\tconst runner = {\r\n\t\t\trgb: () => { options.class = 'rgb'; return runner; },\r\n\t\t\tclassic: () => { options.class = 'classic'; return runner; },\r\n\t\t\tshake: () => { options.animation = 'shake'; return runner; },\r\n\t\t\trun: () => { options.animation = 'roadRunner'; return runner; },\r\n\t\t\tzoom: () => { options.animation = 'zoom'; return runner; },\r\n\r\n\t\t\tthen: (resolve, reject) => {\r\n\t\t\t\tisExecuted = true;\r\n\t\t\t\treturn popup[type](message, title, options).then(resolve, reject);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t// Microtask: 동기 체이닝이 모두 끝난 후 실행\r\n\t\tPromise.resolve().then(() => {\r\n\t\t\tif (!isExecuted) {\r\n\t\t\t\tisExecuted = true;\r\n\t\t\t\tpopup[type](message, title, options);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn runner;\r\n\t}\r\n\r\n\talert(message, title = \"Alert\") {\r\n\t\treturn this.#prepare('alert', message, title, 'classic');\r\n\t}\r\n\r\n\tconfirm(message, title = \"Confirm\") {\r\n\t\treturn this.#prepare('confirm', message, title, 'classic');\r\n\t}\r\n\r\n\tprompt(message, title = \"Prompt\") {\r\n\t\treturn this.#prepare('prompt', message, title, 'classic');\r\n\t}\r\n\r\n\tformatDate = (v, fmt) => {\r\n\t\treturn dayjs(v).format(fmt)\r\n\t}\r\n}","const listeners = new Set();\r\n\r\n// 💡 [핵심] 전역 저장소를 단일화합니다.\r\n// window에 이미 있으면 그것을 쓰고, 없으면 초기값을 생성하여 등록합니다.\r\nconst _initialConfig = {\r\n\tux: { nativeOverride: false, theme: 'light' },\r\n\tboard: { readOnly: false },\r\n\tcssPath: \"\",\r\n\tdebug: false\r\n};\r\n\r\nif (typeof window !== 'undefined' && !window.__NINE_GLOBAL_CONFIG__) {\r\n\twindow.__NINE_GLOBAL_CONFIG__ = _initialConfig;\r\n}\r\n\r\n// 이제 모든 모듈의 _config는 동일한 window 객체 메모리를 가리킵니다.\r\nconst _config = typeof window !== 'undefined' ? window.__NINE_GLOBAL_CONFIG__ : _initialConfig;\r\n\r\nexport const subscribeConfig = (fn) => {\r\n\tlisteners.add(fn);\r\n\tfn('all', _config);\r\n\treturn () => listeners.delete(fn);\r\n};\r\n\r\n// Proxy 역시 전역 저장소인 _config를 조작합니다.\r\nexport const config = new Proxy(_config, {\r\n\tset(target, prop, value) {\r\n\t\ttarget[prop] = value;\r\n\t\tlisteners.forEach(fn => fn(prop, target));\r\n\t\treturn true;\r\n\t},\r\n\tget(target, prop) {\r\n\t\treturn target[prop];\r\n\t}\r\n});\r\n\r\nexport const nine = {\r\n\tconfig: config,\r\n\r\n\t// Getter에서 window.nine까지 확인할 필요도 없습니다.\r\n\t// 이미 config 자체가 전역 저장소(__NINE_GLOBAL_CONFIG__)를 바라보고 있기 때문입니다.\r\n\tget cssPath() {\r\n\t\treturn this.config.cssPath || \"\";\r\n\t},\r\n\r\n\tsetup(options = {}) {\r\n\t\tObject.entries(options).forEach(([key, value]) => {\r\n\t\t\t// 깊은 병합 지원\r\n\t\t\tif (typeof value === 'object' && value !== null && !Array.isArray(value)) {\r\n\t\t\t\tthis.config[key] = { ...this.config[key], ...value };\r\n\t\t\t} else {\r\n\t\t\t\tthis.config[key] = value;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// 다른 모듈에서 window.nine으로 접근할 수 있도록 보장\r\n\t\tif (typeof window !== 'undefined') {\r\n\t\t\twindow.nine = window.nine || this;\r\n\t\t}\r\n\t}\r\n};","export class Trace {\r\n\t#name;\r\n\t#color;\r\n\t#enabled = true;\r\n\r\n\tconstructor(name = null, color = \"green\") {\r\n\t\tthis.#name = name;\r\n\t\tthis.#color = color;\r\n\t\tthis.#autoConfig();\r\n\t\t/**\r\n\t\t// 1. 쪼개진 인스턴스들을 하나로 합치는 '본드' 역할 (이게 핵심!)\r\n\t\tif (typeof window !== 'undefined' && window.__NINE_TRACE__) {\r\n\t\t\treturn window.__NINE_TRACE__;\r\n\t\t}\r\n\t\tthis.#autoConfig();\r\n\t\tif (typeof window !== 'undefined') window.__NINE_TRACE__ = this;\r\n\t\t\t*/\r\n\t}\r\n\r\n\t#autoConfig() {\r\n\t\tif (typeof window === 'undefined') return;\r\n\t\tconst isLocal = window.location.hostname === 'localhost' ||\r\n\t\t\twindow.location.hostname === '127.0.0.1' ||\r\n\t\t\twindow.location.hostname.startsWith('192.168.');\r\n\r\n\t\tif (isLocal) {\r\n\t\t\tthis.enable();\r\n\t\t} else {\r\n\t\t\tthis.disable();\r\n\t\t\tconsole.log(\r\n\t\t\t\t`%c[${this.#name || 'Trace'}]%c 운영 모드: 로그 비활성화. %ctrace.enable()%c 로 활성화 가능`,\r\n\t\t\t\t\"color: #4CAF50; font-weight: bold;\", \"\",\r\n\t\t\t\t\"background: #333; color: yellow; padding: 2px 5px;\", \"\"\r\n\t\t\t);\r\n\t\t}\r\n\t}\r\n\r\n\t// 🟢 빼먹었던 init 메서드 다시 추가!\r\n\tinitBAK(name, color = \"green\") {\r\n\t\tthis.#name = name;\r\n\t\tthis.#color = color;\r\n\t}\r\n\r\n\tinit(name, color = \"green\") {\r\n\t\t//const style = `color: ${color}; font-weight: bold;`;\r\n\t\tthis.#name = name;\r\n\t\tthis.#color = color;\r\n\r\n\t\treturn this;\r\n\t\t/**\r\n\t\tconsole.log(name, color);\r\n\t\treturn {\r\n\t\t\tlog: console.log.bind(console, `%c[${name}]`, style),\r\n\t\t\twarn: console.warn.bind(console, `%c[${name}]`, \"color: cyan; font-weight: bold;\"),\r\n\t\t\terror: console.error.bind(console, `%c[${name}]`, \"color: red; font-weight: bold;\")\r\n\t\t}; */\r\n\t}\r\n\r\n\t//get log() { return console.log.bind(console); }\r\n\r\n\t// 🔴 핵심: 소스 위치를 호출부로 찍어주는 Getter 로직\r\n\tget log() {\r\n\t\t//if (!this.#enabled) return () => {};\r\n\t\tconst style = `color: ${this.#color}; font-weight: bold;`;\r\n\t\t// 이름이 있으면 프리픽스를 붙이고, 없으면 그냥 로그를 바인딩합니다.\r\n\t\treturn (this.#name)\r\n\t\t\t? console.log.bind(console, `%c[${this.#name}]`, style)\r\n\t\t\t: console.log.bind(console);\r\n\t}\r\n\r\n\tget warn() {\r\n\t\tif (!this.#enabled) return () => {};\r\n\t\treturn (this.#name)\r\n\t\t\t? console.warn.bind(console, `%c[${this.#name}]`, \"color: cyan; font-weight: bold;\")\r\n\t\t\t: console.warn.bind(console);\r\n\t}\r\n\r\n\tget error() {\r\n\t\t// 에러는 enabled 상태와 상관없이 찍고 싶으시면 if 체크를 주석 처리하세요.\r\n\t\t// if (!this.#enabled) return () => {};\r\n\t\treturn (this.#name)\r\n\t\t\t? console.error.bind(console, `%c[${this.#name}]`, \"color: red; font-weight: bold;\")\r\n\t\t\t: console.error.bind(console);\r\n\t}\r\n\r\n\tenable() { this.#enabled = true; }\r\n\tdisable() { this.#enabled = false; }\r\n}\r\n\r\nexport const trace = new Trace();\r\nif (typeof window !== 'undefined') window.trace = trace;","export class TaskDebouncer {\r\n\t#timer = null;\r\n\t#queue = [];\r\n\t#delay;\r\n\r\n\tconstructor(delay = 50) {\r\n\t\tthis.#delay = delay;\r\n\t}\r\n\r\n\t/**\r\n\t * @param {Function} func - 실행할 함수\r\n\t * @param {...any} args - 함수에 전달할 임의의 파라미터들\r\n\t */\r\n\texec(func, ...args) {\r\n\t\t// 1. 어떤 함수와 어떤 인자들이 들어왔는지 큐에 저장\r\n\t\tthis.#queue.push({ func, args });\r\n\r\n\t\t// 2. 디바운스 타이머 설정\r\n\t\tif (this.#timer) clearTimeout(this.#timer);\r\n\r\n\t\tthis.#timer = setTimeout(() => this.#flush(), this.#delay);\r\n\t}\r\n\r\n\texecWithKey(key, func, ...args) {\r\n\t\t// 1. 같은 키(예: 'resize')가 들어오면 이전 큐에서 해당 키 삭제 (중복 제거)\r\n\t\tthis.#queue = this.#queue.filter(task => task.key !== key);\r\n\r\n\t\t// 2. 새로운 태스크 추가\r\n\t\tthis.#queue.push({ key, func, args });\r\n\r\n\t\tif (this.#timer) clearTimeout(this.#timer);\r\n\t\tthis.#timer = setTimeout(() => this.#flush(), this.#delay);\r\n\t}\r\n\r\n\t#flush() {\r\n\t\tif (this.#queue.length === 0) return;\r\n\r\n\t\t// 3. 현재까지 쌓인 큐를 쏙 빼옴\r\n\t\tconst tasks = this.#queue.splice(0, this.#queue.length);\r\n\t\tconst seen = new Set();\r\n\r\n\t\ttasks.forEach(task => {\r\n\t\t\t// 4. 핵심: 함수 이름과 인자들을 문자열로 합쳐서 유니크 키 생성\r\n\t\t\t// JSON.stringify를 통해 [1, {a:1}] 같은 파라미터도 문자열로 비교 가능\r\n\t\t\tconst identifier = `${task.func.name}_${JSON.stringify(task.args)}`;\r\n\r\n\t\t\tif (!seen.has(identifier)) {\r\n\t\t\t\t// 5. 중복이 아닐 때만 원래 인자들(...args) 그대로 실행\r\n\t\t\t\ttask.func(...task.args);\r\n\t\t\t\tseen.add(identifier);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tthis.#timer = null;\r\n\t}\r\n}","import { trace as traceOrigin } from '../core/Trace.js';\n\nexport class Trace extends traceOrigin.constructor {\n constructor() {\n super();\n this.init(\"nine-util\", \"green\");\n }\n}\n\nexport const trace = new Trace();","export class Loading {\n\tstatic show() {\n\t\tlet overlay = document.getElementById(\"global-loading-overlay\");\n\t\tif (!overlay) {\n\t\t\toverlay = document.createElement(\"div\");\n\t\t\toverlay.id = \"global-loading-overlay\";\n\t\t\toverlay.style.cssText = `\n position: fixed; inset: 0; z-index: 9999;\n background: rgba(0, 0, 0, 0.4); display: flex; \n justify-content: center; align-items: center;\n backdrop-filter: blur(2px);\n `;\n\t\t\toverlay.innerHTML = `<div class=\"loading-spinner\"></div>`;\n\t\t\tdocument.body.appendChild(overlay);\n\n\t\t\tif (!document.getElementById(\"nine-util-style\")) {\n\t\t\t\tconst style = document.createElement(\"style\");\n\t\t\t\tstyle.id = \"nine-util-style\";\n\t\t\t\tstyle.innerHTML = `\n .loading-spinner {\n width: 48px; height: 48px;\n border: 5px solid rgba(255, 255, 255, 0.3);\n border-top-color: white; border-radius: 50%;\n animation: nine-spin 1s linear infinite;\n }\n @keyframes nine-spin { to { transform: rotate(360deg); } }\n `;\n\t\t\t\tdocument.head.appendChild(style);\n\t\t\t}\n\t\t}\n\t\toverlay.style.display = \"flex\";\n\t}\n\n\tstatic hide() {\n\t\tconst overlay = document.getElementById(\"global-loading-overlay\");\n\t\tif (overlay) overlay.style.display = \"none\";\n\t}\n}","import { trace } from \"@nopeer\";\nimport { Loading } from \"../ux/Loading.js\";\n\nexport class Fetch {\n\tstatic BASE_URL = window.__API_BASE_URL__ || \"\";\n\n\tstatic #request = (method, url, data = {}, showLoading = true) => {\n\t\tconst finalUrl = url.startsWith('http') ? url : `${this.BASE_URL}${url}`;\n\n\t\tif (showLoading) {\n\t\t\tLoading.show();\n\t\t}\n\n\t\t// 1. 기본 헤더 설정\n\t\tconst headers = {};\n\n\t\t// 🔴 핵심: 데이터가 FormData가 아닐 때만 JSON 헤더를 추가합니다.\n\t\tif (!(data instanceof FormData)) {\n\t\t\theaders[\"Content-Type\"] = \"application/json\";\n\t\t}\n\n\t\tconst options = {\n\t\t\tmethod,\n\t\t\theaders\n\t\t};\n\n\t\tlet targetUrl = finalUrl;\n\t\tif (method === \"GET\") {\n\t\t\ttargetUrl += `?${new URLSearchParams(data)}`;\n\t\t} else {\n\t\t\t// 🔴 핵심: FormData는 그대로 body에 넣고, 일반 객체는 JSON.stringify 처리합니다.\n\t\t\toptions.body = data instanceof FormData ? data : JSON.stringify(data);\n\t\t}\n\n\t\treturn fetch(targetUrl, options)\n\t\t\t.then(async res => {\n\t\t\t\tif (!res.ok) {\n\t\t\t\t\tconst text = await res.text();\n\t\t\t\t\tthrow new Error(`API 오류 (${res.status}): ${text}`);\n\t\t\t\t}\n\t\t\t\treturn res.json();\n\t\t\t})\n\t\t\t.catch(err => {\n\t\t\t\ttrace.error(`[IdeFetch.${method.toLowerCase()}] ${finalUrl} 실패:`, err);\n\t\t\t\tthrow err;\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\tif (showLoading) {\n\t\t\t\t\tLoading.hide();\n\t\t\t\t}\n\t\t\t});\n\t};\n\n\t// 기존 post/get 메서드도 인자를 넘겨주도록 수정\n\tstatic get = (url, data = {}, showLoading = true) => this.#request(\"GET\", url, data, showLoading);\n\tstatic post = (url, data = {}, showLoading = true) => this.#request(\"POST\", url, data, showLoading);\n\n\t/**\n\t * 🚀 범용 청크 전송 (파라미터 이름까지 동적 설정)\n\t * @param {string} url - API 주소\n\t * @param {Array} rows - 데이터 배열\n\t * @param {object} options - 상세 옵션\n\t * - fileKey: 객체 내 파일 속성명 (기본: 'fileContents')\n\t * - filePartName: 서버에서 받을 파일 파트명 (기본: 'files')\n\t * - jsonPartName: 서버에서 받을 JSON 파트명 (기본: 'dataList')\n\t * - chunkSize: 분할 단위 (기본: 10)\n\t */\n\tstatic postMultipart = async (url, rows = [], options = {}) => {\n\t\tconst {\n\t\t\tfileKey = 'fileContents',\n\t\t\tfilePartName = 'files',\n\t\t\tjsonPartName = 'dataList',\n\t\t\tchunkSize = 10\n\t\t} = options;\n\n\t\t// 1. 시작 전 로딩바 띄우기\n\t\tLoading.show();\n\n\t\tlet totalCount = 0;\n\t\tlet lastResponse = null;\n\n\t\t// 🔴 2. 전체 루프를 Promise 체인처럼 관리 (내부는 await 유지)\n\t\treturn (async () => {\n\t\t\tfor (let i = 0; i < rows.length; i += chunkSize) {\n\t\t\t\tconst formData = new FormData();\n\t\t\t\tconst chunk = rows.slice(i, i + chunkSize);\n\t\t\t\tconst rowDataList = [];\n\n\t\t\t\tchunk.forEach((row) => {\n\t\t\t\t\tconst { [fileKey]: fileObj, _fileObj, ...rest } = row;\n\t\t\t\t\trowDataList.push(rest);\n\t\t\t\t\tif (fileObj instanceof File) {\n\t\t\t\t\t\tformData.append(filePartName, fileObj);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tconst jsonBlob = new Blob([JSON.stringify(rowDataList)], { type: 'application/json' });\n\t\t\t\tformData.append(jsonPartName, jsonBlob);\n\n\t\t\t\t// showLoading = false로 내부 호출\n\t\t\t\tlastResponse = await this.post(url, formData, false);\n\n\t\t\t\tif (lastResponse && (lastResponse.success || lastResponse.status === 'OK')) {\n\t\t\t\t\ttotalCount += chunk.length;\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(`청크 전송 실패: ${i}번째 섹션`);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn { ...lastResponse, success: true, totalCount };\n\t\t})()\n\t\t\t.catch(err => {\n\t\t\t\ttrace.error(\"[postChunk] Error:\", err);\n\t\t\t\tthrow err;\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\t// 🔴 3. 성공하든 실패하든 여기서 깔끔하게 닫기!\n\t\t\t\tLoading.hide();\n\t\t\t});\n\t};\n}\n\nexport const api = Fetch;","import { trace } from \"@nopeer\";\r\nimport { NineUtil } from \"./dialog/NineUtil.js\";\r\n\r\nclass UxSplitter extends HTMLElement {\r\n\r\n\t#mode;\r\n\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.attachShadow({ mode: \"open\" });\r\n\t}\r\n\r\n\tconnectedCallback() {\r\n\r\n\t\tthis.#init();\r\n\t}\r\n\r\n\t#detectMode = (el) => {\r\n\t\tconst prev = el.previousElementSibling;\r\n\t\tconst next = el.nextElementSibling;\r\n\t\tif (!prev || !next) {\r\n\t\t\tthis.#mode = this.classList.contains('h') ? \"h\" : \"v\";\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst prevRect = prev.getBoundingClientRect();\r\n\t\tconst nextRect = next.getBoundingClientRect();\r\n\r\n\t\tif (this.classList.contains('h')) {\r\n\t\t\tthis.#mode = \"h\";\r\n\t\t} else if (this.classList.contains('v')) {\r\n\t\t\tthis.#mode = \"v\";\r\n\t\t} else {\r\n\t\t\tthis.#mode = (Math.abs(prevRect.top - nextRect.top) < 5) ? \"h\" : \"v\";\r\n\t\t}\r\n\t};\r\n\r\n\t#startDrag = (e) => {\r\n\t\te.preventDefault();\r\n\t\te.stopPropagation();\r\n\r\n\t\tconst splitterRect = this.getBoundingClientRect();\r\n\t\tconst isHorizontal = this.#mode === \"h\";\r\n\r\n\t\t// 마우스 포인터와 스플리터 시작점 사이의 거리\r\n\t\tconst clickOffset = isHorizontal\r\n\t\t\t? e.clientX - splitterRect.left\r\n\t\t\t: e.clientY - splitterRect.top;\r\n\r\n\t\tconst dragBar = document.createElement(\"div\");\r\n\t\tdragBar.className = `nx-splitter-drag-bar-${this.#mode}`;\r\n\r\n\t\tObject.assign(dragBar.style, {\r\n\t\t\tposition: \"absolute\",\r\n\t\t\tzIndex: \"999\",\r\n\t\t\tbackground: \"#666\",\r\n\t\t\topacity: \"0.6\",\r\n\t\t\tpointerEvents: \"none\"\r\n\t\t});\r\n\r\n\t\tconst root = this.getRootNode({ composed: true });\r\n\t\tconst parent = root instanceof ShadowRoot ? root.host : this.parentElement;\r\n\t\tconst prev = this.previousElementSibling;\r\n\t\tconst next = this.nextElementSibling;\r\n\r\n\t\tif (!parent || !prev || !next) {\r\n\t\t\ttrace.warn(\"Spliter's parent or siblings not found.\");\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t(parent.shadowRoot || parent).appendChild(dragBar);\r\n\t\tconst dragBarOffsetParentRect = dragBar.offsetParent.getBoundingClientRect();\r\n\r\n\t\tconst prevRect = prev.getBoundingClientRect();\r\n\t\tconst nextRect = next.getBoundingClientRect();\r\n\r\n\t\t// 드래그 바의 초기 위치와 크기 설정\r\n\t\tconst initialSplitterPosInParent = (isHorizontal\r\n\t\t\t? splitterRect.left - dragBarOffsetParentRect.left\r\n\t\t\t: splitterRect.top - dragBarOffsetParentRect.top) + clickOffset;\r\n\r\n\t\tif (isHorizontal) {\r\n\t\t\tdragBar.style.top = \"0\";\r\n\t\t\tdragBar.style.left = `${initialSplitterPosInParent}px`;\r\n\t\t\tdragBar.style.width = \"2px\";\r\n\t\t\tdragBar.style.height = \"100%\";\r\n\t\t} else {\r\n\t\t\tdragBar.style.left = \"0\";\r\n\t\t\tdragBar.style.top = `${initialSplitterPosInParent}px`;\r\n\t\t\tdragBar.style.height = \"2px\";\r\n\t\t\tdragBar.style.width = \"100%\";\r\n\t\t}\r\n\r\n\t\tdragBar.style.mixBlendMode = \"difference\";\r\n\t\tdragBar.style.zIndex = \"99999\";\r\n\r\n\t\tconst minLimit = isHorizontal\r\n\t\t\t? prevRect.left - dragBarOffsetParentRect.left\r\n\t\t\t: prevRect.top - dragBarOffsetParentRect.top;\r\n\t\tconst maxLimit = isHorizontal\r\n\t\t\t? nextRect.right - dragBarOffsetParentRect.left - splitterRect.width\r\n\t\t\t: nextRect.bottom - dragBarOffsetParentRect.top - splitterRect.height;\r\n\r\n\t\tconst onMove = moveEvent => {\r\n\t\t\tconst clientPos = isHorizontal ? moveEvent.clientX : moveEvent.clientY;\r\n\t\t\tconst currentPosInParent = isHorizontal\r\n\t\t\t\t? clientPos - dragBarOffsetParentRect.left\r\n\t\t\t\t: clientPos - dragBarOffsetParentRect.top;\r\n\r\n\t\t\tconst clampedPos = Math.max(minLimit, Math.min(currentPosInParent, maxLimit));\r\n\r\n\t\t\tif (isHorizontal) {\r\n\t\t\t\tdragBar.style.left = `${clampedPos}px`;\r\n\t\t\t} else {\r\n\t\t\t\tdragBar.style.top = `${clampedPos}px`;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tconst onUp = () => {\r\n\t\t\twindow.removeEventListener(\"mousemove\", onMove);\r\n\t\t\twindow.removeEventListener(\"mouseup\", onUp);\r\n\t\t\tdragBar.remove();\r\n\r\n\t\t\tconst allChildren = Array.from(parent.children);\r\n\t\t\tconst allPanels = allChildren.filter(el => el.tagName.toLowerCase() !== 'nx-splitter');\r\n\r\n\t\t\t// ⭐⭐ gap 크기 계산 ⭐⭐\r\n\t\t\tconst style = window.getComputedStyle(parent);\r\n\t\t\tconst gapValue = isHorizontal ? style.getPropertyValue('column-gap') : style.getPropertyValue('row-gap');\r\n\t\t\tconst gapSize = parseFloat(gapValue) || 0;\r\n\t\t\tconst gapCount = allChildren.length > 1 ? allChildren.length - 1 : 0;\r\n\t\t\tconst totalGapSize = gapCount * gapSize;\r\n\r\n\t\t\tconst finalDragBarPos = isHorizontal ? parseFloat(dragBar.style.left) : parseFloat(dragBar.style.top);\r\n\t\t\tconst dragOffset = finalDragBarPos - initialSplitterPosInParent;\r\n\r\n\t\t\tconst prevSize = isHorizontal ? prev.getBoundingClientRect().width : prev.getBoundingClientRect().height;\r\n\t\t\tconst nextSize = isHorizontal ? next.getBoundingClientRect().width : next.getBoundingClientRect().height;\r\n\r\n\t\t\tlet newPrevSize = prevSize + dragOffset;\r\n\t\t\tlet newNextSize = nextSize - dragOffset;\r\n\r\n\t\t\t// 패널 크기가 음수가 되지 않도록 제한하고, 다른 패널에 차이를 보정\r\n\t\t\tif (newPrevSize < 0) {\r\n\t\t\t\tnewNextSize += newPrevSize;\r\n\t\t\t\tnewPrevSize = 0;\r\n\t\t\t}\r\n\t\t\tif (newNextSize < 0) {\r\n\t\t\t\tnewPrevSize += newNextSize;\r\n\t\t\t\tnewNextSize = 0;\r\n\t\t\t}\r\n\r\n\t\t\tconst initialSizes = allPanels.map(panel => isHorizontal ? panel.getBoundingClientRect().width : panel.getBoundingClientRect().height);\r\n\r\n\t\t\tconst totalSplitterSize = allChildren.reduce((sum, child) => {\r\n\t\t\t\tif (child.tagName.toLowerCase() === 'nx-splitter') {\r\n\t\t\t\t\treturn sum + (isHorizontal ? child.getBoundingClientRect().width : child.getBoundingClientRect().height);\r\n\t\t\t\t}\r\n\t\t\t\treturn sum;\r\n\t\t\t}, 0);\r\n\r\n\t\t\tconst totalContainerSize = (isHorizontal ? parent.getBoundingClientRect().width : parent.getBoundingClientRect().height);\r\n\t\t\tconst totalFlexSpace = totalContainerSize - totalSplitterSize - totalGapSize;\r\n\r\n\t\t\tlet flexSum = 0;\r\n\t\t\tallPanels.forEach((panel, index) => {\r\n\t\t\t\tlet newSize;\r\n\t\t\t\tif (panel === prev) {\r\n\t\t\t\t\tnewSize = newPrevSize;\r\n\t\t\t\t} else if (panel === next) {\r\n\t\t\t\t\tnewSize = newNextSize;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tnewSize = initialSizes[index];\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst newFlexBasis = newSize / totalFlexSpace;\r\n\t\t\t\t//panel.style.flex = `${newFlexBasis} ${newFlexBasis} 0`;\r\n\r\n\t\t\t\ttrace.log(panel);\r\n\r\n\t\t\t\tif (panel.classList.contains('sidebar')) {\r\n\t\t\t\t\t// 드래그가 끝난 시점의 newSize(px)를 그대로 고정값으로 할당\r\n\t\t\t\t\t// 이렇게 하면 비율(%)이 아니라 딱 그 픽셀만큼만 자리를 차지하게 됩니다.\r\n\t\t\t\t\tpanel.style.flex = `0 0 ${newSize}px`;\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// 나머지 메인 보드 같은 유연한 패널은 비율(%)로 처리\r\n\t\t\t\t\t//const newFlexBasis = newSize / totalFlexSpace;\r\n\t\t\t\t\tpanel.style.flex = `${newFlexBasis} ${newFlexBasis} 0`;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tflexSum += newFlexBasis;\r\n\t\t\t});\r\n\r\n\t\t\ttrace.log(`dragOffset: ${dragOffset}`);\r\n\t\t\ttrace.log(`Calculated FlexSum: ${flexSum}`);\r\n\t\t};\r\n\r\n\t\twindow.addEventListener(\"mousemove\", onMove);\r\n\t\twindow.addEventListener(\"mouseup\", onUp);\r\n\t};\r\n\r\n\tget cssPath() {\r\n\t\treturn this.getAttribute(\"css-path\") || NineUtil.cssPath;\r\n\t}\r\n\r\n\t#init = () => {\r\n\t\tthis.#detectMode(this);\r\n\t\tthis.classList.add(this.#mode);\r\n\r\n\t\tconst contents = this.innerHTML.trim();\r\n\t\t//const gripClass = `grip-${this.#mode}`;\r\n\t\tconst gripTmpl = (contents === \"\") ? `<div class=\"grip\"></div>` : `<div class=\"grip\"></div><div class=\"inner-container\">${contents}</div><div class=\"grip\"></div>`;\r\n\r\n\t\tthis.innerHTML = \"\";\r\n\t\tconst htmlTmpl = document.createElement(\"template\");\r\n\t\thtmlTmpl.innerHTML = `\r\n\t\t\t<style>\r\n\t\t\t\t@import \"https://cdn.jsdelivr.net/npm/@nine-lab/nine-util@${__APP_VERSION__}/dist/css/nine-util.css\";\r\n\t\t\t\t${this.cssPath ? `@import \"${this.cssPath}\";` : \"\"}\r\n\t\t\t</style>\r\n\t\t\t${gripTmpl}\r\n `;\r\n\r\n\t\tthis.shadowRoot.appendChild(htmlTmpl.content.cloneNode(true));\r\n\r\n\t\tthis.shadowRoot.querySelectorAll(\".grip\").forEach(el => {\r\n\t\t\tel.addEventListener(\"mousedown\", e => this.#startDrag(e));\r\n\t\t});\r\n\r\n\t\tthis.#prepareLayout();\r\n\r\n\t\twindow.addEventListener(\"resize\", () => this.#prepareLayout());\r\n\t};\r\n\r\n\t#prepareLayout = () => {\r\n\t\tconst isHorizontal = this.#mode === \"h\";\r\n\t\tconst parent = this.parentElement;\r\n\t\tconst allPanels = Array.from(parent.children).filter(el => el.tagName.toLowerCase() !== 'nx-splitter');\r\n\t\tif (allPanels.length < 2) return;\r\n\r\n\t\tconst parentRect = parent.getBoundingClientRect();\r\n\t\tconst totalContentSize = allPanels.reduce((sum, el) => {\r\n\t\t\tconst size = isHorizontal ? el.getBoundingClientRect().width : el.getBoundingClientRect().height;\r\n\t\t\treturn sum + size;\r\n\t\t}, 0);\r\n\t\tconst totalParentSize = isHorizontal ? parentRect.width : parentRect.height;\r\n\r\n\t\tallPanels.forEach(panel => {\r\n\t\t\tconst size = isHorizontal ? panel.getBoundingClientRect().width : panel.getBoundingClientRect().height;\r\n\t\t\tconst newSize = totalParentSize * (size / totalContentSize);\r\n\t\t\tconst flexGrow = newSize / totalParentSize;\r\n\t\t\tpanel.style.flex = `${flexGrow} ${flexGrow} 0`;\r\n\t\t});\r\n\t};\r\n}\r\n\r\nif (!customElements.get('nine-splitter')) {\r\n\tcustomElements.define(\"nine-splitter\", UxSplitter);\r\n}","// 1. 기존 core 모듈\r\nimport { NineUtil } from './ux/dialog/NineUtil.js';\r\nimport { nine, subscribeConfig, config } from './core/Config.js';\r\nimport { Trace, trace } from './core/Trace.js';\r\nimport { TaskDebouncer } from './core/TaskDebouncer.js';\r\n\r\n// 2. 신규 net 및 ux 모듈 추가\r\nimport { api, Fetch } from './net/Fetch.js';\r\nimport { Loading } from './ux/Loading.js';\r\n\r\nimport { nineDialog } from './ux/dialog/nineDialog.js';\r\nimport { nineConfirmPopup, nineAlertPopup } from './ux/dialog/nineConfirm.js';\r\nimport { ninePromptPopup } from './ux/dialog/ninePrompt.js';\r\n\r\nimport { safe } from \"./utils/promise.js\"; // 경로에 맞춰 임포트\r\n// ux\r\nimport './ux/UxSplitter.js';\r\n\r\nconst utilInstance = new NineUtil();\r\nnine.alert = utilInstance.alert.bind(utilInstance);\r\nnine.confirm = utilInstance.confirm.bind(utilInstance);\r\nnine.prompt = utilInstance.prompt.bind(utilInstance);\r\nnine.formatDate = utilInstance.formatDate.bind(utilInstance);\r\n\r\nnine.safe = safe;\r\n\r\n// 기존 nine 객체(Config)와 Util 기능을 합성\r\n//Object.assign(nine, utilInstance);\r\n\r\nnine.api = api;\r\nnine.trace = trace;\r\nnine.subscribeConfig = subscribeConfig;\r\nnine.config = config || {};\r\n\r\nexport {\r\n\tnine,\r\n\tsubscribeConfig,\r\n\tconfig,\r\n\tNineUtil,\r\n\tTrace,\r\n\ttrace,\r\n\tTaskDebouncer,\r\n\tapi, // 🚀 추가: 이제 서비스에서 api.get() 가능\r\n\tFetch, // 🚀 추가: 클래스 자체도 혹시 모르니 노출\r\n\tLoading as loading, // 🚀 추가: loading.show() 로 쓰기 편하게 alias\r\n\tnineDialog,\r\n\tnineAlertPopup, nineConfirmPopup, ninePromptPopup\r\n};\r\n\r\nif (typeof window !== 'undefined') {\r\n\twindow.nine = nine;\r\n}\r\n","/**\r\n * 비동기 함수를 try-catch 없이 안전하게 실행하게 도와주는 유틸리티\r\n * @param {Promise} promise\r\n * @returns {Promise<[any, Error|null]>}\r\n */\r\nexport const safe = async (promise) => {\r\n\ttry {\r\n\t\tconst data = await promise;\r\n\t\treturn [data, null];\r\n\t} catch (err) {\r\n\t\treturn [null, err];\r\n\t}\r\n};"],"names":["nineDialog","HTMLElement","constructor","super","__privateAdd","this","_shift","_dialog","__publicField","__privateGet","showModal","close","remove","_init","head","querySelector","addEventListener","_onMouseDown","_onTouchStart","querySelectorAll","forEach","btn","onclick","closeWithAnimation","e","target","closest","button","altKey","ctrlKey","shiftKey","rect","getBoundingClientRect","__privateSet","x","clientX","left","y","clientY","top","onMouseMove","ev","style","position","margin","onMouseUp","document","removeEventListener","touch","changedTouches","pageX","pageY","onTouchMove","t","onTouchEnd","connectedCallback","v","innerHTML","titleText","getAttribute","call","returnValue","classList","add","setTimeout","dispatchEvent","CustomEvent","detail","WeakMap","BasePopup","attachShadow","mode","open","PopupClass","message","title","options","renderFn","tagName","toLowerCase","config","class","animation","_c","_a","window","nine","_b","ux","replace","el","createElement","body","appendChild","dialogComp","shadowRoot","setAttribute","Promise","resolve","setupEvents","customElements","get","define","_nineConfirmPopup","render","m","o","msg","conf","nineConfirmPopup","_nineAlertPopup","nineAlertPopup","_ninePromptPopup","trace","log","textarea","value","requestAnimationFrame","focus","ninePromptPopup","n","r","i","s","u","a","c","f","h","d","l","$","M","name","weekdays","split","months","ordinal","String","length","Array","join","z","utcOffset","Math","abs","floor","date","year","month","clone","ceil","p","w","D","ms","Q","g","S","_","O","args","arguments","b","locale","$L","utc","$u","$x","$offset","parse","prototype","$d","Date","NaN","test","match","substring","UTC","init","$y","getFullYear","$M","getMonth","$D","getDate","$W","getDay","$H","getHours","$m","getMinutes","$s","getSeconds","$ms","getMilliseconds","$utils","isValid","toString","isSame","startOf","endOf","isAfter","isBefore","$g","set","unix","valueOf","getTime","toDate","apply","slice","$locale","weekStart","$set","min","daysInMonth","Number","round","subtract","format","invalidDate","meridiem","monthsShort","weekdaysMin","weekdaysShort","getTimezoneOffset","diff","toJSON","toISOString","toUTCString","Y","extend","$i","isDayjs","en","Ls","NineUtil","_NineUtil_instances","fmt","dayjs","alert","__privateMethod","prepare_fn","confirm","prompt","WeakSet","type","defaultClass","isExecuted","popup","runner","rgb","classic","shake","run","zoom","then","reject","listeners","Set","_initialConfig","nativeOverride","theme","board","readOnly","cssPath","debug","__NINE_GLOBAL_CONFIG__","_config","subscribeConfig","fn","delete","Proxy","prop","setup","Object","entries","key","isArray","Trace$1","color","_Trace_instances","_name","_color","_enabled","autoConfig_fn","initBAK","console","bind","warn","error","enable","disable","location","hostname","startsWith","Trace","_timer","_queue","_delay","_TaskDebouncer_instances","flush_fn","tasks","splice","seen","task","identifier","func","JSON","stringify","has","traceOrigin","Loading","show","overlay","getElementById","id","cssText","display","hide","_Fetch","_request","__API_BASE_URL__","method","url","data","showLoading","finalUrl","BASE_URL","headers","FormData","targetUrl","URLSearchParams","fetch","async","res","ok","text","Error","status","json","catch","err","finally","rows","fileKey","filePartName","jsonPartName","chunkSize","totalCount","lastResponse","formData","chunk","rowDataList","row","fileObj","_fileObj","rest","push","File","append","jsonBlob","Blob","post","success","Fetch","api","UxSplitter","_mode","_detectMode","prev","previousElementSibling","next","nextElementSibling","contains","prevRect","nextRect","_startDrag","preventDefault","stopPropagation","splitterRect","isHorizontal","clickOffset","dragBar","className","assign","zIndex","background","opacity","pointerEvents","root","getRootNode","composed","parent","ShadowRoot","host","parentElement","dragBarOffsetParentRect","offsetParent","initialSplitterPosInParent","width","height","mixBlendMode","minLimit","maxLimit","right","bottom","onMove","moveEvent","clientPos","currentPosInParent","clampedPos","max","onUp","allChildren","from","children","allPanels","filter","getComputedStyle","gapValue","getPropertyValue","gapSize","parseFloat","totalGapSize","dragOffset","prevSize","nextSize","newPrevSize","newNextSize","initialSizes","map","panel","totalSplitterSize","reduce","sum","child","totalFlexSpace","flexSum","index","newSize","newFlexBasis","flex","contents","trim","gripTmpl","htmlTmpl","content","cloneNode","_prepareLayout","parentRect","totalContentSize","totalParentSize","size","flexGrow","utilInstance","formatDate","safe","promise","delay","exec","clearTimeout","execWithKey"],"mappings":"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","x_google_ignoreList":[3]}
1
+ {"version":3,"file":"nine-util.umd.js","sources":["../src/ux/dialog/nineDialog.js","../src/ux/dialog/nineConfirm.js","../src/ux/dialog/ninePrompt.js","../node_modules/dayjs/dayjs.min.js","../src/ux/dialog/NineUtil.js","../src/core/Config.js","../src/core/Trace.js","../src/core/TaskDebouncer.js","../src/external/NoPeer.js","../src/ux/Loading.js","../src/net/Fetch.js","../src/ux/UxSplitter.js","../src/index.js","../src/utils/promise.js"],"sourcesContent":["import { dialogStyles } from './style.dialog.js';\n\nexport class nineDialog extends HTMLElement\n{\n\t#shift;\n\t#dialog;\n\n\n\tconstructor () {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\n\t\tconst v = this.innerHTML;\n\t\tconst titleText = this.getAttribute(\"subject\") || \"Details\";\n\n\t\t//trace.log(dialogStyles);\n\n\t\tthis.innerHTML = `\n\t\t\t<style>${dialogStyles}</style>\n\t\t\n\t\t\t<dialog>\n\t\t\t\t<div class=\"head\">\n\t\t\t\t\t<div class=\"rect1\"></div>\n\t\t\t\t\t<div class=\"rect2\"></div>\n\t\t\t\t\t<div class=\"rect3\"></div>\n\t\t\t\t\t<ng-sphere class=\"icon\" end-fill=\"#666\" size=\"8\"></ng-sphere>\n\t\t\t\t\t<span class=\"title\">${titleText}</span>\n\t\t\t\t\t<span class=\"sub-title\"></span>\n\t\t\t\t\t<div class=\"buttons\">\n\t\t\t\t\t\t<ng-sphere class=\"apply\" start-fill=\"#cc6\" end-fill=\"#660\" size=\"16\" title=\"apply\"></ng-sphere>\n\t\t\t\t\t\t<ng-sphere class=\"reset\" start-fill=\"#99f\" end-fill=\"#00f\" size=\"16\" title=\"reset\"></ng-sphere>\n\t\t\t\t\t\t<ng-sphere class=\"close\" start-fill=\"#f99\" end-fill=\"#f00\" size=\"16\" title=\"close\"></ng-sphere>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"contents\">\n\t\t\t\t\t<div class=\"left\">\n\t\t\t\t\t\t<span>가나다라마바사아자차카타파하가나다라마바사아자차카타파하가나다라마바사아자차카타파하가나다라마바사아자차카타파하가나다라마바사아자차카타파하가나다라마바사아자차카타파하가나다라마바사아자차카타파하가나다라마바사아자차카타파하</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"body\">\n\t\t\t\t\t\t${v}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"close2\">\n\t\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n\t\t\t\t\t\t\t<path d=\"M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708\"/>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</dialog>\n\t\t`;\n\n\t\t//this.#owner = this.getRootNode().host.closest(\"nine-grid\");\n\n\t\t//$(\".title\", this).html(\"Details\");\n\n\t\tthis.#dialog = this.querySelector('dialog');\n\t\tthis.#init();\n\t};\n\n\tshowModal = () => {\n\t\tthis.#dialog.showModal();\n\t};\n\n\tclose = () => {\n\t\t// 이벤트 리스너 제거 (표준 방식은 핸들러 참조가 필요하지만,\n\t\t// 여기서는 요소가 사라지므로 메모리 관리를 위해 정리)\n\t\tthis.#dialog.close();\n\t\tthis.remove();\n\t};\n\n\t#init = () => {\n\t\tconst head = this.querySelector('.head');\n\n\t\tif (head) {\n\t\t\thead.addEventListener('mousedown', this.#onMouseDown);\n\t\t\thead.addEventListener('touchstart', this.#onTouchStart);\n\n\t\t\t// 마우스 커서를 드래그 가능 아이콘(이동 십자가) 모양으로 변경하여 UX 개선\n\t\t\t//head.style.cursor = 'move';\n\t\t}\n\n\t\t// 1. 모든 닫기 성격의 버튼 (.close, .close2, .cancel) 공통 처리\n\t\tthis.querySelectorAll('.close, .close2, .cancel').forEach(btn => {\n\t\t\tbtn.onclick = () => this.closeWithAnimation(null); // 취소/닫기는 null 리턴\n\t\t});\n\n\t\t// 2. 확인 버튼 (.ok) 처리\n\t\t// 확인 버튼은 텍스트 입력값 등 데이터가 필요하므로\n\t\t// 실제 데이터 추출은 각 팝업 클래스(prompt 등)에서 하되,\n\t\t// 닫기 애니메이션 실행은 여기서 담당하도록 가이드합니다.\n\t\tthis.querySelectorAll('.ok').forEach(btn => {\n\t\t\t// .ok 버튼의 로직은 각 팝업의 setupEvents에서 덮어쓰거나\n\t\t\t// 델리게이트 이벤트를 통해 처리합니다.\n\t\t});\n\n\t\t// 드래그 로직 생략...\n\t};\n\n\t// --- 드래그 로직 (Vanilla JS) ---\n\t#onMouseDown = e => {\n\n\t\tif (e.target.closest(\"buttons\")) return;\n\t\tif (e.button !== 0 || e.altKey || e.ctrlKey || e.shiftKey) return;\n\n\t\tconst rect = this.#dialog.getBoundingClientRect();\n\t\tthis.#shift = {\n\t\t\tx: e.clientX - rect.left,\n\t\t\ty: e.clientY - rect.top\n\t\t};\n\n\t\tconst onMouseMove = (ev) => {\n\t\t\tthis.#dialog.style.position = 'fixed';\n\t\t\tthis.#dialog.style.margin = '0';\n\t\t\tthis.#dialog.style.left = `${ev.clientX - this.#shift.x}px`;\n\t\t\tthis.#dialog.style.top = `${ev.clientY - this.#shift.y}px`;\n\t\t};\n\n\t\tconst onMouseUp = () => {\n\t\t\tdocument.removeEventListener('mousemove', onMouseMove);\n\t\t\tdocument.removeEventListener('mouseup', onMouseUp);\n\t\t};\n\n\t\tdocument.addEventListener('mousemove', onMouseMove);\n\t\tdocument.addEventListener('mouseup', onMouseUp);\n\t};\n\n\t#onTouchStart = e => {\n\t\tif (e.target.closest(\"buttons\")) return;\n\n\t\tconst rect = this.#dialog.getBoundingClientRect();\n\t\tconst touch = e.changedTouches[0];\n\t\tthis.#shift = {\n\t\t\tx: touch.pageX - rect.left,\n\t\t\ty: touch.pageY - rect.top\n\t\t};\n\n\t\tconst onTouchMove = (ev) => {\n\t\t\tconst t = ev.changedTouches[0];\n\t\t\tthis.#dialog.style.position = 'fixed';\n\t\t\tthis.#dialog.style.margin = '0';\n\t\t\tthis.#dialog.style.left = `${t.pageX - this.#shift.x}px`;\n\t\t\tthis.#dialog.style.top = `${t.pageY - this.#shift.y}px`;\n\t\t};\n\n\t\tconst onTouchEnd = () => {\n\t\t\tdocument.removeEventListener('touchmove', onTouchMove);\n\t\t\tdocument.removeEventListener('touchend', onTouchEnd);\n\t\t};\n\n\t\tdocument.addEventListener('touchmove', onTouchMove);\n\t\tdocument.addEventListener('touchend', onTouchEnd);\n\t};\n\n\tcloseWithAnimation(returnValue) {\n\t\tthis.#dialog.classList.add(\"out\"); // 퇴장 애니메이션 시작\n\n\t\t// 애니메이션(0.3s)이 끝난 후 제거 및 이벤트 발생\n\t\tsetTimeout(() => {\n\t\t\tthis.#dialog.close();\n\t\t\t// 부모(BasePopup)에게 작업 완료와 결과값을 알림\n\t\t\tthis.dispatchEvent(new CustomEvent('closed', { detail: returnValue }));\n\t\t\tthis.remove();\n\t\t}, 300);\n\t}\n}\n\n// BasePopup.js\nexport class BasePopup extends HTMLElement {\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.attachShadow({ mode: 'open' });\n\t}\n\n\tstatic async open(PopupClass, message, title, options, renderFn) {\n\t\t// 1. 설정 병합\n\t\tconst tagName = PopupClass.tagName.toLowerCase();\n\t\tconst config = {\n\t\t\t\"true-text\": \"확인\",\n\t\t\t\"false-text\": \"취소\",\n\t\t\tclass: \"classic\",\n\t\t\tanimation: \"fade\",\n\t\t\t...(window.nine?.config?.ux?.[tagName.replace('nine-', '').replace('-popup', '')] || {}),\n\t\t\t...options\n\t\t};\n\n\t\t// 2. 중복 제거 및 엘리먼트 생성\n\t\tdocument.querySelectorAll(tagName).forEach(el => el.remove());\n\t\tconst el = document.createElement(tagName);\n\t\tif (config.class) el.classList.add(config.class);\n\t\tif (config.animation) el.classList.add(config.animation);\n\t\tdocument.body.appendChild(el);\n\n\t\t// 3. 렌더링 (각 팝업의 UI 그리기)\n\t\trenderFn(el, message, config);\n\n\t\tconst dialogComp = el.shadowRoot.querySelector(\"nine-dialog\");\n\t\tif (title) dialogComp.setAttribute(\"subject\", title);\n\n\t\treturn new Promise((resolve) => {\n\t\t\t// [중요] nine-dialog의 애니메이션이 끝난 후 던지는 이벤트를 수신\n\t\t\tdialogComp.addEventListener('closed', (e) => resolve(e.detail));\n\n\t\t\t// 각 팝업 클래스에서 버튼 클릭 시 dialogComp.closeWithAnimation(값)을\n\t\t\t// 호출하도록 이벤트를 바인딩해줌\n\t\t\tel.setupEvents(resolve, dialogComp);\n\n\t\t\tdialogComp.showModal();\n\t\t});\n\t}\n}\n\nif (!customElements.get('nine-dialog')) {\n\tcustomElements.define(\"nine-dialog\", nineDialog);\n}\n","import { BasePopup } from \"./nineDialog.js\";\n\nexport class nineConfirmPopup extends BasePopup {\n\tstatic tagName = 'nine-confirm-popup';\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\n\trender(message, config) {\n\t\tthis.shadowRoot.innerHTML = `\n <nine-dialog>\n <div class=\"msg\">${message.replace(/\\n/g, \"<br/>\")}</div>\n <div class=\"buttons-confirm\">\n <button class=\"cancel\">${config[\"false-text\"]}</button>\n <button class=\"ok\">${config[\"true-text\"]}</button>\n </div>\n </nine-dialog>`;\n\t}\n\n\tsetupEvents(resolve, dialogComp) {\n\t\tthis.shadowRoot.querySelector(\".ok\").onclick = () => dialogComp.closeWithAnimation(true);\n\t\t// 취소는 nine-dialog 내부 기본 로직(closeWithAnimation(null))이 처리함\n\t}\n\n\tstatic confirm = (m, t, o) => BasePopup.open(nineConfirmPopup, m, t, o, (el, msg, conf) => el.render(msg, conf));\n}\n\n// --- 3. ALERT (단순 알림) ---\nexport class nineAlertPopup extends BasePopup {\n\tstatic tagName = 'nine-alert-popup';\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\trender(message, config) {\n\t\tthis.shadowRoot.innerHTML = `\n <nine-dialog>\n <div class=\"msg\">${message.replace(/\\n/g, \"<br/>\")}</div>\n <div class=\"buttons-confirm\">\n <button class=\"cancel\">확인</button>\n </div>\n </nine-dialog>`;\n\t}\n\n\tsetupEvents(resolve, dialogComp) {\n\t\t// 얼럿은 취소 버튼 하나만 두거나, 확인 버튼이 cancel 역할을 수행하게 함\n\t}\n\n\tstatic alert = (m, t, o) => BasePopup.open(nineAlertPopup, m, t, o, (el, msg, conf) => el.render(msg, conf));\n}\n\n// Custom Element 등록\nif (!customElements.get('nine-confirm-popup')) customElements.define('nine-confirm-popup', nineConfirmPopup);\nif (!customElements.get('nine-alert-popup')) customElements.define(\"nine-alert-popup\", nineAlertPopup);","import { BasePopup } from \"./nineDialog.js\";\n\n/**\n *\n */\nexport class ninePromptPopup extends BasePopup {\n\tstatic tagName = 'nine-prompt-popup';\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\trender(message, config) {\n\n\t\ttrace.log(this);\n\t\ttrace.log(this.shadowRoot);\n\n\t\tthis.shadowRoot.innerHTML = `\n\t\t\t<style>\n\t\t\t\tdialog {\n\t\t\t\t\theight: 300px !important;\n\t\t\t\t}\n\t\t\t\t.msg {\n\t\t\t\t\theight: unset !important;\n\t\t\t\t}\n\t\t\t</style>\n\t\t\t\n <nine-dialog>\n <div class=\"msg\">${message.replace(/\\n/g, \"<br/>\")}</div>\n <div class=\"input-area\">\n <textarea placeholder=\"내용을 입력하세요...\"></textarea>\n </div>\n <div class=\"buttons-confirm\">\n <button class=\"cancel\">${config[\"false-text\"]}</button>\n <button class=\"ok\">${config[\"true-text\"]}</button>\n </div>\n </nine-dialog>`;\n\t}\n\n\tsetupEvents(resolve, dialogComp) {\n\t\tconst textarea = this.shadowRoot.querySelector(\"textarea\");\n\t\tconst okBtn = this.shadowRoot.querySelector(\".ok\");\n\n\t\t// 확인 버튼 클릭 시 textarea 값을 가지고 애니메이션 닫기\n\t\tokBtn.onclick = () => dialogComp.closeWithAnimation(textarea.value);\n\n\t\t// 렌더링 후 포커스\n\t\trequestAnimationFrame(() => textarea.focus());\n\t}\n\n\tstatic prompt = (m, t, o) => BasePopup.open(ninePromptPopup, m, t, o, (el, msg, conf) => el.render(msg, conf));\n}\n\nif (!customElements.get('nine-prompt-popup')) {\n\tcustomElements.define('nine-prompt-popup', ninePromptPopup);\n}","!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs=e()}(this,(function(){\"use strict\";var t=1e3,e=6e4,n=36e5,r=\"millisecond\",i=\"second\",s=\"minute\",u=\"hour\",a=\"day\",o=\"week\",c=\"month\",f=\"quarter\",h=\"year\",d=\"date\",l=\"Invalid Date\",$=/^(\\d{4})[-/]?(\\d{1,2})?[-/]?(\\d{0,2})[Tt\\s]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?[.:]?(\\d+)?$/,y=/\\[([^\\]]+)]|YYYY|YY|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,M={name:\"en\",weekdays:\"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday\".split(\"_\"),months:\"January_February_March_April_May_June_July_August_September_October_November_December\".split(\"_\"),ordinal:function(t){var e=[\"th\",\"st\",\"nd\",\"rd\"],n=t%100;return\"[\"+t+(e[(n-20)%10]||e[n]||e[0])+\"]\"}},m=function(t,e,n){var r=String(t);return!r||r.length>=e?t:\"\"+Array(e+1-r.length).join(n)+t},v={s:m,z:function(t){var e=-t.utcOffset(),n=Math.abs(e),r=Math.floor(n/60),i=n%60;return(e<=0?\"+\":\"-\")+m(r,2,\"0\")+\":\"+m(i,2,\"0\")},m:function t(e,n){if(e.date()<n.date())return-t(n,e);var r=12*(n.year()-e.year())+(n.month()-e.month()),i=e.clone().add(r,c),s=n-i<0,u=e.clone().add(r+(s?-1:1),c);return+(-(r+(n-i)/(s?i-u:u-i))||0)},a:function(t){return t<0?Math.ceil(t)||0:Math.floor(t)},p:function(t){return{M:c,y:h,w:o,d:a,D:d,h:u,m:s,s:i,ms:r,Q:f}[t]||String(t||\"\").toLowerCase().replace(/s$/,\"\")},u:function(t){return void 0===t}},g=\"en\",D={};D[g]=M;var p=\"$isDayjsObject\",S=function(t){return t instanceof _||!(!t||!t[p])},w=function t(e,n,r){var i;if(!e)return g;if(\"string\"==typeof e){var s=e.toLowerCase();D[s]&&(i=s),n&&(D[s]=n,i=s);var u=e.split(\"-\");if(!i&&u.length>1)return t(u[0])}else{var a=e.name;D[a]=e,i=a}return!r&&i&&(g=i),i||!r&&g},O=function(t,e){if(S(t))return t.clone();var n=\"object\"==typeof e?e:{};return n.date=t,n.args=arguments,new _(n)},b=v;b.l=w,b.i=S,b.w=function(t,e){return O(t,{locale:e.$L,utc:e.$u,x:e.$x,$offset:e.$offset})};var _=function(){function M(t){this.$L=w(t.locale,null,!0),this.parse(t),this.$x=this.$x||t.x||{},this[p]=!0}var m=M.prototype;return m.parse=function(t){this.$d=function(t){var e=t.date,n=t.utc;if(null===e)return new Date(NaN);if(b.u(e))return new Date;if(e instanceof Date)return new Date(e);if(\"string\"==typeof e&&!/Z$/i.test(e)){var r=e.match($);if(r){var i=r[2]-1||0,s=(r[7]||\"0\").substring(0,3);return n?new Date(Date.UTC(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)):new Date(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)}}return new Date(e)}(t),this.init()},m.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},m.$utils=function(){return b},m.isValid=function(){return!(this.$d.toString()===l)},m.isSame=function(t,e){var n=O(t);return this.startOf(e)<=n&&n<=this.endOf(e)},m.isAfter=function(t,e){return O(t)<this.startOf(e)},m.isBefore=function(t,e){return this.endOf(e)<O(t)},m.$g=function(t,e,n){return b.u(t)?this[e]:this.set(n,t)},m.unix=function(){return Math.floor(this.valueOf()/1e3)},m.valueOf=function(){return this.$d.getTime()},m.startOf=function(t,e){var n=this,r=!!b.u(e)||e,f=b.p(t),l=function(t,e){var i=b.w(n.$u?Date.UTC(n.$y,e,t):new Date(n.$y,e,t),n);return r?i:i.endOf(a)},$=function(t,e){return b.w(n.toDate()[t].apply(n.toDate(\"s\"),(r?[0,0,0,0]:[23,59,59,999]).slice(e)),n)},y=this.$W,M=this.$M,m=this.$D,v=\"set\"+(this.$u?\"UTC\":\"\");switch(f){case h:return r?l(1,0):l(31,11);case c:return r?l(1,M):l(0,M+1);case o:var g=this.$locale().weekStart||0,D=(y<g?y+7:y)-g;return l(r?m-D:m+(6-D),M);case a:case d:return $(v+\"Hours\",0);case u:return $(v+\"Minutes\",1);case s:return $(v+\"Seconds\",2);case i:return $(v+\"Milliseconds\",3);default:return this.clone()}},m.endOf=function(t){return this.startOf(t,!1)},m.$set=function(t,e){var n,o=b.p(t),f=\"set\"+(this.$u?\"UTC\":\"\"),l=(n={},n[a]=f+\"Date\",n[d]=f+\"Date\",n[c]=f+\"Month\",n[h]=f+\"FullYear\",n[u]=f+\"Hours\",n[s]=f+\"Minutes\",n[i]=f+\"Seconds\",n[r]=f+\"Milliseconds\",n)[o],$=o===a?this.$D+(e-this.$W):e;if(o===c||o===h){var y=this.clone().set(d,1);y.$d[l]($),y.init(),this.$d=y.set(d,Math.min(this.$D,y.daysInMonth())).$d}else l&&this.$d[l]($);return this.init(),this},m.set=function(t,e){return this.clone().$set(t,e)},m.get=function(t){return this[b.p(t)]()},m.add=function(r,f){var d,l=this;r=Number(r);var $=b.p(f),y=function(t){var e=O(l);return b.w(e.date(e.date()+Math.round(t*r)),l)};if($===c)return this.set(c,this.$M+r);if($===h)return this.set(h,this.$y+r);if($===a)return y(1);if($===o)return y(7);var M=(d={},d[s]=e,d[u]=n,d[i]=t,d)[$]||1,m=this.$d.getTime()+r*M;return b.w(m,this)},m.subtract=function(t,e){return this.add(-1*t,e)},m.format=function(t){var e=this,n=this.$locale();if(!this.isValid())return n.invalidDate||l;var r=t||\"YYYY-MM-DDTHH:mm:ssZ\",i=b.z(this),s=this.$H,u=this.$m,a=this.$M,o=n.weekdays,c=n.months,f=n.meridiem,h=function(t,n,i,s){return t&&(t[n]||t(e,r))||i[n].slice(0,s)},d=function(t){return b.s(s%12||12,t,\"0\")},$=f||function(t,e,n){var r=t<12?\"AM\":\"PM\";return n?r.toLowerCase():r};return r.replace(y,(function(t,r){return r||function(t){switch(t){case\"YY\":return String(e.$y).slice(-2);case\"YYYY\":return b.s(e.$y,4,\"0\");case\"M\":return a+1;case\"MM\":return b.s(a+1,2,\"0\");case\"MMM\":return h(n.monthsShort,a,c,3);case\"MMMM\":return h(c,a);case\"D\":return e.$D;case\"DD\":return b.s(e.$D,2,\"0\");case\"d\":return String(e.$W);case\"dd\":return h(n.weekdaysMin,e.$W,o,2);case\"ddd\":return h(n.weekdaysShort,e.$W,o,3);case\"dddd\":return o[e.$W];case\"H\":return String(s);case\"HH\":return b.s(s,2,\"0\");case\"h\":return d(1);case\"hh\":return d(2);case\"a\":return $(s,u,!0);case\"A\":return $(s,u,!1);case\"m\":return String(u);case\"mm\":return b.s(u,2,\"0\");case\"s\":return String(e.$s);case\"ss\":return b.s(e.$s,2,\"0\");case\"SSS\":return b.s(e.$ms,3,\"0\");case\"Z\":return i}return null}(t)||i.replace(\":\",\"\")}))},m.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},m.diff=function(r,d,l){var $,y=this,M=b.p(d),m=O(r),v=(m.utcOffset()-this.utcOffset())*e,g=this-m,D=function(){return b.m(y,m)};switch(M){case h:$=D()/12;break;case c:$=D();break;case f:$=D()/3;break;case o:$=(g-v)/6048e5;break;case a:$=(g-v)/864e5;break;case u:$=g/n;break;case s:$=g/e;break;case i:$=g/t;break;default:$=g}return l?$:b.a($)},m.daysInMonth=function(){return this.endOf(c).$D},m.$locale=function(){return D[this.$L]},m.locale=function(t,e){if(!t)return this.$L;var n=this.clone(),r=w(t,e,!0);return r&&(n.$L=r),n},m.clone=function(){return b.w(this.$d,this)},m.toDate=function(){return new Date(this.valueOf())},m.toJSON=function(){return this.isValid()?this.toISOString():null},m.toISOString=function(){return this.$d.toISOString()},m.toString=function(){return this.$d.toUTCString()},M}(),Y=_.prototype;return O.prototype=Y,[[\"$ms\",r],[\"$s\",i],[\"$m\",s],[\"$H\",u],[\"$W\",a],[\"$M\",c],[\"$y\",h],[\"$D\",d]].forEach((function(t){Y[t[1]]=function(e){return this.$g(e,t[0],t[1])}})),O.extend=function(t,e){return t.$i||(t(e,_,O),t.$i=!0),O},O.locale=w,O.isDayjs=S,O.unix=function(t){return O(1e3*t)},O.en=D[g],O.Ls=D,O.p={},O}));","// src/core/NineUtil.js\r\nimport { nineAlertPopup, nineConfirmPopup } from './nineConfirm.js';\r\nimport { ninePromptPopup } from \"./ninePrompt.js\";\r\nimport dayjs from 'dayjs';\r\n\r\nexport class NineUtil {\r\n\t// static 필드는 클래스 자체에 저장됨\r\n\tstatic cssPath = \"\";\r\n\r\n\t/**\r\n\t * 팝업 준비 로직 (Private 메서드)\r\n\t */\r\n\t#prepare(type, message, title, defaultClass) {\r\n\r\n\t\tconst options = { class: defaultClass, animation: 'fade' };\r\n\t\t//const popup = type === 'alert' ? nineAlertPopup : (type === 'confirm' ? nineConfirmPopup : ninePromptPopup);\r\n\t\tlet isExecuted = false;\r\n\r\n\t\tconst popupMap = {\r\n\t\t\talert: nineAlertPopup,\r\n\t\t\tconfirm: nineConfirmPopup,\r\n\t\t\tprompt: ninePromptPopup\r\n\t\t};\r\n\r\n\t\tconst popup = popupMap[type];\r\n\r\n\t\tconst runner = {\r\n\t\t\trgb: () => { options.class = 'rgb'; return runner; },\r\n\t\t\tclassic: () => { options.class = 'classic'; return runner; },\r\n\t\t\tshake: () => { options.animation = 'shake'; return runner; },\r\n\t\t\trun: () => { options.animation = 'roadRunner'; return runner; },\r\n\t\t\tzoom: () => { options.animation = 'zoom'; return runner; },\r\n\r\n\t\t\tthen: (resolve, reject) => {\r\n\t\t\t\tisExecuted = true;\r\n\t\t\t\treturn popup[type](message, title, options).then(resolve, reject);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t// Microtask: 동기 체이닝이 모두 끝난 후 실행\r\n\t\tPromise.resolve().then(() => {\r\n\t\t\tif (!isExecuted) {\r\n\t\t\t\tisExecuted = true;\r\n\t\t\t\tpopup[type](message, title, options);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn runner;\r\n\t}\r\n\r\n\talert = (message, title = \"Alert\") => {\r\n\t\treturn this.#prepare('alert', message, title, 'classic');\r\n\t}\r\n\r\n\tconfirm = (message, title = \"Confirm\") => {\r\n\t\treturn this.#prepare('confirm', message, title, 'classic');\r\n\t}\r\n\r\n\tprompt = (message, title = \"Prompt\") => {\r\n\t\treturn this.#prepare('prompt', message, title, 'classic');\r\n\t}\r\n\r\n\tformatDate = (v, fmt) => {\r\n\t\treturn dayjs(v).format(fmt)\r\n\t}\r\n}","const listeners = new Set();\r\n\r\n// 💡 [핵심] 전역 저장소를 단일화합니다.\r\n// window에 이미 있으면 그것을 쓰고, 없으면 초기값을 생성하여 등록합니다.\r\nconst _initialConfig = {\r\n\tux: { nativeOverride: false, theme: 'light' },\r\n\tboard: { readOnly: false },\r\n\tcssPath: \"\",\r\n\tdebug: false\r\n};\r\n\r\nif (typeof window !== 'undefined' && !window.__NINE_GLOBAL_CONFIG__) {\r\n\twindow.__NINE_GLOBAL_CONFIG__ = _initialConfig;\r\n}\r\n\r\n// 이제 모든 모듈의 _config는 동일한 window 객체 메모리를 가리킵니다.\r\nconst _config = typeof window !== 'undefined' ? window.__NINE_GLOBAL_CONFIG__ : _initialConfig;\r\n\r\nexport const subscribeConfig = (fn) => {\r\n\tlisteners.add(fn);\r\n\tfn('all', _config);\r\n\treturn () => listeners.delete(fn);\r\n};\r\n\r\n// Proxy 역시 전역 저장소인 _config를 조작합니다.\r\nexport const config = new Proxy(_config, {\r\n\tset(target, prop, value) {\r\n\t\ttarget[prop] = value;\r\n\t\tlisteners.forEach(fn => fn(prop, target));\r\n\t\treturn true;\r\n\t},\r\n\tget(target, prop) {\r\n\t\treturn target[prop];\r\n\t}\r\n});\r\n\r\nexport const nine = {\r\n\tconfig: config,\r\n\r\n\t// Getter에서 window.nine까지 확인할 필요도 없습니다.\r\n\t// 이미 config 자체가 전역 저장소(__NINE_GLOBAL_CONFIG__)를 바라보고 있기 때문입니다.\r\n\tget cssPath() {\r\n\t\treturn this.config.cssPath || \"\";\r\n\t},\r\n\r\n\tsetup(options = {}) {\r\n\t\tObject.entries(options).forEach(([key, value]) => {\r\n\t\t\t// 깊은 병합 지원\r\n\t\t\tif (typeof value === 'object' && value !== null && !Array.isArray(value)) {\r\n\t\t\t\tthis.config[key] = { ...this.config[key], ...value };\r\n\t\t\t} else {\r\n\t\t\t\tthis.config[key] = value;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// 다른 모듈에서 window.nine으로 접근할 수 있도록 보장\r\n\t\tif (typeof window !== 'undefined') {\r\n\t\t\twindow.nine = window.nine || this;\r\n\t\t}\r\n\t}\r\n};","export class Trace {\r\n\t#name;\r\n\t#color;\r\n\t#enabled = true;\r\n\r\n\tconstructor(name = null, color = \"green\") {\r\n\t\tthis.#name = name;\r\n\t\tthis.#color = color;\r\n\t\tthis.#autoConfig();\r\n\t\t/**\r\n\t\t// 1. 쪼개진 인스턴스들을 하나로 합치는 '본드' 역할 (이게 핵심!)\r\n\t\tif (typeof window !== 'undefined' && window.__NINE_TRACE__) {\r\n\t\t\treturn window.__NINE_TRACE__;\r\n\t\t}\r\n\t\tthis.#autoConfig();\r\n\t\tif (typeof window !== 'undefined') window.__NINE_TRACE__ = this;\r\n\t\t\t*/\r\n\t}\r\n\r\n\t#autoConfig() {\r\n\t\tif (typeof window === 'undefined') return;\r\n\t\tconst isLocal = window.location.hostname === 'localhost' ||\r\n\t\t\twindow.location.hostname === '127.0.0.1' ||\r\n\t\t\twindow.location.hostname.startsWith('192.168.');\r\n\r\n\t\tif (isLocal) {\r\n\t\t\tthis.enable();\r\n\t\t} else {\r\n\t\t\tthis.disable();\r\n\t\t\tconsole.log(\r\n\t\t\t\t`%c[${this.#name || 'Trace'}]%c 운영 모드: 로그 비활성화. %ctrace.enable()%c 로 활성화 가능`,\r\n\t\t\t\t\"color: #4CAF50; font-weight: bold;\", \"\",\r\n\t\t\t\t\"background: #333; color: yellow; padding: 2px 5px;\", \"\"\r\n\t\t\t);\r\n\t\t}\r\n\t}\r\n\r\n\t// 🟢 빼먹었던 init 메서드 다시 추가!\r\n\tinitBAK(name, color = \"green\") {\r\n\t\tthis.#name = name;\r\n\t\tthis.#color = color;\r\n\t}\r\n\r\n\tinit(name, color = \"green\") {\r\n\t\t//const style = `color: ${color}; font-weight: bold;`;\r\n\t\tthis.#name = name;\r\n\t\tthis.#color = color;\r\n\r\n\t\treturn this;\r\n\t\t/**\r\n\t\tconsole.log(name, color);\r\n\t\treturn {\r\n\t\t\tlog: console.log.bind(console, `%c[${name}]`, style),\r\n\t\t\twarn: console.warn.bind(console, `%c[${name}]`, \"color: cyan; font-weight: bold;\"),\r\n\t\t\terror: console.error.bind(console, `%c[${name}]`, \"color: red; font-weight: bold;\")\r\n\t\t}; */\r\n\t}\r\n\r\n\t//get log() { return console.log.bind(console); }\r\n\r\n\t// 🔴 핵심: 소스 위치를 호출부로 찍어주는 Getter 로직\r\n\tget log() {\r\n\t\t//if (!this.#enabled) return () => {};\r\n\t\tconst style = `color: ${this.#color}; font-weight: bold;`;\r\n\t\t// 이름이 있으면 프리픽스를 붙이고, 없으면 그냥 로그를 바인딩합니다.\r\n\t\treturn (this.#name)\r\n\t\t\t? console.log.bind(console, `%c[${this.#name}]`, style)\r\n\t\t\t: console.log.bind(console);\r\n\t}\r\n\r\n\tget warn() {\r\n\t\tif (!this.#enabled) return () => {};\r\n\t\treturn (this.#name)\r\n\t\t\t? console.warn.bind(console, `%c[${this.#name}]`, \"color: cyan; font-weight: bold;\")\r\n\t\t\t: console.warn.bind(console);\r\n\t}\r\n\r\n\tget error() {\r\n\t\t// 에러는 enabled 상태와 상관없이 찍고 싶으시면 if 체크를 주석 처리하세요.\r\n\t\t// if (!this.#enabled) return () => {};\r\n\t\treturn (this.#name)\r\n\t\t\t? console.error.bind(console, `%c[${this.#name}]`, \"color: red; font-weight: bold;\")\r\n\t\t\t: console.error.bind(console);\r\n\t}\r\n\r\n\tenable() { this.#enabled = true; }\r\n\tdisable() { this.#enabled = false; }\r\n}\r\n\r\nexport const trace = new Trace();\r\nif (typeof window !== 'undefined') window.trace = trace;","export class TaskDebouncer {\r\n\t#timer = null;\r\n\t#queue = [];\r\n\t#delay;\r\n\r\n\tconstructor(delay = 50) {\r\n\t\tthis.#delay = delay;\r\n\t}\r\n\r\n\t/**\r\n\t * @param {Function} func - 실행할 함수\r\n\t * @param {...any} args - 함수에 전달할 임의의 파라미터들\r\n\t */\r\n\texec(func, ...args) {\r\n\t\t// 1. 어떤 함수와 어떤 인자들이 들어왔는지 큐에 저장\r\n\t\tthis.#queue.push({ func, args });\r\n\r\n\t\t// 2. 디바운스 타이머 설정\r\n\t\tif (this.#timer) clearTimeout(this.#timer);\r\n\r\n\t\tthis.#timer = setTimeout(() => this.#flush(), this.#delay);\r\n\t}\r\n\r\n\texecWithKey(key, func, ...args) {\r\n\t\t// 1. 같은 키(예: 'resize')가 들어오면 이전 큐에서 해당 키 삭제 (중복 제거)\r\n\t\tthis.#queue = this.#queue.filter(task => task.key !== key);\r\n\r\n\t\t// 2. 새로운 태스크 추가\r\n\t\tthis.#queue.push({ key, func, args });\r\n\r\n\t\tif (this.#timer) clearTimeout(this.#timer);\r\n\t\tthis.#timer = setTimeout(() => this.#flush(), this.#delay);\r\n\t}\r\n\r\n\t#flush() {\r\n\t\tif (this.#queue.length === 0) return;\r\n\r\n\t\t// 3. 현재까지 쌓인 큐를 쏙 빼옴\r\n\t\tconst tasks = this.#queue.splice(0, this.#queue.length);\r\n\t\tconst seen = new Set();\r\n\r\n\t\ttasks.forEach(task => {\r\n\t\t\t// 4. 핵심: 함수 이름과 인자들을 문자열로 합쳐서 유니크 키 생성\r\n\t\t\t// JSON.stringify를 통해 [1, {a:1}] 같은 파라미터도 문자열로 비교 가능\r\n\t\t\tconst identifier = `${task.func.name}_${JSON.stringify(task.args)}`;\r\n\r\n\t\t\tif (!seen.has(identifier)) {\r\n\t\t\t\t// 5. 중복이 아닐 때만 원래 인자들(...args) 그대로 실행\r\n\t\t\t\ttask.func(...task.args);\r\n\t\t\t\tseen.add(identifier);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tthis.#timer = null;\r\n\t}\r\n}","import { trace as traceOrigin } from '../core/Trace.js';\n\nexport class Trace extends traceOrigin.constructor {\n constructor() {\n super();\n this.init(\"nine-util\", \"green\");\n }\n}\n\nexport const trace = new Trace();","export class Loading {\n\tstatic show() {\n\t\tlet overlay = document.getElementById(\"global-loading-overlay\");\n\t\tif (!overlay) {\n\t\t\toverlay = document.createElement(\"div\");\n\t\t\toverlay.id = \"global-loading-overlay\";\n\t\t\toverlay.style.cssText = `\n position: fixed; inset: 0; z-index: 9999;\n background: rgba(0, 0, 0, 0.4); display: flex; \n justify-content: center; align-items: center;\n backdrop-filter: blur(2px);\n `;\n\t\t\toverlay.innerHTML = `<div class=\"loading-spinner\"></div>`;\n\t\t\tdocument.body.appendChild(overlay);\n\n\t\t\tif (!document.getElementById(\"nine-util-style\")) {\n\t\t\t\tconst style = document.createElement(\"style\");\n\t\t\t\tstyle.id = \"nine-util-style\";\n\t\t\t\tstyle.innerHTML = `\n .loading-spinner {\n width: 48px; height: 48px;\n border: 5px solid rgba(255, 255, 255, 0.3);\n border-top-color: white; border-radius: 50%;\n animation: nine-spin 1s linear infinite;\n }\n @keyframes nine-spin { to { transform: rotate(360deg); } }\n `;\n\t\t\t\tdocument.head.appendChild(style);\n\t\t\t}\n\t\t}\n\t\toverlay.style.display = \"flex\";\n\t}\n\n\tstatic hide() {\n\t\tconst overlay = document.getElementById(\"global-loading-overlay\");\n\t\tif (overlay) overlay.style.display = \"none\";\n\t}\n}","import { trace } from \"@nopeer\";\nimport { Loading } from \"../ux/Loading.js\";\n\nexport class Fetch {\n\tstatic BASE_URL = window.__API_BASE_URL__ || \"\";\n\n\tstatic #request = (method, url, data = {}, showLoading = true) => {\n\t\tconst finalUrl = url.startsWith('http') ? url : `${this.BASE_URL}${url}`;\n\n\t\tif (showLoading) {\n\t\t\tLoading.show();\n\t\t}\n\n\t\t// 1. 기본 헤더 설정\n\t\tconst headers = {};\n\n\t\t// 🔴 핵심: 데이터가 FormData가 아닐 때만 JSON 헤더를 추가합니다.\n\t\tif (!(data instanceof FormData)) {\n\t\t\theaders[\"Content-Type\"] = \"application/json\";\n\t\t}\n\n\t\tconst options = {\n\t\t\tmethod,\n\t\t\theaders\n\t\t};\n\n\t\tlet targetUrl = finalUrl;\n\t\tif (method === \"GET\") {\n\t\t\ttargetUrl += `?${new URLSearchParams(data)}`;\n\t\t} else {\n\t\t\t// 🔴 핵심: FormData는 그대로 body에 넣고, 일반 객체는 JSON.stringify 처리합니다.\n\t\t\toptions.body = data instanceof FormData ? data : JSON.stringify(data);\n\t\t}\n\n\t\treturn fetch(targetUrl, options)\n\t\t\t.then(async res => {\n\t\t\t\tif (!res.ok) {\n\t\t\t\t\tconst text = await res.text();\n\t\t\t\t\tthrow new Error(`API 오류 (${res.status}): ${text}`);\n\t\t\t\t}\n\t\t\t\treturn res.json();\n\t\t\t})\n\t\t\t.catch(err => {\n\t\t\t\ttrace.error(`[IdeFetch.${method.toLowerCase()}] ${finalUrl} 실패:`, err);\n\t\t\t\tthrow err;\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\tif (showLoading) {\n\t\t\t\t\tLoading.hide();\n\t\t\t\t}\n\t\t\t});\n\t};\n\n\t// 기존 post/get 메서드도 인자를 넘겨주도록 수정\n\tstatic get = (url, data = {}, showLoading = true) => this.#request(\"GET\", url, data, showLoading);\n\tstatic post = (url, data = {}, showLoading = true) => this.#request(\"POST\", url, data, showLoading);\n\n\t/**\n\t * 🚀 범용 청크 전송 (파라미터 이름까지 동적 설정)\n\t * @param {string} url - API 주소\n\t * @param {Array} rows - 데이터 배열\n\t * @param {object} options - 상세 옵션\n\t * - fileKey: 객체 내 파일 속성명 (기본: 'fileContents')\n\t * - filePartName: 서버에서 받을 파일 파트명 (기본: 'files')\n\t * - jsonPartName: 서버에서 받을 JSON 파트명 (기본: 'dataList')\n\t * - chunkSize: 분할 단위 (기본: 10)\n\t */\n\tstatic postMultipart = async (url, rows = [], options = {}) => {\n\t\tconst {\n\t\t\tfileKey = 'fileContents',\n\t\t\tfilePartName = 'files',\n\t\t\tjsonPartName = 'dataList',\n\t\t\tchunkSize = 10\n\t\t} = options;\n\n\t\t// 1. 시작 전 로딩바 띄우기\n\t\tLoading.show();\n\n\t\tlet totalCount = 0;\n\t\tlet lastResponse = null;\n\n\t\t// 🔴 2. 전체 루프를 Promise 체인처럼 관리 (내부는 await 유지)\n\t\treturn (async () => {\n\t\t\tfor (let i = 0; i < rows.length; i += chunkSize) {\n\t\t\t\tconst formData = new FormData();\n\t\t\t\tconst chunk = rows.slice(i, i + chunkSize);\n\t\t\t\tconst rowDataList = [];\n\n\t\t\t\tchunk.forEach((row) => {\n\t\t\t\t\tconst { [fileKey]: fileObj, _fileObj, ...rest } = row;\n\t\t\t\t\trowDataList.push(rest);\n\t\t\t\t\tif (fileObj instanceof File) {\n\t\t\t\t\t\tformData.append(filePartName, fileObj);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tconst jsonBlob = new Blob([JSON.stringify(rowDataList)], { type: 'application/json' });\n\t\t\t\tformData.append(jsonPartName, jsonBlob);\n\n\t\t\t\t// showLoading = false로 내부 호출\n\t\t\t\tlastResponse = await this.post(url, formData, false);\n\n\t\t\t\tif (lastResponse && (lastResponse.success || lastResponse.status === 'OK')) {\n\t\t\t\t\ttotalCount += chunk.length;\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(`청크 전송 실패: ${i}번째 섹션`);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn { ...lastResponse, success: true, totalCount };\n\t\t})()\n\t\t\t.catch(err => {\n\t\t\t\ttrace.error(\"[postChunk] Error:\", err);\n\t\t\t\tthrow err;\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\t// 🔴 3. 성공하든 실패하든 여기서 깔끔하게 닫기!\n\t\t\t\tLoading.hide();\n\t\t\t});\n\t};\n}\n\nexport const api = Fetch;","import { trace } from \"@nopeer\";\r\nimport { NineUtil } from \"./dialog/NineUtil.js\";\r\n\r\nclass UxSplitter extends HTMLElement {\r\n\r\n\t#mode;\r\n\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.attachShadow({ mode: \"open\" });\r\n\t}\r\n\r\n\tconnectedCallback() {\r\n\r\n\t\tthis.#init();\r\n\t}\r\n\r\n\t#detectMode = (el) => {\r\n\t\tconst prev = el.previousElementSibling;\r\n\t\tconst next = el.nextElementSibling;\r\n\t\tif (!prev || !next) {\r\n\t\t\tthis.#mode = this.classList.contains('h') ? \"h\" : \"v\";\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst prevRect = prev.getBoundingClientRect();\r\n\t\tconst nextRect = next.getBoundingClientRect();\r\n\r\n\t\tif (this.classList.contains('h')) {\r\n\t\t\tthis.#mode = \"h\";\r\n\t\t} else if (this.classList.contains('v')) {\r\n\t\t\tthis.#mode = \"v\";\r\n\t\t} else {\r\n\t\t\tthis.#mode = (Math.abs(prevRect.top - nextRect.top) < 5) ? \"h\" : \"v\";\r\n\t\t}\r\n\t};\r\n\r\n\t#startDrag = (e) => {\r\n\t\te.preventDefault();\r\n\t\te.stopPropagation();\r\n\r\n\t\tconst splitterRect = this.getBoundingClientRect();\r\n\t\tconst isHorizontal = this.#mode === \"h\";\r\n\r\n\t\t// 마우스 포인터와 스플리터 시작점 사이의 거리\r\n\t\tconst clickOffset = isHorizontal\r\n\t\t\t? e.clientX - splitterRect.left\r\n\t\t\t: e.clientY - splitterRect.top;\r\n\r\n\t\tconst dragBar = document.createElement(\"div\");\r\n\t\tdragBar.className = `nx-splitter-drag-bar-${this.#mode}`;\r\n\r\n\t\tObject.assign(dragBar.style, {\r\n\t\t\tposition: \"absolute\",\r\n\t\t\tzIndex: \"999\",\r\n\t\t\tbackground: \"#666\",\r\n\t\t\topacity: \"0.6\",\r\n\t\t\tpointerEvents: \"none\"\r\n\t\t});\r\n\r\n\t\tconst root = this.getRootNode({ composed: true });\r\n\t\tconst parent = root instanceof ShadowRoot ? root.host : this.parentElement;\r\n\t\tconst prev = this.previousElementSibling;\r\n\t\tconst next = this.nextElementSibling;\r\n\r\n\t\tif (!parent || !prev || !next) {\r\n\t\t\ttrace.warn(\"Spliter's parent or siblings not found.\");\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t(parent.shadowRoot || parent).appendChild(dragBar);\r\n\t\tconst dragBarOffsetParentRect = dragBar.offsetParent.getBoundingClientRect();\r\n\r\n\t\tconst prevRect = prev.getBoundingClientRect();\r\n\t\tconst nextRect = next.getBoundingClientRect();\r\n\r\n\t\t// 드래그 바의 초기 위치와 크기 설정\r\n\t\tconst initialSplitterPosInParent = (isHorizontal\r\n\t\t\t? splitterRect.left - dragBarOffsetParentRect.left\r\n\t\t\t: splitterRect.top - dragBarOffsetParentRect.top) + clickOffset;\r\n\r\n\t\tif (isHorizontal) {\r\n\t\t\tdragBar.style.top = \"0\";\r\n\t\t\tdragBar.style.left = `${initialSplitterPosInParent}px`;\r\n\t\t\tdragBar.style.width = \"2px\";\r\n\t\t\tdragBar.style.height = \"100%\";\r\n\t\t} else {\r\n\t\t\tdragBar.style.left = \"0\";\r\n\t\t\tdragBar.style.top = `${initialSplitterPosInParent}px`;\r\n\t\t\tdragBar.style.height = \"2px\";\r\n\t\t\tdragBar.style.width = \"100%\";\r\n\t\t}\r\n\r\n\t\tdragBar.style.mixBlendMode = \"difference\";\r\n\t\tdragBar.style.zIndex = \"99999\";\r\n\r\n\t\tconst minLimit = isHorizontal\r\n\t\t\t? prevRect.left - dragBarOffsetParentRect.left\r\n\t\t\t: prevRect.top - dragBarOffsetParentRect.top;\r\n\t\tconst maxLimit = isHorizontal\r\n\t\t\t? nextRect.right - dragBarOffsetParentRect.left - splitterRect.width\r\n\t\t\t: nextRect.bottom - dragBarOffsetParentRect.top - splitterRect.height;\r\n\r\n\t\tconst onMove = moveEvent => {\r\n\t\t\tconst clientPos = isHorizontal ? moveEvent.clientX : moveEvent.clientY;\r\n\t\t\tconst currentPosInParent = isHorizontal\r\n\t\t\t\t? clientPos - dragBarOffsetParentRect.left\r\n\t\t\t\t: clientPos - dragBarOffsetParentRect.top;\r\n\r\n\t\t\tconst clampedPos = Math.max(minLimit, Math.min(currentPosInParent, maxLimit));\r\n\r\n\t\t\tif (isHorizontal) {\r\n\t\t\t\tdragBar.style.left = `${clampedPos}px`;\r\n\t\t\t} else {\r\n\t\t\t\tdragBar.style.top = `${clampedPos}px`;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tconst onUp = () => {\r\n\t\t\twindow.removeEventListener(\"mousemove\", onMove);\r\n\t\t\twindow.removeEventListener(\"mouseup\", onUp);\r\n\t\t\tdragBar.remove();\r\n\r\n\t\t\tconst allChildren = Array.from(parent.children);\r\n\t\t\tconst allPanels = allChildren.filter(el => el.tagName.toLowerCase() !== 'nx-splitter');\r\n\r\n\t\t\t// ⭐⭐ gap 크기 계산 ⭐⭐\r\n\t\t\tconst style = window.getComputedStyle(parent);\r\n\t\t\tconst gapValue = isHorizontal ? style.getPropertyValue('column-gap') : style.getPropertyValue('row-gap');\r\n\t\t\tconst gapSize = parseFloat(gapValue) || 0;\r\n\t\t\tconst gapCount = allChildren.length > 1 ? allChildren.length - 1 : 0;\r\n\t\t\tconst totalGapSize = gapCount * gapSize;\r\n\r\n\t\t\tconst finalDragBarPos = isHorizontal ? parseFloat(dragBar.style.left) : parseFloat(dragBar.style.top);\r\n\t\t\tconst dragOffset = finalDragBarPos - initialSplitterPosInParent;\r\n\r\n\t\t\tconst prevSize = isHorizontal ? prev.getBoundingClientRect().width : prev.getBoundingClientRect().height;\r\n\t\t\tconst nextSize = isHorizontal ? next.getBoundingClientRect().width : next.getBoundingClientRect().height;\r\n\r\n\t\t\tlet newPrevSize = prevSize + dragOffset;\r\n\t\t\tlet newNextSize = nextSize - dragOffset;\r\n\r\n\t\t\t// 패널 크기가 음수가 되지 않도록 제한하고, 다른 패널에 차이를 보정\r\n\t\t\tif (newPrevSize < 0) {\r\n\t\t\t\tnewNextSize += newPrevSize;\r\n\t\t\t\tnewPrevSize = 0;\r\n\t\t\t}\r\n\t\t\tif (newNextSize < 0) {\r\n\t\t\t\tnewPrevSize += newNextSize;\r\n\t\t\t\tnewNextSize = 0;\r\n\t\t\t}\r\n\r\n\t\t\tconst initialSizes = allPanels.map(panel => isHorizontal ? panel.getBoundingClientRect().width : panel.getBoundingClientRect().height);\r\n\r\n\t\t\tconst totalSplitterSize = allChildren.reduce((sum, child) => {\r\n\t\t\t\tif (child.tagName.toLowerCase() === 'nx-splitter') {\r\n\t\t\t\t\treturn sum + (isHorizontal ? child.getBoundingClientRect().width : child.getBoundingClientRect().height);\r\n\t\t\t\t}\r\n\t\t\t\treturn sum;\r\n\t\t\t}, 0);\r\n\r\n\t\t\tconst totalContainerSize = (isHorizontal ? parent.getBoundingClientRect().width : parent.getBoundingClientRect().height);\r\n\t\t\tconst totalFlexSpace = totalContainerSize - totalSplitterSize - totalGapSize;\r\n\r\n\t\t\tlet flexSum = 0;\r\n\t\t\tallPanels.forEach((panel, index) => {\r\n\t\t\t\tlet newSize;\r\n\t\t\t\tif (panel === prev) {\r\n\t\t\t\t\tnewSize = newPrevSize;\r\n\t\t\t\t} else if (panel === next) {\r\n\t\t\t\t\tnewSize = newNextSize;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tnewSize = initialSizes[index];\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst newFlexBasis = newSize / totalFlexSpace;\r\n\t\t\t\t//panel.style.flex = `${newFlexBasis} ${newFlexBasis} 0`;\r\n\r\n\t\t\t\ttrace.log(panel);\r\n\r\n\t\t\t\tif (panel.classList.contains('sidebar')) {\r\n\t\t\t\t\t// 드래그가 끝난 시점의 newSize(px)를 그대로 고정값으로 할당\r\n\t\t\t\t\t// 이렇게 하면 비율(%)이 아니라 딱 그 픽셀만큼만 자리를 차지하게 됩니다.\r\n\t\t\t\t\tpanel.style.flex = `0 0 ${newSize}px`;\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// 나머지 메인 보드 같은 유연한 패널은 비율(%)로 처리\r\n\t\t\t\t\t//const newFlexBasis = newSize / totalFlexSpace;\r\n\t\t\t\t\tpanel.style.flex = `${newFlexBasis} ${newFlexBasis} 0`;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tflexSum += newFlexBasis;\r\n\t\t\t});\r\n\r\n\t\t\ttrace.log(`dragOffset: ${dragOffset}`);\r\n\t\t\ttrace.log(`Calculated FlexSum: ${flexSum}`);\r\n\t\t};\r\n\r\n\t\twindow.addEventListener(\"mousemove\", onMove);\r\n\t\twindow.addEventListener(\"mouseup\", onUp);\r\n\t};\r\n\r\n\tget cssPath() {\r\n\t\treturn this.getAttribute(\"css-path\") || NineUtil.cssPath;\r\n\t}\r\n\r\n\t#init = () => {\r\n\t\tthis.#detectMode(this);\r\n\t\tthis.classList.add(this.#mode);\r\n\r\n\t\tconst contents = this.innerHTML.trim();\r\n\t\t//const gripClass = `grip-${this.#mode}`;\r\n\t\tconst gripTmpl = (contents === \"\") ? `<div class=\"grip\"></div>` : `<div class=\"grip\"></div><div class=\"inner-container\">${contents}</div><div class=\"grip\"></div>`;\r\n\r\n\t\tthis.innerHTML = \"\";\r\n\t\tconst htmlTmpl = document.createElement(\"template\");\r\n\t\thtmlTmpl.innerHTML = `\r\n\t\t\t<style>\r\n\t\t\t\t@import \"https://cdn.jsdelivr.net/npm/@nine-lab/nine-util@${__APP_VERSION__}/dist/css/nine-util.css\";\r\n\t\t\t\t${this.cssPath ? `@import \"${this.cssPath}\";` : \"\"}\r\n\t\t\t</style>\r\n\t\t\t${gripTmpl}\r\n `;\r\n\r\n\t\tthis.shadowRoot.appendChild(htmlTmpl.content.cloneNode(true));\r\n\r\n\t\tthis.shadowRoot.querySelectorAll(\".grip\").forEach(el => {\r\n\t\t\tel.addEventListener(\"mousedown\", e => this.#startDrag(e));\r\n\t\t});\r\n\r\n\t\tthis.#prepareLayout();\r\n\r\n\t\twindow.addEventListener(\"resize\", () => this.#prepareLayout());\r\n\t};\r\n\r\n\t#prepareLayout = () => {\r\n\t\tconst isHorizontal = this.#mode === \"h\";\r\n\t\tconst parent = this.parentElement;\r\n\t\tconst allPanels = Array.from(parent.children).filter(el => el.tagName.toLowerCase() !== 'nx-splitter');\r\n\t\tif (allPanels.length < 2) return;\r\n\r\n\t\tconst parentRect = parent.getBoundingClientRect();\r\n\t\tconst totalContentSize = allPanels.reduce((sum, el) => {\r\n\t\t\tconst size = isHorizontal ? el.getBoundingClientRect().width : el.getBoundingClientRect().height;\r\n\t\t\treturn sum + size;\r\n\t\t}, 0);\r\n\t\tconst totalParentSize = isHorizontal ? parentRect.width : parentRect.height;\r\n\r\n\t\tallPanels.forEach(panel => {\r\n\t\t\tconst size = isHorizontal ? panel.getBoundingClientRect().width : panel.getBoundingClientRect().height;\r\n\t\t\tconst newSize = totalParentSize * (size / totalContentSize);\r\n\t\t\tconst flexGrow = newSize / totalParentSize;\r\n\t\t\tpanel.style.flex = `${flexGrow} ${flexGrow} 0`;\r\n\t\t});\r\n\t};\r\n}\r\n\r\nif (!customElements.get('nine-splitter')) {\r\n\tcustomElements.define(\"nine-splitter\", UxSplitter);\r\n}","// 1. 기존 core 모듈\r\nimport { NineUtil } from './ux/dialog/NineUtil.js';\r\nimport { nine, subscribeConfig, config } from './core/Config.js';\r\nimport { Trace, trace } from './core/Trace.js';\r\nimport { TaskDebouncer } from './core/TaskDebouncer.js';\r\n\r\n// 2. 신규 net 및 ux 모듈 추가\r\nimport { api, Fetch } from './net/Fetch.js';\r\nimport { Loading } from './ux/Loading.js';\r\n\r\nimport { nineDialog } from './ux/dialog/nineDialog.js';\r\nimport { nineConfirmPopup, nineAlertPopup } from './ux/dialog/nineConfirm.js';\r\nimport { ninePromptPopup } from './ux/dialog/ninePrompt.js';\r\n\r\nimport { safe } from \"./utils/promise.js\"; // 경로에 맞춰 임포트\r\n// ux\r\nimport './ux/UxSplitter.js';\r\n\r\n/**\r\nconst utilInstance = new NineUtil();\r\nnine.alert = utilInstance.alert.bind(utilInstance);\r\nnine.confirm = utilInstance.confirm.bind(utilInstance);\r\nnine.prompt = utilInstance.prompt.bind(utilInstance);\r\nnine.formatDate = utilInstance.formatDate.bind(utilInstance);\r\n\t*/\r\nconst utilInstance = new NineUtil();\r\n\r\n// 💡 이미 화살표 함수로 바인딩되어 있으므로, 객체 통째로 복사해주면 끝납니다!\r\nObject.assign(nine, utilInstance);\r\n\r\nnine.safe = safe;\r\n\r\n// 기존 nine 객체(Config)와 Util 기능을 합성\r\n//Object.assign(nine, utilInstance);\r\n\r\nnine.api = api;\r\nnine.trace = trace;\r\nnine.subscribeConfig = subscribeConfig;\r\nnine.config = config || {};\r\n\r\nexport {\r\n\tnine,\r\n\tsubscribeConfig,\r\n\tconfig,\r\n\tNineUtil,\r\n\tTrace,\r\n\ttrace,\r\n\tTaskDebouncer,\r\n\tapi, // 🚀 추가: 이제 서비스에서 api.get() 가능\r\n\tFetch, // 🚀 추가: 클래스 자체도 혹시 모르니 노출\r\n\tLoading as loading, // 🚀 추가: loading.show() 로 쓰기 편하게 alias\r\n\tnineDialog,\r\n\tnineAlertPopup, nineConfirmPopup, ninePromptPopup\r\n};\r\n\r\nif (typeof window !== 'undefined') {\r\n\twindow.nine = nine;\r\n}\r\n","/**\r\n * 비동기 함수를 try-catch 없이 안전하게 실행하게 도와주는 유틸리티\r\n * @param {Promise} promise\r\n * @returns {Promise<[any, Error|null]>}\r\n */\r\nexport const safe = async (promise) => {\r\n\ttry {\r\n\t\tconst data = await promise;\r\n\t\treturn [data, null];\r\n\t} catch (err) {\r\n\t\treturn [null, err];\r\n\t}\r\n};"],"names":["nineDialog","HTMLElement","constructor","super","__privateAdd","this","_shift","_dialog","__publicField","__privateGet","showModal","close","remove","_init","head","querySelector","addEventListener","_onMouseDown","_onTouchStart","querySelectorAll","forEach","btn","onclick","closeWithAnimation","e","target","closest","button","altKey","ctrlKey","shiftKey","rect","getBoundingClientRect","__privateSet","x","clientX","left","y","clientY","top","onMouseMove","ev","style","position","margin","onMouseUp","document","removeEventListener","touch","changedTouches","pageX","pageY","onTouchMove","t","onTouchEnd","connectedCallback","v","innerHTML","titleText","getAttribute","call","returnValue","classList","add","setTimeout","dispatchEvent","CustomEvent","detail","WeakMap","BasePopup","attachShadow","mode","open","PopupClass","message","title","options","renderFn","tagName","toLowerCase","config","class","animation","_c","_a","window","nine","_b","ux","replace","el","createElement","body","appendChild","dialogComp","shadowRoot","setAttribute","Promise","resolve","setupEvents","customElements","get","define","_nineConfirmPopup","render","m","o","msg","conf","nineConfirmPopup","_nineAlertPopup","nineAlertPopup","_ninePromptPopup","trace","log","textarea","value","requestAnimationFrame","focus","ninePromptPopup","n","r","i","s","u","a","c","f","h","d","l","$","M","name","weekdays","split","months","ordinal","String","length","Array","join","z","utcOffset","Math","abs","floor","date","year","month","clone","ceil","p","w","D","ms","Q","g","S","_","O","args","arguments","b","locale","$L","utc","$u","$x","$offset","parse","prototype","$d","Date","NaN","test","match","substring","UTC","init","$y","getFullYear","$M","getMonth","$D","getDate","$W","getDay","$H","getHours","$m","getMinutes","$s","getSeconds","$ms","getMilliseconds","$utils","isValid","toString","isSame","startOf","endOf","isAfter","isBefore","$g","set","unix","valueOf","getTime","toDate","apply","slice","$locale","weekStart","$set","min","daysInMonth","Number","round","subtract","format","invalidDate","meridiem","monthsShort","weekdaysMin","weekdaysShort","getTimezoneOffset","diff","toJSON","toISOString","toUTCString","Y","extend","$i","isDayjs","en","Ls","NineUtil","_NineUtil_instances","__privateMethod","prepare_fn","fmt","dayjs","WeakSet","type","defaultClass","isExecuted","popup","alert","confirm","prompt","runner","rgb","classic","shake","run","zoom","then","reject","listeners","Set","_initialConfig","nativeOverride","theme","board","readOnly","cssPath","debug","__NINE_GLOBAL_CONFIG__","_config","subscribeConfig","fn","delete","Proxy","prop","setup","Object","entries","key","isArray","Trace$1","color","_Trace_instances","_name","_color","_enabled","autoConfig_fn","initBAK","console","bind","warn","error","enable","disable","location","hostname","startsWith","Trace","_timer","_queue","_delay","_TaskDebouncer_instances","flush_fn","tasks","splice","seen","task","identifier","func","JSON","stringify","has","traceOrigin","Loading","show","overlay","getElementById","id","cssText","display","hide","_Fetch","_request","__API_BASE_URL__","method","url","data","showLoading","finalUrl","BASE_URL","headers","FormData","targetUrl","URLSearchParams","fetch","async","res","ok","text","Error","status","json","catch","err","finally","rows","fileKey","filePartName","jsonPartName","chunkSize","totalCount","lastResponse","formData","chunk","rowDataList","row","fileObj","_fileObj","rest","push","File","append","jsonBlob","Blob","post","success","Fetch","api","UxSplitter","_mode","_detectMode","prev","previousElementSibling","next","nextElementSibling","contains","prevRect","nextRect","_startDrag","preventDefault","stopPropagation","splitterRect","isHorizontal","clickOffset","dragBar","className","assign","zIndex","background","opacity","pointerEvents","root","getRootNode","composed","parent","ShadowRoot","host","parentElement","dragBarOffsetParentRect","offsetParent","initialSplitterPosInParent","width","height","mixBlendMode","minLimit","maxLimit","right","bottom","onMove","moveEvent","clientPos","currentPosInParent","clampedPos","max","onUp","allChildren","from","children","allPanels","filter","getComputedStyle","gapValue","getPropertyValue","gapSize","parseFloat","totalGapSize","dragOffset","prevSize","nextSize","newPrevSize","newNextSize","initialSizes","map","panel","totalSplitterSize","reduce","sum","child","totalFlexSpace","flexSum","index","newSize","newFlexBasis","flex","contents","trim","gripTmpl","htmlTmpl","content","cloneNode","_prepareLayout","parentRect","totalContentSize","totalParentSize","size","flexGrow","utilInstance","safe","promise","delay","exec","clearTimeout","execWithKey"],"mappings":"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","x_google_ignoreList":[3]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nine-lab/nine-util",
3
- "version": "0.9.147",
3
+ "version": "0.9.150",
4
4
  "description": "Custom Element based Util Component for Real-time Collaboration",
5
5
  "type": "module",
6
6
  "main": "./dist/nine-util.umd.cjs",