@ninebone/table 0.0.20 → 0.0.22

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.
@@ -4,7 +4,7 @@ var R = (o) => {
4
4
  };
5
5
  var r = (o, e) => O(o, "name", { value: e, configurable: !0 });
6
6
  var q = (o, e, t) => e.has(o) || R("Cannot " + t);
7
- var n = (o, e, t) => (q(o, e, "read from private field"), t ? t.call(o) : e.get(o)), b = (o, e, t) => e.has(o) ? R("Cannot add the same private member more than once") : e instanceof WeakSet ? e.add(o) : e.set(o, t), g = (o, e, t, s) => (q(o, e, "write to private field"), s ? s.call(o, t) : e.set(o, t), t), u = (o, e, t) => (q(o, e, "access private method"), t);
7
+ var n = (o, e, t) => (q(o, e, "read from private field"), t ? t.call(o) : e.get(o)), b = (o, e, t) => e.has(o) ? R("Cannot add the same private member more than once") : e instanceof WeakSet ? e.add(o) : e.set(o, t), g = (o, e, t, i) => (q(o, e, "write to private field"), i ? i.call(o, t) : e.set(o, t), t), p = (o, e, t) => (q(o, e, "access private method"), t);
8
8
  import { trace as P } from "@ninebone/util";
9
9
  const T = class T extends P.constructor {
10
10
  constructor() {
@@ -13,7 +13,7 @@ const T = class T extends P.constructor {
13
13
  };
14
14
  r(T, "Trace");
15
15
  let E = T;
16
- const w = new E();
16
+ const x = new E();
17
17
  var S, m, W, I;
18
18
  const A = class A {
19
19
  constructor(e) {
@@ -23,24 +23,24 @@ const A = class A {
23
23
  }
24
24
  // [Public] 테이블 초기화 진입점 (필요한 최소한의 마크업 보정만 수행)
25
25
  initializeTable(e) {
26
- return u(this, m, W).call(this, e), u(this, m, I).call(this, e), e.classList.add("nine-table-element"), e;
26
+ return p(this, m, W).call(this, e), p(this, m, I).call(this, e), e.classList.add("nine-table-element"), e;
27
27
  }
28
28
  };
29
29
  S = new WeakMap(), m = new WeakSet(), // [Private] colgroup 보정
30
30
  W = /* @__PURE__ */ r(function(e) {
31
- var i;
31
+ var s;
32
32
  if (e.querySelector("colgroup")) return;
33
- const t = ((i = e.querySelector("tbody tr")) == null ? void 0 : i.querySelectorAll("th, td").length) || 1, s = document.createElement("colgroup"), a = Math.max(Math.floor((e.clientWidth || 600) / t), 100);
33
+ const t = ((s = e.querySelector("tbody tr")) == null ? void 0 : s.querySelectorAll("th, td").length) || 1, i = document.createElement("colgroup"), a = Math.max(Math.floor((e.clientWidth || 600) / t), 100);
34
34
  for (let l = 0; l < t; l++) {
35
35
  const c = document.createElement("col");
36
- c.setAttribute("width", a), s.appendChild(c);
36
+ c.setAttribute("width", a), i.appendChild(c);
37
37
  }
38
- e.prepend(s);
38
+ e.prepend(i);
39
39
  }, "#ensureColgroup"), // [Private] thead 보정
40
40
  I = /* @__PURE__ */ r(function(e) {
41
41
  if (e.querySelector("thead")) return;
42
- const t = document.createElement("thead"), s = e.querySelector("colgroup");
43
- s ? s.after(t) : e.prepend(t);
42
+ const t = document.createElement("thead"), i = e.querySelector("colgroup");
43
+ i ? i.after(t) : e.prepend(t);
44
44
  }, "#ensureThead"), r(A, "TableInitializer");
45
45
  let L = A;
46
46
  var y, v, k, j;
@@ -53,7 +53,7 @@ const M = class M extends HTMLElement {
53
53
  g(this, v, new L(this));
54
54
  }
55
55
  connectedCallback() {
56
- u(this, k, j).call(this);
56
+ p(this, k, j).call(this);
57
57
  }
58
58
  /**
59
59
  * 외부(LayoutManager 등)에서 원본 테이블 엘리먼트를 주입받아 초기화 및 보정 수행
@@ -61,16 +61,16 @@ const M = class M extends HTMLElement {
61
61
  */
62
62
  init(t) {
63
63
  if (!t) return;
64
- const s = t.cloneNode(!0);
65
- g(this, y, n(this, v).initializeTable(s)), n(this, y).style.display = "table";
64
+ const i = t.cloneNode(!0);
65
+ g(this, y, n(this, v).initializeTable(i)), n(this, y).style.display = "table";
66
66
  const a = this.querySelector(".sheet-content-container");
67
- a && (a.innerHTML = "", a.appendChild(n(this, y))), w.log(`NineTableSheet initialized with table rows: ${this.getRowCount()}`);
67
+ a && (a.innerHTML = "", a.appendChild(n(this, y))), x.log(`NineTableSheet initialized with table rows: ${this.getRowCount()}`);
68
68
  }
69
69
  getRowCount() {
70
70
  return n(this, y) ? n(this, y).querySelectorAll("tbody tr").length : 0;
71
71
  }
72
72
  disconnectedCallback() {
73
- this.innerHTML = "", w.log("NineTableSheet destroyed.");
73
+ this.innerHTML = "", x.log("NineTableSheet destroyed.");
74
74
  }
75
75
  };
76
76
  y = new WeakMap(), v = new WeakMap(), k = new WeakSet(), j = /* @__PURE__ */ r(function() {
@@ -122,24 +122,24 @@ y = new WeakMap(), v = new WeakMap(), k = new WeakSet(), j = /* @__PURE__ */ r(f
122
122
  }, "#render"), r(M, "NineTableSheet");
123
123
  let B = M;
124
124
  customElements.get("nine-table-sheet") || customElements.define("nine-table-sheet", B);
125
- var p, h, d, K, F, N, D, G;
125
+ var u, h, d, K, F, N, D, G;
126
126
  const z = class z {
127
127
  constructor(e) {
128
128
  b(this, d);
129
- b(this, p);
129
+ b(this, u);
130
130
  b(this, h, []);
131
- g(this, p, e);
131
+ g(this, u, e);
132
132
  }
133
133
  render() {
134
- n(this, p).host.querySelectorAll("table").forEach((t) => {
134
+ n(this, u).host.querySelectorAll("table").forEach((t) => {
135
135
  n(this, h).push(t), t.style.display = "none";
136
- }), u(this, d, K).call(this), u(this, d, F).call(this), u(this, d, N).call(this), n(this, h).length > 0 && this.switchTab(0, !1);
136
+ }), p(this, d, K).call(this), p(this, d, F).call(this), p(this, d, N).call(this), n(this, h).length > 0 && this.switchTab(0, !1);
137
137
  }
138
138
  switchTab(e, t = !1) {
139
139
  if (!n(this, h)[e]) return;
140
- const s = this.tabBar.querySelectorAll(".nine-tab-item"), a = this.sheetsBody.querySelectorAll("nine-table-sheet");
140
+ const i = this.tabBar.querySelectorAll(".nine-tab-item"), a = this.sheetsBody.querySelectorAll("nine-table-sheet");
141
141
  if (!t)
142
- s.forEach((l, c) => {
142
+ i.forEach((l, c) => {
143
143
  l.classList.toggle("active", c === e);
144
144
  const f = this.sheetsBody.querySelector(`nine-table-sheet[data-index="${c}"]`);
145
145
  f && (f.style.width = "");
@@ -147,29 +147,29 @@ const z = class z {
147
147
  l.classList.toggle("active", c === e);
148
148
  });
149
149
  else {
150
- const l = s[e], c = this.tabBar.querySelectorAll(".nine-tab-item.active");
150
+ const l = i[e], c = this.tabBar.querySelectorAll(".nine-tab-item.active");
151
151
  if (l.classList.contains("active") && c.length <= 1)
152
152
  return;
153
153
  l.classList.toggle("active");
154
154
  const f = this.sheetsBody.querySelector(`nine-table-sheet[data-index="${e}"]`);
155
155
  f && (f.classList.toggle("active"), f.classList.contains("active") || (f.style.width = ""));
156
156
  }
157
- u(this, d, D).call(this), u(this, d, G).call(this);
158
- const i = this.sheetsBody.querySelector("nine-table-sheet.active");
159
- if (i && typeof i.getRowCount == "function") {
160
- const l = n(this, p).querySelector("#row-count");
161
- l && (l.textContent = i.getRowCount().toLocaleString());
157
+ p(this, d, D).call(this), p(this, d, G).call(this);
158
+ const s = this.sheetsBody.querySelector("nine-table-sheet.active");
159
+ if (s && typeof s.getRowCount == "function") {
160
+ const l = n(this, u).querySelector("#row-count");
161
+ l && (l.textContent = s.getRowCount().toLocaleString());
162
162
  }
163
163
  }
164
164
  };
165
- p = new WeakMap(), h = new WeakMap(), d = new WeakSet(), K = /* @__PURE__ */ r(function() {
166
- const e = n(this, h).map((a, i) => {
167
- const l = `<nine-table-sheet class="${i === 0 ? "active" : ""}" data-index="${i}"></nine-table-sheet>`;
168
- return i === 0 ? l : `<nine-splitter class="h" data-split-index="${i}"></nine-splitter>${l}`;
169
- }).join(""), t = n(this, h).map((a, i) => `
170
- <div class="nine-tab-item ${i === 0 ? "active" : ""}" data-index="${i}">Sheet ${i + 1}</div>
171
- `).join(""), s = n(this, h)[0] ? n(this, h)[0].querySelectorAll("tbody tr").length : 0;
172
- n(this, p).innerHTML = `
165
+ u = new WeakMap(), h = new WeakMap(), d = new WeakSet(), K = /* @__PURE__ */ r(function() {
166
+ const e = n(this, h).map((a, s) => {
167
+ const l = `<nine-table-sheet class="${s === 0 ? "active" : ""}" data-index="${s}"></nine-table-sheet>`;
168
+ return s === 0 ? l : `<nine-splitter class="h" data-split-index="${s}"></nine-splitter>${l}`;
169
+ }).join(""), t = n(this, h).map((a, s) => `
170
+ <div class="nine-tab-item ${s === 0 ? "active" : ""}" data-index="${s}">Sheet ${s + 1}</div>
171
+ `).join(""), i = n(this, h)[0] ? n(this, h)[0].querySelectorAll("tbody tr").length : 0;
172
+ n(this, u).innerHTML = `
173
173
  <style>
174
174
  :host { display: flex; flex-direction: column; position: relative; overflow: hidden; height: 100%; background: #fff; }
175
175
  nine-table-header { height: 40px; display: block; flex-shrink: 0; border-bottom: 1px solid #e5e7eb; background: #fff; }
@@ -179,19 +179,22 @@ p = new WeakMap(), h = new WeakMap(), d = new WeakSet(), K = /* @__PURE__ */ r(f
179
179
  nine-table-summary { display: none; width: 250px; flex-shrink: 0; border-right: 1px solid #e5e7eb; }
180
180
 
181
181
  nine-table-sheets { flex: 1; display: flex; flex-direction: column; overflow: hidden; position: relative; background: #fff; }
182
- nine-table-sheets-body { flex: 1; overflow: auto; position: relative; display: flex; flex-direction: row; align-items: stretch; }
183
182
 
184
- /* 시트 기본 설정 (flex 대신 너비 고정 제어) */
185
- nine-table-sheet { display: none !important; height: 100%; overflow: auto; flex-shrink: 0; box-sizing: border-box; }
183
+ /* flex-direction 대신 block 및 white-space / float 또는 단순 인라인 블록 구조로 변경하여 flex 간섭 원천 차단 */
184
+ nine-table-sheets-body { flex: 1; overflow: auto; position: relative; white-space: nowrap; font-size: 0; }
186
185
 
187
- /* active 시트 1개일 채우기 */
188
- nine-table-sheets-body.single-view nine-table-sheet.active { display: block !important; width: 100% !important; }
186
+ /* 시트 기본 설정: flex 속성 완전 배제, inline-block으로 나란히 배치 */
187
+ nine-table-sheet { display: none !important; height: 100%; overflow: auto; box-sizing: border-box; vertical-align: top; font-size: 12px; }
189
188
 
190
- /* active 시트 2개 이상일 width 수동 할당 대상 */
191
- nine-table-sheets-body.multi-view nine-table-sheet.active { display: block !important; }
189
+ /* active 시트 1개일화면 가득 채우기 */
190
+ nine-table-sheets-body.single-view nine-table-sheet.active { display: inline-block !important; width: 100% !important; }
191
+
192
+ /* active 시트 2개 이상일 때 인라인 블록 기반 수동 픽셀 width 적용 */
193
+ nine-table-sheets-body.multi-view nine-table-sheet.active { display: inline-block !important; }
192
194
 
193
- nine-table-sheets-body nine-splitter { width: 4px; background: #e5e7eb; cursor: col-resize; flex-shrink: 0; display: none; }
194
- nine-table-sheets-body nine-splitter.active { display: block; }
195
+ /* 스플리터도 인라인 블록으로 나란히 배치 */
196
+ nine-table-sheets-body nine-splitter { width: 4px; height: 100%; background: #e5e7eb; display: none !important; vertical-align: top; }
197
+ nine-table-sheets-body nine-splitter.active { display: inline-block !important; }
195
198
 
196
199
  nine-table-sheets-footer { display: flex; height: 32px; background: #f3f4f6; border-top: 1px solid #e5e7eb; align-items: center; justify-content: space-between; padding: 0 8px; flex-shrink: 0; }
197
200
  .nine-tab-bar { display: flex; align-items: center; gap: 2px; overflow-x: auto; flex: 1; height: 100%; }
@@ -216,7 +219,7 @@ p = new WeakMap(), h = new WeakMap(), d = new WeakSet(), K = /* @__PURE__ */ r(f
216
219
  <div class="nine-tab-bar">
217
220
  ${t}
218
221
  </div>
219
- <div class="sheets-counter">Total : <span id="row-count">${s.toLocaleString()}</span></div>
222
+ <div class="sheets-counter">Total : <span id="row-count">${i.toLocaleString()}</span></div>
220
223
  </nine-table-sheets-footer>
221
224
  </nine-table-sheets>
222
225
  <nine-table-analysis></nine-table-analysis>
@@ -224,25 +227,25 @@ p = new WeakMap(), h = new WeakMap(), d = new WeakSet(), K = /* @__PURE__ */ r(f
224
227
  <nine-table-footer></nine-table-footer>
225
228
  `;
226
229
  }, "#renderLayoutShell"), F = /* @__PURE__ */ r(function() {
227
- this.sheetsBody = n(this, p).querySelector("nine-table-sheets-body"), this.tabBar = n(this, p).querySelector(".nine-tab-bar"), this.tabBar.addEventListener("click", (e) => {
230
+ this.sheetsBody = n(this, u).querySelector("nine-table-sheets-body"), this.tabBar = n(this, u).querySelector(".nine-tab-bar"), this.tabBar.addEventListener("click", (e) => {
228
231
  const t = e.target.closest(".nine-tab-item");
229
232
  if (!t) return;
230
- const s = e.ctrlKey || e.metaKey || e.shiftKey, a = parseInt(t.dataset.index, 10);
231
- this.switchTab(a, s);
233
+ const i = e.ctrlKey || e.metaKey || e.shiftKey, a = parseInt(t.dataset.index, 10);
234
+ this.switchTab(a, i);
232
235
  });
233
236
  }, "#bindElements"), N = /* @__PURE__ */ r(function() {
234
- this.sheetsBody.querySelectorAll("nine-table-sheet").forEach((t, s) => {
235
- n(this, h)[s] && t.init(n(this, h)[s]);
237
+ this.sheetsBody.querySelectorAll("nine-table-sheet").forEach((t, i) => {
238
+ n(this, h)[i] && t.init(n(this, h)[i]);
236
239
  });
237
240
  }, "#initSheets"), D = /* @__PURE__ */ r(function() {
238
241
  const e = Array.from(this.sheetsBody.querySelectorAll("nine-table-sheet.active"));
239
242
  if (e.length > 1) {
240
243
  this.sheetsBody.classList.remove("single-view"), this.sheetsBody.classList.add("multi-view");
241
- const t = this.sheetsBody.clientWidth || 800, a = this.sheetsBody.querySelectorAll("nine-splitter.active").length * 4, i = t - a, l = Math.floor(i / e.length);
244
+ const t = this.sheetsBody.clientWidth || 800, a = this.sheetsBody.querySelectorAll("nine-splitter.active").length * 4, s = t - a, l = Math.floor(s / e.length);
242
245
  e.forEach((c, f) => {
243
246
  if (f === e.length - 1) {
244
247
  const J = l * (e.length - 1);
245
- c.style.width = `${i - J}px`;
248
+ c.style.width = `${s - J}px`;
246
249
  } else
247
250
  c.style.width = `${l}px`;
248
251
  });
@@ -252,26 +255,26 @@ p = new WeakMap(), h = new WeakMap(), d = new WeakSet(), K = /* @__PURE__ */ r(f
252
255
  });
253
256
  }, "#updateLayoutMode"), G = /* @__PURE__ */ r(function() {
254
257
  this.sheetsBody.querySelectorAll("nine-splitter").forEach((t) => {
255
- const s = parseInt(t.dataset.splitIndex, 10), a = this.sheetsBody.querySelector(`nine-table-sheet[data-index="${s - 1}"]`), i = this.sheetsBody.querySelector(`nine-table-sheet[data-index="${s}"]`);
256
- a && i && a.classList.contains("active") && i.classList.contains("active") ? t.classList.add("active") : t.classList.remove("active");
258
+ const i = parseInt(t.dataset.splitIndex, 10), a = this.sheetsBody.querySelector(`nine-table-sheet[data-index="${i - 1}"]`), s = this.sheetsBody.querySelector(`nine-table-sheet[data-index="${i}"]`);
259
+ a && s && a.classList.contains("active") && s.classList.contains("active") ? t.classList.add("active") : t.classList.remove("active");
257
260
  });
258
261
  }, "#updateSplitters"), r(z, "LayoutManager");
259
262
  let C = z;
260
- var x;
263
+ var w;
261
264
  const H = class H extends HTMLElement {
262
265
  constructor() {
263
266
  super();
264
- b(this, x, !1);
267
+ b(this, w, !1);
265
268
  this.attachShadow({ mode: "open" });
266
269
  }
267
270
  connectedCallback() {
268
- n(this, x) || (this.layoutManager = new C(this.shadowRoot), this.layoutManager.render(), g(this, x, !0), w.log("NineTable connected."), this.dispatchEvent(new CustomEvent("load", { bubbles: !0, detail: { target: this } })));
271
+ n(this, w) || (this.layoutManager = new C(this.shadowRoot), this.layoutManager.render(), g(this, w, !0), x.log("NineTable connected."), this.dispatchEvent(new CustomEvent("load", { bubbles: !0, detail: { target: this } })));
269
272
  }
270
273
  disconnectedCallback() {
271
- w.log("NineTable disconnected.");
274
+ x.log("NineTable disconnected.");
272
275
  }
273
276
  };
274
- x = new WeakMap(), r(H, "NineTable");
277
+ w = new WeakMap(), r(H, "NineTable");
275
278
  let $ = H;
276
279
  customElements.get("nine-table") || customElements.define("nine-table", $);
277
280
  //# sourceMappingURL=nine-table.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"nine-table.js","sources":["../src/external/NoPeer.js","../src/ui/TableInitializer.js","../src/ui/nine-table-sheet.js","../src/ui/LayoutManager.js","../src/core/nine-table.js"],"sourcesContent":["import { trace as traceOrigin } from '@ninebone/util';\n\nexport class Trace extends traceOrigin.constructor {\n constructor() {\n super();\n this.init(\"nine-table\", \"green\");\n }\n}\n\nexport const trace = new Trace();","export class TableInitializer {\n #container;\n\n constructor(container) {\n this.#container = container;\n }\n\n // [Public] 테이블 초기화 진입점 (필요한 최소한의 마크업 보정만 수행)\n initializeTable(tbl) {\n this.#ensureColgroup(tbl);\n this.#ensureThead(tbl);\n\n tbl.classList.add('nine-table-element');\n return tbl;\n }\n\n // [Private] colgroup 보정\n #ensureColgroup(tbl) {\n if (tbl.querySelector('colgroup')) return;\n\n const colCount = tbl.querySelector('tbody tr')?.querySelectorAll('th, td').length || 1;\n const colgroup = document.createElement('colgroup');\n const defaultWidth = Math.max(Math.floor((tbl.clientWidth || 600) / colCount), 100);\n\n for (let i = 0; i < colCount; i++) {\n const col = document.createElement('col');\n col.setAttribute('width', defaultWidth);\n colgroup.appendChild(col);\n }\n tbl.prepend(colgroup);\n }\n\n // [Private] thead 보정\n #ensureThead(tbl) {\n if (tbl.querySelector('thead')) return;\n\n const thead = document.createElement('thead');\n const colgroup = tbl.querySelector('colgroup');\n if (colgroup) {\n colgroup.after(thead);\n } else {\n tbl.prepend(thead);\n }\n }\n}","import { trace } from \"@nopeer\";\nimport { TableInitializer } from \"./TableInitializer.js\"; // 경로에 맞게 조정 필요\n\nexport class NineTableSheet extends HTMLElement {\n #tableElement = null;\n #initializer;\n\n constructor() {\n super();\n this.#initializer = new TableInitializer(this);\n }\n\n connectedCallback() {\n this.#render();\n }\n\n /**\n * 외부(LayoutManager 등)에서 원본 테이블 엘리먼트를 주입받아 초기화 및 보정 수행\n * @param {HTMLTableElement} tableEl\n */\n init(tableEl) {\n if (!tableEl) return;\n\n // 원본 테이블 복제 후 TableInitializer를 통한 구조 보정\n const clonedTable = tableEl.cloneNode(true);\n this.#tableElement = this.#initializer.initializeTable(clonedTable);\n this.#tableElement.style.display = 'table';\n\n const container = this.querySelector('.sheet-content-container');\n if (container) {\n container.innerHTML = '';\n container.appendChild(this.#tableElement);\n }\n\n trace.log(`NineTableSheet initialized with table rows: ${this.getRowCount()}`);\n }\n\n getRowCount() {\n if (!this.#tableElement) return 0;\n return this.#tableElement.querySelectorAll('tbody tr').length;\n }\n\n #render() {\n this.innerHTML = `\n <style>\n nine-table-sheet {\n display: block;\n width: 100%;\n height: 100%;\n overflow: auto;\n position: relative;\n box-sizing: border-box;\n background: #ffffff;\n }\n\n nine-table-sheet .sheet-content-container {\n width: 100%;\n min-width: fit-content;\n }\n\n nine-table-sheet table {\n border-collapse: collapse;\n width: 100%;\n table-layout: fixed;\n }\n\n nine-table-sheet th, nine-table-sheet td {\n box-sizing: border-box;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n padding: 6px 8px;\n border: 1px solid #e5e7eb;\n font-size: 12px;\n color: #111827;\n }\n\n nine-table-sheet th {\n background-color: #f9fafb;\n font-weight: 600;\n text-align: left;\n }\n </style>\n \n <div class=\"sheet-content-container\">\n <!-- 테이블이 동적으로 주입되는 영역 -->\n </div>\n `;\n }\n\n disconnectedCallback() {\n this.innerHTML = '';\n trace.log('NineTableSheet destroyed.');\n }\n}\n\nif (!customElements.get('nine-table-sheet')) {\n customElements.define('nine-table-sheet', NineTableSheet);\n}\n","import './nine-table-sheet.js';\n// import './nine-splitter.js';\n\nexport class LayoutManager {\n #shadowRoot;\n #tables = [];\n\n constructor(shadowRoot) {\n this.#shadowRoot = shadowRoot;\n }\n\n render() {\n const rawTables = this.#shadowRoot.host.querySelectorAll('table');\n rawTables.forEach(tbl => {\n this.#tables.push(tbl);\n tbl.style.display = 'none';\n });\n\n this.#renderLayoutShell();\n this.#bindElements();\n this.#initSheets();\n\n if (this.#tables.length > 0) {\n this.switchTab(0, false);\n }\n }\n\n #renderLayoutShell() {\n const sheetsHtml = this.#tables.map((_, idx) => {\n const sheet = `<nine-table-sheet class=\"${idx === 0 ? 'active' : ''}\" data-index=\"${idx}\"></nine-table-sheet>`;\n if (idx === 0) return sheet;\n return `<nine-splitter class=\"h\" data-split-index=\"${idx}\"></nine-splitter>${sheet}`;\n }).join('');\n\n const tabsHtml = this.#tables.map((_, idx) => `\n <div class=\"nine-tab-item ${idx === 0 ? 'active' : ''}\" data-index=\"${idx}\">Sheet ${idx + 1}</div>\n `).join('');\n\n const totalRowCount = this.#tables[0] ? this.#tables[0].querySelectorAll('tbody tr').length : 0;\n\n this.#shadowRoot.innerHTML = `\n <style>\n :host { display: flex; flex-direction: column; position: relative; overflow: hidden; height: 100%; background: #fff; }\n nine-table-header { height: 40px; display: block; flex-shrink: 0; border-bottom: 1px solid #e5e7eb; background: #fff; }\n \n nine-table-body { display: flex; flex-direction: row; flex: 1; overflow: hidden; position: relative; }\n \n nine-table-summary { display: none; width: 250px; flex-shrink: 0; border-right: 1px solid #e5e7eb; }\n \n nine-table-sheets { flex: 1; display: flex; flex-direction: column; overflow: hidden; position: relative; background: #fff; }\n nine-table-sheets-body { flex: 1; overflow: auto; position: relative; display: flex; flex-direction: row; align-items: stretch; }\n \n /* 시트 기본 설정 (flex 대신 너비 고정 제어) */\n nine-table-sheet { display: none !important; height: 100%; overflow: auto; flex-shrink: 0; box-sizing: border-box; }\n \n /* active 시트 1개일 때 꽉 채우기 */\n nine-table-sheets-body.single-view nine-table-sheet.active { display: block !important; width: 100% !important; }\n \n /* active 시트 2개 이상일 때 width 수동 할당 대상 */\n nine-table-sheets-body.multi-view nine-table-sheet.active { display: block !important; }\n\n nine-table-sheets-body nine-splitter { width: 4px; background: #e5e7eb; cursor: col-resize; flex-shrink: 0; display: none; }\n nine-table-sheets-body nine-splitter.active { display: block; }\n\n nine-table-sheets-footer { display: flex; height: 32px; background: #f3f4f6; border-top: 1px solid #e5e7eb; align-items: center; justify-content: space-between; padding: 0 8px; flex-shrink: 0; }\n .nine-tab-bar { display: flex; align-items: center; gap: 2px; overflow-x: auto; flex: 1; height: 100%; }\n \n .nine-tab-item { padding: 4px 12px; cursor: pointer; font-size: 12px; color: #4b5563; background: #e5e7eb; border: 1px solid #d1d5db; border-top: none; border-radius: 0 0 3px 3px; user-select: none; }\n .nine-tab-item.active { background: #ffffff; color: #111827; font-weight: 600; border-bottom: 2px solid #2563eb; }\n \n .sheets-counter { font-size: 12px; color: #6b7280; padding-left: 12px; flex-shrink: 0; }\n nine-table-analysis { display: none; }\n nine-table-footer { display: none; }\n </style>\n \n <nine-table-header></nine-table-header>\n <nine-table-body>\n <nine-table-summary></nine-table-summary>\n <nine-splitter></nine-splitter>\n <nine-table-sheets>\n <nine-table-sheets-body class=\"single-view\">\n ${sheetsHtml}\n </nine-table-sheets-body>\n <nine-table-sheets-footer>\n <div class=\"nine-tab-bar\">\n ${tabsHtml}\n </div>\n <div class=\"sheets-counter\">Total : <span id=\"row-count\">${totalRowCount.toLocaleString()}</span></div>\n </nine-table-sheets-footer>\n </nine-table-sheets>\n <nine-table-analysis></nine-table-analysis>\n </nine-table-body>\n <nine-table-footer></nine-table-footer>\n `;\n }\n\n #bindElements() {\n this.sheetsBody = this.#shadowRoot.querySelector('nine-table-sheets-body');\n this.tabBar = this.#shadowRoot.querySelector('.nine-tab-bar');\n\n this.tabBar.addEventListener('click', (e) => {\n const tabItem = e.target.closest('.nine-tab-item');\n if (!tabItem) return;\n\n const isMultiSelect = e.ctrlKey || e.metaKey || e.shiftKey;\n const index = parseInt(tabItem.dataset.index, 10);\n\n this.switchTab(index, isMultiSelect);\n });\n }\n\n #initSheets() {\n const sheetElements = this.sheetsBody.querySelectorAll('nine-table-sheet');\n sheetElements.forEach((sheetEl, idx) => {\n if (this.#tables[idx]) {\n sheetEl.init(this.#tables[idx]);\n }\n });\n }\n\n switchTab(index, isMultiSelect = false) {\n if (!this.#tables[index]) return;\n\n const tabItems = this.tabBar.querySelectorAll('.nine-tab-item');\n const sheetElements = this.sheetsBody.querySelectorAll('nine-table-sheet');\n\n if (!isMultiSelect) {\n tabItems.forEach((tab, idx) => {\n tab.classList.toggle('active', idx === index);\n const sheet = this.sheetsBody.querySelector(`nine-table-sheet[data-index=\"${idx}\"]`);\n if (sheet) sheet.style.width = '';\n });\n sheetElements.forEach((sheet, idx) => {\n sheet.classList.toggle('active', idx === index);\n });\n } else {\n const clickedTab = tabItems[index];\n const activeTabs = this.tabBar.querySelectorAll('.nine-tab-item.active');\n\n if (clickedTab.classList.contains('active') && activeTabs.length <= 1) {\n return;\n }\n\n clickedTab.classList.toggle('active');\n const targetSheet = this.sheetsBody.querySelector(`nine-table-sheet[data-index=\"${index}\"]`);\n if (targetSheet) {\n targetSheet.classList.toggle('active');\n if (!targetSheet.classList.contains('active')) {\n targetSheet.style.width = '';\n }\n }\n }\n\n this.#updateLayoutMode();\n this.#updateSplitters();\n\n const activeSheet = this.sheetsBody.querySelector(`nine-table-sheet.active`);\n if (activeSheet && typeof activeSheet.getRowCount === 'function') {\n const rowCountEl = this.#shadowRoot.querySelector('#row-count');\n if (rowCountEl) {\n rowCountEl.textContent = activeSheet.getRowCount().toLocaleString();\n }\n }\n }\n\n #updateLayoutMode() {\n const activeSheets = Array.from(this.sheetsBody.querySelectorAll('nine-table-sheet.active'));\n\n if (activeSheets.length > 1) {\n this.sheetsBody.classList.remove('single-view');\n this.sheetsBody.classList.add('multi-view');\n\n // 다중 보기일 때 컨테이너 너비를 기준으로 균등하게 픽셀 width 부여 (여백 문제 해결)\n const bodyWidth = this.sheetsBody.clientWidth || 800;\n const splitterCount = this.sheetsBody.querySelectorAll('nine-splitter.active').length;\n const totalSplitterWidth = splitterCount * 4;\n const availableWidth = bodyWidth - totalSplitterWidth;\n const equalWidth = Math.floor(availableWidth / activeSheets.length);\n\n activeSheets.forEach((sheet, idx) => {\n // 마지막 시트는 남은 잔여 픽셀까지 가져가도록 처리\n if (idx === activeSheets.length - 1) {\n const assignedSoFar = equalWidth * (activeSheets.length - 1);\n sheet.style.width = `${availableWidth - assignedSoFar}px`;\n } else {\n sheet.style.width = `${equalWidth}px`;\n }\n });\n } else {\n this.sheetsBody.classList.remove('multi-view');\n this.sheetsBody.classList.add('single-view');\n\n activeSheets.forEach(sheet => {\n sheet.style.width = '';\n });\n }\n }\n\n #updateSplitters() {\n const splitters = this.sheetsBody.querySelectorAll('nine-splitter');\n splitters.forEach(splitter => {\n const splitIndex = parseInt(splitter.dataset.splitIndex, 10);\n const leftSheet = this.sheetsBody.querySelector(`nine-table-sheet[data-index=\"${splitIndex - 1}\"]`);\n const rightSheet = this.sheetsBody.querySelector(`nine-table-sheet[data-index=\"${splitIndex}\"]`);\n\n if (leftSheet && rightSheet && leftSheet.classList.contains('active') && rightSheet.classList.contains('active')) {\n splitter.classList.add('active');\n } else {\n splitter.classList.remove('active');\n }\n });\n }\n}","import {trace} from \"@nopeer\";\nimport { LayoutManager } from '../ui/LayoutManager.js';\n\nexport default class NineTable extends HTMLElement {\n #created = false;\n\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n }\n\n connectedCallback() {\n if (this.#created) return;\n\n // shadowRoot 하나만 넘겨서 내부에서 레이아웃 및 테이블 수집 처리\n this.layoutManager = new LayoutManager(this.shadowRoot);\n this.layoutManager.render();\n\n this.#created = true;\n trace.log('NineTable connected.');\n\n this.dispatchEvent(new CustomEvent('load', { bubbles: true, detail: { target: this } }));\n }\n\n disconnectedCallback() {\n trace.log('NineTable disconnected.');\n }\n}\n\nif (!customElements.get('nine-table')) {\n customElements.define('nine-table', NineTable);\n}"],"names":["_Trace","traceOrigin","__name","Trace","trace","_TableInitializer","container","__privateAdd","_TableInitializer_instances","_container","__privateSet","tbl","__privateMethod","ensureColgroup_fn","ensureThead_fn","colCount","_a","colgroup","defaultWidth","i","col","thead","TableInitializer","_NineTableSheet","_NineTableSheet_instances","_tableElement","_initializer","render_fn","tableEl","clonedTable","__privateGet","NineTableSheet","_LayoutManager","shadowRoot","_LayoutManager_instances","_shadowRoot","_tables","renderLayoutShell_fn","bindElements_fn","initSheets_fn","index","isMultiSelect","tabItems","sheetElements","tab","idx","sheet","clickedTab","activeTabs","targetSheet","updateLayoutMode_fn","updateSplitters_fn","activeSheet","rowCountEl","sheetsHtml","_","tabsHtml","totalRowCount","tabItem","sheetEl","activeSheets","bodyWidth","totalSplitterWidth","availableWidth","equalWidth","assignedSoFar","splitter","splitIndex","leftSheet","rightSheet","LayoutManager","_NineTable","_created","NineTable"],"mappings":"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"}
1
+ {"version":3,"file":"nine-table.js","sources":["../src/external/NoPeer.js","../src/ui/TableInitializer.js","../src/ui/nine-table-sheet.js","../src/ui/LayoutManager.js","../src/core/nine-table.js"],"sourcesContent":["import { trace as traceOrigin } from '@ninebone/util';\n\nexport class Trace extends traceOrigin.constructor {\n constructor() {\n super();\n this.init(\"nine-table\", \"green\");\n }\n}\n\nexport const trace = new Trace();","export class TableInitializer {\n #container;\n\n constructor(container) {\n this.#container = container;\n }\n\n // [Public] 테이블 초기화 진입점 (필요한 최소한의 마크업 보정만 수행)\n initializeTable(tbl) {\n this.#ensureColgroup(tbl);\n this.#ensureThead(tbl);\n\n tbl.classList.add('nine-table-element');\n return tbl;\n }\n\n // [Private] colgroup 보정\n #ensureColgroup(tbl) {\n if (tbl.querySelector('colgroup')) return;\n\n const colCount = tbl.querySelector('tbody tr')?.querySelectorAll('th, td').length || 1;\n const colgroup = document.createElement('colgroup');\n const defaultWidth = Math.max(Math.floor((tbl.clientWidth || 600) / colCount), 100);\n\n for (let i = 0; i < colCount; i++) {\n const col = document.createElement('col');\n col.setAttribute('width', defaultWidth);\n colgroup.appendChild(col);\n }\n tbl.prepend(colgroup);\n }\n\n // [Private] thead 보정\n #ensureThead(tbl) {\n if (tbl.querySelector('thead')) return;\n\n const thead = document.createElement('thead');\n const colgroup = tbl.querySelector('colgroup');\n if (colgroup) {\n colgroup.after(thead);\n } else {\n tbl.prepend(thead);\n }\n }\n}","import { trace } from \"@nopeer\";\nimport { TableInitializer } from \"./TableInitializer.js\"; // 경로에 맞게 조정 필요\n\nexport class NineTableSheet extends HTMLElement {\n #tableElement = null;\n #initializer;\n\n constructor() {\n super();\n this.#initializer = new TableInitializer(this);\n }\n\n connectedCallback() {\n this.#render();\n }\n\n /**\n * 외부(LayoutManager 등)에서 원본 테이블 엘리먼트를 주입받아 초기화 및 보정 수행\n * @param {HTMLTableElement} tableEl\n */\n init(tableEl) {\n if (!tableEl) return;\n\n // 원본 테이블 복제 후 TableInitializer를 통한 구조 보정\n const clonedTable = tableEl.cloneNode(true);\n this.#tableElement = this.#initializer.initializeTable(clonedTable);\n this.#tableElement.style.display = 'table';\n\n const container = this.querySelector('.sheet-content-container');\n if (container) {\n container.innerHTML = '';\n container.appendChild(this.#tableElement);\n }\n\n trace.log(`NineTableSheet initialized with table rows: ${this.getRowCount()}`);\n }\n\n getRowCount() {\n if (!this.#tableElement) return 0;\n return this.#tableElement.querySelectorAll('tbody tr').length;\n }\n\n #render() {\n this.innerHTML = `\n <style>\n nine-table-sheet {\n display: block;\n width: 100%;\n height: 100%;\n overflow: auto;\n position: relative;\n box-sizing: border-box;\n background: #ffffff;\n }\n\n nine-table-sheet .sheet-content-container {\n width: 100%;\n min-width: fit-content;\n }\n\n nine-table-sheet table {\n border-collapse: collapse;\n width: 100%;\n table-layout: fixed;\n }\n\n nine-table-sheet th, nine-table-sheet td {\n box-sizing: border-box;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n padding: 6px 8px;\n border: 1px solid #e5e7eb;\n font-size: 12px;\n color: #111827;\n }\n\n nine-table-sheet th {\n background-color: #f9fafb;\n font-weight: 600;\n text-align: left;\n }\n </style>\n \n <div class=\"sheet-content-container\">\n <!-- 테이블이 동적으로 주입되는 영역 -->\n </div>\n `;\n }\n\n disconnectedCallback() {\n this.innerHTML = '';\n trace.log('NineTableSheet destroyed.');\n }\n}\n\nif (!customElements.get('nine-table-sheet')) {\n customElements.define('nine-table-sheet', NineTableSheet);\n}\n","import './nine-table-sheet.js';\n// import './nine-splitter.js';\n\nexport class LayoutManager {\n #shadowRoot;\n #tables = [];\n\n constructor(shadowRoot) {\n this.#shadowRoot = shadowRoot;\n }\n\n render() {\n const rawTables = this.#shadowRoot.host.querySelectorAll('table');\n rawTables.forEach(tbl => {\n this.#tables.push(tbl);\n tbl.style.display = 'none';\n });\n\n this.#renderLayoutShell();\n this.#bindElements();\n this.#initSheets();\n\n if (this.#tables.length > 0) {\n this.switchTab(0, false);\n }\n }\n\n #renderLayoutShell() {\n const sheetsHtml = this.#tables.map((_, idx) => {\n const sheet = `<nine-table-sheet class=\"${idx === 0 ? 'active' : ''}\" data-index=\"${idx}\"></nine-table-sheet>`;\n if (idx === 0) return sheet;\n return `<nine-splitter class=\"h\" data-split-index=\"${idx}\"></nine-splitter>${sheet}`;\n }).join('');\n\n const tabsHtml = this.#tables.map((_, idx) => `\n <div class=\"nine-tab-item ${idx === 0 ? 'active' : ''}\" data-index=\"${idx}\">Sheet ${idx + 1}</div>\n `).join('');\n\n const totalRowCount = this.#tables[0] ? this.#tables[0].querySelectorAll('tbody tr').length : 0;\n\n this.#shadowRoot.innerHTML = `\n <style>\n :host { display: flex; flex-direction: column; position: relative; overflow: hidden; height: 100%; background: #fff; }\n nine-table-header { height: 40px; display: block; flex-shrink: 0; border-bottom: 1px solid #e5e7eb; background: #fff; }\n \n nine-table-body { display: flex; flex-direction: row; flex: 1; overflow: hidden; position: relative; }\n \n nine-table-summary { display: none; width: 250px; flex-shrink: 0; border-right: 1px solid #e5e7eb; }\n \n nine-table-sheets { flex: 1; display: flex; flex-direction: column; overflow: hidden; position: relative; background: #fff; }\n \n /* flex-direction 대신 block 및 white-space / float 또는 단순 인라인 블록 구조로 변경하여 flex 간섭 원천 차단 */\n nine-table-sheets-body { flex: 1; overflow: auto; position: relative; white-space: nowrap; font-size: 0; }\n \n /* 시트 기본 설정: flex 속성 완전 배제, inline-block으로 나란히 배치 */\n nine-table-sheet { display: none !important; height: 100%; overflow: auto; box-sizing: border-box; vertical-align: top; font-size: 12px; }\n \n /* active 시트 1개일 때 화면 가득 채우기 */\n nine-table-sheets-body.single-view nine-table-sheet.active { display: inline-block !important; width: 100% !important; }\n \n /* active 시트 2개 이상일 때 인라인 블록 기반 수동 픽셀 width 적용 */\n nine-table-sheets-body.multi-view nine-table-sheet.active { display: inline-block !important; }\n\n /* 스플리터도 인라인 블록으로 나란히 배치 */\n nine-table-sheets-body nine-splitter { width: 4px; height: 100%; background: #e5e7eb; display: none !important; vertical-align: top; }\n nine-table-sheets-body nine-splitter.active { display: inline-block !important; }\n\n nine-table-sheets-footer { display: flex; height: 32px; background: #f3f4f6; border-top: 1px solid #e5e7eb; align-items: center; justify-content: space-between; padding: 0 8px; flex-shrink: 0; }\n .nine-tab-bar { display: flex; align-items: center; gap: 2px; overflow-x: auto; flex: 1; height: 100%; }\n \n .nine-tab-item { padding: 4px 12px; cursor: pointer; font-size: 12px; color: #4b5563; background: #e5e7eb; border: 1px solid #d1d5db; border-top: none; border-radius: 0 0 3px 3px; user-select: none; }\n .nine-tab-item.active { background: #ffffff; color: #111827; font-weight: 600; border-bottom: 2px solid #2563eb; }\n \n .sheets-counter { font-size: 12px; color: #6b7280; padding-left: 12px; flex-shrink: 0; }\n nine-table-analysis { display: none; }\n nine-table-footer { display: none; }\n </style>\n \n <nine-table-header></nine-table-header>\n <nine-table-body>\n <nine-table-summary></nine-table-summary>\n <nine-splitter></nine-splitter>\n <nine-table-sheets>\n <nine-table-sheets-body class=\"single-view\">\n ${sheetsHtml}\n </nine-table-sheets-body>\n <nine-table-sheets-footer>\n <div class=\"nine-tab-bar\">\n ${tabsHtml}\n </div>\n <div class=\"sheets-counter\">Total : <span id=\"row-count\">${totalRowCount.toLocaleString()}</span></div>\n </nine-table-sheets-footer>\n </nine-table-sheets>\n <nine-table-analysis></nine-table-analysis>\n </nine-table-body>\n <nine-table-footer></nine-table-footer>\n `;\n }\n\n #bindElements() {\n this.sheetsBody = this.#shadowRoot.querySelector('nine-table-sheets-body');\n this.tabBar = this.#shadowRoot.querySelector('.nine-tab-bar');\n\n this.tabBar.addEventListener('click', (e) => {\n const tabItem = e.target.closest('.nine-tab-item');\n if (!tabItem) return;\n\n const isMultiSelect = e.ctrlKey || e.metaKey || e.shiftKey;\n const index = parseInt(tabItem.dataset.index, 10);\n\n this.switchTab(index, isMultiSelect);\n });\n }\n\n #initSheets() {\n const sheetElements = this.sheetsBody.querySelectorAll('nine-table-sheet');\n sheetElements.forEach((sheetEl, idx) => {\n if (this.#tables[idx]) {\n sheetEl.init(this.#tables[idx]);\n }\n });\n }\n\n switchTab(index, isMultiSelect = false) {\n if (!this.#tables[index]) return;\n\n const tabItems = this.tabBar.querySelectorAll('.nine-tab-item');\n const sheetElements = this.sheetsBody.querySelectorAll('nine-table-sheet');\n\n if (!isMultiSelect) {\n tabItems.forEach((tab, idx) => {\n tab.classList.toggle('active', idx === index);\n const sheet = this.sheetsBody.querySelector(`nine-table-sheet[data-index=\"${idx}\"]`);\n if (sheet) sheet.style.width = '';\n });\n sheetElements.forEach((sheet, idx) => {\n sheet.classList.toggle('active', idx === index);\n });\n } else {\n const clickedTab = tabItems[index];\n const activeTabs = this.tabBar.querySelectorAll('.nine-tab-item.active');\n\n if (clickedTab.classList.contains('active') && activeTabs.length <= 1) {\n return;\n }\n\n clickedTab.classList.toggle('active');\n const targetSheet = this.sheetsBody.querySelector(`nine-table-sheet[data-index=\"${index}\"]`);\n if (targetSheet) {\n targetSheet.classList.toggle('active');\n if (!targetSheet.classList.contains('active')) {\n targetSheet.style.width = '';\n }\n }\n }\n\n this.#updateLayoutMode();\n this.#updateSplitters();\n\n const activeSheet = this.sheetsBody.querySelector(`nine-table-sheet.active`);\n if (activeSheet && typeof activeSheet.getRowCount === 'function') {\n const rowCountEl = this.#shadowRoot.querySelector('#row-count');\n if (rowCountEl) {\n rowCountEl.textContent = activeSheet.getRowCount().toLocaleString();\n }\n }\n }\n\n #updateLayoutMode() {\n const activeSheets = Array.from(this.sheetsBody.querySelectorAll('nine-table-sheet.active'));\n\n if (activeSheets.length > 1) {\n this.sheetsBody.classList.remove('single-view');\n this.sheetsBody.classList.add('multi-view');\n\n // 컨테이너 폭에서 스플리터 영역(개당 4px)을 제외한 순수 가용 너비 계산\n const bodyWidth = this.sheetsBody.clientWidth || 800;\n const splitterCount = this.sheetsBody.querySelectorAll('nine-splitter.active').length;\n const totalSplitterWidth = splitterCount * 4;\n const availableWidth = bodyWidth - totalSplitterWidth;\n const equalWidth = Math.floor(availableWidth / activeSheets.length);\n\n activeSheets.forEach((sheet, idx) => {\n if (idx === activeSheets.length - 1) {\n const assignedSoFar = equalWidth * (activeSheets.length - 1);\n sheet.style.width = `${availableWidth - assignedSoFar}px`;\n } else {\n sheet.style.width = `${equalWidth}px`;\n }\n });\n } else {\n this.sheetsBody.classList.remove('multi-view');\n this.sheetsBody.classList.add('single-view');\n\n activeSheets.forEach(sheet => {\n sheet.style.width = '';\n });\n }\n }\n\n #updateSplitters() {\n const splitters = this.sheetsBody.querySelectorAll('nine-splitter');\n splitters.forEach(splitter => {\n const splitIndex = parseInt(splitter.dataset.splitIndex, 10);\n const leftSheet = this.sheetsBody.querySelector(`nine-table-sheet[data-index=\"${splitIndex - 1}\"]`);\n const rightSheet = this.sheetsBody.querySelector(`nine-table-sheet[data-index=\"${splitIndex}\"]`);\n\n if (leftSheet && rightSheet && leftSheet.classList.contains('active') && rightSheet.classList.contains('active')) {\n splitter.classList.add('active');\n } else {\n splitter.classList.remove('active');\n }\n });\n }\n}","import {trace} from \"@nopeer\";\nimport { LayoutManager } from '../ui/LayoutManager.js';\n\nexport default class NineTable extends HTMLElement {\n #created = false;\n\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n }\n\n connectedCallback() {\n if (this.#created) return;\n\n // shadowRoot 하나만 넘겨서 내부에서 레이아웃 및 테이블 수집 처리\n this.layoutManager = new LayoutManager(this.shadowRoot);\n this.layoutManager.render();\n\n this.#created = true;\n trace.log('NineTable connected.');\n\n this.dispatchEvent(new CustomEvent('load', { bubbles: true, detail: { target: this } }));\n }\n\n disconnectedCallback() {\n trace.log('NineTable disconnected.');\n }\n}\n\nif (!customElements.get('nine-table')) {\n customElements.define('nine-table', NineTable);\n}"],"names":["_Trace","traceOrigin","__name","Trace","trace","_TableInitializer","container","__privateAdd","_TableInitializer_instances","_container","__privateSet","tbl","__privateMethod","ensureColgroup_fn","ensureThead_fn","colCount","_a","colgroup","defaultWidth","i","col","thead","TableInitializer","_NineTableSheet","_NineTableSheet_instances","_tableElement","_initializer","render_fn","tableEl","clonedTable","__privateGet","NineTableSheet","_LayoutManager","shadowRoot","_LayoutManager_instances","_shadowRoot","_tables","renderLayoutShell_fn","bindElements_fn","initSheets_fn","index","isMultiSelect","tabItems","sheetElements","tab","idx","sheet","clickedTab","activeTabs","targetSheet","updateLayoutMode_fn","updateSplitters_fn","activeSheet","rowCountEl","sheetsHtml","_","tabsHtml","totalRowCount","tabItem","sheetEl","activeSheets","bodyWidth","totalSplitterWidth","availableWidth","equalWidth","assignedSoFar","splitter","splitIndex","leftSheet","rightSheet","LayoutManager","_NineTable","_created","NineTable"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- (function(i,s){typeof exports=="object"&&typeof module<"u"?s(require("@ninebone/util")):typeof define=="function"&&define.amd?define(["@ninebone/util"],s):(i=typeof globalThis<"u"?globalThis:i||self,s(i.NineboneUtil))})(this,function(i){"use strict";var J=Object.defineProperty;var R=i=>{throw TypeError(i)};var h=(i,s)=>J(i,"name",{value:s,configurable:!0});var H=(i,s,r)=>s.has(i)||R("Cannot "+r);var l=(i,s,r)=>(H(i,s,"read from private field"),r?r.call(i):s.get(i)),u=(i,s,r)=>s.has(i)?R("Cannot add the same private member more than once"):s instanceof WeakSet?s.add(i):s.set(i,r),w=(i,s,r,v)=>(H(i,s,"write to private field"),v?v.call(i,r):s.set(i,r),r),g=(i,s,r)=>(H(i,s,"access private method"),r);var q,x,W,j,m,S,E,I,p,d,b,K,N,F,U,D,k;const $=class $ extends i.trace.constructor{constructor(){super(),this.init("nine-table","green")}};h($,"Trace");let s=$;const r=new s,T=class T{constructor(e){u(this,x);u(this,q);w(this,q,e)}initializeTable(e){return g(this,x,W).call(this,e),g(this,x,j).call(this,e),e.classList.add("nine-table-element"),e}};q=new WeakMap,x=new WeakSet,W=h(function(e){var o;if(e.querySelector("colgroup"))return;const t=((o=e.querySelector("tbody tr"))==null?void 0:o.querySelectorAll("th, td").length)||1,n=document.createElement("colgroup"),c=Math.max(Math.floor((e.clientWidth||600)/t),100);for(let a=0;a<t;a++){const f=document.createElement("col");f.setAttribute("width",c),n.appendChild(f)}e.prepend(n)},"#ensureColgroup"),j=h(function(e){if(e.querySelector("thead"))return;const t=document.createElement("thead"),n=e.querySelector("colgroup");n?n.after(t):e.prepend(t)},"#ensureThead"),h(T,"TableInitializer");let v=T;const A=class A extends HTMLElement{constructor(){super();u(this,E);u(this,m,null);u(this,S);w(this,S,new v(this))}connectedCallback(){g(this,E,I).call(this)}init(t){if(!t)return;const n=t.cloneNode(!0);w(this,m,l(this,S).initializeTable(n)),l(this,m).style.display="table";const c=this.querySelector(".sheet-content-container");c&&(c.innerHTML="",c.appendChild(l(this,m))),r.log(`NineTableSheet initialized with table rows: ${this.getRowCount()}`)}getRowCount(){return l(this,m)?l(this,m).querySelectorAll("tbody tr").length:0}disconnectedCallback(){this.innerHTML="",r.log("NineTableSheet destroyed.")}};m=new WeakMap,S=new WeakMap,E=new WeakSet,I=h(function(){this.innerHTML=`
1
+ (function(i,n){typeof exports=="object"&&typeof module<"u"?n(require("@ninebone/util")):typeof define=="function"&&define.amd?define(["@ninebone/util"],n):(i=typeof globalThis<"u"?globalThis:i||self,n(i.NineboneUtil))})(this,function(i){"use strict";var J=Object.defineProperty;var R=i=>{throw TypeError(i)};var h=(i,n)=>J(i,"name",{value:n,configurable:!0});var H=(i,n,r)=>n.has(i)||R("Cannot "+r);var l=(i,n,r)=>(H(i,n,"read from private field"),r?r.call(i):n.get(i)),u=(i,n,r)=>n.has(i)?R("Cannot add the same private member more than once"):n instanceof WeakSet?n.add(i):n.set(i,r),x=(i,n,r,v)=>(H(i,n,"write to private field"),v?v.call(i,r):n.set(i,r),r),g=(i,n,r)=>(H(i,n,"access private method"),r);var q,w,W,j,m,S,E,I,p,d,b,K,N,F,U,D,k;const $=class $ extends i.trace.constructor{constructor(){super(),this.init("nine-table","green")}};h($,"Trace");let n=$;const r=new n,T=class T{constructor(e){u(this,w);u(this,q);x(this,q,e)}initializeTable(e){return g(this,w,W).call(this,e),g(this,w,j).call(this,e),e.classList.add("nine-table-element"),e}};q=new WeakMap,w=new WeakSet,W=h(function(e){var o;if(e.querySelector("colgroup"))return;const t=((o=e.querySelector("tbody tr"))==null?void 0:o.querySelectorAll("th, td").length)||1,s=document.createElement("colgroup"),c=Math.max(Math.floor((e.clientWidth||600)/t),100);for(let a=0;a<t;a++){const f=document.createElement("col");f.setAttribute("width",c),s.appendChild(f)}e.prepend(s)},"#ensureColgroup"),j=h(function(e){if(e.querySelector("thead"))return;const t=document.createElement("thead"),s=e.querySelector("colgroup");s?s.after(t):e.prepend(t)},"#ensureThead"),h(T,"TableInitializer");let v=T;const A=class A extends HTMLElement{constructor(){super();u(this,E);u(this,m,null);u(this,S);x(this,S,new v(this))}connectedCallback(){g(this,E,I).call(this)}init(t){if(!t)return;const s=t.cloneNode(!0);x(this,m,l(this,S).initializeTable(s)),l(this,m).style.display="table";const c=this.querySelector(".sheet-content-container");c&&(c.innerHTML="",c.appendChild(l(this,m))),r.log(`NineTableSheet initialized with table rows: ${this.getRowCount()}`)}getRowCount(){return l(this,m)?l(this,m).querySelectorAll("tbody tr").length:0}disconnectedCallback(){this.innerHTML="",r.log("NineTableSheet destroyed.")}};m=new WeakMap,S=new WeakMap,E=new WeakSet,I=h(function(){this.innerHTML=`
2
2
  <style>
3
3
  nine-table-sheet {
4
4
  display: block;
@@ -42,9 +42,9 @@
42
42
  <div class="sheet-content-container">
43
43
  <!-- 테이블이 동적으로 주입되는 영역 -->
44
44
  </div>
45
- `},"#render"),h(A,"NineTableSheet");let L=A;customElements.get("nine-table-sheet")||customElements.define("nine-table-sheet",L);const M=class M{constructor(e){u(this,b);u(this,p);u(this,d,[]);w(this,p,e)}render(){l(this,p).host.querySelectorAll("table").forEach(t=>{l(this,d).push(t),t.style.display="none"}),g(this,b,K).call(this),g(this,b,N).call(this),g(this,b,F).call(this),l(this,d).length>0&&this.switchTab(0,!1)}switchTab(e,t=!1){if(!l(this,d)[e])return;const n=this.tabBar.querySelectorAll(".nine-tab-item"),c=this.sheetsBody.querySelectorAll("nine-table-sheet");if(!t)n.forEach((a,f)=>{a.classList.toggle("active",f===e);const y=this.sheetsBody.querySelector(`nine-table-sheet[data-index="${f}"]`);y&&(y.style.width="")}),c.forEach((a,f)=>{a.classList.toggle("active",f===e)});else{const a=n[e],f=this.tabBar.querySelectorAll(".nine-tab-item.active");if(a.classList.contains("active")&&f.length<=1)return;a.classList.toggle("active");const y=this.sheetsBody.querySelector(`nine-table-sheet[data-index="${e}"]`);y&&(y.classList.toggle("active"),y.classList.contains("active")||(y.style.width=""))}g(this,b,U).call(this),g(this,b,D).call(this);const o=this.sheetsBody.querySelector("nine-table-sheet.active");if(o&&typeof o.getRowCount=="function"){const a=l(this,p).querySelector("#row-count");a&&(a.textContent=o.getRowCount().toLocaleString())}}};p=new WeakMap,d=new WeakMap,b=new WeakSet,K=h(function(){const e=l(this,d).map((c,o)=>{const a=`<nine-table-sheet class="${o===0?"active":""}" data-index="${o}"></nine-table-sheet>`;return o===0?a:`<nine-splitter class="h" data-split-index="${o}"></nine-splitter>${a}`}).join(""),t=l(this,d).map((c,o)=>`
45
+ `},"#render"),h(A,"NineTableSheet");let L=A;customElements.get("nine-table-sheet")||customElements.define("nine-table-sheet",L);const M=class M{constructor(e){u(this,b);u(this,p);u(this,d,[]);x(this,p,e)}render(){l(this,p).host.querySelectorAll("table").forEach(t=>{l(this,d).push(t),t.style.display="none"}),g(this,b,K).call(this),g(this,b,N).call(this),g(this,b,F).call(this),l(this,d).length>0&&this.switchTab(0,!1)}switchTab(e,t=!1){if(!l(this,d)[e])return;const s=this.tabBar.querySelectorAll(".nine-tab-item"),c=this.sheetsBody.querySelectorAll("nine-table-sheet");if(!t)s.forEach((a,f)=>{a.classList.toggle("active",f===e);const y=this.sheetsBody.querySelector(`nine-table-sheet[data-index="${f}"]`);y&&(y.style.width="")}),c.forEach((a,f)=>{a.classList.toggle("active",f===e)});else{const a=s[e],f=this.tabBar.querySelectorAll(".nine-tab-item.active");if(a.classList.contains("active")&&f.length<=1)return;a.classList.toggle("active");const y=this.sheetsBody.querySelector(`nine-table-sheet[data-index="${e}"]`);y&&(y.classList.toggle("active"),y.classList.contains("active")||(y.style.width=""))}g(this,b,U).call(this),g(this,b,D).call(this);const o=this.sheetsBody.querySelector("nine-table-sheet.active");if(o&&typeof o.getRowCount=="function"){const a=l(this,p).querySelector("#row-count");a&&(a.textContent=o.getRowCount().toLocaleString())}}};p=new WeakMap,d=new WeakMap,b=new WeakSet,K=h(function(){const e=l(this,d).map((c,o)=>{const a=`<nine-table-sheet class="${o===0?"active":""}" data-index="${o}"></nine-table-sheet>`;return o===0?a:`<nine-splitter class="h" data-split-index="${o}"></nine-splitter>${a}`}).join(""),t=l(this,d).map((c,o)=>`
46
46
  <div class="nine-tab-item ${o===0?"active":""}" data-index="${o}">Sheet ${o+1}</div>
47
- `).join(""),n=l(this,d)[0]?l(this,d)[0].querySelectorAll("tbody tr").length:0;l(this,p).innerHTML=`
47
+ `).join(""),s=l(this,d)[0]?l(this,d)[0].querySelectorAll("tbody tr").length:0;l(this,p).innerHTML=`
48
48
  <style>
49
49
  :host { display: flex; flex-direction: column; position: relative; overflow: hidden; height: 100%; background: #fff; }
50
50
  nine-table-header { height: 40px; display: block; flex-shrink: 0; border-bottom: 1px solid #e5e7eb; background: #fff; }
@@ -54,19 +54,22 @@
54
54
  nine-table-summary { display: none; width: 250px; flex-shrink: 0; border-right: 1px solid #e5e7eb; }
55
55
 
56
56
  nine-table-sheets { flex: 1; display: flex; flex-direction: column; overflow: hidden; position: relative; background: #fff; }
57
- nine-table-sheets-body { flex: 1; overflow: auto; position: relative; display: flex; flex-direction: row; align-items: stretch; }
58
57
 
59
- /* 시트 기본 설정 (flex 대신 너비 고정 제어) */
60
- nine-table-sheet { display: none !important; height: 100%; overflow: auto; flex-shrink: 0; box-sizing: border-box; }
58
+ /* flex-direction 대신 block 및 white-space / float 또는 단순 인라인 블록 구조로 변경하여 flex 간섭 원천 차단 */
59
+ nine-table-sheets-body { flex: 1; overflow: auto; position: relative; white-space: nowrap; font-size: 0; }
61
60
 
62
- /* active 시트 1개일 채우기 */
63
- nine-table-sheets-body.single-view nine-table-sheet.active { display: block !important; width: 100% !important; }
61
+ /* 시트 기본 설정: flex 속성 완전 배제, inline-block으로 나란히 배치 */
62
+ nine-table-sheet { display: none !important; height: 100%; overflow: auto; box-sizing: border-box; vertical-align: top; font-size: 12px; }
64
63
 
65
- /* active 시트 2개 이상일 width 수동 할당 대상 */
66
- nine-table-sheets-body.multi-view nine-table-sheet.active { display: block !important; }
64
+ /* active 시트 1개일화면 가득 채우기 */
65
+ nine-table-sheets-body.single-view nine-table-sheet.active { display: inline-block !important; width: 100% !important; }
66
+
67
+ /* active 시트 2개 이상일 때 인라인 블록 기반 수동 픽셀 width 적용 */
68
+ nine-table-sheets-body.multi-view nine-table-sheet.active { display: inline-block !important; }
67
69
 
68
- nine-table-sheets-body nine-splitter { width: 4px; background: #e5e7eb; cursor: col-resize; flex-shrink: 0; display: none; }
69
- nine-table-sheets-body nine-splitter.active { display: block; }
70
+ /* 스플리터도 인라인 블록으로 나란히 배치 */
71
+ nine-table-sheets-body nine-splitter { width: 4px; height: 100%; background: #e5e7eb; display: none !important; vertical-align: top; }
72
+ nine-table-sheets-body nine-splitter.active { display: inline-block !important; }
70
73
 
71
74
  nine-table-sheets-footer { display: flex; height: 32px; background: #f3f4f6; border-top: 1px solid #e5e7eb; align-items: center; justify-content: space-between; padding: 0 8px; flex-shrink: 0; }
72
75
  .nine-tab-bar { display: flex; align-items: center; gap: 2px; overflow-x: auto; flex: 1; height: 100%; }
@@ -91,11 +94,11 @@
91
94
  <div class="nine-tab-bar">
92
95
  ${t}
93
96
  </div>
94
- <div class="sheets-counter">Total : <span id="row-count">${n.toLocaleString()}</span></div>
97
+ <div class="sheets-counter">Total : <span id="row-count">${s.toLocaleString()}</span></div>
95
98
  </nine-table-sheets-footer>
96
99
  </nine-table-sheets>
97
100
  <nine-table-analysis></nine-table-analysis>
98
101
  </nine-table-body>
99
102
  <nine-table-footer></nine-table-footer>
100
- `},"#renderLayoutShell"),N=h(function(){this.sheetsBody=l(this,p).querySelector("nine-table-sheets-body"),this.tabBar=l(this,p).querySelector(".nine-tab-bar"),this.tabBar.addEventListener("click",e=>{const t=e.target.closest(".nine-tab-item");if(!t)return;const n=e.ctrlKey||e.metaKey||e.shiftKey,c=parseInt(t.dataset.index,10);this.switchTab(c,n)})},"#bindElements"),F=h(function(){this.sheetsBody.querySelectorAll("nine-table-sheet").forEach((t,n)=>{l(this,d)[n]&&t.init(l(this,d)[n])})},"#initSheets"),U=h(function(){const e=Array.from(this.sheetsBody.querySelectorAll("nine-table-sheet.active"));if(e.length>1){this.sheetsBody.classList.remove("single-view"),this.sheetsBody.classList.add("multi-view");const t=this.sheetsBody.clientWidth||800,c=this.sheetsBody.querySelectorAll("nine-splitter.active").length*4,o=t-c,a=Math.floor(o/e.length);e.forEach((f,y)=>{if(y===e.length-1){const G=a*(e.length-1);f.style.width=`${o-G}px`}else f.style.width=`${a}px`})}else this.sheetsBody.classList.remove("multi-view"),this.sheetsBody.classList.add("single-view"),e.forEach(t=>{t.style.width=""})},"#updateLayoutMode"),D=h(function(){this.sheetsBody.querySelectorAll("nine-splitter").forEach(t=>{const n=parseInt(t.dataset.splitIndex,10),c=this.sheetsBody.querySelector(`nine-table-sheet[data-index="${n-1}"]`),o=this.sheetsBody.querySelector(`nine-table-sheet[data-index="${n}"]`);c&&o&&c.classList.contains("active")&&o.classList.contains("active")?t.classList.add("active"):t.classList.remove("active")})},"#updateSplitters"),h(M,"LayoutManager");let B=M;const z=class z extends HTMLElement{constructor(){super();u(this,k,!1);this.attachShadow({mode:"open"})}connectedCallback(){l(this,k)||(this.layoutManager=new B(this.shadowRoot),this.layoutManager.render(),w(this,k,!0),r.log("NineTable connected."),this.dispatchEvent(new CustomEvent("load",{bubbles:!0,detail:{target:this}})))}disconnectedCallback(){r.log("NineTable disconnected.")}};k=new WeakMap,h(z,"NineTable");let C=z;customElements.get("nine-table")||customElements.define("nine-table",C)});
103
+ `},"#renderLayoutShell"),N=h(function(){this.sheetsBody=l(this,p).querySelector("nine-table-sheets-body"),this.tabBar=l(this,p).querySelector(".nine-tab-bar"),this.tabBar.addEventListener("click",e=>{const t=e.target.closest(".nine-tab-item");if(!t)return;const s=e.ctrlKey||e.metaKey||e.shiftKey,c=parseInt(t.dataset.index,10);this.switchTab(c,s)})},"#bindElements"),F=h(function(){this.sheetsBody.querySelectorAll("nine-table-sheet").forEach((t,s)=>{l(this,d)[s]&&t.init(l(this,d)[s])})},"#initSheets"),U=h(function(){const e=Array.from(this.sheetsBody.querySelectorAll("nine-table-sheet.active"));if(e.length>1){this.sheetsBody.classList.remove("single-view"),this.sheetsBody.classList.add("multi-view");const t=this.sheetsBody.clientWidth||800,c=this.sheetsBody.querySelectorAll("nine-splitter.active").length*4,o=t-c,a=Math.floor(o/e.length);e.forEach((f,y)=>{if(y===e.length-1){const G=a*(e.length-1);f.style.width=`${o-G}px`}else f.style.width=`${a}px`})}else this.sheetsBody.classList.remove("multi-view"),this.sheetsBody.classList.add("single-view"),e.forEach(t=>{t.style.width=""})},"#updateLayoutMode"),D=h(function(){this.sheetsBody.querySelectorAll("nine-splitter").forEach(t=>{const s=parseInt(t.dataset.splitIndex,10),c=this.sheetsBody.querySelector(`nine-table-sheet[data-index="${s-1}"]`),o=this.sheetsBody.querySelector(`nine-table-sheet[data-index="${s}"]`);c&&o&&c.classList.contains("active")&&o.classList.contains("active")?t.classList.add("active"):t.classList.remove("active")})},"#updateSplitters"),h(M,"LayoutManager");let B=M;const z=class z extends HTMLElement{constructor(){super();u(this,k,!1);this.attachShadow({mode:"open"})}connectedCallback(){l(this,k)||(this.layoutManager=new B(this.shadowRoot),this.layoutManager.render(),x(this,k,!0),r.log("NineTable connected."),this.dispatchEvent(new CustomEvent("load",{bubbles:!0,detail:{target:this}})))}disconnectedCallback(){r.log("NineTable disconnected.")}};k=new WeakMap,h(z,"NineTable");let C=z;customElements.get("nine-table")||customElements.define("nine-table",C)});
101
104
  //# sourceMappingURL=nine-table.umd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"nine-table.umd.js","sources":["../src/external/NoPeer.js","../src/ui/TableInitializer.js","../src/ui/nine-table-sheet.js","../src/ui/LayoutManager.js","../src/core/nine-table.js"],"sourcesContent":["import { trace as traceOrigin } from '@ninebone/util';\n\nexport class Trace extends traceOrigin.constructor {\n constructor() {\n super();\n this.init(\"nine-table\", \"green\");\n }\n}\n\nexport const trace = new Trace();","export class TableInitializer {\n #container;\n\n constructor(container) {\n this.#container = container;\n }\n\n // [Public] 테이블 초기화 진입점 (필요한 최소한의 마크업 보정만 수행)\n initializeTable(tbl) {\n this.#ensureColgroup(tbl);\n this.#ensureThead(tbl);\n\n tbl.classList.add('nine-table-element');\n return tbl;\n }\n\n // [Private] colgroup 보정\n #ensureColgroup(tbl) {\n if (tbl.querySelector('colgroup')) return;\n\n const colCount = tbl.querySelector('tbody tr')?.querySelectorAll('th, td').length || 1;\n const colgroup = document.createElement('colgroup');\n const defaultWidth = Math.max(Math.floor((tbl.clientWidth || 600) / colCount), 100);\n\n for (let i = 0; i < colCount; i++) {\n const col = document.createElement('col');\n col.setAttribute('width', defaultWidth);\n colgroup.appendChild(col);\n }\n tbl.prepend(colgroup);\n }\n\n // [Private] thead 보정\n #ensureThead(tbl) {\n if (tbl.querySelector('thead')) return;\n\n const thead = document.createElement('thead');\n const colgroup = tbl.querySelector('colgroup');\n if (colgroup) {\n colgroup.after(thead);\n } else {\n tbl.prepend(thead);\n }\n }\n}","import { trace } from \"@nopeer\";\nimport { TableInitializer } from \"./TableInitializer.js\"; // 경로에 맞게 조정 필요\n\nexport class NineTableSheet extends HTMLElement {\n #tableElement = null;\n #initializer;\n\n constructor() {\n super();\n this.#initializer = new TableInitializer(this);\n }\n\n connectedCallback() {\n this.#render();\n }\n\n /**\n * 외부(LayoutManager 등)에서 원본 테이블 엘리먼트를 주입받아 초기화 및 보정 수행\n * @param {HTMLTableElement} tableEl\n */\n init(tableEl) {\n if (!tableEl) return;\n\n // 원본 테이블 복제 후 TableInitializer를 통한 구조 보정\n const clonedTable = tableEl.cloneNode(true);\n this.#tableElement = this.#initializer.initializeTable(clonedTable);\n this.#tableElement.style.display = 'table';\n\n const container = this.querySelector('.sheet-content-container');\n if (container) {\n container.innerHTML = '';\n container.appendChild(this.#tableElement);\n }\n\n trace.log(`NineTableSheet initialized with table rows: ${this.getRowCount()}`);\n }\n\n getRowCount() {\n if (!this.#tableElement) return 0;\n return this.#tableElement.querySelectorAll('tbody tr').length;\n }\n\n #render() {\n this.innerHTML = `\n <style>\n nine-table-sheet {\n display: block;\n width: 100%;\n height: 100%;\n overflow: auto;\n position: relative;\n box-sizing: border-box;\n background: #ffffff;\n }\n\n nine-table-sheet .sheet-content-container {\n width: 100%;\n min-width: fit-content;\n }\n\n nine-table-sheet table {\n border-collapse: collapse;\n width: 100%;\n table-layout: fixed;\n }\n\n nine-table-sheet th, nine-table-sheet td {\n box-sizing: border-box;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n padding: 6px 8px;\n border: 1px solid #e5e7eb;\n font-size: 12px;\n color: #111827;\n }\n\n nine-table-sheet th {\n background-color: #f9fafb;\n font-weight: 600;\n text-align: left;\n }\n </style>\n \n <div class=\"sheet-content-container\">\n <!-- 테이블이 동적으로 주입되는 영역 -->\n </div>\n `;\n }\n\n disconnectedCallback() {\n this.innerHTML = '';\n trace.log('NineTableSheet destroyed.');\n }\n}\n\nif (!customElements.get('nine-table-sheet')) {\n customElements.define('nine-table-sheet', NineTableSheet);\n}\n","import './nine-table-sheet.js';\n// import './nine-splitter.js';\n\nexport class LayoutManager {\n #shadowRoot;\n #tables = [];\n\n constructor(shadowRoot) {\n this.#shadowRoot = shadowRoot;\n }\n\n render() {\n const rawTables = this.#shadowRoot.host.querySelectorAll('table');\n rawTables.forEach(tbl => {\n this.#tables.push(tbl);\n tbl.style.display = 'none';\n });\n\n this.#renderLayoutShell();\n this.#bindElements();\n this.#initSheets();\n\n if (this.#tables.length > 0) {\n this.switchTab(0, false);\n }\n }\n\n #renderLayoutShell() {\n const sheetsHtml = this.#tables.map((_, idx) => {\n const sheet = `<nine-table-sheet class=\"${idx === 0 ? 'active' : ''}\" data-index=\"${idx}\"></nine-table-sheet>`;\n if (idx === 0) return sheet;\n return `<nine-splitter class=\"h\" data-split-index=\"${idx}\"></nine-splitter>${sheet}`;\n }).join('');\n\n const tabsHtml = this.#tables.map((_, idx) => `\n <div class=\"nine-tab-item ${idx === 0 ? 'active' : ''}\" data-index=\"${idx}\">Sheet ${idx + 1}</div>\n `).join('');\n\n const totalRowCount = this.#tables[0] ? this.#tables[0].querySelectorAll('tbody tr').length : 0;\n\n this.#shadowRoot.innerHTML = `\n <style>\n :host { display: flex; flex-direction: column; position: relative; overflow: hidden; height: 100%; background: #fff; }\n nine-table-header { height: 40px; display: block; flex-shrink: 0; border-bottom: 1px solid #e5e7eb; background: #fff; }\n \n nine-table-body { display: flex; flex-direction: row; flex: 1; overflow: hidden; position: relative; }\n \n nine-table-summary { display: none; width: 250px; flex-shrink: 0; border-right: 1px solid #e5e7eb; }\n \n nine-table-sheets { flex: 1; display: flex; flex-direction: column; overflow: hidden; position: relative; background: #fff; }\n nine-table-sheets-body { flex: 1; overflow: auto; position: relative; display: flex; flex-direction: row; align-items: stretch; }\n \n /* 시트 기본 설정 (flex 대신 너비 고정 제어) */\n nine-table-sheet { display: none !important; height: 100%; overflow: auto; flex-shrink: 0; box-sizing: border-box; }\n \n /* active 시트 1개일 때 꽉 채우기 */\n nine-table-sheets-body.single-view nine-table-sheet.active { display: block !important; width: 100% !important; }\n \n /* active 시트 2개 이상일 때 width 수동 할당 대상 */\n nine-table-sheets-body.multi-view nine-table-sheet.active { display: block !important; }\n\n nine-table-sheets-body nine-splitter { width: 4px; background: #e5e7eb; cursor: col-resize; flex-shrink: 0; display: none; }\n nine-table-sheets-body nine-splitter.active { display: block; }\n\n nine-table-sheets-footer { display: flex; height: 32px; background: #f3f4f6; border-top: 1px solid #e5e7eb; align-items: center; justify-content: space-between; padding: 0 8px; flex-shrink: 0; }\n .nine-tab-bar { display: flex; align-items: center; gap: 2px; overflow-x: auto; flex: 1; height: 100%; }\n \n .nine-tab-item { padding: 4px 12px; cursor: pointer; font-size: 12px; color: #4b5563; background: #e5e7eb; border: 1px solid #d1d5db; border-top: none; border-radius: 0 0 3px 3px; user-select: none; }\n .nine-tab-item.active { background: #ffffff; color: #111827; font-weight: 600; border-bottom: 2px solid #2563eb; }\n \n .sheets-counter { font-size: 12px; color: #6b7280; padding-left: 12px; flex-shrink: 0; }\n nine-table-analysis { display: none; }\n nine-table-footer { display: none; }\n </style>\n \n <nine-table-header></nine-table-header>\n <nine-table-body>\n <nine-table-summary></nine-table-summary>\n <nine-splitter></nine-splitter>\n <nine-table-sheets>\n <nine-table-sheets-body class=\"single-view\">\n ${sheetsHtml}\n </nine-table-sheets-body>\n <nine-table-sheets-footer>\n <div class=\"nine-tab-bar\">\n ${tabsHtml}\n </div>\n <div class=\"sheets-counter\">Total : <span id=\"row-count\">${totalRowCount.toLocaleString()}</span></div>\n </nine-table-sheets-footer>\n </nine-table-sheets>\n <nine-table-analysis></nine-table-analysis>\n </nine-table-body>\n <nine-table-footer></nine-table-footer>\n `;\n }\n\n #bindElements() {\n this.sheetsBody = this.#shadowRoot.querySelector('nine-table-sheets-body');\n this.tabBar = this.#shadowRoot.querySelector('.nine-tab-bar');\n\n this.tabBar.addEventListener('click', (e) => {\n const tabItem = e.target.closest('.nine-tab-item');\n if (!tabItem) return;\n\n const isMultiSelect = e.ctrlKey || e.metaKey || e.shiftKey;\n const index = parseInt(tabItem.dataset.index, 10);\n\n this.switchTab(index, isMultiSelect);\n });\n }\n\n #initSheets() {\n const sheetElements = this.sheetsBody.querySelectorAll('nine-table-sheet');\n sheetElements.forEach((sheetEl, idx) => {\n if (this.#tables[idx]) {\n sheetEl.init(this.#tables[idx]);\n }\n });\n }\n\n switchTab(index, isMultiSelect = false) {\n if (!this.#tables[index]) return;\n\n const tabItems = this.tabBar.querySelectorAll('.nine-tab-item');\n const sheetElements = this.sheetsBody.querySelectorAll('nine-table-sheet');\n\n if (!isMultiSelect) {\n tabItems.forEach((tab, idx) => {\n tab.classList.toggle('active', idx === index);\n const sheet = this.sheetsBody.querySelector(`nine-table-sheet[data-index=\"${idx}\"]`);\n if (sheet) sheet.style.width = '';\n });\n sheetElements.forEach((sheet, idx) => {\n sheet.classList.toggle('active', idx === index);\n });\n } else {\n const clickedTab = tabItems[index];\n const activeTabs = this.tabBar.querySelectorAll('.nine-tab-item.active');\n\n if (clickedTab.classList.contains('active') && activeTabs.length <= 1) {\n return;\n }\n\n clickedTab.classList.toggle('active');\n const targetSheet = this.sheetsBody.querySelector(`nine-table-sheet[data-index=\"${index}\"]`);\n if (targetSheet) {\n targetSheet.classList.toggle('active');\n if (!targetSheet.classList.contains('active')) {\n targetSheet.style.width = '';\n }\n }\n }\n\n this.#updateLayoutMode();\n this.#updateSplitters();\n\n const activeSheet = this.sheetsBody.querySelector(`nine-table-sheet.active`);\n if (activeSheet && typeof activeSheet.getRowCount === 'function') {\n const rowCountEl = this.#shadowRoot.querySelector('#row-count');\n if (rowCountEl) {\n rowCountEl.textContent = activeSheet.getRowCount().toLocaleString();\n }\n }\n }\n\n #updateLayoutMode() {\n const activeSheets = Array.from(this.sheetsBody.querySelectorAll('nine-table-sheet.active'));\n\n if (activeSheets.length > 1) {\n this.sheetsBody.classList.remove('single-view');\n this.sheetsBody.classList.add('multi-view');\n\n // 다중 보기일 때 컨테이너 너비를 기준으로 균등하게 픽셀 width 부여 (여백 문제 해결)\n const bodyWidth = this.sheetsBody.clientWidth || 800;\n const splitterCount = this.sheetsBody.querySelectorAll('nine-splitter.active').length;\n const totalSplitterWidth = splitterCount * 4;\n const availableWidth = bodyWidth - totalSplitterWidth;\n const equalWidth = Math.floor(availableWidth / activeSheets.length);\n\n activeSheets.forEach((sheet, idx) => {\n // 마지막 시트는 남은 잔여 픽셀까지 가져가도록 처리\n if (idx === activeSheets.length - 1) {\n const assignedSoFar = equalWidth * (activeSheets.length - 1);\n sheet.style.width = `${availableWidth - assignedSoFar}px`;\n } else {\n sheet.style.width = `${equalWidth}px`;\n }\n });\n } else {\n this.sheetsBody.classList.remove('multi-view');\n this.sheetsBody.classList.add('single-view');\n\n activeSheets.forEach(sheet => {\n sheet.style.width = '';\n });\n }\n }\n\n #updateSplitters() {\n const splitters = this.sheetsBody.querySelectorAll('nine-splitter');\n splitters.forEach(splitter => {\n const splitIndex = parseInt(splitter.dataset.splitIndex, 10);\n const leftSheet = this.sheetsBody.querySelector(`nine-table-sheet[data-index=\"${splitIndex - 1}\"]`);\n const rightSheet = this.sheetsBody.querySelector(`nine-table-sheet[data-index=\"${splitIndex}\"]`);\n\n if (leftSheet && rightSheet && leftSheet.classList.contains('active') && rightSheet.classList.contains('active')) {\n splitter.classList.add('active');\n } else {\n splitter.classList.remove('active');\n }\n });\n }\n}","import {trace} from \"@nopeer\";\nimport { LayoutManager } from '../ui/LayoutManager.js';\n\nexport default class NineTable extends HTMLElement {\n #created = false;\n\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n }\n\n connectedCallback() {\n if (this.#created) return;\n\n // shadowRoot 하나만 넘겨서 내부에서 레이아웃 및 테이블 수집 처리\n this.layoutManager = new LayoutManager(this.shadowRoot);\n this.layoutManager.render();\n\n this.#created = true;\n trace.log('NineTable connected.');\n\n this.dispatchEvent(new CustomEvent('load', { bubbles: true, detail: { target: this } }));\n }\n\n disconnectedCallback() {\n trace.log('NineTable disconnected.');\n }\n}\n\nif (!customElements.get('nine-table')) {\n customElements.define('nine-table', NineTable);\n}"],"names":["_Trace","traceOrigin","__name","Trace","trace","_TableInitializer","container","__privateAdd","_TableInitializer_instances","_container","__privateSet","tbl","__privateMethod","ensureColgroup_fn","ensureThead_fn","colCount","_a","colgroup","defaultWidth","i","col","thead","TableInitializer","_NineTableSheet","_NineTableSheet_instances","_tableElement","_initializer","render_fn","tableEl","clonedTable","__privateGet","NineTableSheet","_LayoutManager","shadowRoot","_LayoutManager_instances","_shadowRoot","_tables","renderLayoutShell_fn","bindElements_fn","initSheets_fn","index","isMultiSelect","tabItems","sheetElements","tab","idx","sheet","clickedTab","activeTabs","targetSheet","updateLayoutMode_fn","updateSplitters_fn","activeSheet","rowCountEl","sheetsHtml","_","tabsHtml","totalRowCount","tabItem","sheetEl","activeSheets","bodyWidth","totalSplitterWidth","availableWidth","equalWidth","assignedSoFar","splitter","splitIndex","leftSheet","rightSheet","LayoutManager","_NineTable","_created","NineTable"],"mappings":"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"}
1
+ {"version":3,"file":"nine-table.umd.js","sources":["../src/external/NoPeer.js","../src/ui/TableInitializer.js","../src/ui/nine-table-sheet.js","../src/ui/LayoutManager.js","../src/core/nine-table.js"],"sourcesContent":["import { trace as traceOrigin } from '@ninebone/util';\n\nexport class Trace extends traceOrigin.constructor {\n constructor() {\n super();\n this.init(\"nine-table\", \"green\");\n }\n}\n\nexport const trace = new Trace();","export class TableInitializer {\n #container;\n\n constructor(container) {\n this.#container = container;\n }\n\n // [Public] 테이블 초기화 진입점 (필요한 최소한의 마크업 보정만 수행)\n initializeTable(tbl) {\n this.#ensureColgroup(tbl);\n this.#ensureThead(tbl);\n\n tbl.classList.add('nine-table-element');\n return tbl;\n }\n\n // [Private] colgroup 보정\n #ensureColgroup(tbl) {\n if (tbl.querySelector('colgroup')) return;\n\n const colCount = tbl.querySelector('tbody tr')?.querySelectorAll('th, td').length || 1;\n const colgroup = document.createElement('colgroup');\n const defaultWidth = Math.max(Math.floor((tbl.clientWidth || 600) / colCount), 100);\n\n for (let i = 0; i < colCount; i++) {\n const col = document.createElement('col');\n col.setAttribute('width', defaultWidth);\n colgroup.appendChild(col);\n }\n tbl.prepend(colgroup);\n }\n\n // [Private] thead 보정\n #ensureThead(tbl) {\n if (tbl.querySelector('thead')) return;\n\n const thead = document.createElement('thead');\n const colgroup = tbl.querySelector('colgroup');\n if (colgroup) {\n colgroup.after(thead);\n } else {\n tbl.prepend(thead);\n }\n }\n}","import { trace } from \"@nopeer\";\nimport { TableInitializer } from \"./TableInitializer.js\"; // 경로에 맞게 조정 필요\n\nexport class NineTableSheet extends HTMLElement {\n #tableElement = null;\n #initializer;\n\n constructor() {\n super();\n this.#initializer = new TableInitializer(this);\n }\n\n connectedCallback() {\n this.#render();\n }\n\n /**\n * 외부(LayoutManager 등)에서 원본 테이블 엘리먼트를 주입받아 초기화 및 보정 수행\n * @param {HTMLTableElement} tableEl\n */\n init(tableEl) {\n if (!tableEl) return;\n\n // 원본 테이블 복제 후 TableInitializer를 통한 구조 보정\n const clonedTable = tableEl.cloneNode(true);\n this.#tableElement = this.#initializer.initializeTable(clonedTable);\n this.#tableElement.style.display = 'table';\n\n const container = this.querySelector('.sheet-content-container');\n if (container) {\n container.innerHTML = '';\n container.appendChild(this.#tableElement);\n }\n\n trace.log(`NineTableSheet initialized with table rows: ${this.getRowCount()}`);\n }\n\n getRowCount() {\n if (!this.#tableElement) return 0;\n return this.#tableElement.querySelectorAll('tbody tr').length;\n }\n\n #render() {\n this.innerHTML = `\n <style>\n nine-table-sheet {\n display: block;\n width: 100%;\n height: 100%;\n overflow: auto;\n position: relative;\n box-sizing: border-box;\n background: #ffffff;\n }\n\n nine-table-sheet .sheet-content-container {\n width: 100%;\n min-width: fit-content;\n }\n\n nine-table-sheet table {\n border-collapse: collapse;\n width: 100%;\n table-layout: fixed;\n }\n\n nine-table-sheet th, nine-table-sheet td {\n box-sizing: border-box;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n padding: 6px 8px;\n border: 1px solid #e5e7eb;\n font-size: 12px;\n color: #111827;\n }\n\n nine-table-sheet th {\n background-color: #f9fafb;\n font-weight: 600;\n text-align: left;\n }\n </style>\n \n <div class=\"sheet-content-container\">\n <!-- 테이블이 동적으로 주입되는 영역 -->\n </div>\n `;\n }\n\n disconnectedCallback() {\n this.innerHTML = '';\n trace.log('NineTableSheet destroyed.');\n }\n}\n\nif (!customElements.get('nine-table-sheet')) {\n customElements.define('nine-table-sheet', NineTableSheet);\n}\n","import './nine-table-sheet.js';\n// import './nine-splitter.js';\n\nexport class LayoutManager {\n #shadowRoot;\n #tables = [];\n\n constructor(shadowRoot) {\n this.#shadowRoot = shadowRoot;\n }\n\n render() {\n const rawTables = this.#shadowRoot.host.querySelectorAll('table');\n rawTables.forEach(tbl => {\n this.#tables.push(tbl);\n tbl.style.display = 'none';\n });\n\n this.#renderLayoutShell();\n this.#bindElements();\n this.#initSheets();\n\n if (this.#tables.length > 0) {\n this.switchTab(0, false);\n }\n }\n\n #renderLayoutShell() {\n const sheetsHtml = this.#tables.map((_, idx) => {\n const sheet = `<nine-table-sheet class=\"${idx === 0 ? 'active' : ''}\" data-index=\"${idx}\"></nine-table-sheet>`;\n if (idx === 0) return sheet;\n return `<nine-splitter class=\"h\" data-split-index=\"${idx}\"></nine-splitter>${sheet}`;\n }).join('');\n\n const tabsHtml = this.#tables.map((_, idx) => `\n <div class=\"nine-tab-item ${idx === 0 ? 'active' : ''}\" data-index=\"${idx}\">Sheet ${idx + 1}</div>\n `).join('');\n\n const totalRowCount = this.#tables[0] ? this.#tables[0].querySelectorAll('tbody tr').length : 0;\n\n this.#shadowRoot.innerHTML = `\n <style>\n :host { display: flex; flex-direction: column; position: relative; overflow: hidden; height: 100%; background: #fff; }\n nine-table-header { height: 40px; display: block; flex-shrink: 0; border-bottom: 1px solid #e5e7eb; background: #fff; }\n \n nine-table-body { display: flex; flex-direction: row; flex: 1; overflow: hidden; position: relative; }\n \n nine-table-summary { display: none; width: 250px; flex-shrink: 0; border-right: 1px solid #e5e7eb; }\n \n nine-table-sheets { flex: 1; display: flex; flex-direction: column; overflow: hidden; position: relative; background: #fff; }\n \n /* flex-direction 대신 block 및 white-space / float 또는 단순 인라인 블록 구조로 변경하여 flex 간섭 원천 차단 */\n nine-table-sheets-body { flex: 1; overflow: auto; position: relative; white-space: nowrap; font-size: 0; }\n \n /* 시트 기본 설정: flex 속성 완전 배제, inline-block으로 나란히 배치 */\n nine-table-sheet { display: none !important; height: 100%; overflow: auto; box-sizing: border-box; vertical-align: top; font-size: 12px; }\n \n /* active 시트 1개일 때 화면 가득 채우기 */\n nine-table-sheets-body.single-view nine-table-sheet.active { display: inline-block !important; width: 100% !important; }\n \n /* active 시트 2개 이상일 때 인라인 블록 기반 수동 픽셀 width 적용 */\n nine-table-sheets-body.multi-view nine-table-sheet.active { display: inline-block !important; }\n\n /* 스플리터도 인라인 블록으로 나란히 배치 */\n nine-table-sheets-body nine-splitter { width: 4px; height: 100%; background: #e5e7eb; display: none !important; vertical-align: top; }\n nine-table-sheets-body nine-splitter.active { display: inline-block !important; }\n\n nine-table-sheets-footer { display: flex; height: 32px; background: #f3f4f6; border-top: 1px solid #e5e7eb; align-items: center; justify-content: space-between; padding: 0 8px; flex-shrink: 0; }\n .nine-tab-bar { display: flex; align-items: center; gap: 2px; overflow-x: auto; flex: 1; height: 100%; }\n \n .nine-tab-item { padding: 4px 12px; cursor: pointer; font-size: 12px; color: #4b5563; background: #e5e7eb; border: 1px solid #d1d5db; border-top: none; border-radius: 0 0 3px 3px; user-select: none; }\n .nine-tab-item.active { background: #ffffff; color: #111827; font-weight: 600; border-bottom: 2px solid #2563eb; }\n \n .sheets-counter { font-size: 12px; color: #6b7280; padding-left: 12px; flex-shrink: 0; }\n nine-table-analysis { display: none; }\n nine-table-footer { display: none; }\n </style>\n \n <nine-table-header></nine-table-header>\n <nine-table-body>\n <nine-table-summary></nine-table-summary>\n <nine-splitter></nine-splitter>\n <nine-table-sheets>\n <nine-table-sheets-body class=\"single-view\">\n ${sheetsHtml}\n </nine-table-sheets-body>\n <nine-table-sheets-footer>\n <div class=\"nine-tab-bar\">\n ${tabsHtml}\n </div>\n <div class=\"sheets-counter\">Total : <span id=\"row-count\">${totalRowCount.toLocaleString()}</span></div>\n </nine-table-sheets-footer>\n </nine-table-sheets>\n <nine-table-analysis></nine-table-analysis>\n </nine-table-body>\n <nine-table-footer></nine-table-footer>\n `;\n }\n\n #bindElements() {\n this.sheetsBody = this.#shadowRoot.querySelector('nine-table-sheets-body');\n this.tabBar = this.#shadowRoot.querySelector('.nine-tab-bar');\n\n this.tabBar.addEventListener('click', (e) => {\n const tabItem = e.target.closest('.nine-tab-item');\n if (!tabItem) return;\n\n const isMultiSelect = e.ctrlKey || e.metaKey || e.shiftKey;\n const index = parseInt(tabItem.dataset.index, 10);\n\n this.switchTab(index, isMultiSelect);\n });\n }\n\n #initSheets() {\n const sheetElements = this.sheetsBody.querySelectorAll('nine-table-sheet');\n sheetElements.forEach((sheetEl, idx) => {\n if (this.#tables[idx]) {\n sheetEl.init(this.#tables[idx]);\n }\n });\n }\n\n switchTab(index, isMultiSelect = false) {\n if (!this.#tables[index]) return;\n\n const tabItems = this.tabBar.querySelectorAll('.nine-tab-item');\n const sheetElements = this.sheetsBody.querySelectorAll('nine-table-sheet');\n\n if (!isMultiSelect) {\n tabItems.forEach((tab, idx) => {\n tab.classList.toggle('active', idx === index);\n const sheet = this.sheetsBody.querySelector(`nine-table-sheet[data-index=\"${idx}\"]`);\n if (sheet) sheet.style.width = '';\n });\n sheetElements.forEach((sheet, idx) => {\n sheet.classList.toggle('active', idx === index);\n });\n } else {\n const clickedTab = tabItems[index];\n const activeTabs = this.tabBar.querySelectorAll('.nine-tab-item.active');\n\n if (clickedTab.classList.contains('active') && activeTabs.length <= 1) {\n return;\n }\n\n clickedTab.classList.toggle('active');\n const targetSheet = this.sheetsBody.querySelector(`nine-table-sheet[data-index=\"${index}\"]`);\n if (targetSheet) {\n targetSheet.classList.toggle('active');\n if (!targetSheet.classList.contains('active')) {\n targetSheet.style.width = '';\n }\n }\n }\n\n this.#updateLayoutMode();\n this.#updateSplitters();\n\n const activeSheet = this.sheetsBody.querySelector(`nine-table-sheet.active`);\n if (activeSheet && typeof activeSheet.getRowCount === 'function') {\n const rowCountEl = this.#shadowRoot.querySelector('#row-count');\n if (rowCountEl) {\n rowCountEl.textContent = activeSheet.getRowCount().toLocaleString();\n }\n }\n }\n\n #updateLayoutMode() {\n const activeSheets = Array.from(this.sheetsBody.querySelectorAll('nine-table-sheet.active'));\n\n if (activeSheets.length > 1) {\n this.sheetsBody.classList.remove('single-view');\n this.sheetsBody.classList.add('multi-view');\n\n // 컨테이너 폭에서 스플리터 영역(개당 4px)을 제외한 순수 가용 너비 계산\n const bodyWidth = this.sheetsBody.clientWidth || 800;\n const splitterCount = this.sheetsBody.querySelectorAll('nine-splitter.active').length;\n const totalSplitterWidth = splitterCount * 4;\n const availableWidth = bodyWidth - totalSplitterWidth;\n const equalWidth = Math.floor(availableWidth / activeSheets.length);\n\n activeSheets.forEach((sheet, idx) => {\n if (idx === activeSheets.length - 1) {\n const assignedSoFar = equalWidth * (activeSheets.length - 1);\n sheet.style.width = `${availableWidth - assignedSoFar}px`;\n } else {\n sheet.style.width = `${equalWidth}px`;\n }\n });\n } else {\n this.sheetsBody.classList.remove('multi-view');\n this.sheetsBody.classList.add('single-view');\n\n activeSheets.forEach(sheet => {\n sheet.style.width = '';\n });\n }\n }\n\n #updateSplitters() {\n const splitters = this.sheetsBody.querySelectorAll('nine-splitter');\n splitters.forEach(splitter => {\n const splitIndex = parseInt(splitter.dataset.splitIndex, 10);\n const leftSheet = this.sheetsBody.querySelector(`nine-table-sheet[data-index=\"${splitIndex - 1}\"]`);\n const rightSheet = this.sheetsBody.querySelector(`nine-table-sheet[data-index=\"${splitIndex}\"]`);\n\n if (leftSheet && rightSheet && leftSheet.classList.contains('active') && rightSheet.classList.contains('active')) {\n splitter.classList.add('active');\n } else {\n splitter.classList.remove('active');\n }\n });\n }\n}","import {trace} from \"@nopeer\";\nimport { LayoutManager } from '../ui/LayoutManager.js';\n\nexport default class NineTable extends HTMLElement {\n #created = false;\n\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n }\n\n connectedCallback() {\n if (this.#created) return;\n\n // shadowRoot 하나만 넘겨서 내부에서 레이아웃 및 테이블 수집 처리\n this.layoutManager = new LayoutManager(this.shadowRoot);\n this.layoutManager.render();\n\n this.#created = true;\n trace.log('NineTable connected.');\n\n this.dispatchEvent(new CustomEvent('load', { bubbles: true, detail: { target: this } }));\n }\n\n disconnectedCallback() {\n trace.log('NineTable disconnected.');\n }\n}\n\nif (!customElements.get('nine-table')) {\n customElements.define('nine-table', NineTable);\n}"],"names":["_Trace","traceOrigin","__name","Trace","trace","_TableInitializer","container","__privateAdd","_TableInitializer_instances","_container","__privateSet","tbl","__privateMethod","ensureColgroup_fn","ensureThead_fn","colCount","_a","colgroup","defaultWidth","i","col","thead","TableInitializer","_NineTableSheet","_NineTableSheet_instances","_tableElement","_initializer","render_fn","tableEl","clonedTable","__privateGet","NineTableSheet","_LayoutManager","shadowRoot","_LayoutManager_instances","_shadowRoot","_tables","renderLayoutShell_fn","bindElements_fn","initSheets_fn","index","isMultiSelect","tabItems","sheetElements","tab","idx","sheet","clickedTab","activeTabs","targetSheet","updateLayoutMode_fn","updateSplitters_fn","activeSheet","rowCountEl","sheetsHtml","_","tabsHtml","totalRowCount","tabItem","sheetEl","activeSheets","bodyWidth","totalSplitterWidth","availableWidth","equalWidth","assignedSoFar","splitter","splitIndex","leftSheet","rightSheet","LayoutManager","_NineTable","_created","NineTable"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ninebone/table",
3
- "version": "0.0.20",
3
+ "version": "0.0.22",
4
4
  "description": "Grid component for real-time collaboration (Vanilla JS based)",
5
5
  "type": "module",
6
6
  "main": "./dist/nine-table.umd.js",