@ninebone/table 0.0.73 → 0.0.74

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"nine-table.js","sources":["../src/external/NoPeer.js","../src/ui/nine-table-vscrollbar.js","../src/ui/nine-table-hscrollbar.js","../src/ui/nine-table-sheet.js","../src/ui/nine-table-sheets.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();","\nimport { trace } from \"@nopeer\";\n\nclass NineTableVScrollBar extends HTMLElement {\n #owner;\n #dragging;\n #elements;\n #interval1;\n #interval2;\n #firstThumbMove;\n #prevY = 0;\n\n constructor() {\n super();\n //this.applyBaseStyle();\n }\n\n connectedCallback() {\n // 호스트 엘리먼트(nine-table-sheet) 참조\n this.#owner = this.getRootNode().host;\n if (!this.#owner) return;\n\n this.shadowRoot.innerHTML = `\n <button class='ng-scroll-top' disabled><div class='ng-scroll-icon'></div></button>\n <div class='ng-scroll-track'> <div class='ng-scroll-thumb'></div> </div>\n <button class='ng-scroll-bottom'><div class='ng-scroll-icon'></div></button>\n `;\n\n super.connectedCallback();\n\n this.#elements = {\n track : this.shadowRoot.querySelector(\".ng-scroll-track\"),\n thumb : this.shadowRoot.querySelector(\".ng-scroll-thumb\"),\n top : this.shadowRoot.querySelector(\".ng-scroll-top\"),\n bottom : this.shadowRoot.querySelector(\".ng-scroll-bottom\"),\n };\n\n this.#init();\n }\n\n refresh = () => {\n if (!this.#owner) return;\n\n const body = this.#owner.querySelector(\".ng-container-body\");\n if (!body) return;\n\n const thumb = $(this.#elements.thumb, this.shadowRoot);\n const thead = body.querySelector(\"table > thead\");\n\n const currRow = this.#owner.getRowCount ? 0 : 0; // 데이터 연동 시점 확장 포인트\n const trackHeight = $(this.#elements.track).height();\n const thumbHeight = $(this.#elements.thumb).height();\n\n // 높이 및 표시 여부 산출\n const totalRows = this.#owner.getRowCount ? this.#owner.getRowCount() : 0;\n if (totalRows <= 10) {\n $(this).hide();\n return;\n } else {\n $(this).show();\n }\n\n const theadHeight = thead ? thead.getBoundingClientRect().height : 0;\n const h = Math.max(Math.min(trackHeight * (body.clientHeight - theadHeight) / (32 * totalRows), trackHeight), 16);\n\n thumb[0].dataset.height = h;\n thumb.css({ \"height\": h });\n\n const totalHeight = trackHeight - this.#getThumbHeight();\n if (totalHeight <= 0) return;\n\n // 위치(Top) 산출\n let y = 0;\n const maxScrollTop = body.scrollHeight - body.clientHeight;\n if (maxScrollTop > 0) {\n y = parseInt((body.scrollTop / maxScrollTop) * totalHeight, 10);\n if (y > trackHeight - thumbHeight) y = trackHeight - thumbHeight;\n if (y < 0) y = 0;\n }\n\n this.#elements.thumb.style.top = y + 'px';\n\n // 버튼 활성/비활성 처리\n this.#elements.top.disabled = body.scrollTop <= 0;\n this.#elements.bottom.disabled = body.scrollTop >= maxScrollTop;\n };\n\n delayScroll = (pos, delay1, delay2, callback) => {\n clearInterval(this.#interval1);\n clearInterval(this.#interval2);\n\n const body = this.#owner.querySelector(\".ng-container-body\");\n if (body) body.scrollTop += pos * 32;\n\n this.#interval1 = setInterval(() => {\n clearInterval(this.#interval1);\n\n this.#interval2 = setInterval(() => {\n if (body) {\n body.scrollTop += pos * 32;\n if (callback) callback.call();\n }\n }, delay2);\n }, delay1);\n };\n\n stopScroll = () => {\n clearInterval(this.#interval1);\n clearInterval(this.#interval2);\n };\n\n #init = () => {\n const delayScrollAction = (pos) => {\n clearInterval(this.#interval1);\n clearInterval(this.#interval2);\n\n const body = this.#owner.querySelector(\".ng-container-body\");\n if (body) body.scrollTop += pos * 32;\n\n this.#interval1 = setInterval(() => {\n clearInterval(this.#interval1);\n\n this.#interval2 = setInterval(() => {\n if (body) body.scrollTop += pos * 32;\n }, 10);\n }, 500);\n };\n\n $(this.#elements.top).on(\"mousedown\", e => { if (e.buttons != 1 || e.altKey || e.ctrlKey || e.shiftKey) return; delayScrollAction(-1); });\n $(this.#elements.bottom).on(\"mousedown\", e => { if (e.buttons != 1 || e.altKey || e.ctrlKey || e.shiftKey) return; delayScrollAction(1); });\n\n $(this.#elements.top).on(\"touchstart\", e => { delayScrollAction(-1); });\n $(this.#elements.bottom).on(\"touchstart\", e => { delayScrollAction(1); });\n\n const clearTimer = () => {\n clearInterval(this.#interval1);\n clearInterval(this.#interval2);\n };\n\n this.#elements.top.ontouchend =\n this.#elements.bottom.ontouchend =\n this.#elements.track.ontouchend =\n this.#elements.top.onmouseup =\n this.#elements.top.onmouseleave =\n this.#elements.bottom.onmouseup =\n this.#elements.bottom.onmouseleave =\n this.#elements.track.onmouseup =\n this.#elements.track.onmouseleave = clearTimer;\n\n $(this.#elements.track).on(\"mousedown\", this.#track_onMouseDown);\n $(this.#elements.track).on(\"touchstart\", this.#track_onTouchStart);\n\n $(this.#elements.thumb).on(\"mousedown\", this.#thumb_onMouseDown);\n $(this.#elements.thumb).on(\"touchstart\", this.#thumb_onTouchStart);\n\n document.addEventListener('mouseup', e => {\n if (this.#dragging) {\n this.#dragging = false;\n }\n document.removeEventListener('mousemove', this.#thumb_onMouseMove);\n });\n\n document.addEventListener('touchend', e => {\n this.#dragging = false;\n document.removeEventListener('touchmove', this.#thumb_onTouchMove);\n });\n };\n\n #track_onTouchStart = e => {\n var rect = e.target.getBoundingClientRect();\n e.clientX = e.targetTouches[0].clientX;\n e.clientY = e.targetTouches[0].clientY;\n e.buttons = 1;\n this.#track_onMouseDown(e);\n }\n\n #track_onMouseDown = e => {\n if (this.#dragging) return;\n if (e.buttons != 1 || e.altKey || e.ctrlKey || e.shiftKey) return;\n e.preventDefault();\n\n var thumbBound = this.#elements.thumb.getBoundingClientRect();\n const body = this.#owner.querySelector(\".ng-container-body\");\n if (!body) return;\n\n const scrollStep = body.clientHeight;\n const pos = (e.clientY > thumbBound.y) ? scrollStep : -scrollStep;\n body.scrollTop += pos;\n\n clearInterval(this.#interval1);\n clearInterval(this.#interval2);\n\n this.#interval1 = setInterval(() => {\n clearInterval(this.#interval1);\n\n this.#interval2 = setInterval(() => {\n var thumbBound = this.#elements.thumb.getBoundingClientRect();\n if (e.clientY > thumbBound.y && e.clientY < thumbBound.y + thumbBound.height) {\n clearInterval(this.#interval2);\n } else {\n body.scrollTop += (e.clientY > thumbBound.y) ? scrollStep : -scrollStep;\n }\n }, 10);\n }, 500);\n };\n\n #thumb_onTouchStart = e => {\n e.clientX = e.targetTouches[0].clientX;\n e.clientY = e.targetTouches[0].clientY;\n e.buttons = 1;\n this.#thumb_onMouseDown(e);\n document.addEventListener('touchmove', this.#thumb_onTouchMove);\n };\n\n #thumb_onTouchMove = e => {\n e.clientX = e.targetTouches[0].clientX;\n e.clientY = e.targetTouches[0].clientY;\n e.buttons = 1;\n this.#thumb_onMouseMove(e);\n };\n\n #thumb_onMouseDown = e => {\n this.#prevY = e.clientY;\n this.#dragging = true;\n this.shiftY = e.offsetY + this.#elements.track.getBoundingClientRect().y;\n\n this.trackHeight = $(this.#elements.track).height();\n this.thumbHeight = $(this.#elements.thumb).height();\n\n this.#firstThumbMove = true;\n document.addEventListener('mousemove', this.#thumb_onMouseMove);\n };\n\n #thumb_onMouseMove = (e) => {\n if (!this.#dragging) return;\n e.preventDefault();\n\n const trackHeight = this.trackHeight;\n const thumbHeight = this.#getThumbHeight();\n\n var y = e.clientY - this.shiftY;\n if (y < 0) y = 0;\n if (y + thumbHeight > trackHeight) y = parseInt(trackHeight - thumbHeight);\n\n this.#elements.thumb.style.top = y + 'px';\n\n const body = this.#owner.querySelector(\".ng-container-body\");\n if (!body) return;\n\n const maxScrollTop = body.scrollHeight - body.clientHeight;\n const scrollableTrack = trackHeight - thumbHeight;\n\n if (scrollableTrack > 0 && maxScrollTop > 0) {\n body.scrollTop = (y / scrollableTrack) * maxScrollTop;\n }\n };\n\n #getThumbHeight = () => {\n return parseInt(this.#elements.thumb.dataset.height || 30, 10);\n };\n}\n\nif (!customElements.get('nine-table-vscrollbar')) {\n customElements.define(\"nine-table-vscrollbar\", NineTableVScrollBar);\n}","\nimport { trace } from \"@nopeer\";\n\nclass NineTableHScrollBar extends HTMLElement {\n #owner;\n #dragging;\n #elements;\n #interval1;\n #interval2;\n #firstThumbMove;\n #prevY = 0;\n\n constructor() {\n super();\n //this.applyBaseStyle();\n }\n\n connectedCallback() {\n // 호스트 엘리먼트(nine-table-sheet) 참조\n this.#owner = this.getRootNode().host;\n if (!this.#owner) return;\n\n this.shadowRoot.innerHTML = `\n <button class='ng-scroll-top' disabled><div class='ng-scroll-icon'></div></button>\n <div class='ng-scroll-track'> <div class='ng-scroll-thumb'></div> </div>\n <button class='ng-scroll-bottom'><div class='ng-scroll-icon'></div></button>\n `;\n\n super.connectedCallback();\n\n this.#elements = {\n track : this.shadowRoot.querySelector(\".ng-scroll-track\"),\n thumb : this.shadowRoot.querySelector(\".ng-scroll-thumb\"),\n top : this.shadowRoot.querySelector(\".ng-scroll-top\"),\n bottom : this.shadowRoot.querySelector(\".ng-scroll-bottom\"),\n };\n\n this.#init();\n }\n\n refresh = () => {\n if (!this.#owner) return;\n\n const body = this.#owner.querySelector(\".ng-container-body\");\n if (!body) return;\n\n const thumb = $(this.#elements.thumb, this.shadowRoot);\n const thead = body.querySelector(\"table > thead\");\n\n const currRow = this.#owner.getRowCount ? 0 : 0; // 데이터 연동 시점 확장 포인트\n const trackHeight = $(this.#elements.track).height();\n const thumbHeight = $(this.#elements.thumb).height();\n\n // 높이 및 표시 여부 산출\n const totalRows = this.#owner.getRowCount ? this.#owner.getRowCount() : 0;\n if (totalRows <= 10) {\n $(this).hide();\n return;\n } else {\n $(this).show();\n }\n\n const theadHeight = thead ? thead.getBoundingClientRect().height : 0;\n const h = Math.max(Math.min(trackHeight * (body.clientHeight - theadHeight) / (32 * totalRows), trackHeight), 16);\n\n thumb[0].dataset.height = h;\n thumb.css({ \"height\": h });\n\n const totalHeight = trackHeight - this.#getThumbHeight();\n if (totalHeight <= 0) return;\n\n // 위치(Top) 산출\n let y = 0;\n const maxScrollTop = body.scrollHeight - body.clientHeight;\n if (maxScrollTop > 0) {\n y = parseInt((body.scrollTop / maxScrollTop) * totalHeight, 10);\n if (y > trackHeight - thumbHeight) y = trackHeight - thumbHeight;\n if (y < 0) y = 0;\n }\n\n this.#elements.thumb.style.top = y + 'px';\n\n // 버튼 활성/비활성 처리\n this.#elements.top.disabled = body.scrollTop <= 0;\n this.#elements.bottom.disabled = body.scrollTop >= maxScrollTop;\n };\n\n delayScroll = (pos, delay1, delay2, callback) => {\n clearInterval(this.#interval1);\n clearInterval(this.#interval2);\n\n const body = this.#owner.querySelector(\".ng-container-body\");\n if (body) body.scrollTop += pos * 32;\n\n this.#interval1 = setInterval(() => {\n clearInterval(this.#interval1);\n\n this.#interval2 = setInterval(() => {\n if (body) {\n body.scrollTop += pos * 32;\n if (callback) callback.call();\n }\n }, delay2);\n }, delay1);\n };\n\n stopScroll = () => {\n clearInterval(this.#interval1);\n clearInterval(this.#interval2);\n };\n\n #init = () => {\n const delayScrollAction = (pos) => {\n clearInterval(this.#interval1);\n clearInterval(this.#interval2);\n\n const body = this.#owner.querySelector(\".ng-container-body\");\n if (body) body.scrollTop += pos * 32;\n\n this.#interval1 = setInterval(() => {\n clearInterval(this.#interval1);\n\n this.#interval2 = setInterval(() => {\n if (body) body.scrollTop += pos * 32;\n }, 10);\n }, 500);\n };\n\n $(this.#elements.top).on(\"mousedown\", e => { if (e.buttons != 1 || e.altKey || e.ctrlKey || e.shiftKey) return; delayScrollAction(-1); });\n $(this.#elements.bottom).on(\"mousedown\", e => { if (e.buttons != 1 || e.altKey || e.ctrlKey || e.shiftKey) return; delayScrollAction(1); });\n\n $(this.#elements.top).on(\"touchstart\", e => { delayScrollAction(-1); });\n $(this.#elements.bottom).on(\"touchstart\", e => { delayScrollAction(1); });\n\n const clearTimer = () => {\n clearInterval(this.#interval1);\n clearInterval(this.#interval2);\n };\n\n this.#elements.top.ontouchend =\n this.#elements.bottom.ontouchend =\n this.#elements.track.ontouchend =\n this.#elements.top.onmouseup =\n this.#elements.top.onmouseleave =\n this.#elements.bottom.onmouseup =\n this.#elements.bottom.onmouseleave =\n this.#elements.track.onmouseup =\n this.#elements.track.onmouseleave = clearTimer;\n\n $(this.#elements.track).on(\"mousedown\", this.#track_onMouseDown);\n $(this.#elements.track).on(\"touchstart\", this.#track_onTouchStart);\n\n $(this.#elements.thumb).on(\"mousedown\", this.#thumb_onMouseDown);\n $(this.#elements.thumb).on(\"touchstart\", this.#thumb_onTouchStart);\n\n document.addEventListener('mouseup', e => {\n if (this.#dragging) {\n this.#dragging = false;\n }\n document.removeEventListener('mousemove', this.#thumb_onMouseMove);\n });\n\n document.addEventListener('touchend', e => {\n this.#dragging = false;\n document.removeEventListener('touchmove', this.#thumb_onTouchMove);\n });\n };\n\n #track_onTouchStart = e => {\n var rect = e.target.getBoundingClientRect();\n e.clientX = e.targetTouches[0].clientX;\n e.clientY = e.targetTouches[0].clientY;\n e.buttons = 1;\n this.#track_onMouseDown(e);\n }\n\n #track_onMouseDown = e => {\n if (this.#dragging) return;\n if (e.buttons != 1 || e.altKey || e.ctrlKey || e.shiftKey) return;\n e.preventDefault();\n\n var thumbBound = this.#elements.thumb.getBoundingClientRect();\n const body = this.#owner.querySelector(\".ng-container-body\");\n if (!body) return;\n\n const scrollStep = body.clientHeight;\n const pos = (e.clientY > thumbBound.y) ? scrollStep : -scrollStep;\n body.scrollTop += pos;\n\n clearInterval(this.#interval1);\n clearInterval(this.#interval2);\n\n this.#interval1 = setInterval(() => {\n clearInterval(this.#interval1);\n\n this.#interval2 = setInterval(() => {\n var thumbBound = this.#elements.thumb.getBoundingClientRect();\n if (e.clientY > thumbBound.y && e.clientY < thumbBound.y + thumbBound.height) {\n clearInterval(this.#interval2);\n } else {\n body.scrollTop += (e.clientY > thumbBound.y) ? scrollStep : -scrollStep;\n }\n }, 10);\n }, 500);\n };\n\n #thumb_onTouchStart = e => {\n e.clientX = e.targetTouches[0].clientX;\n e.clientY = e.targetTouches[0].clientY;\n e.buttons = 1;\n this.#thumb_onMouseDown(e);\n document.addEventListener('touchmove', this.#thumb_onTouchMove);\n };\n\n #thumb_onTouchMove = e => {\n e.clientX = e.targetTouches[0].clientX;\n e.clientY = e.targetTouches[0].clientY;\n e.buttons = 1;\n this.#thumb_onMouseMove(e);\n };\n\n #thumb_onMouseDown = e => {\n this.#prevY = e.clientY;\n this.#dragging = true;\n this.shiftY = e.offsetY + this.#elements.track.getBoundingClientRect().y;\n\n this.trackHeight = $(this.#elements.track).height();\n this.thumbHeight = $(this.#elements.thumb).height();\n\n this.#firstThumbMove = true;\n document.addEventListener('mousemove', this.#thumb_onMouseMove);\n };\n\n #thumb_onMouseMove = (e) => {\n if (!this.#dragging) return;\n e.preventDefault();\n\n const trackHeight = this.trackHeight;\n const thumbHeight = this.#getThumbHeight();\n\n var y = e.clientY - this.shiftY;\n if (y < 0) y = 0;\n if (y + thumbHeight > trackHeight) y = parseInt(trackHeight - thumbHeight);\n\n this.#elements.thumb.style.top = y + 'px';\n\n const body = this.#owner.querySelector(\".ng-container-body\");\n if (!body) return;\n\n const maxScrollTop = body.scrollHeight - body.clientHeight;\n const scrollableTrack = trackHeight - thumbHeight;\n\n if (scrollableTrack > 0 && maxScrollTop > 0) {\n body.scrollTop = (y / scrollableTrack) * maxScrollTop;\n }\n };\n\n #getThumbHeight = () => {\n return parseInt(this.#elements.thumb.dataset.height || 30, 10);\n };\n}\n\nif (!customElements.get('nine-table-hscrollbar')) {\n customElements.define(\"nine-table-hscrollbar\", NineTableHScrollBar);\n}","import { trace } from \"@nopeer\";\nimport './nine-table-vscrollbar.js';\nimport './nine-table-hscrollbar.js';\n\nexport class NineTableSheet extends HTMLElement {\n #tableElement = null;\n static SCROLLBAR_SIZE = 16;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.#render();\n };\n\n init = (tableEl) => {\n if (!tableEl) return;\n\n const initializeTable = (tbl) => {\n\n const ensureColgroup = (tbl) => {\n if (tbl.querySelector('colgroup')) return;\n\n const firstRow = tbl.querySelector('tbody tr') || tbl.querySelector('tr');\n const colCount = firstRow ? firstRow.querySelectorAll('th, td').length : 1;\n\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 const ensureThead = (tbl) => {\n if (tbl.querySelector('thead')) return;\n\n const thead = document.createElement('thead');\n const colgroup = tbl.querySelector('colgroup');\n\n if (colgroup) {\n colgroup.after(thead);\n } else {\n tbl.prepend(thead);\n }\n };\n\n ensureColgroup(tbl);\n ensureThead(tbl);\n\n tbl.classList.add('nine-table-element');\n return tbl;\n };\n\n const clonedTable = tableEl.cloneNode(true);\n this.#tableElement = initializeTable(clonedTable);\n this.#tableElement.style.display = 'table';\n\n const leftContainer = this.querySelector('.ng-container-left');\n const bodyContainer = this.querySelector('.ng-container-body');\n const rightContainer = this.querySelector('.ng-container-right');\n\n const filterTableByFixed = (sourceTable, targetFixedType, isBody = false) => {\n const tbl = sourceTable.cloneNode(true);\n const cols = Array.from(tbl.querySelectorAll('colgroup col'));\n const targetIndices = [];\n\n cols.forEach((col, idx) => {\n const fixedAttr = col.getAttribute('fixed');\n const isMatch = isBody ? (!fixedAttr || fixedAttr === '') : (fixedAttr === targetFixedType);\n if (!isMatch) {\n targetIndices.push(idx);\n }\n });\n\n targetIndices.reverse().forEach(idx => {\n if (cols[idx]) cols[idx].remove();\n tbl.querySelectorAll('tr').forEach(tr => {\n const cells = tr.querySelectorAll('th, td');\n if (cells[idx]) cells[idx].remove();\n });\n });\n\n return tbl;\n };\n\n // 1. 메인 바디 영역\n if (bodyContainer) {\n const bodyTable = filterTableByFixed(this.#tableElement, null, true);\n bodyContainer.innerHTML = '';\n bodyContainer.appendChild(bodyTable);\n }\n\n // 2. 좌측 고정 영역\n if (leftContainer) {\n const leftTable = filterTableByFixed(this.#tableElement, 'left', false);\n\n let leftWidth = 0;\n leftTable.querySelectorAll('col').forEach(col => {\n const w = parseInt(col.getAttribute('width'), 10);\n if (!isNaN(w)) leftWidth += w;\n });\n\n leftContainer.innerHTML = '';\n leftContainer.appendChild(leftTable);\n\n const activeLeftWidth = leftWidth > 0 ? leftWidth : 0;\n leftContainer.style.flex = `0 0 ${activeLeftWidth}px`;\n leftContainer.style.width = `${activeLeftWidth}px`;\n }\n\n // 3. 우측 고정 영역\n if (rightContainer) {\n const rightTable = filterTableByFixed(this.#tableElement, 'right', false);\n\n let rightWidth = 0;\n rightTable.querySelectorAll('col').forEach(col => {\n const w = parseInt(col.getAttribute('width'), 10);\n if (!isNaN(w)) rightWidth += w;\n });\n\n rightContainer.innerHTML = '';\n rightContainer.appendChild(rightTable);\n\n const activeRightWidth = rightWidth > 0 ? rightWidth : 0;\n rightContainer.style.flex = `0 0 ${activeRightWidth}px`;\n rightContainer.style.width = `${activeRightWidth}px`;\n }\n\n // 데이터 건수 기반 세로 스크롤 제어 정책 반영\n if (bodyContainer) {\n const rowCount = this.getRowCount();\n bodyContainer.style.overflowY = rowCount > 10 ? 'auto' : 'hidden';\n\n bodyContainer.addEventListener('scroll', () => {\n const scrollLeft = bodyContainer.scrollLeft;\n\n // 좌우 고정 영역은 가로 스크롤 시 밀려나지 않도록 위치 보정 또는\n // 하단 스크롤바 썸(Thumb) 위치 동기화 호출\n const hScrollbar = this.querySelector('nine-table-hscrollbar');\n if (hScrollbar && typeof hScrollbar.syncThumb === 'function') {\n hScrollbar.syncThumb(scrollLeft);\n }\n });\n }\n\n trace.log(`NineTableSheet 3-split initialized with rows: ${this.getRowCount()}`);\n };\n\n getRowCount = () => {\n if (!this.#tableElement) return 0;\n return this.#tableElement.querySelectorAll('tbody tr').length;\n };\n\n // 🎯 외부 스크롤바 및 컨트롤러 연동용 메서드\n scrollToX = (scrollLeft) => {\n const bodyContainer = this.querySelector('.ng-container-body');\n if (bodyContainer) bodyContainer.scrollLeft = scrollLeft;\n };\n\n scrollToY = (scrollTop) => {\n const bodyContainer = this.querySelector('.ng-container-body');\n if (bodyContainer) bodyContainer.scrollTop = scrollTop;\n };\n\n #render = () => {\n const sbSize = NineTableSheet.SCROLLBAR_SIZE;\n\n this.innerHTML = `\n <style>\n nine-table-sheet {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n position: relative;\n box-sizing: border-box;\n background: #ffffff;\n overflow: hidden;\n }\n \n nine-table-sheet .ng-container-top {\n display: flex;\n flex-direction: row;\n flex: 1 1 auto;\n width: 100%;\n height: calc(100% - ${sbSize}px);\n overflow: hidden;\n position: relative;\n }\n \n nine-table-sheet .ng-container-left {\n display: flex;\n flex-direction: column;\n overflow: hidden;\n background: #ffffff;\n border-right: 1px solid #e5e7eb;\n flex-shrink: 0;\n }\n \n nine-table-sheet .ng-container-body {\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow-x: auto;\n overflow-y: auto;\n background: #ffffff;\n position: relative;\n }\n \n nine-table-sheet .ng-container-right {\n display: flex;\n flex-direction: column;\n overflow: hidden;\n background: #ffffff;\n border-left: 1px solid #e5e7eb;\n flex-shrink: 0;\n }\n \n nine-table-sheet .ng-container-bottom {\n display: flex;\n flex-direction: row;\n height: ${sbSize}px;\n min-height: ${sbSize}px;\n flex-shrink: 0;\n background: #f9fafb;\n border-top: 1px solid #e5e7eb;\n }\n \n nine-table-sheet nine-table-hscrollbar {\n flex: 1;\n height: 100%;\n overflow: hidden;\n display: block;\n }\n \n nine-table-sheet .ng-scroll-edge {\n width: ${sbSize}px;\n min-width: ${sbSize}px;\n height: 100%;\n flex-shrink: 0;\n background: #f3f4f6;\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='ng-container-top'>\n <div class='ng-container-left'></div>\n <div class='ng-container-body'></div>\n <div class='ng-container-right'></div>\n <nine-table-vscrollbar></nine-table-vscrollbar>\n </div>\n <div class='ng-container-bottom'>\n <nine-table-hscrollbar></nine-table-hscrollbar>\n <div class='ng-scroll-edge'></div>\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}","import './nine-table-sheet.js';\n\nexport class NineTableSheets extends HTMLElement {\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.#init();\n };\n\n #init = () => {\n const tabBar = this.querySelector('.nine-tab-bar');\n if (!tabBar) return;\n\n 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 this.switchSheet(index, isMultiSelect);\n });\n\n this.switchSheet(0, false);\n };\n\n switchSheet = (index, isMultiSelect = false) => {\n\n const updateSplitters = () => {\n const body = this.querySelector('nine-table-sheets-body');\n const splitters = body.querySelectorAll('nine-splitter');\n splitters.forEach(splitter => {\n const splitIndex = parseInt(splitter.dataset.splitIndex, 10);\n const leftSheet = body.querySelector(`nine-table-sheet[data-index=\"${splitIndex - 1}\"]`);\n const rightSheet = body.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\n const tabBar = this.querySelector('.nine-tab-bar');\n const body = this.querySelector('nine-table-sheets-body');\n const tabItems = tabBar.querySelectorAll('.nine-tab-item');\n const sheetElements = body.querySelectorAll('nine-table-sheet');\n\n if (!tabItems[index]) return;\n\n if (!isMultiSelect) {\n tabItems.forEach((tab, idx) => {\n tab.classList.toggle('active', idx === index);\n const sheet = body.querySelector(`nine-table-sheet[data-index=\"${idx}\"]`);\n if (sheet) sheet.style.flex = '';\n });\n sheetElements.forEach((sheet, idx) => {\n sheet.classList.toggle('active', idx === index);\n });\n } else {\n const clickedTab = tabItems[index];\n const activeTabs = 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 = body.querySelector(`nine-table-sheet[data-index=\"${index}\"]`);\n if (targetSheet) {\n targetSheet.classList.toggle('active');\n if (!targetSheet.classList.contains('active')) {\n targetSheet.style.flex = '';\n }\n }\n }\n\n const activeSheets = Array.from(body.querySelectorAll('nine-table-sheet.active'));\n if (activeSheets.length > 1) {\n const initialBasis = (1 / activeSheets.length);\n activeSheets.forEach(sheet => {\n if (!sheet.style.flex || sheet.style.flex === '1 1 100%') {\n sheet.style.flex = `${initialBasis} ${initialBasis} 0px`;\n }\n });\n } else {\n activeSheets.forEach(sheet => {\n sheet.style.flex = '1 1 100%';\n });\n }\n\n updateSplitters();\n\n const activeSheet = body.querySelector(`nine-table-sheet.active`);\n if (activeSheet && typeof activeSheet.getRowCount === 'function') {\n const rowCountEl = this.querySelector('#row-count');\n if (rowCountEl) {\n rowCountEl.textContent = activeSheet.getRowCount().toLocaleString();\n }\n }\n };\n\n\n}\n\nif (!customElements.get('nine-table-sheets')) {\n customElements.define('nine-table-sheets', NineTableSheets);\n}","/**\n * [LayoutManager 높이 설정(Height Configuration) 사용 예제]\n *\n * 1. 부모 영역 채우기 (Fluid / 100% Fill) - 기본값\n * - 컴포넌트가 부모 컨테이너의 남은 공간을 가득 채우고 내부 영역에서 스크롤을 처리합니다.\n * - 사용법: <nine-table> 또는 호스트 엘리먼트에 별도 속성을 주지 않으면 적용됩니다.\n *\n * 2. 콘텐츠 밀착형 / 데이터 건수 기반 동적 높이 (Auto-Height)\n * - 데이터 행 개수에 맞춰 컴포넌트 전체 높이가 유연하게 늘어납니다.\n * - 사용법: <nine-table auto-height=\"true\"> 또는 호스트 엘리먼트에 auto-height=\"true\" 속성을 지정합니다.\n *\n * 3. 픽셀 고정 높이 (Fixed Pixel)\n * - 부모 크기에 상관없이 개발자가 지정한 고정 크기를 엄격하게 유지합니다.\n * - 사용법: <nine-table style=\"height: 400px;\"> 처럼 인라인 스타일로 높이를 직접 제어합니다.\n */\n\nimport './nine-table-sheets.js';\n\nexport class LayoutManager {\n #root;\n #resizeObserver = null;\n\n constructor(shadowRoot) {\n this.#root = shadowRoot;\n this.#render();\n this.#observeResize();\n }\n\n #observeResize = () => {\n const hostEl = this.#root.host;\n if (!hostEl) return;\n\n this.#resizeObserver = new ResizeObserver((entries) => {\n for (let entry of entries) {\n const isAutoHeight = hostEl.getAttribute('auto-height') === 'true';\n if (isAutoHeight) {\n this.#applyAutoHeight(hostEl);\n }\n }\n });\n\n this.#resizeObserver.observe(hostEl);\n };\n\n #applyAutoHeight = (hostEl) => {\n const activeSheet = hostEl.shadowRoot?.querySelector('nine-table-sheet.active');\n if (!activeSheet) return;\n\n const rowCount = activeSheet.getRowCount?.() || 0;\n\n // 1. 속성으로 maxRows를 받되, 없으면 기본값 10 설정\n const maxRows = parseInt(hostEl.getAttribute('max-display-row'), 10) || 10;\n const targetRows = Math.min(rowCount, maxRows);\n\n // 2. 실제 렌더링된 행(tr) 높이를 동적으로 측정 (없으면 기본 32px 폴백)\n const sampleRow = activeSheet.querySelector('tbody tr') || activeSheet.querySelector('tr');\n const rowHeight = sampleRow ? sampleRow.getBoundingClientRect().height : 32;\n\n // 3. 헤더 및 푸터/탭 영역의 실제 높이를 DOM에서 동적 측정\n const headerEl = this.#root.querySelector('nine-table-header');\n const footerEl = this.#root.querySelector('nine-table-sheets-footer');\n const headerHeight = headerEl ? headerEl.getBoundingClientRect().height : 40;\n const footerHeight = footerEl ? footerEl.getBoundingClientRect().height : 32;\n const extraPadding = 16; // 미세 여백\n\n const headerFooterHeight = headerHeight + footerHeight + extraPadding;\n const calculatedHeight = (targetRows * rowHeight) + headerFooterHeight;\n\n hostEl.style.height = `${calculatedHeight}px`;\n hostEl.style.maxHeight = `${(maxRows * rowHeight) + headerFooterHeight}px`;\n\n const sheetsBody = this.#root.querySelector('nine-table-sheets-body');\n if (sheetsBody) {\n sheetsBody.style.overflowY = rowCount > maxRows ? 'auto' : 'hidden';\n }\n };\n\n #render = () => {\n const hostEl = this.#root.host;\n const rawElements = Array.from(hostEl.children);\n const rawTables = rawElements.filter(el => el.tagName === 'TABLE');\n const isAutoHeight = hostEl.getAttribute('auto-height') === 'true';\n\n const sheetsHtml = rawTables.map((_, idx) => {\n const className = idx === 0 ? 'active' : '';\n return `<nine-table-sheet class=\"${className}\" data-index=\"${idx}\"></nine-table-sheet>`;\n }).join('');\n\n const tabsHtml = rawTables.map((_, idx) => {\n const className = idx === 0 ? 'active' : '';\n return `<div class=\"nine-tab-item ${className}\" data-index=\"${idx}\">Sheet ${idx + 1}</div>`;\n }).join('');\n\n this.#root.innerHTML = `\n <style>\n :host { \n display: flex; \n flex-direction: column; \n position: relative; \n overflow: hidden; \n height: ${isAutoHeight ? 'auto' : '100%'}; \n background: #fff; \n }\n nine-table-header { height: 40px; display: block; flex-shrink: 0; border-bottom: 1px solid #e5e7eb; background: #fff; }\n nine-table-body { display: flex; flex-direction: row; flex: 1; overflow: hidden; position: relative; }\n nine-table-summary { display: none; width: 250px; flex-shrink: 0; border-right: 1px solid #e5e7eb; }\n nine-splitter:not([data-split-index]) { width: 4px; background: #e5e7eb; cursor: col-resize; flex-shrink: 0; }\n nine-table-analysis { display: none; }\n nine-table-footer { display: none; }\n\n nine-table-sheets {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n position: relative;\n background: #fff;\n }\n nine-table-sheets-body {\n flex: 1;\n overflow: auto;\n position: relative;\n display: flex;\n flex-direction: row;\n }\n nine-table-sheet {\n display: none !important;\n height: 100%;\n overflow: auto;\n flex: 1 1 100%;\n }\n nine-table-sheet.active {\n display: block !important;\n }\n nine-table-sheets-footer {\n display: flex;\n height: 32px;\n background: #f3f4f6;\n border-top: 1px solid #e5e7eb;\n align-items: center;\n justify-content: space-between;\n padding: 0 8px;\n flex-shrink: 0;\n }\n nine-table-sheets .nine-tab-bar {\n display: flex;\n align-items: center;\n gap: 2px;\n overflow-x: auto;\n flex: 1;\n height: 100%;\n }\n nine-table-sheets .nine-tab-item {\n padding: 4px 12px;\n cursor: pointer;\n font-size: 12px;\n color: #4b5563;\n background: #e5e7eb;\n border: 1px solid #d1d5db;\n border-top: none;\n border-radius: 0 0 3px 3px;\n user-select: none;\n }\n nine-table-sheets .nine-tab-item.active {\n background: #ffffff;\n color: #111827;\n font-weight: 600;\n border-bottom: 2px solid #2563eb;\n }\n nine-table-sheets .sheets-counter {\n font-size: 12px;\n color: #6b7280;\n padding-left: 12px;\n flex-shrink: 0;\n }\n </style>\n \n <nine-table-header></nine-table-header>\n <nine-table-body>\n <nine-table-summary></nine-table-summary>\n <nine-table-sheets>\n <nine-table-sheets-body>${sheetsHtml}</nine-table-sheets-body>\n <nine-table-sheets-footer>\n <div class=\"nine-tab-bar\">${tabsHtml}</div>\n <div class=\"sheets-counter\">Total : <span id=\"row-count\">0</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 const $sheetElements = this.#root.querySelectorAll('nine-table-sheet');\n\n $sheetElements?.forEach(($el, idx) => {\n if (rawTables[idx]) {\n setTimeout(() => {\n $el.init(rawTables[idx]);\n if (isAutoHeight) {\n this.#applyAutoHeight(hostEl);\n }\n });\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","_NineTableVScrollBar","__privateAdd","_owner","_dragging","_elements","_interval1","_interval2","_firstThumbMove","_prevY","__publicField","__privateGet","body","thumb","thead","trackHeight","thumbHeight","totalRows","theadHeight","h","totalHeight","_getThumbHeight","y","maxScrollTop","pos","delay1","delay2","callback","__privateSet","_init","delayScrollAction","e","clearTimer","_track_onMouseDown","_track_onTouchStart","_thumb_onMouseDown","_thumb_onTouchStart","_thumb_onMouseMove","_thumb_onTouchMove","thumbBound","scrollStep","scrollableTrack","NineTableVScrollBar","_NineTableHScrollBar","NineTableHScrollBar","_NineTableSheet","_tableElement","tableEl","initializeTable","tbl","ensureColgroup","firstRow","colCount","colgroup","defaultWidth","i","col","ensureThead","clonedTable","leftContainer","bodyContainer","rightContainer","filterTableByFixed","sourceTable","targetFixedType","isBody","cols","targetIndices","idx","fixedAttr","tr","cells","bodyTable","leftTable","leftWidth","w","activeLeftWidth","rightTable","rightWidth","activeRightWidth","rowCount","scrollLeft","hScrollbar","scrollTop","_render","sbSize","NineTableSheet","_NineTableSheets","tabBar","tabItem","isMultiSelect","index","updateSplitters","splitter","splitIndex","leftSheet","rightSheet","tabItems","sheetElements","tab","sheet","clickedTab","activeTabs","targetSheet","activeSheets","initialBasis","activeSheet","rowCountEl","NineTableSheets","_LayoutManager","shadowRoot","_root","_resizeObserver","_observeResize","hostEl","entries","entry","_applyAutoHeight","_a","_b","maxRows","targetRows","sampleRow","rowHeight","headerEl","footerEl","headerHeight","footerHeight","headerFooterHeight","calculatedHeight","sheetsBody","rawTables","el","isAutoHeight","sheetsHtml","_","tabsHtml","$sheetElements","$el","LayoutManager","_NineTable","_created","NineTable"],"mappings":"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"}
1
+ {"version":3,"file":"nine-table.js","sources":["../src/external/NoPeer.js","../src/ui/nine-table-vscrollbar.js","../src/ui/nine-table-hscrollbar.js","../src/ui/nine-table-sheet.js","../src/ui/nine-table-sheets.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();","\nimport { trace } from \"@nopeer\";\n\nclass NineTableVScrollBar extends HTMLElement {\n #owner;\n #dragging;\n #elements;\n #interval1;\n #interval2;\n #firstThumbMove;\n #prevY = 0;\n\n constructor() {\n super();\n //this.applyBaseStyle();\n }\n\n connectedCallback() {\n // 호스트 엘리먼트(nine-table-sheet) 참조\n this.#owner = this.getRootNode().host;\n if (!this.#owner) return;\n\n this.shadowRoot.innerHTML = `\n <button class='ng-scroll-top' disabled><div class='ng-scroll-icon'></div></button>\n <div class='ng-scroll-track'> <div class='ng-scroll-thumb'></div> </div>\n <button class='ng-scroll-bottom'><div class='ng-scroll-icon'></div></button>\n `;\n\n super.connectedCallback();\n\n this.#elements = {\n track : this.shadowRoot.querySelector(\".ng-scroll-track\"),\n thumb : this.shadowRoot.querySelector(\".ng-scroll-thumb\"),\n top : this.shadowRoot.querySelector(\".ng-scroll-top\"),\n bottom : this.shadowRoot.querySelector(\".ng-scroll-bottom\"),\n };\n\n this.#init();\n }\n\n refresh = () => {\n if (!this.#owner) return;\n\n const body = this.#owner.querySelector(\".ng-container-body\");\n if (!body) return;\n\n const thumb = $(this.#elements.thumb, this.shadowRoot);\n const thead = body.querySelector(\"table > thead\");\n\n const currRow = this.#owner.getRowCount ? 0 : 0; // 데이터 연동 시점 확장 포인트\n const trackHeight = $(this.#elements.track).height();\n const thumbHeight = $(this.#elements.thumb).height();\n\n // 높이 및 표시 여부 산출\n const totalRows = this.#owner.getRowCount ? this.#owner.getRowCount() : 0;\n if (totalRows <= 10) {\n $(this).hide();\n return;\n } else {\n $(this).show();\n }\n\n const theadHeight = thead ? thead.getBoundingClientRect().height : 0;\n const h = Math.max(Math.min(trackHeight * (body.clientHeight - theadHeight) / (32 * totalRows), trackHeight), 16);\n\n thumb[0].dataset.height = h;\n thumb.css({ \"height\": h });\n\n const totalHeight = trackHeight - this.#getThumbHeight();\n if (totalHeight <= 0) return;\n\n // 위치(Top) 산출\n let y = 0;\n const maxScrollTop = body.scrollHeight - body.clientHeight;\n if (maxScrollTop > 0) {\n y = parseInt((body.scrollTop / maxScrollTop) * totalHeight, 10);\n if (y > trackHeight - thumbHeight) y = trackHeight - thumbHeight;\n if (y < 0) y = 0;\n }\n\n this.#elements.thumb.style.top = y + 'px';\n\n // 버튼 활성/비활성 처리\n this.#elements.top.disabled = body.scrollTop <= 0;\n this.#elements.bottom.disabled = body.scrollTop >= maxScrollTop;\n };\n\n delayScroll = (pos, delay1, delay2, callback) => {\n clearInterval(this.#interval1);\n clearInterval(this.#interval2);\n\n const body = this.#owner.querySelector(\".ng-container-body\");\n if (body) body.scrollTop += pos * 32;\n\n this.#interval1 = setInterval(() => {\n clearInterval(this.#interval1);\n\n this.#interval2 = setInterval(() => {\n if (body) {\n body.scrollTop += pos * 32;\n if (callback) callback.call();\n }\n }, delay2);\n }, delay1);\n };\n\n stopScroll = () => {\n clearInterval(this.#interval1);\n clearInterval(this.#interval2);\n };\n\n #init = () => {\n const delayScrollAction = (pos) => {\n clearInterval(this.#interval1);\n clearInterval(this.#interval2);\n\n const body = this.#owner.querySelector(\".ng-container-body\");\n if (body) body.scrollTop += pos * 32;\n\n this.#interval1 = setInterval(() => {\n clearInterval(this.#interval1);\n\n this.#interval2 = setInterval(() => {\n if (body) body.scrollTop += pos * 32;\n }, 10);\n }, 500);\n };\n\n $(this.#elements.top).on(\"mousedown\", e => { if (e.buttons != 1 || e.altKey || e.ctrlKey || e.shiftKey) return; delayScrollAction(-1); });\n $(this.#elements.bottom).on(\"mousedown\", e => { if (e.buttons != 1 || e.altKey || e.ctrlKey || e.shiftKey) return; delayScrollAction(1); });\n\n $(this.#elements.top).on(\"touchstart\", e => { delayScrollAction(-1); });\n $(this.#elements.bottom).on(\"touchstart\", e => { delayScrollAction(1); });\n\n const clearTimer = () => {\n clearInterval(this.#interval1);\n clearInterval(this.#interval2);\n };\n\n this.#elements.top.ontouchend =\n this.#elements.bottom.ontouchend =\n this.#elements.track.ontouchend =\n this.#elements.top.onmouseup =\n this.#elements.top.onmouseleave =\n this.#elements.bottom.onmouseup =\n this.#elements.bottom.onmouseleave =\n this.#elements.track.onmouseup =\n this.#elements.track.onmouseleave = clearTimer;\n\n $(this.#elements.track).on(\"mousedown\", this.#track_onMouseDown);\n $(this.#elements.track).on(\"touchstart\", this.#track_onTouchStart);\n\n $(this.#elements.thumb).on(\"mousedown\", this.#thumb_onMouseDown);\n $(this.#elements.thumb).on(\"touchstart\", this.#thumb_onTouchStart);\n\n document.addEventListener('mouseup', e => {\n if (this.#dragging) {\n this.#dragging = false;\n }\n document.removeEventListener('mousemove', this.#thumb_onMouseMove);\n });\n\n document.addEventListener('touchend', e => {\n this.#dragging = false;\n document.removeEventListener('touchmove', this.#thumb_onTouchMove);\n });\n };\n\n #track_onTouchStart = e => {\n var rect = e.target.getBoundingClientRect();\n e.clientX = e.targetTouches[0].clientX;\n e.clientY = e.targetTouches[0].clientY;\n e.buttons = 1;\n this.#track_onMouseDown(e);\n }\n\n #track_onMouseDown = e => {\n if (this.#dragging) return;\n if (e.buttons != 1 || e.altKey || e.ctrlKey || e.shiftKey) return;\n e.preventDefault();\n\n var thumbBound = this.#elements.thumb.getBoundingClientRect();\n const body = this.#owner.querySelector(\".ng-container-body\");\n if (!body) return;\n\n const scrollStep = body.clientHeight;\n const pos = (e.clientY > thumbBound.y) ? scrollStep : -scrollStep;\n body.scrollTop += pos;\n\n clearInterval(this.#interval1);\n clearInterval(this.#interval2);\n\n this.#interval1 = setInterval(() => {\n clearInterval(this.#interval1);\n\n this.#interval2 = setInterval(() => {\n var thumbBound = this.#elements.thumb.getBoundingClientRect();\n if (e.clientY > thumbBound.y && e.clientY < thumbBound.y + thumbBound.height) {\n clearInterval(this.#interval2);\n } else {\n body.scrollTop += (e.clientY > thumbBound.y) ? scrollStep : -scrollStep;\n }\n }, 10);\n }, 500);\n };\n\n #thumb_onTouchStart = e => {\n e.clientX = e.targetTouches[0].clientX;\n e.clientY = e.targetTouches[0].clientY;\n e.buttons = 1;\n this.#thumb_onMouseDown(e);\n document.addEventListener('touchmove', this.#thumb_onTouchMove);\n };\n\n #thumb_onTouchMove = e => {\n e.clientX = e.targetTouches[0].clientX;\n e.clientY = e.targetTouches[0].clientY;\n e.buttons = 1;\n this.#thumb_onMouseMove(e);\n };\n\n #thumb_onMouseDown = e => {\n this.#prevY = e.clientY;\n this.#dragging = true;\n this.shiftY = e.offsetY + this.#elements.track.getBoundingClientRect().y;\n\n this.trackHeight = $(this.#elements.track).height();\n this.thumbHeight = $(this.#elements.thumb).height();\n\n this.#firstThumbMove = true;\n document.addEventListener('mousemove', this.#thumb_onMouseMove);\n };\n\n #thumb_onMouseMove = (e) => {\n if (!this.#dragging) return;\n e.preventDefault();\n\n const trackHeight = this.trackHeight;\n const thumbHeight = this.#getThumbHeight();\n\n var y = e.clientY - this.shiftY;\n if (y < 0) y = 0;\n if (y + thumbHeight > trackHeight) y = parseInt(trackHeight - thumbHeight);\n\n this.#elements.thumb.style.top = y + 'px';\n\n const body = this.#owner.querySelector(\".ng-container-body\");\n if (!body) return;\n\n const maxScrollTop = body.scrollHeight - body.clientHeight;\n const scrollableTrack = trackHeight - thumbHeight;\n\n if (scrollableTrack > 0 && maxScrollTop > 0) {\n body.scrollTop = (y / scrollableTrack) * maxScrollTop;\n }\n };\n\n #getThumbHeight = () => {\n return parseInt(this.#elements.thumb.dataset.height || 30, 10);\n };\n}\n\nif (!customElements.get('nine-table-vscrollbar')) {\n customElements.define(\"nine-table-vscrollbar\", NineTableVScrollBar);\n}","import { trace } from \"@nopeer\";\n\nclass NineTableHScrollBar extends HTMLElement {\n #owner;\n #dragging;\n #elements;\n #interval1;\n #interval2;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.#owner = this.getRootNode().host;\n if (!this.#owner) return;\n\n this.innerHTML = `\n <style>\n nine-table-hscrollbar {\n display: flex;\n flex-direction: row;\n width: 100%;\n height: 100%;\n background: #f9fafb;\n box-sizing: border-box;\n user-select: none;\n }\n nine-table-hscrollbar button {\n width: 16px;\n height: 100%;\n background: #f3f4f6;\n border: none;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n }\n nine-table-hscrollbar button:disabled {\n opacity: 0.4;\n cursor: default;\n }\n nine-table-hscrollbar .ng-scroll-icon {\n width: 6px;\n height: 6px;\n border-top: 2px solid #6b7280;\n border-right: 2px solid #6b7280;\n }\n nine-table-hscrollbar .ng-scroll-left .ng-scroll-icon { transform: rotate(-135deg); }\n nine-table-hscrollbar .ng-scroll-right .ng-scroll-icon { transform: rotate(45deg); }\n nine-table-hscrollbar .ng-scroll-track {\n flex: 1;\n height: 100%;\n position: relative;\n background: #f3f4f6;\n overflow: hidden;\n }\n nine-table-hscrollbar .ng-scroll-thumb {\n position: absolute;\n top: 2px;\n bottom: 2px;\n background: #d1d5db;\n border-radius: 4px;\n cursor: pointer;\n }\n nine-table-hscrollbar .ng-scroll-thumb:hover {\n background: #9ca3af;\n }\n </style>\n <button class='ng-scroll-left' disabled><div class='ng-scroll-icon'></div></button>\n <div class='ng-scroll-track'><div class='ng-scroll-thumb'></div></div>\n <button class='ng-scroll-right'><div class='ng-scroll-icon'></div></button>\n `;\n\n this.#elements = {\n container : this.#owner.querySelector(\".ng-container-body\"),\n track : this.querySelector(\".ng-scroll-track\"),\n thumb : this.querySelector(\".ng-scroll-thumb\"),\n left : this.querySelector(\".ng-scroll-left\"),\n right : this.querySelector(\".ng-scroll-right\"),\n };\n\n this.#init();\n setTimeout(() => this.refresh(), 0);\n }\n\n refresh = () => {\n if (!this.#owner) return;\n\n const body = this.#owner.querySelector(\".ng-container-body\");\n if (!body) return;\n\n const table = body.querySelector(\"table\");\n if (!table) return;\n\n const track = $(this.#elements.track, this);\n const thumb = $(this.#elements.thumb, this);\n\n const bottomContainer = this.#owner.querySelector(\".ng-container-bottom\");\n if (body.clientWidth !== 0 && table.scrollWidth > body.clientWidth) {\n $(bottomContainer).show();\n } else {\n $(bottomContainer).hide();\n return;\n }\n\n const trackWidth = track.width();\n if (trackWidth <= 0) return;\n\n const thumbWidth = Math.max(Math.min(trackWidth * (body.clientWidth / table.scrollWidth), trackWidth), 20);\n thumb.width(thumbWidth);\n\n const maxScrollLeft = table.scrollWidth - body.clientWidth;\n const maxThumbLeft = trackWidth - thumbWidth;\n\n let l = 0;\n if (maxScrollLeft > 0) {\n l = parseInt((body.scrollLeft / maxScrollLeft) * maxThumbLeft, 10);\n }\n if (l < 0) l = 0;\n if (l > maxThumbLeft) l = maxThumbLeft;\n\n thumb.css({ left: l });\n\n this.#elements.left.disabled = (body.scrollLeft <= 0);\n this.#elements.right.disabled = (body.scrollLeft >= maxScrollLeft);\n };\n\n #thumbMoveTo = (x) => {\n if (!this.#elements) return;\n\n const body = this.#owner.querySelector(\".ng-container-body\");\n const table = body.querySelector(\"table\");\n if (!table) return;\n\n const trackBound = this.#elements.track.getBoundingClientRect();\n const thumbBound = this.#elements.thumb.getBoundingClientRect();\n\n let targetX = x;\n if (targetX < 0) targetX = 0;\n if (targetX + thumbBound.width > trackBound.width) targetX = trackBound.width - thumbBound.width;\n targetX = parseInt(targetX, 10);\n\n this.#elements.thumb.style.left = targetX + 'px';\n\n const maxScrollLeft = table.scrollWidth - body.clientWidth;\n const maxThumbLeft = trackBound.width - thumbBound.width;\n\n if (maxThumbLeft > 0 && maxScrollLeft > 0) {\n body.scrollLeft = (targetX / maxThumbLeft) * maxScrollLeft;\n }\n\n this.#elements.left.disabled = targetX <= 0;\n this.#elements.right.disabled = targetX >= maxThumbLeft;\n\n return (targetX > 0 && targetX < maxThumbLeft);\n };\n\n #init = () => {\n const body = this.#owner.querySelector(\".ng-container-body\");\n\n if (body) {\n body.addEventListener('scroll', () => {\n this.refresh();\n });\n }\n\n const delayScroll = (pos) => {\n clearInterval(this.#interval1);\n clearInterval(this.#interval2);\n\n const trackBound = this.#elements.track.getBoundingClientRect();\n const thumbBound = this.#elements.thumb.getBoundingClientRect();\n\n this.#thumbMoveTo((thumbBound.x - trackBound.x) + pos);\n\n this.#interval1 = setInterval(() => {\n clearInterval(this.#interval1);\n\n this.#interval2 = setInterval(() => {\n const tBound = this.#elements.track.getBoundingClientRect();\n const thBound = this.#elements.thumb.getBoundingClientRect();\n if (!this.#thumbMoveTo((thBound.x - tBound.x) + pos)) {\n clearInterval(this.#interval2);\n }\n }, 10);\n }, 500);\n };\n\n const clearTimer = () => {\n clearInterval(this.#interval1);\n clearInterval(this.#interval2);\n };\n\n this.#elements.left.ontouchend =\n this.#elements.right.ontouchend =\n this.#elements.track.ontouchend =\n this.#elements.left.onmouseup =\n this.#elements.left.onmouseleave =\n this.#elements.right.onmouseup =\n this.#elements.right.onmouseleave =\n this.#elements.track.onmouseup =\n this.#elements.track.onmouseleave = clearTimer;\n\n $(this.#elements.left).on(\"mousedown\", e => { if (e.buttons != 1) return; delayScroll(-10); });\n $(this.#elements.right).on(\"mousedown\", e => { if (e.buttons != 1) return; delayScroll(10); });\n\n $(this.#elements.left).on(\"touchstart\", e => { delayScroll(-10); });\n $(this.#elements.right).on(\"touchstart\", e => { delayScroll(10); });\n\n $(this.#elements.track).on(\"mousedown\", e => {\n if (e.buttons != 1) return;\n e.preventDefault();\n const trackRect = this.#elements.track.getBoundingClientRect();\n const thumbWidth = this.#elements.thumb.getBoundingClientRect().width;\n this.#thumbMoveTo(e.clientX - trackRect.left - (thumbWidth / 2));\n });\n\n $(this.#elements.thumb).on(\"mousedown\", e => {\n this.#dragging = true;\n this.shiftX = e.clientX - this.#elements.thumb.getBoundingClientRect().left;\n document.addEventListener('mousemove', this.#thumb_onMouseMove);\n });\n\n document.addEventListener('mouseup', () => {\n this.#dragging = false;\n clearTimer();\n document.removeEventListener('mousemove', this.#thumb_onMouseMove);\n });\n };\n\n #thumb_onMouseMove = e => {\n if (!this.#dragging) return;\n const trackRect = this.#elements.track.getBoundingClientRect();\n this.#thumbMoveTo(e.clientX - trackRect.left - this.shiftX);\n };\n}\n\nif (!customElements.get('nine-table-hscrollbar')) {\n customElements.define(\"nine-table-hscrollbar\", NineTableHScrollBar);\n}","import { trace } from \"@nopeer\";\nimport './nine-table-vscrollbar.js';\nimport './nine-table-hscrollbar.js';\n\nexport class NineTableSheet extends HTMLElement {\n #tableElement = null;\n static SCROLLBAR_SIZE = 16;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.#render();\n };\n\n init = (tableEl) => {\n if (!tableEl) return;\n\n const initializeTable = (tbl) => {\n\n const ensureColgroup = (tbl) => {\n if (tbl.querySelector('colgroup')) return;\n\n const firstRow = tbl.querySelector('tbody tr') || tbl.querySelector('tr');\n const colCount = firstRow ? firstRow.querySelectorAll('th, td').length : 1;\n\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 const ensureThead = (tbl) => {\n if (tbl.querySelector('thead')) return;\n\n const thead = document.createElement('thead');\n const colgroup = tbl.querySelector('colgroup');\n\n if (colgroup) {\n colgroup.after(thead);\n } else {\n tbl.prepend(thead);\n }\n };\n\n ensureColgroup(tbl);\n ensureThead(tbl);\n\n tbl.classList.add('nine-table-element');\n return tbl;\n };\n\n const clonedTable = tableEl.cloneNode(true);\n this.#tableElement = initializeTable(clonedTable);\n this.#tableElement.style.display = 'table';\n\n const leftContainer = this.querySelector('.ng-container-left');\n const bodyContainer = this.querySelector('.ng-container-body');\n const rightContainer = this.querySelector('.ng-container-right');\n\n const filterTableByFixed = (sourceTable, targetFixedType, isBody = false) => {\n const tbl = sourceTable.cloneNode(true);\n const cols = Array.from(tbl.querySelectorAll('colgroup col'));\n const targetIndices = [];\n\n cols.forEach((col, idx) => {\n const fixedAttr = col.getAttribute('fixed');\n const isMatch = isBody ? (!fixedAttr || fixedAttr === '') : (fixedAttr === targetFixedType);\n if (!isMatch) {\n targetIndices.push(idx);\n }\n });\n\n targetIndices.reverse().forEach(idx => {\n if (cols[idx]) cols[idx].remove();\n tbl.querySelectorAll('tr').forEach(tr => {\n const cells = tr.querySelectorAll('th, td');\n if (cells[idx]) cells[idx].remove();\n });\n });\n\n return tbl;\n };\n\n // 1. 메인 바디 영역\n if (bodyContainer) {\n const bodyTable = filterTableByFixed(this.#tableElement, null, true);\n bodyContainer.innerHTML = '';\n bodyContainer.appendChild(bodyTable);\n }\n\n // 2. 좌측 고정 영역\n if (leftContainer) {\n const leftTable = filterTableByFixed(this.#tableElement, 'left', false);\n\n let leftWidth = 0;\n leftTable.querySelectorAll('col').forEach(col => {\n const w = parseInt(col.getAttribute('width'), 10);\n if (!isNaN(w)) leftWidth += w;\n });\n\n leftContainer.innerHTML = '';\n leftContainer.appendChild(leftTable);\n\n const activeLeftWidth = leftWidth > 0 ? leftWidth : 0;\n leftContainer.style.flex = `0 0 ${activeLeftWidth}px`;\n leftContainer.style.width = `${activeLeftWidth}px`;\n }\n\n // 3. 우측 고정 영역\n if (rightContainer) {\n const rightTable = filterTableByFixed(this.#tableElement, 'right', false);\n\n let rightWidth = 0;\n rightTable.querySelectorAll('col').forEach(col => {\n const w = parseInt(col.getAttribute('width'), 10);\n if (!isNaN(w)) rightWidth += w;\n });\n\n rightContainer.innerHTML = '';\n rightContainer.appendChild(rightTable);\n\n const activeRightWidth = rightWidth > 0 ? rightWidth : 0;\n rightContainer.style.flex = `0 0 ${activeRightWidth}px`;\n rightContainer.style.width = `${activeRightWidth}px`;\n }\n\n // 데이터 건수 기반 세로 스크롤 제어 정책 반영\n if (bodyContainer) {\n const rowCount = this.getRowCount();\n bodyContainer.style.overflowY = rowCount > 10 ? 'auto' : 'hidden';\n\n bodyContainer.addEventListener('scroll', () => {\n const scrollLeft = bodyContainer.scrollLeft;\n\n // 좌우 고정 영역은 가로 스크롤 시 밀려나지 않도록 위치 보정 또는\n // 하단 스크롤바 썸(Thumb) 위치 동기화 호출\n const hScrollbar = this.querySelector('nine-table-hscrollbar');\n if (hScrollbar && typeof hScrollbar.syncThumb === 'function') {\n hScrollbar.syncThumb(scrollLeft);\n }\n });\n }\n\n trace.log(`NineTableSheet 3-split initialized with rows: ${this.getRowCount()}`);\n };\n\n getRowCount = () => {\n if (!this.#tableElement) return 0;\n return this.#tableElement.querySelectorAll('tbody tr').length;\n };\n\n // 🎯 외부 스크롤바 및 컨트롤러 연동용 메서드\n scrollToX = (scrollLeft) => {\n const bodyContainer = this.querySelector('.ng-container-body');\n if (bodyContainer) bodyContainer.scrollLeft = scrollLeft;\n };\n\n scrollToY = (scrollTop) => {\n const bodyContainer = this.querySelector('.ng-container-body');\n if (bodyContainer) bodyContainer.scrollTop = scrollTop;\n };\n\n #render = () => {\n const sbSize = NineTableSheet.SCROLLBAR_SIZE;\n\n this.innerHTML = `\n <style>\n nine-table-sheet {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n position: relative;\n box-sizing: border-box;\n background: #ffffff;\n overflow: hidden;\n }\n \n nine-table-sheet .ng-container-top {\n display: flex;\n flex-direction: row;\n flex: 1 1 auto;\n width: 100%;\n height: calc(100% - ${sbSize}px);\n overflow: hidden;\n position: relative;\n }\n \n nine-table-sheet .ng-container-left {\n display: flex;\n flex-direction: column;\n overflow: hidden;\n background: #ffffff;\n border-right: 1px solid #e5e7eb;\n flex-shrink: 0;\n }\n \n nine-table-sheet .ng-container-body {\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow-x: auto;\n overflow-y: auto;\n background: #ffffff;\n position: relative;\n }\n \n nine-table-sheet .ng-container-right {\n display: flex;\n flex-direction: column;\n overflow: hidden;\n background: #ffffff;\n border-left: 1px solid #e5e7eb;\n flex-shrink: 0;\n }\n \n nine-table-sheet .ng-container-bottom {\n display: flex;\n flex-direction: row;\n height: ${sbSize}px;\n min-height: ${sbSize}px;\n flex-shrink: 0;\n background: #f9fafb;\n border-top: 1px solid #e5e7eb;\n }\n \n nine-table-sheet nine-table-hscrollbar {\n flex: 1;\n height: 100%;\n overflow: hidden;\n display: block;\n }\n \n nine-table-sheet .ng-scroll-edge {\n width: ${sbSize}px;\n min-width: ${sbSize}px;\n height: 100%;\n flex-shrink: 0;\n background: #f3f4f6;\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='ng-container-top'>\n <div class='ng-container-left'></div>\n <div class='ng-container-body'></div>\n <div class='ng-container-right'></div>\n <nine-table-vscrollbar></nine-table-vscrollbar>\n </div>\n <div class='ng-container-bottom'>\n <nine-table-hscrollbar></nine-table-hscrollbar>\n <div class='ng-scroll-edge'></div>\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}","import './nine-table-sheet.js';\n\nexport class NineTableSheets extends HTMLElement {\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.#init();\n };\n\n #init = () => {\n const tabBar = this.querySelector('.nine-tab-bar');\n if (!tabBar) return;\n\n 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 this.switchSheet(index, isMultiSelect);\n });\n\n this.switchSheet(0, false);\n };\n\n switchSheet = (index, isMultiSelect = false) => {\n\n const updateSplitters = () => {\n const body = this.querySelector('nine-table-sheets-body');\n const splitters = body.querySelectorAll('nine-splitter');\n splitters.forEach(splitter => {\n const splitIndex = parseInt(splitter.dataset.splitIndex, 10);\n const leftSheet = body.querySelector(`nine-table-sheet[data-index=\"${splitIndex - 1}\"]`);\n const rightSheet = body.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\n const tabBar = this.querySelector('.nine-tab-bar');\n const body = this.querySelector('nine-table-sheets-body');\n const tabItems = tabBar.querySelectorAll('.nine-tab-item');\n const sheetElements = body.querySelectorAll('nine-table-sheet');\n\n if (!tabItems[index]) return;\n\n if (!isMultiSelect) {\n tabItems.forEach((tab, idx) => {\n tab.classList.toggle('active', idx === index);\n const sheet = body.querySelector(`nine-table-sheet[data-index=\"${idx}\"]`);\n if (sheet) sheet.style.flex = '';\n });\n sheetElements.forEach((sheet, idx) => {\n sheet.classList.toggle('active', idx === index);\n });\n } else {\n const clickedTab = tabItems[index];\n const activeTabs = 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 = body.querySelector(`nine-table-sheet[data-index=\"${index}\"]`);\n if (targetSheet) {\n targetSheet.classList.toggle('active');\n if (!targetSheet.classList.contains('active')) {\n targetSheet.style.flex = '';\n }\n }\n }\n\n const activeSheets = Array.from(body.querySelectorAll('nine-table-sheet.active'));\n if (activeSheets.length > 1) {\n const initialBasis = (1 / activeSheets.length);\n activeSheets.forEach(sheet => {\n if (!sheet.style.flex || sheet.style.flex === '1 1 100%') {\n sheet.style.flex = `${initialBasis} ${initialBasis} 0px`;\n }\n });\n } else {\n activeSheets.forEach(sheet => {\n sheet.style.flex = '1 1 100%';\n });\n }\n\n updateSplitters();\n\n const activeSheet = body.querySelector(`nine-table-sheet.active`);\n if (activeSheet && typeof activeSheet.getRowCount === 'function') {\n const rowCountEl = this.querySelector('#row-count');\n if (rowCountEl) {\n rowCountEl.textContent = activeSheet.getRowCount().toLocaleString();\n }\n }\n };\n\n\n}\n\nif (!customElements.get('nine-table-sheets')) {\n customElements.define('nine-table-sheets', NineTableSheets);\n}","/**\n * [LayoutManager 높이 설정(Height Configuration) 사용 예제]\n *\n * 1. 부모 영역 채우기 (Fluid / 100% Fill) - 기본값\n * - 컴포넌트가 부모 컨테이너의 남은 공간을 가득 채우고 내부 영역에서 스크롤을 처리합니다.\n * - 사용법: <nine-table> 또는 호스트 엘리먼트에 별도 속성을 주지 않으면 적용됩니다.\n *\n * 2. 콘텐츠 밀착형 / 데이터 건수 기반 동적 높이 (Auto-Height)\n * - 데이터 행 개수에 맞춰 컴포넌트 전체 높이가 유연하게 늘어납니다.\n * - 사용법: <nine-table auto-height=\"true\"> 또는 호스트 엘리먼트에 auto-height=\"true\" 속성을 지정합니다.\n *\n * 3. 픽셀 고정 높이 (Fixed Pixel)\n * - 부모 크기에 상관없이 개발자가 지정한 고정 크기를 엄격하게 유지합니다.\n * - 사용법: <nine-table style=\"height: 400px;\"> 처럼 인라인 스타일로 높이를 직접 제어합니다.\n */\n\nimport './nine-table-sheets.js';\n\nexport class LayoutManager {\n #root;\n #resizeObserver = null;\n\n constructor(shadowRoot) {\n this.#root = shadowRoot;\n this.#render();\n this.#observeResize();\n }\n\n #observeResize = () => {\n const hostEl = this.#root.host;\n if (!hostEl) return;\n\n this.#resizeObserver = new ResizeObserver((entries) => {\n for (let entry of entries) {\n const isAutoHeight = hostEl.getAttribute('auto-height') === 'true';\n if (isAutoHeight) {\n this.#applyAutoHeight(hostEl);\n }\n }\n });\n\n this.#resizeObserver.observe(hostEl);\n };\n\n #applyAutoHeight = (hostEl) => {\n const activeSheet = hostEl.shadowRoot?.querySelector('nine-table-sheet.active');\n if (!activeSheet) return;\n\n const rowCount = activeSheet.getRowCount?.() || 0;\n\n // 1. 속성으로 maxRows를 받되, 없으면 기본값 10 설정\n const maxRows = parseInt(hostEl.getAttribute('max-display-row'), 10) || 10;\n const targetRows = Math.min(rowCount, maxRows);\n\n // 2. 실제 렌더링된 행(tr) 높이를 동적으로 측정 (없으면 기본 32px 폴백)\n const sampleRow = activeSheet.querySelector('tbody tr') || activeSheet.querySelector('tr');\n const rowHeight = sampleRow ? sampleRow.getBoundingClientRect().height : 32;\n\n // 3. 헤더 및 푸터/탭 영역의 실제 높이를 DOM에서 동적 측정\n const headerEl = this.#root.querySelector('nine-table-header');\n const footerEl = this.#root.querySelector('nine-table-sheets-footer');\n const headerHeight = headerEl ? headerEl.getBoundingClientRect().height : 40;\n const footerHeight = footerEl ? footerEl.getBoundingClientRect().height : 32;\n const extraPadding = 16; // 미세 여백\n\n const headerFooterHeight = headerHeight + footerHeight + extraPadding;\n const calculatedHeight = (targetRows * rowHeight) + headerFooterHeight;\n\n hostEl.style.height = `${calculatedHeight}px`;\n hostEl.style.maxHeight = `${(maxRows * rowHeight) + headerFooterHeight}px`;\n\n const sheetsBody = this.#root.querySelector('nine-table-sheets-body');\n if (sheetsBody) {\n sheetsBody.style.overflowY = rowCount > maxRows ? 'auto' : 'hidden';\n }\n };\n\n #render = () => {\n const hostEl = this.#root.host;\n const rawElements = Array.from(hostEl.children);\n const rawTables = rawElements.filter(el => el.tagName === 'TABLE');\n const isAutoHeight = hostEl.getAttribute('auto-height') === 'true';\n\n const sheetsHtml = rawTables.map((_, idx) => {\n const className = idx === 0 ? 'active' : '';\n return `<nine-table-sheet class=\"${className}\" data-index=\"${idx}\"></nine-table-sheet>`;\n }).join('');\n\n const tabsHtml = rawTables.map((_, idx) => {\n const className = idx === 0 ? 'active' : '';\n return `<div class=\"nine-tab-item ${className}\" data-index=\"${idx}\">Sheet ${idx + 1}</div>`;\n }).join('');\n\n this.#root.innerHTML = `\n <style>\n :host { \n display: flex; \n flex-direction: column; \n position: relative; \n overflow: hidden; \n height: ${isAutoHeight ? 'auto' : '100%'}; \n background: #fff; \n }\n nine-table-header { height: 40px; display: block; flex-shrink: 0; border-bottom: 1px solid #e5e7eb; background: #fff; }\n nine-table-body { display: flex; flex-direction: row; flex: 1; overflow: hidden; position: relative; }\n nine-table-summary { display: none; width: 250px; flex-shrink: 0; border-right: 1px solid #e5e7eb; }\n nine-splitter:not([data-split-index]) { width: 4px; background: #e5e7eb; cursor: col-resize; flex-shrink: 0; }\n nine-table-analysis { display: none; }\n nine-table-footer { display: none; }\n\n nine-table-sheets {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n position: relative;\n background: #fff;\n }\n nine-table-sheets-body {\n flex: 1;\n overflow: auto;\n position: relative;\n display: flex;\n flex-direction: row;\n }\n nine-table-sheet {\n display: none !important;\n height: 100%;\n overflow: auto;\n flex: 1 1 100%;\n }\n nine-table-sheet.active {\n display: block !important;\n }\n nine-table-sheets-footer {\n display: flex;\n height: 32px;\n background: #f3f4f6;\n border-top: 1px solid #e5e7eb;\n align-items: center;\n justify-content: space-between;\n padding: 0 8px;\n flex-shrink: 0;\n }\n nine-table-sheets .nine-tab-bar {\n display: flex;\n align-items: center;\n gap: 2px;\n overflow-x: auto;\n flex: 1;\n height: 100%;\n }\n nine-table-sheets .nine-tab-item {\n padding: 4px 12px;\n cursor: pointer;\n font-size: 12px;\n color: #4b5563;\n background: #e5e7eb;\n border: 1px solid #d1d5db;\n border-top: none;\n border-radius: 0 0 3px 3px;\n user-select: none;\n }\n nine-table-sheets .nine-tab-item.active {\n background: #ffffff;\n color: #111827;\n font-weight: 600;\n border-bottom: 2px solid #2563eb;\n }\n nine-table-sheets .sheets-counter {\n font-size: 12px;\n color: #6b7280;\n padding-left: 12px;\n flex-shrink: 0;\n }\n </style>\n \n <nine-table-header></nine-table-header>\n <nine-table-body>\n <nine-table-summary></nine-table-summary>\n <nine-table-sheets>\n <nine-table-sheets-body>${sheetsHtml}</nine-table-sheets-body>\n <nine-table-sheets-footer>\n <div class=\"nine-tab-bar\">${tabsHtml}</div>\n <div class=\"sheets-counter\">Total : <span id=\"row-count\">0</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 const $sheetElements = this.#root.querySelectorAll('nine-table-sheet');\n\n $sheetElements?.forEach(($el, idx) => {\n if (rawTables[idx]) {\n setTimeout(() => {\n $el.init(rawTables[idx]);\n if (isAutoHeight) {\n this.#applyAutoHeight(hostEl);\n }\n });\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","_NineTableVScrollBar","__privateAdd","_owner","_dragging","_elements","_interval1","_interval2","_firstThumbMove","_prevY","__publicField","__privateGet","body","thumb","thead","trackHeight","thumbHeight","totalRows","theadHeight","h","totalHeight","_getThumbHeight","y","maxScrollTop","pos","delay1","delay2","callback","__privateSet","_init","delayScrollAction","e","clearTimer","_track_onMouseDown","_track_onTouchStart","_thumb_onMouseDown","_thumb_onTouchStart","_thumb_onMouseMove","_thumb_onTouchMove","thumbBound","scrollStep","scrollableTrack","NineTableVScrollBar","_NineTableHScrollBar","table","track","bottomContainer","trackWidth","thumbWidth","maxScrollLeft","maxThumbLeft","l","_thumbMoveTo","x","trackBound","targetX","delayScroll","tBound","thBound","trackRect","NineTableHScrollBar","_NineTableSheet","_tableElement","tableEl","initializeTable","tbl","ensureColgroup","firstRow","colCount","colgroup","defaultWidth","i","col","ensureThead","clonedTable","leftContainer","bodyContainer","rightContainer","filterTableByFixed","sourceTable","targetFixedType","isBody","cols","targetIndices","idx","fixedAttr","tr","cells","bodyTable","leftTable","leftWidth","w","activeLeftWidth","rightTable","rightWidth","activeRightWidth","rowCount","scrollLeft","hScrollbar","scrollTop","_render","sbSize","NineTableSheet","_NineTableSheets","tabBar","tabItem","isMultiSelect","index","updateSplitters","splitter","splitIndex","leftSheet","rightSheet","tabItems","sheetElements","tab","sheet","clickedTab","activeTabs","targetSheet","activeSheets","initialBasis","activeSheet","rowCountEl","NineTableSheets","_LayoutManager","shadowRoot","_root","_resizeObserver","_observeResize","hostEl","entries","entry","_applyAutoHeight","_a","_b","maxRows","targetRows","sampleRow","rowHeight","headerEl","footerEl","headerHeight","footerHeight","headerFooterHeight","calculatedHeight","sheetsBody","rawTables","el","isAutoHeight","sheetsHtml","_","tabsHtml","$sheetElements","$el","LayoutManager","_NineTable","_created","NineTable"],"mappings":"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"}
@@ -1,12 +1,64 @@
1
- (function(p,g){typeof exports=="object"&&typeof module<"u"?g(require("@ninebone/util")):typeof define=="function"&&define.amd?define(["@ninebone/util"],g):(p=typeof globalThis<"u"?globalThis:p||self,g(p.NineboneUtil))})(this,function(p){"use strict";var qt=Object.defineProperty;var It=p=>{throw TypeError(p)};var $t=(p,g,x)=>g in p?qt(p,g,{enumerable:!0,configurable:!0,writable:!0,value:x}):p[g]=x;var l=(p,g)=>qt(p,"name",{value:g,configurable:!0});var R=(p,g,x)=>$t(p,typeof g!="symbol"?g+"":g,x),Ht=(p,g,x)=>g.has(p)||It("Cannot "+x);var t=(p,g,x)=>(Ht(p,g,"read from private field"),x?x.call(p):g.get(p)),h=(p,g,x)=>g.has(p)?It("Cannot add the same private member more than once"):g instanceof WeakSet?g.add(p):g.set(p,x),f=(p,g,x,X)=>(Ht(p,g,"write to private field"),X?X.call(p,x):g.set(p,x),x);var T,B,d,k,C,V,tt,et,ot,N,nt,_,W,z,j,q,K,b,I,E,st,it,lt,rt,O,ct,F,P,D,Z,A,ht,at,Y,G,ut,J,dt,Q;const yt=class yt extends p.trace.constructor{constructor(){super(),this.init("nine-table","green")}};l(yt,"Trace");let g=yt;const x=new g,vt=class vt extends HTMLElement{constructor(){super();h(this,T);h(this,B);h(this,d);h(this,k);h(this,C);h(this,V);h(this,tt,0);R(this,"refresh",l(()=>{if(!t(this,T))return;const e=t(this,T).querySelector(".ng-container-body");if(!e)return;const i=$(t(this,d).thumb,this.shadowRoot),o=e.querySelector("table > thead");t(this,T).getRowCount;const n=$(t(this,d).track).height(),s=$(t(this,d).thumb).height(),a=t(this,T).getRowCount?t(this,T).getRowCount():0;if(a<=10){$(this).hide();return}else $(this).show();const v=o?o.getBoundingClientRect().height:0,c=Math.max(Math.min(n*(e.clientHeight-v)/(32*a),n),16);i[0].dataset.height=c,i.css({height:c});const y=n-t(this,j).call(this);if(y<=0)return;let r=0;const u=e.scrollHeight-e.clientHeight;u>0&&(r=parseInt(e.scrollTop/u*y,10),r>n-s&&(r=n-s),r<0&&(r=0)),t(this,d).thumb.style.top=r+"px",t(this,d).top.disabled=e.scrollTop<=0,t(this,d).bottom.disabled=e.scrollTop>=u},"refresh"));R(this,"delayScroll",l((e,i,o,n)=>{clearInterval(t(this,k)),clearInterval(t(this,C));const s=t(this,T).querySelector(".ng-container-body");s&&(s.scrollTop+=e*32),f(this,k,setInterval(()=>{clearInterval(t(this,k)),f(this,C,setInterval(()=>{s&&(s.scrollTop+=e*32,n&&n.call())},o))},i))},"delayScroll"));R(this,"stopScroll",l(()=>{clearInterval(t(this,k)),clearInterval(t(this,C))},"stopScroll"));h(this,et,l(()=>{const e=l(o=>{clearInterval(t(this,k)),clearInterval(t(this,C));const n=t(this,T).querySelector(".ng-container-body");n&&(n.scrollTop+=o*32),f(this,k,setInterval(()=>{clearInterval(t(this,k)),f(this,C,setInterval(()=>{n&&(n.scrollTop+=o*32)},10))},500))},"delayScrollAction");$(t(this,d).top).on("mousedown",o=>{o.buttons!=1||o.altKey||o.ctrlKey||o.shiftKey||e(-1)}),$(t(this,d).bottom).on("mousedown",o=>{o.buttons!=1||o.altKey||o.ctrlKey||o.shiftKey||e(1)}),$(t(this,d).top).on("touchstart",o=>{e(-1)}),$(t(this,d).bottom).on("touchstart",o=>{e(1)});const i=l(()=>{clearInterval(t(this,k)),clearInterval(t(this,C))},"clearTimer");t(this,d).top.ontouchend=t(this,d).bottom.ontouchend=t(this,d).track.ontouchend=t(this,d).top.onmouseup=t(this,d).top.onmouseleave=t(this,d).bottom.onmouseup=t(this,d).bottom.onmouseleave=t(this,d).track.onmouseup=t(this,d).track.onmouseleave=i,$(t(this,d).track).on("mousedown",t(this,N)),$(t(this,d).track).on("touchstart",t(this,ot)),$(t(this,d).thumb).on("mousedown",t(this,W)),$(t(this,d).thumb).on("touchstart",t(this,nt)),document.addEventListener("mouseup",o=>{t(this,B)&&f(this,B,!1),document.removeEventListener("mousemove",t(this,z))}),document.addEventListener("touchend",o=>{f(this,B,!1),document.removeEventListener("touchmove",t(this,_))})},"#init"));h(this,ot,l(e=>{e.target.getBoundingClientRect(),e.clientX=e.targetTouches[0].clientX,e.clientY=e.targetTouches[0].clientY,e.buttons=1,t(this,N).call(this,e)},"#track_onTouchStart"));h(this,N,l(e=>{if(t(this,B)||e.buttons!=1||e.altKey||e.ctrlKey||e.shiftKey)return;e.preventDefault();var i=t(this,d).thumb.getBoundingClientRect();const o=t(this,T).querySelector(".ng-container-body");if(!o)return;const n=o.clientHeight,s=e.clientY>i.y?n:-n;o.scrollTop+=s,clearInterval(t(this,k)),clearInterval(t(this,C)),f(this,k,setInterval(()=>{clearInterval(t(this,k)),f(this,C,setInterval(()=>{var a=t(this,d).thumb.getBoundingClientRect();e.clientY>a.y&&e.clientY<a.y+a.height?clearInterval(t(this,C)):o.scrollTop+=e.clientY>a.y?n:-n},10))},500))},"#track_onMouseDown"));h(this,nt,l(e=>{e.clientX=e.targetTouches[0].clientX,e.clientY=e.targetTouches[0].clientY,e.buttons=1,t(this,W).call(this,e),document.addEventListener("touchmove",t(this,_))},"#thumb_onTouchStart"));h(this,_,l(e=>{e.clientX=e.targetTouches[0].clientX,e.clientY=e.targetTouches[0].clientY,e.buttons=1,t(this,z).call(this,e)},"#thumb_onTouchMove"));h(this,W,l(e=>{f(this,tt,e.clientY),f(this,B,!0),this.shiftY=e.offsetY+t(this,d).track.getBoundingClientRect().y,this.trackHeight=$(t(this,d).track).height(),this.thumbHeight=$(t(this,d).thumb).height(),f(this,V,!0),document.addEventListener("mousemove",t(this,z))},"#thumb_onMouseDown"));h(this,z,l(e=>{if(!t(this,B))return;e.preventDefault();const i=this.trackHeight,o=t(this,j).call(this);var n=e.clientY-this.shiftY;n<0&&(n=0),n+o>i&&(n=parseInt(i-o)),t(this,d).thumb.style.top=n+"px";const s=t(this,T).querySelector(".ng-container-body");if(!s)return;const a=s.scrollHeight-s.clientHeight,v=i-o;v>0&&a>0&&(s.scrollTop=n/v*a)},"#thumb_onMouseMove"));h(this,j,l(()=>parseInt(t(this,d).thumb.dataset.height||30,10),"#getThumbHeight"))}connectedCallback(){f(this,T,this.getRootNode().host),t(this,T)&&(this.shadowRoot.innerHTML=`
1
+ (function(m,f){typeof exports=="object"&&typeof module<"u"?f(require("@ninebone/util")):typeof define=="function"&&define.amd?define(["@ninebone/util"],f):(m=typeof globalThis<"u"?globalThis:m||self,f(m.NineboneUtil))})(this,function(m){"use strict";var yt=Object.defineProperty;var vt=m=>{throw TypeError(m)};var wt=(m,f,x)=>f in m?yt(m,f,{enumerable:!0,configurable:!0,writable:!0,value:x}):m[f]=x;var a=(m,f)=>yt(m,"name",{value:f,configurable:!0});var H=(m,f,x)=>wt(m,typeof f!="symbol"?f+"":f,x),xt=(m,f,x)=>f.has(m)||vt("Cannot "+x);var t=(m,f,x)=>(xt(m,f,"read from private field"),x?x.call(m):f.get(m)),b=(m,f,x)=>f.has(m)?vt("Cannot add the same private member more than once"):f instanceof WeakSet?f.add(m):f.set(m,x),v=(m,f,x,z)=>(xt(m,f,"write to private field"),z?z.call(m,x):f.set(m,x),x);var k,M,d,q,T,G,J,Q,V,N,tt,j,D,X,O,R,K,h,B,Y,W,et,F,A,nt,ot,E,Z,it,_,st,U;const dt=class dt extends m.trace.constructor{constructor(){super(),this.init("nine-table","green")}};a(dt,"Trace");let f=dt;const x=new f,ut=class ut extends HTMLElement{constructor(){super();b(this,k);b(this,M);b(this,d);b(this,q);b(this,T);b(this,G);b(this,J,0);H(this,"refresh",a(()=>{if(!t(this,k))return;const e=t(this,k).querySelector(".ng-container-body");if(!e)return;const i=$(t(this,d).thumb,this.shadowRoot),o=e.querySelector("table > thead");t(this,k).getRowCount;const n=$(t(this,d).track).height(),c=$(t(this,d).thumb).height(),s=t(this,k).getRowCount?t(this,k).getRowCount():0;if(s<=10){$(this).hide();return}else $(this).show();const y=o?o.getBoundingClientRect().height:0,l=Math.max(Math.min(n*(e.clientHeight-y)/(32*s),n),16);i[0].dataset.height=l,i.css({height:l});const p=n-t(this,O).call(this);if(p<=0)return;let r=0;const u=e.scrollHeight-e.clientHeight;u>0&&(r=parseInt(e.scrollTop/u*p,10),r>n-c&&(r=n-c),r<0&&(r=0)),t(this,d).thumb.style.top=r+"px",t(this,d).top.disabled=e.scrollTop<=0,t(this,d).bottom.disabled=e.scrollTop>=u},"refresh"));H(this,"delayScroll",a((e,i,o,n)=>{clearInterval(t(this,q)),clearInterval(t(this,T));const c=t(this,k).querySelector(".ng-container-body");c&&(c.scrollTop+=e*32),v(this,q,setInterval(()=>{clearInterval(t(this,q)),v(this,T,setInterval(()=>{c&&(c.scrollTop+=e*32,n&&n.call())},o))},i))},"delayScroll"));H(this,"stopScroll",a(()=>{clearInterval(t(this,q)),clearInterval(t(this,T))},"stopScroll"));b(this,Q,a(()=>{const e=a(o=>{clearInterval(t(this,q)),clearInterval(t(this,T));const n=t(this,k).querySelector(".ng-container-body");n&&(n.scrollTop+=o*32),v(this,q,setInterval(()=>{clearInterval(t(this,q)),v(this,T,setInterval(()=>{n&&(n.scrollTop+=o*32)},10))},500))},"delayScrollAction");$(t(this,d).top).on("mousedown",o=>{o.buttons!=1||o.altKey||o.ctrlKey||o.shiftKey||e(-1)}),$(t(this,d).bottom).on("mousedown",o=>{o.buttons!=1||o.altKey||o.ctrlKey||o.shiftKey||e(1)}),$(t(this,d).top).on("touchstart",o=>{e(-1)}),$(t(this,d).bottom).on("touchstart",o=>{e(1)});const i=a(()=>{clearInterval(t(this,q)),clearInterval(t(this,T))},"clearTimer");t(this,d).top.ontouchend=t(this,d).bottom.ontouchend=t(this,d).track.ontouchend=t(this,d).top.onmouseup=t(this,d).top.onmouseleave=t(this,d).bottom.onmouseup=t(this,d).bottom.onmouseleave=t(this,d).track.onmouseup=t(this,d).track.onmouseleave=i,$(t(this,d).track).on("mousedown",t(this,N)),$(t(this,d).track).on("touchstart",t(this,V)),$(t(this,d).thumb).on("mousedown",t(this,D)),$(t(this,d).thumb).on("touchstart",t(this,tt)),document.addEventListener("mouseup",o=>{t(this,M)&&v(this,M,!1),document.removeEventListener("mousemove",t(this,X))}),document.addEventListener("touchend",o=>{v(this,M,!1),document.removeEventListener("touchmove",t(this,j))})},"#init"));b(this,V,a(e=>{e.target.getBoundingClientRect(),e.clientX=e.targetTouches[0].clientX,e.clientY=e.targetTouches[0].clientY,e.buttons=1,t(this,N).call(this,e)},"#track_onTouchStart"));b(this,N,a(e=>{if(t(this,M)||e.buttons!=1||e.altKey||e.ctrlKey||e.shiftKey)return;e.preventDefault();var i=t(this,d).thumb.getBoundingClientRect();const o=t(this,k).querySelector(".ng-container-body");if(!o)return;const n=o.clientHeight,c=e.clientY>i.y?n:-n;o.scrollTop+=c,clearInterval(t(this,q)),clearInterval(t(this,T)),v(this,q,setInterval(()=>{clearInterval(t(this,q)),v(this,T,setInterval(()=>{var s=t(this,d).thumb.getBoundingClientRect();e.clientY>s.y&&e.clientY<s.y+s.height?clearInterval(t(this,T)):o.scrollTop+=e.clientY>s.y?n:-n},10))},500))},"#track_onMouseDown"));b(this,tt,a(e=>{e.clientX=e.targetTouches[0].clientX,e.clientY=e.targetTouches[0].clientY,e.buttons=1,t(this,D).call(this,e),document.addEventListener("touchmove",t(this,j))},"#thumb_onTouchStart"));b(this,j,a(e=>{e.clientX=e.targetTouches[0].clientX,e.clientY=e.targetTouches[0].clientY,e.buttons=1,t(this,X).call(this,e)},"#thumb_onTouchMove"));b(this,D,a(e=>{v(this,J,e.clientY),v(this,M,!0),this.shiftY=e.offsetY+t(this,d).track.getBoundingClientRect().y,this.trackHeight=$(t(this,d).track).height(),this.thumbHeight=$(t(this,d).thumb).height(),v(this,G,!0),document.addEventListener("mousemove",t(this,X))},"#thumb_onMouseDown"));b(this,X,a(e=>{if(!t(this,M))return;e.preventDefault();const i=this.trackHeight,o=t(this,O).call(this);var n=e.clientY-this.shiftY;n<0&&(n=0),n+o>i&&(n=parseInt(i-o)),t(this,d).thumb.style.top=n+"px";const c=t(this,k).querySelector(".ng-container-body");if(!c)return;const s=c.scrollHeight-c.clientHeight,y=i-o;y>0&&s>0&&(c.scrollTop=n/y*s)},"#thumb_onMouseMove"));b(this,O,a(()=>parseInt(t(this,d).thumb.dataset.height||30,10),"#getThumbHeight"))}connectedCallback(){v(this,k,this.getRootNode().host),t(this,k)&&(this.shadowRoot.innerHTML=`
2
2
  <button class='ng-scroll-top' disabled><div class='ng-scroll-icon'></div></button>
3
3
  <div class='ng-scroll-track'> <div class='ng-scroll-thumb'></div> </div>
4
4
  <button class='ng-scroll-bottom'><div class='ng-scroll-icon'></div></button>
5
- `,super.connectedCallback(),f(this,d,{track:this.shadowRoot.querySelector(".ng-scroll-track"),thumb:this.shadowRoot.querySelector(".ng-scroll-thumb"),top:this.shadowRoot.querySelector(".ng-scroll-top"),bottom:this.shadowRoot.querySelector(".ng-scroll-bottom")}),t(this,et).call(this))}};T=new WeakMap,B=new WeakMap,d=new WeakMap,k=new WeakMap,C=new WeakMap,V=new WeakMap,tt=new WeakMap,et=new WeakMap,ot=new WeakMap,N=new WeakMap,nt=new WeakMap,_=new WeakMap,W=new WeakMap,z=new WeakMap,j=new WeakMap,l(vt,"NineTableVScrollBar");let X=vt;customElements.get("nine-table-vscrollbar")||customElements.define("nine-table-vscrollbar",X);const xt=class xt extends HTMLElement{constructor(){super();h(this,q);h(this,K);h(this,b);h(this,I);h(this,E);h(this,st);h(this,it,0);R(this,"refresh",l(()=>{if(!t(this,q))return;const e=t(this,q).querySelector(".ng-container-body");if(!e)return;const i=$(t(this,b).thumb,this.shadowRoot),o=e.querySelector("table > thead");t(this,q).getRowCount;const n=$(t(this,b).track).height(),s=$(t(this,b).thumb).height(),a=t(this,q).getRowCount?t(this,q).getRowCount():0;if(a<=10){$(this).hide();return}else $(this).show();const v=o?o.getBoundingClientRect().height:0,c=Math.max(Math.min(n*(e.clientHeight-v)/(32*a),n),16);i[0].dataset.height=c,i.css({height:c});const y=n-t(this,Z).call(this);if(y<=0)return;let r=0;const u=e.scrollHeight-e.clientHeight;u>0&&(r=parseInt(e.scrollTop/u*y,10),r>n-s&&(r=n-s),r<0&&(r=0)),t(this,b).thumb.style.top=r+"px",t(this,b).top.disabled=e.scrollTop<=0,t(this,b).bottom.disabled=e.scrollTop>=u},"refresh"));R(this,"delayScroll",l((e,i,o,n)=>{clearInterval(t(this,I)),clearInterval(t(this,E));const s=t(this,q).querySelector(".ng-container-body");s&&(s.scrollTop+=e*32),f(this,I,setInterval(()=>{clearInterval(t(this,I)),f(this,E,setInterval(()=>{s&&(s.scrollTop+=e*32,n&&n.call())},o))},i))},"delayScroll"));R(this,"stopScroll",l(()=>{clearInterval(t(this,I)),clearInterval(t(this,E))},"stopScroll"));h(this,lt,l(()=>{const e=l(o=>{clearInterval(t(this,I)),clearInterval(t(this,E));const n=t(this,q).querySelector(".ng-container-body");n&&(n.scrollTop+=o*32),f(this,I,setInterval(()=>{clearInterval(t(this,I)),f(this,E,setInterval(()=>{n&&(n.scrollTop+=o*32)},10))},500))},"delayScrollAction");$(t(this,b).top).on("mousedown",o=>{o.buttons!=1||o.altKey||o.ctrlKey||o.shiftKey||e(-1)}),$(t(this,b).bottom).on("mousedown",o=>{o.buttons!=1||o.altKey||o.ctrlKey||o.shiftKey||e(1)}),$(t(this,b).top).on("touchstart",o=>{e(-1)}),$(t(this,b).bottom).on("touchstart",o=>{e(1)});const i=l(()=>{clearInterval(t(this,I)),clearInterval(t(this,E))},"clearTimer");t(this,b).top.ontouchend=t(this,b).bottom.ontouchend=t(this,b).track.ontouchend=t(this,b).top.onmouseup=t(this,b).top.onmouseleave=t(this,b).bottom.onmouseup=t(this,b).bottom.onmouseleave=t(this,b).track.onmouseup=t(this,b).track.onmouseleave=i,$(t(this,b).track).on("mousedown",t(this,O)),$(t(this,b).track).on("touchstart",t(this,rt)),$(t(this,b).thumb).on("mousedown",t(this,P)),$(t(this,b).thumb).on("touchstart",t(this,ct)),document.addEventListener("mouseup",o=>{t(this,K)&&f(this,K,!1),document.removeEventListener("mousemove",t(this,D))}),document.addEventListener("touchend",o=>{f(this,K,!1),document.removeEventListener("touchmove",t(this,F))})},"#init"));h(this,rt,l(e=>{e.target.getBoundingClientRect(),e.clientX=e.targetTouches[0].clientX,e.clientY=e.targetTouches[0].clientY,e.buttons=1,t(this,O).call(this,e)},"#track_onTouchStart"));h(this,O,l(e=>{if(t(this,K)||e.buttons!=1||e.altKey||e.ctrlKey||e.shiftKey)return;e.preventDefault();var i=t(this,b).thumb.getBoundingClientRect();const o=t(this,q).querySelector(".ng-container-body");if(!o)return;const n=o.clientHeight,s=e.clientY>i.y?n:-n;o.scrollTop+=s,clearInterval(t(this,I)),clearInterval(t(this,E)),f(this,I,setInterval(()=>{clearInterval(t(this,I)),f(this,E,setInterval(()=>{var a=t(this,b).thumb.getBoundingClientRect();e.clientY>a.y&&e.clientY<a.y+a.height?clearInterval(t(this,E)):o.scrollTop+=e.clientY>a.y?n:-n},10))},500))},"#track_onMouseDown"));h(this,ct,l(e=>{e.clientX=e.targetTouches[0].clientX,e.clientY=e.targetTouches[0].clientY,e.buttons=1,t(this,P).call(this,e),document.addEventListener("touchmove",t(this,F))},"#thumb_onTouchStart"));h(this,F,l(e=>{e.clientX=e.targetTouches[0].clientX,e.clientY=e.targetTouches[0].clientY,e.buttons=1,t(this,D).call(this,e)},"#thumb_onTouchMove"));h(this,P,l(e=>{f(this,it,e.clientY),f(this,K,!0),this.shiftY=e.offsetY+t(this,b).track.getBoundingClientRect().y,this.trackHeight=$(t(this,b).track).height(),this.thumbHeight=$(t(this,b).thumb).height(),f(this,st,!0),document.addEventListener("mousemove",t(this,D))},"#thumb_onMouseDown"));h(this,D,l(e=>{if(!t(this,K))return;e.preventDefault();const i=this.trackHeight,o=t(this,Z).call(this);var n=e.clientY-this.shiftY;n<0&&(n=0),n+o>i&&(n=parseInt(i-o)),t(this,b).thumb.style.top=n+"px";const s=t(this,q).querySelector(".ng-container-body");if(!s)return;const a=s.scrollHeight-s.clientHeight,v=i-o;v>0&&a>0&&(s.scrollTop=n/v*a)},"#thumb_onMouseMove"));h(this,Z,l(()=>parseInt(t(this,b).thumb.dataset.height||30,10),"#getThumbHeight"))}connectedCallback(){f(this,q,this.getRootNode().host),t(this,q)&&(this.shadowRoot.innerHTML=`
6
- <button class='ng-scroll-top' disabled><div class='ng-scroll-icon'></div></button>
7
- <div class='ng-scroll-track'> <div class='ng-scroll-thumb'></div> </div>
8
- <button class='ng-scroll-bottom'><div class='ng-scroll-icon'></div></button>
9
- `,super.connectedCallback(),f(this,b,{track:this.shadowRoot.querySelector(".ng-scroll-track"),thumb:this.shadowRoot.querySelector(".ng-scroll-thumb"),top:this.shadowRoot.querySelector(".ng-scroll-top"),bottom:this.shadowRoot.querySelector(".ng-scroll-bottom")}),t(this,lt).call(this))}};q=new WeakMap,K=new WeakMap,b=new WeakMap,I=new WeakMap,E=new WeakMap,st=new WeakMap,it=new WeakMap,lt=new WeakMap,rt=new WeakMap,O=new WeakMap,ct=new WeakMap,F=new WeakMap,P=new WeakMap,D=new WeakMap,Z=new WeakMap,l(xt,"NineTableHScrollBar");let bt=xt;customElements.get("nine-table-hscrollbar")||customElements.define("nine-table-hscrollbar",bt);const U=class U extends HTMLElement{constructor(){super();h(this,A,null);R(this,"init",l(e=>{if(!e)return;const i=l(c=>{const y=l(u=>{if(u.querySelector("colgroup"))return;const m=u.querySelector("tbody tr")||u.querySelector("tr"),H=m?m.querySelectorAll("th, td").length:1,S=document.createElement("colgroup"),M=Math.max(Math.floor((u.clientWidth||600)/H),100);for(let L=0;L<H;L++){const kt=document.createElement("col");kt.setAttribute("width",M),S.appendChild(kt)}u.prepend(S)},"ensureColgroup"),r=l(u=>{if(u.querySelector("thead"))return;const m=document.createElement("thead"),H=u.querySelector("colgroup");H?H.after(m):u.prepend(m)},"ensureThead");return y(c),r(c),c.classList.add("nine-table-element"),c},"initializeTable"),o=e.cloneNode(!0);f(this,A,i(o)),t(this,A).style.display="table";const n=this.querySelector(".ng-container-left"),s=this.querySelector(".ng-container-body"),a=this.querySelector(".ng-container-right"),v=l((c,y,r=!1)=>{const u=c.cloneNode(!0),m=Array.from(u.querySelectorAll("colgroup col")),H=[];return m.forEach((S,M)=>{const L=S.getAttribute("fixed");(r?!L||L==="":L===y)||H.push(M)}),H.reverse().forEach(S=>{m[S]&&m[S].remove(),u.querySelectorAll("tr").forEach(M=>{const L=M.querySelectorAll("th, td");L[S]&&L[S].remove()})}),u},"filterTableByFixed");if(s){const c=v(t(this,A),null,!0);s.innerHTML="",s.appendChild(c)}if(n){const c=v(t(this,A),"left",!1);let y=0;c.querySelectorAll("col").forEach(u=>{const m=parseInt(u.getAttribute("width"),10);isNaN(m)||(y+=m)}),n.innerHTML="",n.appendChild(c);const r=y>0?y:0;n.style.flex=`0 0 ${r}px`,n.style.width=`${r}px`}if(a){const c=v(t(this,A),"right",!1);let y=0;c.querySelectorAll("col").forEach(u=>{const m=parseInt(u.getAttribute("width"),10);isNaN(m)||(y+=m)}),a.innerHTML="",a.appendChild(c);const r=y>0?y:0;a.style.flex=`0 0 ${r}px`,a.style.width=`${r}px`}if(s){const c=this.getRowCount();s.style.overflowY=c>10?"auto":"hidden",s.addEventListener("scroll",()=>{const y=s.scrollLeft,r=this.querySelector("nine-table-hscrollbar");r&&typeof r.syncThumb=="function"&&r.syncThumb(y)})}x.log(`NineTableSheet 3-split initialized with rows: ${this.getRowCount()}`)},"init"));R(this,"getRowCount",l(()=>t(this,A)?t(this,A).querySelectorAll("tbody tr").length:0,"getRowCount"));R(this,"scrollToX",l(e=>{const i=this.querySelector(".ng-container-body");i&&(i.scrollLeft=e)},"scrollToX"));R(this,"scrollToY",l(e=>{const i=this.querySelector(".ng-container-body");i&&(i.scrollTop=e)},"scrollToY"));h(this,ht,l(()=>{const e=U.SCROLLBAR_SIZE;this.innerHTML=`
5
+ `,super.connectedCallback(),v(this,d,{track:this.shadowRoot.querySelector(".ng-scroll-track"),thumb:this.shadowRoot.querySelector(".ng-scroll-thumb"),top:this.shadowRoot.querySelector(".ng-scroll-top"),bottom:this.shadowRoot.querySelector(".ng-scroll-bottom")}),t(this,Q).call(this))}};k=new WeakMap,M=new WeakMap,d=new WeakMap,q=new WeakMap,T=new WeakMap,G=new WeakMap,J=new WeakMap,Q=new WeakMap,V=new WeakMap,N=new WeakMap,tt=new WeakMap,j=new WeakMap,D=new WeakMap,X=new WeakMap,O=new WeakMap,a(ut,"NineTableVScrollBar");let z=ut;customElements.get("nine-table-vscrollbar")||customElements.define("nine-table-vscrollbar",z);const bt=class bt extends HTMLElement{constructor(){super();b(this,R);b(this,K);b(this,h);b(this,B);b(this,Y);H(this,"refresh",a(()=>{if(!t(this,R))return;const e=t(this,R).querySelector(".ng-container-body");if(!e)return;const i=e.querySelector("table");if(!i)return;const o=$(t(this,h).track,this),n=$(t(this,h).thumb,this),c=t(this,R).querySelector(".ng-container-bottom");if(e.clientWidth!==0&&i.scrollWidth>e.clientWidth)$(c).show();else{$(c).hide();return}const s=o.width();if(s<=0)return;const y=Math.max(Math.min(s*(e.clientWidth/i.scrollWidth),s),20);n.width(y);const l=i.scrollWidth-e.clientWidth,p=s-y;let r=0;l>0&&(r=parseInt(e.scrollLeft/l*p,10)),r<0&&(r=0),r>p&&(r=p),n.css({left:r}),t(this,h).left.disabled=e.scrollLeft<=0,t(this,h).right.disabled=e.scrollLeft>=l},"refresh"));b(this,W,a(e=>{if(!t(this,h))return;const i=t(this,R).querySelector(".ng-container-body"),o=i.querySelector("table");if(!o)return;const n=t(this,h).track.getBoundingClientRect(),c=t(this,h).thumb.getBoundingClientRect();let s=e;s<0&&(s=0),s+c.width>n.width&&(s=n.width-c.width),s=parseInt(s,10),t(this,h).thumb.style.left=s+"px";const y=o.scrollWidth-i.clientWidth,l=n.width-c.width;return l>0&&y>0&&(i.scrollLeft=s/l*y),t(this,h).left.disabled=s<=0,t(this,h).right.disabled=s>=l,s>0&&s<l},"#thumbMoveTo"));b(this,et,a(()=>{const e=t(this,R).querySelector(".ng-container-body");e&&e.addEventListener("scroll",()=>{this.refresh()});const i=a(n=>{clearInterval(t(this,B)),clearInterval(t(this,Y));const c=t(this,h).track.getBoundingClientRect(),s=t(this,h).thumb.getBoundingClientRect();t(this,W).call(this,s.x-c.x+n),v(this,B,setInterval(()=>{clearInterval(t(this,B)),v(this,Y,setInterval(()=>{const y=t(this,h).track.getBoundingClientRect(),l=t(this,h).thumb.getBoundingClientRect();t(this,W).call(this,l.x-y.x+n)||clearInterval(t(this,Y))},10))},500))},"delayScroll"),o=a(()=>{clearInterval(t(this,B)),clearInterval(t(this,Y))},"clearTimer");t(this,h).left.ontouchend=t(this,h).right.ontouchend=t(this,h).track.ontouchend=t(this,h).left.onmouseup=t(this,h).left.onmouseleave=t(this,h).right.onmouseup=t(this,h).right.onmouseleave=t(this,h).track.onmouseup=t(this,h).track.onmouseleave=o,$(t(this,h).left).on("mousedown",n=>{n.buttons==1&&i(-10)}),$(t(this,h).right).on("mousedown",n=>{n.buttons==1&&i(10)}),$(t(this,h).left).on("touchstart",n=>{i(-10)}),$(t(this,h).right).on("touchstart",n=>{i(10)}),$(t(this,h).track).on("mousedown",n=>{if(n.buttons!=1)return;n.preventDefault();const c=t(this,h).track.getBoundingClientRect(),s=t(this,h).thumb.getBoundingClientRect().width;t(this,W).call(this,n.clientX-c.left-s/2)}),$(t(this,h).thumb).on("mousedown",n=>{v(this,K,!0),this.shiftX=n.clientX-t(this,h).thumb.getBoundingClientRect().left,document.addEventListener("mousemove",t(this,F))}),document.addEventListener("mouseup",()=>{v(this,K,!1),o(),document.removeEventListener("mousemove",t(this,F))})},"#init"));b(this,F,a(e=>{if(!t(this,K))return;const i=t(this,h).track.getBoundingClientRect();t(this,W).call(this,e.clientX-i.left-this.shiftX)},"#thumb_onMouseMove"))}connectedCallback(){v(this,R,this.getRootNode().host),t(this,R)&&(this.innerHTML=`
6
+ <style>
7
+ nine-table-hscrollbar {
8
+ display: flex;
9
+ flex-direction: row;
10
+ width: 100%;
11
+ height: 100%;
12
+ background: #f9fafb;
13
+ box-sizing: border-box;
14
+ user-select: none;
15
+ }
16
+ nine-table-hscrollbar button {
17
+ width: 16px;
18
+ height: 100%;
19
+ background: #f3f4f6;
20
+ border: none;
21
+ cursor: pointer;
22
+ display: flex;
23
+ align-items: center;
24
+ justify-content: center;
25
+ padding: 0;
26
+ }
27
+ nine-table-hscrollbar button:disabled {
28
+ opacity: 0.4;
29
+ cursor: default;
30
+ }
31
+ nine-table-hscrollbar .ng-scroll-icon {
32
+ width: 6px;
33
+ height: 6px;
34
+ border-top: 2px solid #6b7280;
35
+ border-right: 2px solid #6b7280;
36
+ }
37
+ nine-table-hscrollbar .ng-scroll-left .ng-scroll-icon { transform: rotate(-135deg); }
38
+ nine-table-hscrollbar .ng-scroll-right .ng-scroll-icon { transform: rotate(45deg); }
39
+ nine-table-hscrollbar .ng-scroll-track {
40
+ flex: 1;
41
+ height: 100%;
42
+ position: relative;
43
+ background: #f3f4f6;
44
+ overflow: hidden;
45
+ }
46
+ nine-table-hscrollbar .ng-scroll-thumb {
47
+ position: absolute;
48
+ top: 2px;
49
+ bottom: 2px;
50
+ background: #d1d5db;
51
+ border-radius: 4px;
52
+ cursor: pointer;
53
+ }
54
+ nine-table-hscrollbar .ng-scroll-thumb:hover {
55
+ background: #9ca3af;
56
+ }
57
+ </style>
58
+ <button class='ng-scroll-left' disabled><div class='ng-scroll-icon'></div></button>
59
+ <div class='ng-scroll-track'><div class='ng-scroll-thumb'></div></div>
60
+ <button class='ng-scroll-right'><div class='ng-scroll-icon'></div></button>
61
+ `,v(this,h,{container:t(this,R).querySelector(".ng-container-body"),track:this.querySelector(".ng-scroll-track"),thumb:this.querySelector(".ng-scroll-thumb"),left:this.querySelector(".ng-scroll-left"),right:this.querySelector(".ng-scroll-right")}),t(this,et).call(this),setTimeout(()=>this.refresh(),0))}};R=new WeakMap,K=new WeakMap,h=new WeakMap,B=new WeakMap,Y=new WeakMap,W=new WeakMap,et=new WeakMap,F=new WeakMap,a(bt,"NineTableHScrollBar");let lt=bt;customElements.get("nine-table-hscrollbar")||customElements.define("nine-table-hscrollbar",lt);const P=class P extends HTMLElement{constructor(){super();b(this,A,null);H(this,"init",a(e=>{if(!e)return;const i=a(l=>{const p=a(u=>{if(u.querySelector("colgroup"))return;const g=u.querySelector("tbody tr")||u.querySelector("tr"),C=g?g.querySelectorAll("th, td").length:1,S=document.createElement("colgroup"),I=Math.max(Math.floor((u.clientWidth||600)/C),100);for(let L=0;L<C;L++){const pt=document.createElement("col");pt.setAttribute("width",I),S.appendChild(pt)}u.prepend(S)},"ensureColgroup"),r=a(u=>{if(u.querySelector("thead"))return;const g=document.createElement("thead"),C=u.querySelector("colgroup");C?C.after(g):u.prepend(g)},"ensureThead");return p(l),r(l),l.classList.add("nine-table-element"),l},"initializeTable"),o=e.cloneNode(!0);v(this,A,i(o)),t(this,A).style.display="table";const n=this.querySelector(".ng-container-left"),c=this.querySelector(".ng-container-body"),s=this.querySelector(".ng-container-right"),y=a((l,p,r=!1)=>{const u=l.cloneNode(!0),g=Array.from(u.querySelectorAll("colgroup col")),C=[];return g.forEach((S,I)=>{const L=S.getAttribute("fixed");(r?!L||L==="":L===p)||C.push(I)}),C.reverse().forEach(S=>{g[S]&&g[S].remove(),u.querySelectorAll("tr").forEach(I=>{const L=I.querySelectorAll("th, td");L[S]&&L[S].remove()})}),u},"filterTableByFixed");if(c){const l=y(t(this,A),null,!0);c.innerHTML="",c.appendChild(l)}if(n){const l=y(t(this,A),"left",!1);let p=0;l.querySelectorAll("col").forEach(u=>{const g=parseInt(u.getAttribute("width"),10);isNaN(g)||(p+=g)}),n.innerHTML="",n.appendChild(l);const r=p>0?p:0;n.style.flex=`0 0 ${r}px`,n.style.width=`${r}px`}if(s){const l=y(t(this,A),"right",!1);let p=0;l.querySelectorAll("col").forEach(u=>{const g=parseInt(u.getAttribute("width"),10);isNaN(g)||(p+=g)}),s.innerHTML="",s.appendChild(l);const r=p>0?p:0;s.style.flex=`0 0 ${r}px`,s.style.width=`${r}px`}if(c){const l=this.getRowCount();c.style.overflowY=l>10?"auto":"hidden",c.addEventListener("scroll",()=>{const p=c.scrollLeft,r=this.querySelector("nine-table-hscrollbar");r&&typeof r.syncThumb=="function"&&r.syncThumb(p)})}x.log(`NineTableSheet 3-split initialized with rows: ${this.getRowCount()}`)},"init"));H(this,"getRowCount",a(()=>t(this,A)?t(this,A).querySelectorAll("tbody tr").length:0,"getRowCount"));H(this,"scrollToX",a(e=>{const i=this.querySelector(".ng-container-body");i&&(i.scrollLeft=e)},"scrollToX"));H(this,"scrollToY",a(e=>{const i=this.querySelector(".ng-container-body");i&&(i.scrollTop=e)},"scrollToY"));b(this,nt,a(()=>{const e=P.SCROLLBAR_SIZE;this.innerHTML=`
10
62
  <style>
11
63
  nine-table-sheet {
12
64
  display: flex;
@@ -116,7 +168,7 @@
116
168
  <nine-table-hscrollbar></nine-table-hscrollbar>
117
169
  <div class='ng-scroll-edge'></div>
118
170
  </div>
119
- `},"#render"))}connectedCallback(){t(this,ht).call(this)}disconnectedCallback(){this.innerHTML="",x.log("NineTableSheet destroyed.")}};A=new WeakMap,ht=new WeakMap,l(U,"NineTableSheet"),R(U,"SCROLLBAR_SIZE",16);let ft=U;customElements.get("nine-table-sheet")||customElements.define("nine-table-sheet",ft);const wt=class wt extends HTMLElement{constructor(){super();h(this,at,l(()=>{const e=this.querySelector(".nine-tab-bar");e&&(e.addEventListener("click",i=>{const o=i.target.closest(".nine-tab-item");if(!o)return;const n=i.ctrlKey||i.metaKey||i.shiftKey,s=parseInt(o.dataset.index,10);this.switchSheet(s,n)}),this.switchSheet(0,!1))},"#init"));R(this,"switchSheet",l((e,i=!1)=>{const o=l(()=>{const r=this.querySelector("nine-table-sheets-body");r.querySelectorAll("nine-splitter").forEach(m=>{const H=parseInt(m.dataset.splitIndex,10),S=r.querySelector(`nine-table-sheet[data-index="${H-1}"]`),M=r.querySelector(`nine-table-sheet[data-index="${H}"]`);S&&M&&S.classList.contains("active")&&M.classList.contains("active")?m.classList.add("active"):m.classList.remove("active")})},"updateSplitters"),n=this.querySelector(".nine-tab-bar"),s=this.querySelector("nine-table-sheets-body"),a=n.querySelectorAll(".nine-tab-item"),v=s.querySelectorAll("nine-table-sheet");if(!a[e])return;if(!i)a.forEach((r,u)=>{r.classList.toggle("active",u===e);const m=s.querySelector(`nine-table-sheet[data-index="${u}"]`);m&&(m.style.flex="")}),v.forEach((r,u)=>{r.classList.toggle("active",u===e)});else{const r=a[e],u=n.querySelectorAll(".nine-tab-item.active");if(r.classList.contains("active")&&u.length<=1)return;r.classList.toggle("active");const m=s.querySelector(`nine-table-sheet[data-index="${e}"]`);m&&(m.classList.toggle("active"),m.classList.contains("active")||(m.style.flex=""))}const c=Array.from(s.querySelectorAll("nine-table-sheet.active"));if(c.length>1){const r=1/c.length;c.forEach(u=>{(!u.style.flex||u.style.flex==="1 1 100%")&&(u.style.flex=`${r} ${r} 0px`)})}else c.forEach(r=>{r.style.flex="1 1 100%"});o();const y=s.querySelector("nine-table-sheet.active");if(y&&typeof y.getRowCount=="function"){const r=this.querySelector("#row-count");r&&(r.textContent=y.getRowCount().toLocaleString())}},"switchSheet"))}connectedCallback(){t(this,at).call(this)}};at=new WeakMap,l(wt,"NineTableSheets");let gt=wt;customElements.get("nine-table-sheets")||customElements.define("nine-table-sheets",gt);const St=class St{constructor(w){h(this,Y);h(this,G,null);h(this,ut,l(()=>{const w=t(this,Y).host;w&&(f(this,G,new ResizeObserver(e=>{for(let i of e)w.getAttribute("auto-height")==="true"&&t(this,J).call(this,w)})),t(this,G).observe(w))},"#observeResize"));h(this,J,l(w=>{var M,L;const e=(M=w.shadowRoot)==null?void 0:M.querySelector("nine-table-sheet.active");if(!e)return;const i=((L=e.getRowCount)==null?void 0:L.call(e))||0,o=parseInt(w.getAttribute("max-display-row"),10)||10,n=Math.min(i,o),s=e.querySelector("tbody tr")||e.querySelector("tr"),a=s?s.getBoundingClientRect().height:32,v=t(this,Y).querySelector("nine-table-header"),c=t(this,Y).querySelector("nine-table-sheets-footer"),y=v?v.getBoundingClientRect().height:40,r=c?c.getBoundingClientRect().height:32,m=y+r+16,H=n*a+m;w.style.height=`${H}px`,w.style.maxHeight=`${o*a+m}px`;const S=t(this,Y).querySelector("nine-table-sheets-body");S&&(S.style.overflowY=i>o?"auto":"hidden")},"#applyAutoHeight"));h(this,dt,l(()=>{const w=t(this,Y).host,i=Array.from(w.children).filter(v=>v.tagName==="TABLE"),o=w.getAttribute("auto-height")==="true",n=i.map((v,c)=>`<nine-table-sheet class="${c===0?"active":""}" data-index="${c}"></nine-table-sheet>`).join(""),s=i.map((v,c)=>`<div class="nine-tab-item ${c===0?"active":""}" data-index="${c}">Sheet ${c+1}</div>`).join("");t(this,Y).innerHTML=`
171
+ `},"#render"))}connectedCallback(){t(this,nt).call(this)}disconnectedCallback(){this.innerHTML="",x.log("NineTableSheet destroyed.")}};A=new WeakMap,nt=new WeakMap,a(P,"NineTableSheet"),H(P,"SCROLLBAR_SIZE",16);let rt=P;customElements.get("nine-table-sheet")||customElements.define("nine-table-sheet",rt);const ft=class ft extends HTMLElement{constructor(){super();b(this,ot,a(()=>{const e=this.querySelector(".nine-tab-bar");e&&(e.addEventListener("click",i=>{const o=i.target.closest(".nine-tab-item");if(!o)return;const n=i.ctrlKey||i.metaKey||i.shiftKey,c=parseInt(o.dataset.index,10);this.switchSheet(c,n)}),this.switchSheet(0,!1))},"#init"));H(this,"switchSheet",a((e,i=!1)=>{const o=a(()=>{const r=this.querySelector("nine-table-sheets-body");r.querySelectorAll("nine-splitter").forEach(g=>{const C=parseInt(g.dataset.splitIndex,10),S=r.querySelector(`nine-table-sheet[data-index="${C-1}"]`),I=r.querySelector(`nine-table-sheet[data-index="${C}"]`);S&&I&&S.classList.contains("active")&&I.classList.contains("active")?g.classList.add("active"):g.classList.remove("active")})},"updateSplitters"),n=this.querySelector(".nine-tab-bar"),c=this.querySelector("nine-table-sheets-body"),s=n.querySelectorAll(".nine-tab-item"),y=c.querySelectorAll("nine-table-sheet");if(!s[e])return;if(!i)s.forEach((r,u)=>{r.classList.toggle("active",u===e);const g=c.querySelector(`nine-table-sheet[data-index="${u}"]`);g&&(g.style.flex="")}),y.forEach((r,u)=>{r.classList.toggle("active",u===e)});else{const r=s[e],u=n.querySelectorAll(".nine-tab-item.active");if(r.classList.contains("active")&&u.length<=1)return;r.classList.toggle("active");const g=c.querySelector(`nine-table-sheet[data-index="${e}"]`);g&&(g.classList.toggle("active"),g.classList.contains("active")||(g.style.flex=""))}const l=Array.from(c.querySelectorAll("nine-table-sheet.active"));if(l.length>1){const r=1/l.length;l.forEach(u=>{(!u.style.flex||u.style.flex==="1 1 100%")&&(u.style.flex=`${r} ${r} 0px`)})}else l.forEach(r=>{r.style.flex="1 1 100%"});o();const p=c.querySelector("nine-table-sheet.active");if(p&&typeof p.getRowCount=="function"){const r=this.querySelector("#row-count");r&&(r.textContent=p.getRowCount().toLocaleString())}},"switchSheet"))}connectedCallback(){t(this,ot).call(this)}};ot=new WeakMap,a(ft,"NineTableSheets");let ct=ft;customElements.get("nine-table-sheets")||customElements.define("nine-table-sheets",ct);const gt=class gt{constructor(w){b(this,E);b(this,Z,null);b(this,it,a(()=>{const w=t(this,E).host;w&&(v(this,Z,new ResizeObserver(e=>{for(let i of e)w.getAttribute("auto-height")==="true"&&t(this,_).call(this,w)})),t(this,Z).observe(w))},"#observeResize"));b(this,_,a(w=>{var I,L;const e=(I=w.shadowRoot)==null?void 0:I.querySelector("nine-table-sheet.active");if(!e)return;const i=((L=e.getRowCount)==null?void 0:L.call(e))||0,o=parseInt(w.getAttribute("max-display-row"),10)||10,n=Math.min(i,o),c=e.querySelector("tbody tr")||e.querySelector("tr"),s=c?c.getBoundingClientRect().height:32,y=t(this,E).querySelector("nine-table-header"),l=t(this,E).querySelector("nine-table-sheets-footer"),p=y?y.getBoundingClientRect().height:40,r=l?l.getBoundingClientRect().height:32,g=p+r+16,C=n*s+g;w.style.height=`${C}px`,w.style.maxHeight=`${o*s+g}px`;const S=t(this,E).querySelector("nine-table-sheets-body");S&&(S.style.overflowY=i>o?"auto":"hidden")},"#applyAutoHeight"));b(this,st,a(()=>{const w=t(this,E).host,i=Array.from(w.children).filter(y=>y.tagName==="TABLE"),o=w.getAttribute("auto-height")==="true",n=i.map((y,l)=>`<nine-table-sheet class="${l===0?"active":""}" data-index="${l}"></nine-table-sheet>`).join(""),c=i.map((y,l)=>`<div class="nine-tab-item ${l===0?"active":""}" data-index="${l}">Sheet ${l+1}</div>`).join("");t(this,E).innerHTML=`
120
172
  <style>
121
173
  :host {
122
174
  display: flex;
@@ -206,12 +258,12 @@
206
258
  <nine-table-sheets>
207
259
  <nine-table-sheets-body>${n}</nine-table-sheets-body>
208
260
  <nine-table-sheets-footer>
209
- <div class="nine-tab-bar">${s}</div>
261
+ <div class="nine-tab-bar">${c}</div>
210
262
  <div class="sheets-counter">Total : <span id="row-count">0</span></div>
211
263
  </nine-table-sheets-footer>
212
264
  </nine-table-sheets>
213
265
  <nine-table-analysis></nine-table-analysis>
214
266
  </nine-table-body>
215
267
  <nine-table-footer></nine-table-footer>
216
- `;const a=t(this,Y).querySelectorAll("nine-table-sheet");a==null||a.forEach((v,c)=>{i[c]&&setTimeout(()=>{v.init(i[c]),o&&t(this,J).call(this,w)})})},"#render"));f(this,Y,w),t(this,dt).call(this),t(this,ut).call(this)}};Y=new WeakMap,G=new WeakMap,ut=new WeakMap,J=new WeakMap,dt=new WeakMap,l(St,"LayoutManager");let mt=St;const Tt=class Tt extends HTMLElement{constructor(){super();h(this,Q,!1);this.attachShadow({mode:"open"})}connectedCallback(){t(this,Q)||(this.layoutManager=new mt(this.shadowRoot),f(this,Q,!0),x.log("NineTable connected."),this.dispatchEvent(new CustomEvent("load",{bubbles:!0,detail:{target:this}})))}disconnectedCallback(){x.log("NineTable disconnected.")}};Q=new WeakMap,l(Tt,"NineTable");let pt=Tt;customElements.get("nine-table")||customElements.define("nine-table",pt)});
268
+ `;const s=t(this,E).querySelectorAll("nine-table-sheet");s==null||s.forEach((y,l)=>{i[l]&&setTimeout(()=>{y.init(i[l]),o&&t(this,_).call(this,w)})})},"#render"));v(this,E,w),t(this,st).call(this),t(this,it).call(this)}};E=new WeakMap,Z=new WeakMap,it=new WeakMap,_=new WeakMap,st=new WeakMap,a(gt,"LayoutManager");let at=gt;const mt=class mt extends HTMLElement{constructor(){super();b(this,U,!1);this.attachShadow({mode:"open"})}connectedCallback(){t(this,U)||(this.layoutManager=new at(this.shadowRoot),v(this,U,!0),x.log("NineTable connected."),this.dispatchEvent(new CustomEvent("load",{bubbles:!0,detail:{target:this}})))}disconnectedCallback(){x.log("NineTable disconnected.")}};U=new WeakMap,a(mt,"NineTable");let ht=mt;customElements.get("nine-table")||customElements.define("nine-table",ht)});
217
269
  //# sourceMappingURL=nine-table.umd.js.map