@ninebone/table 0.0.74 → 0.0.75

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}","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
+ {"version":3,"file":"nine-table.js","sources":["../src/external/NoPeer.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();","import { trace } from \"@nopeer\";\n//import './nine-table-vscrollbar.js';\n//import './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","_NineTableSheet","__privateAdd","_tableElement","__publicField","tableEl","initializeTable","tbl","ensureColgroup","firstRow","colCount","colgroup","defaultWidth","i","col","ensureThead","thead","clonedTable","__privateSet","__privateGet","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","_init","tabBar","e","tabItem","isMultiSelect","index","updateSplitters","body","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,64 +1,4 @@
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
- <button class='ng-scroll-top' disabled><div class='ng-scroll-icon'></div></button>
3
- <div class='ng-scroll-track'> <div class='ng-scroll-thumb'></div> </div>
4
- <button class='ng-scroll-bottom'><div class='ng-scroll-icon'></div></button>
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=`
1
+ (function(l,i){typeof exports=="object"&&typeof module<"u"?i(require("@ninebone/util")):typeof define=="function"&&define.amd?define(["@ninebone/util"],i):(l=typeof globalThis<"u"?globalThis:l||self,i(l.NineboneUtil))})(this,function(l){"use strict";var P=Object.defineProperty;var Z=l=>{throw TypeError(l)};var X=(l,i,h)=>i in l?P(l,i,{enumerable:!0,configurable:!0,writable:!0,value:h}):l[i]=h;var d=(l,i)=>P(l,"name",{value:i,configurable:!0});var k=(l,i,h)=>X(l,typeof i!="symbol"?i+"":i,h),U=(l,i,h)=>i.has(l)||Z("Cannot "+h);var a=(l,i,h)=>(U(l,i,"read from private field"),h?h.call(l):i.get(l)),E=(l,i,h)=>i.has(l)?Z("Cannot add the same private member more than once"):i instanceof WeakSet?i.add(l):i.set(l,h),R=(l,i,h,C)=>(U(l,i,"write to private field"),C?C.call(l,h):i.set(l,h),h);var q,H,M,w,L,z,$,I,T;const j=class j extends l.trace.constructor{constructor(){super(),this.init("nine-table","green")}};d(j,"Trace");let i=j;const h=new i,A=class A extends HTMLElement{constructor(){super();E(this,q,null);k(this,"init",d(n=>{if(!n)return;const r=d(e=>{const c=d(o=>{if(o.querySelector("colgroup"))return;const s=o.querySelector("tbody tr")||o.querySelector("tr"),m=s?s.querySelectorAll("th, td").length:1,p=document.createElement("colgroup"),S=Math.max(Math.floor((o.clientWidth||600)/m),100);for(let v=0;v<m;v++){const F=document.createElement("col");F.setAttribute("width",S),p.appendChild(F)}o.prepend(p)},"ensureColgroup"),t=d(o=>{if(o.querySelector("thead"))return;const s=document.createElement("thead"),m=o.querySelector("colgroup");m?m.after(s):o.prepend(s)},"ensureThead");return c(e),t(e),e.classList.add("nine-table-element"),e},"initializeTable"),g=n.cloneNode(!0);R(this,q,r(g)),a(this,q).style.display="table";const y=this.querySelector(".ng-container-left"),f=this.querySelector(".ng-container-body"),u=this.querySelector(".ng-container-right"),x=d((e,c,t=!1)=>{const o=e.cloneNode(!0),s=Array.from(o.querySelectorAll("colgroup col")),m=[];return s.forEach((p,S)=>{const v=p.getAttribute("fixed");(t?!v||v==="":v===c)||m.push(S)}),m.reverse().forEach(p=>{s[p]&&s[p].remove(),o.querySelectorAll("tr").forEach(S=>{const v=S.querySelectorAll("th, td");v[p]&&v[p].remove()})}),o},"filterTableByFixed");if(f){const e=x(a(this,q),null,!0);f.innerHTML="",f.appendChild(e)}if(y){const e=x(a(this,q),"left",!1);let c=0;e.querySelectorAll("col").forEach(o=>{const s=parseInt(o.getAttribute("width"),10);isNaN(s)||(c+=s)}),y.innerHTML="",y.appendChild(e);const t=c>0?c:0;y.style.flex=`0 0 ${t}px`,y.style.width=`${t}px`}if(u){const e=x(a(this,q),"right",!1);let c=0;e.querySelectorAll("col").forEach(o=>{const s=parseInt(o.getAttribute("width"),10);isNaN(s)||(c+=s)}),u.innerHTML="",u.appendChild(e);const t=c>0?c:0;u.style.flex=`0 0 ${t}px`,u.style.width=`${t}px`}if(f){const e=this.getRowCount();f.style.overflowY=e>10?"auto":"hidden",f.addEventListener("scroll",()=>{const c=f.scrollLeft,t=this.querySelector("nine-table-hscrollbar");t&&typeof t.syncThumb=="function"&&t.syncThumb(c)})}h.log(`NineTableSheet 3-split initialized with rows: ${this.getRowCount()}`)},"init"));k(this,"getRowCount",d(()=>a(this,q)?a(this,q).querySelectorAll("tbody tr").length:0,"getRowCount"));k(this,"scrollToX",d(n=>{const r=this.querySelector(".ng-container-body");r&&(r.scrollLeft=n)},"scrollToX"));k(this,"scrollToY",d(n=>{const r=this.querySelector(".ng-container-body");r&&(r.scrollTop=n)},"scrollToY"));E(this,H,d(()=>{const n=A.SCROLLBAR_SIZE;this.innerHTML=`
62
2
  <style>
63
3
  nine-table-sheet {
64
4
  display: flex;
@@ -76,7 +16,7 @@
76
16
  flex-direction: row;
77
17
  flex: 1 1 auto;
78
18
  width: 100%;
79
- height: calc(100% - ${e}px);
19
+ height: calc(100% - ${n}px);
80
20
  overflow: hidden;
81
21
  position: relative;
82
22
  }
@@ -112,8 +52,8 @@
112
52
  nine-table-sheet .ng-container-bottom {
113
53
  display: flex;
114
54
  flex-direction: row;
115
- height: ${e}px;
116
- min-height: ${e}px;
55
+ height: ${n}px;
56
+ min-height: ${n}px;
117
57
  flex-shrink: 0;
118
58
  background: #f9fafb;
119
59
  border-top: 1px solid #e5e7eb;
@@ -127,8 +67,8 @@
127
67
  }
128
68
 
129
69
  nine-table-sheet .ng-scroll-edge {
130
- width: ${e}px;
131
- min-width: ${e}px;
70
+ width: ${n}px;
71
+ min-width: ${n}px;
132
72
  height: 100%;
133
73
  flex-shrink: 0;
134
74
  background: #f3f4f6;
@@ -168,14 +108,14 @@
168
108
  <nine-table-hscrollbar></nine-table-hscrollbar>
169
109
  <div class='ng-scroll-edge'></div>
170
110
  </div>
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=`
111
+ `},"#render"))}connectedCallback(){a(this,H).call(this)}disconnectedCallback(){this.innerHTML="",h.log("NineTableSheet destroyed.")}};q=new WeakMap,H=new WeakMap,d(A,"NineTableSheet"),k(A,"SCROLLBAR_SIZE",16);let C=A;customElements.get("nine-table-sheet")||customElements.define("nine-table-sheet",C);const O=class O extends HTMLElement{constructor(){super();E(this,M,d(()=>{const n=this.querySelector(".nine-tab-bar");n&&(n.addEventListener("click",r=>{const g=r.target.closest(".nine-tab-item");if(!g)return;const y=r.ctrlKey||r.metaKey||r.shiftKey,f=parseInt(g.dataset.index,10);this.switchSheet(f,y)}),this.switchSheet(0,!1))},"#init"));k(this,"switchSheet",d((n,r=!1)=>{const g=d(()=>{const t=this.querySelector("nine-table-sheets-body");t.querySelectorAll("nine-splitter").forEach(s=>{const m=parseInt(s.dataset.splitIndex,10),p=t.querySelector(`nine-table-sheet[data-index="${m-1}"]`),S=t.querySelector(`nine-table-sheet[data-index="${m}"]`);p&&S&&p.classList.contains("active")&&S.classList.contains("active")?s.classList.add("active"):s.classList.remove("active")})},"updateSplitters"),y=this.querySelector(".nine-tab-bar"),f=this.querySelector("nine-table-sheets-body"),u=y.querySelectorAll(".nine-tab-item"),x=f.querySelectorAll("nine-table-sheet");if(!u[n])return;if(!r)u.forEach((t,o)=>{t.classList.toggle("active",o===n);const s=f.querySelector(`nine-table-sheet[data-index="${o}"]`);s&&(s.style.flex="")}),x.forEach((t,o)=>{t.classList.toggle("active",o===n)});else{const t=u[n],o=y.querySelectorAll(".nine-tab-item.active");if(t.classList.contains("active")&&o.length<=1)return;t.classList.toggle("active");const s=f.querySelector(`nine-table-sheet[data-index="${n}"]`);s&&(s.classList.toggle("active"),s.classList.contains("active")||(s.style.flex=""))}const e=Array.from(f.querySelectorAll("nine-table-sheet.active"));if(e.length>1){const t=1/e.length;e.forEach(o=>{(!o.style.flex||o.style.flex==="1 1 100%")&&(o.style.flex=`${t} ${t} 0px`)})}else e.forEach(t=>{t.style.flex="1 1 100%"});g();const c=f.querySelector("nine-table-sheet.active");if(c&&typeof c.getRowCount=="function"){const t=this.querySelector("#row-count");t&&(t.textContent=c.getRowCount().toLocaleString())}},"switchSheet"))}connectedCallback(){a(this,M).call(this)}};M=new WeakMap,d(O,"NineTableSheets");let B=O;customElements.get("nine-table-sheets")||customElements.define("nine-table-sheets",B);const K=class K{constructor(b){E(this,w);E(this,L,null);E(this,z,d(()=>{const b=a(this,w).host;b&&(R(this,L,new ResizeObserver(n=>{for(let r of n)b.getAttribute("auto-height")==="true"&&a(this,$).call(this,b)})),a(this,L).observe(b))},"#observeResize"));E(this,$,d(b=>{var S,v;const n=(S=b.shadowRoot)==null?void 0:S.querySelector("nine-table-sheet.active");if(!n)return;const r=((v=n.getRowCount)==null?void 0:v.call(n))||0,g=parseInt(b.getAttribute("max-display-row"),10)||10,y=Math.min(r,g),f=n.querySelector("tbody tr")||n.querySelector("tr"),u=f?f.getBoundingClientRect().height:32,x=a(this,w).querySelector("nine-table-header"),e=a(this,w).querySelector("nine-table-sheets-footer"),c=x?x.getBoundingClientRect().height:40,t=e?e.getBoundingClientRect().height:32,s=c+t+16,m=y*u+s;b.style.height=`${m}px`,b.style.maxHeight=`${g*u+s}px`;const p=a(this,w).querySelector("nine-table-sheets-body");p&&(p.style.overflowY=r>g?"auto":"hidden")},"#applyAutoHeight"));E(this,I,d(()=>{const b=a(this,w).host,r=Array.from(b.children).filter(x=>x.tagName==="TABLE"),g=b.getAttribute("auto-height")==="true",y=r.map((x,e)=>`<nine-table-sheet class="${e===0?"active":""}" data-index="${e}"></nine-table-sheet>`).join(""),f=r.map((x,e)=>`<div class="nine-tab-item ${e===0?"active":""}" data-index="${e}">Sheet ${e+1}</div>`).join("");a(this,w).innerHTML=`
172
112
  <style>
173
113
  :host {
174
114
  display: flex;
175
115
  flex-direction: column;
176
116
  position: relative;
177
117
  overflow: hidden;
178
- height: ${o?"auto":"100%"};
118
+ height: ${g?"auto":"100%"};
179
119
  background: #fff;
180
120
  }
181
121
  nine-table-header { height: 40px; display: block; flex-shrink: 0; border-bottom: 1px solid #e5e7eb; background: #fff; }
@@ -256,14 +196,14 @@
256
196
  <nine-table-body>
257
197
  <nine-table-summary></nine-table-summary>
258
198
  <nine-table-sheets>
259
- <nine-table-sheets-body>${n}</nine-table-sheets-body>
199
+ <nine-table-sheets-body>${y}</nine-table-sheets-body>
260
200
  <nine-table-sheets-footer>
261
- <div class="nine-tab-bar">${c}</div>
201
+ <div class="nine-tab-bar">${f}</div>
262
202
  <div class="sheets-counter">Total : <span id="row-count">0</span></div>
263
203
  </nine-table-sheets-footer>
264
204
  </nine-table-sheets>
265
205
  <nine-table-analysis></nine-table-analysis>
266
206
  </nine-table-body>
267
207
  <nine-table-footer></nine-table-footer>
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)});
208
+ `;const u=a(this,w).querySelectorAll("nine-table-sheet");u==null||u.forEach((x,e)=>{r[e]&&setTimeout(()=>{x.init(r[e]),g&&a(this,$).call(this,b)})})},"#render"));R(this,w,b),a(this,I).call(this),a(this,z).call(this)}};w=new WeakMap,L=new WeakMap,z=new WeakMap,$=new WeakMap,I=new WeakMap,d(K,"LayoutManager");let N=K;const Y=class Y extends HTMLElement{constructor(){super();E(this,T,!1);this.attachShadow({mode:"open"})}connectedCallback(){a(this,T)||(this.layoutManager=new N(this.shadowRoot),R(this,T,!0),h.log("NineTable connected."),this.dispatchEvent(new CustomEvent("load",{bubbles:!0,detail:{target:this}})))}disconnectedCallback(){h.log("NineTable disconnected.")}};T=new WeakMap,d(Y,"NineTable");let W=Y;customElements.get("nine-table")||customElements.define("nine-table",W)});
269
209
  //# sourceMappingURL=nine-table.umd.js.map