@nuptechs/nup-xlsx-preview 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +226 -0
- package/dist/adapters/react.cjs +10 -0
- package/dist/adapters/react.cjs.map +1 -0
- package/dist/adapters/react.d.cts +307 -0
- package/dist/adapters/react.d.ts +307 -0
- package/dist/adapters/react.js +10 -0
- package/dist/adapters/react.js.map +1 -0
- package/dist/adapters/vanilla.cjs +55 -0
- package/dist/adapters/vanilla.cjs.map +1 -0
- package/dist/adapters/vanilla.d.cts +168 -0
- package/dist/adapters/vanilla.d.ts +168 -0
- package/dist/adapters/vanilla.js +55 -0
- package/dist/adapters/vanilla.js.map +1 -0
- package/dist/adapters/vue.cjs +10 -0
- package/dist/adapters/vue.cjs.map +1 -0
- package/dist/adapters/vue.d.cts +369 -0
- package/dist/adapters/vue.d.ts +369 -0
- package/dist/adapters/vue.js +10 -0
- package/dist/adapters/vue.js.map +1 -0
- package/dist/index.cjs +55 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +790 -0
- package/dist/index.d.ts +790 -0
- package/dist/index.js +55 -0
- package/dist/index.js.map +1 -0
- package/dist/styles/base.css +346 -0
- package/dist/styles/index.css +730 -0
- package/dist/styles/print.css +182 -0
- package/dist/styles/themes.css +202 -0
- package/package.json +131 -0
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
var F=class{rowPositions;colPositions;rowHeightCache;colWidthCache;totalHeight;totalWidth;overscan;rowCount;colCount;frozenRows;frozenCols;frozenRowsHeight;frozenColsWidth;constructor(e){let{rows:t,cols:r,rowHeights:s,colWidths:o,defaultRowHeight:a=24,defaultColWidth:d=100,overscan:h=5,frozenRows:u=0,frozenCols:b=0}=e;this.frozenRows=u,this.frozenCols=b,this.rowCount=t,this.colCount=r,this.overscan=h,this.rowPositions=new Array(t+1),this.rowHeightCache=new Array(t),this.rowPositions[0]=0;for(let p=0;p<t;p++){let w=s[p]??a;this.rowHeightCache[p]=w,this.rowPositions[p+1]=this.rowPositions[p]+w;}this.totalHeight=this.rowPositions[t],this.frozenRowsHeight=u>0?this.rowPositions[u]??0:0,this.colPositions=new Array(r+1),this.colWidthCache=new Array(r),this.colPositions[0]=0;for(let p=0;p<r;p++){let w=o[p]??d;this.colWidthCache[p]=w,this.colPositions[p+1]=this.colPositions[p]+w;}this.totalWidth=this.colPositions[r],this.frozenColsWidth=b>0?this.colPositions[b]??0:0;}getFrozenInfo(){return {rows:this.frozenRows,cols:this.frozenCols,frozenRowsHeight:this.frozenRowsHeight,frozenColsWidth:this.frozenColsWidth}}binarySearch(e,t){let r=0,s=e.length-2;for(;r<=s;){let o=r+s>>>1,a=e[o],d=e[o+1];if(t>=a&&t<d)return o;t<a?s=o-1:r=o+1;}return Math.max(0,Math.min(r,e.length-2))}getVisibleRange(e,t,r,s){let o=e+this.frozenRowsHeight,a=t+this.frozenColsWidth,d=this.binarySearch(this.rowPositions,o),h=this.binarySearch(this.rowPositions,o+Math.max(0,r)),u=this.binarySearch(this.colPositions,a),b=this.binarySearch(this.colPositions,a+Math.max(0,s)),p=Math.max(this.frozenRows,d-this.overscan),w=Math.min(this.rowCount-1,h+this.overscan),re=Math.max(this.frozenCols,u-this.overscan),_=Math.min(this.colCount-1,b+this.overscan);return {startRow:p,endRow:w,startCol:re,endCol:_}}getFrozenRowsRange(){return this.frozenRows===0?null:{startRow:0,endRow:this.frozenRows-1}}getFrozenColsRange(){return this.frozenCols===0?null:{startCol:0,endCol:this.frozenCols-1}}getCellRect(e,t){return {top:this.rowPositions[e]??0,left:this.colPositions[t]??0,width:this.colWidthCache[t]??100,height:this.rowHeightCache[e]??24}}getRowHeight(e){return this.rowHeightCache[e]??24}getColWidth(e){return this.colWidthCache[e]??100}setColWidth(e,t){if(e<0||e>=this.colCount)return;let r=this.colWidthCache[e],s=t-r;this.colWidthCache[e]=t;for(let o=e+1;o<=this.colCount;o++)this.colPositions[o]+=s;this.totalWidth+=s;}getIndexAtPosition(e,t){return {row:this.binarySearch(this.rowPositions,e),col:this.binarySearch(this.colPositions,t)}}getScrollToPosition(e,t,r,s){let o=this.rowPositions[e]??0,a=this.colPositions[t]??0;return {scrollTop:Math.max(0,o-r/2),scrollLeft:Math.max(0,a-s/2)}}};function ee(f){let e="",t=f;for(;t>=0;)e=String.fromCharCode(t%26+65)+e,t=Math.floor(t/26)-1;return e}function Ie(f){let e=0,t=f.toUpperCase();for(let r=0;r<t.length;r++)e=e*26+(t.charCodeAt(r)-64);return e-1}function A(f,e){return `${ee(e)}${f+1}`}function S(f){let e=f.match(/^([A-Z]+)(\d+)$/i);if(!e)return null;let t=Ie(e[1]),r=parseInt(e[2],10)-1;return r<0||t<0?null:{row:r,col:t}}var D=class{state;sheet;onChange;constructor(e,t){this.sheet=e,this.onChange=t??null,this.state={anchor:null,focus:null,ranges:[]};}handleClick(e,t,r){let{shiftKey:s,ctrlKey:o,metaKey:a}=r;s&&this.state.anchor?(this.state.focus={row:e,col:t},this.updateRanges()):o||a?(this.state.anchor={row:e,col:t},this.state.focus={row:e,col:t},this.state.ranges.push(this.createRange(this.state.anchor,this.state.focus))):(this.state.anchor={row:e,col:t},this.state.focus={row:e,col:t},this.state.ranges=[this.createRange(this.state.anchor,this.state.focus)]),this.notifyChange();}handleDrag(e,t){this.state.anchor&&(this.state.focus={row:e,col:t},this.updateRanges(),this.notifyChange());}selectCell(e){let t=S(e);t&&(this.state.anchor=t,this.state.focus=t,this.state.ranges=[this.createRange(t,t)],this.notifyChange());}selectRange(e,t){let r=S(e),s=S(t);!r||!s||(this.state.anchor=r,this.state.focus=s,this.state.ranges=[this.createRange(r,s)],this.notifyChange());}selectAll(){this.state.anchor={row:0,col:0},this.state.focus={row:this.sheet.rowCount-1,col:this.sheet.colCount-1},this.state.ranges=[this.createRange(this.state.anchor,this.state.focus)],this.notifyChange();}clear(){this.state.anchor=null,this.state.focus=null,this.state.ranges=[],this.notifyChange();}getSelection(){return this.state.ranges.length===0?null:this.state.ranges[0]}getAllSelections(){return [...this.state.ranges]}isCellSelected(e,t){return this.state.ranges.some(r=>e>=r.start.row&&e<=r.end.row&&t>=r.start.col&&t<=r.end.col)}isAnchor(e,t){return this.state.anchor?.row===e&&this.state.anchor?.col===t}setSheet(e){this.sheet=e,this.clear();}updateRanges(){if(!this.state.anchor||!this.state.focus)return;let e=this.createRange(this.state.anchor,this.state.focus);this.state.ranges.length>0?this.state.ranges[this.state.ranges.length-1]=e:this.state.ranges.push(e);}createRange(e,t){let r=Math.min(e.row,t.row),s=Math.max(e.row,t.row),o=Math.min(e.col,t.col),a=Math.max(e.col,t.col),d=[],h=[];for(let u=r;u<=s;u++){let b=[];for(let p=o;p<=a;p++){let w=A(u,p);h.push(w),b.push(this.sheet.cells[w]??null);}d.push(b);}return {start:{row:r,col:o},end:{row:s,col:a},cells:d,cellRefs:h}}notifyChange(){this.onChange&&this.onChange(this.getSelection());}};var U=class{selection;virtualScroll;config;onScroll;onCopy;constructor(e,t,r,s){this.selection=e,this.virtualScroll=t,this.config=r,this.onScroll=s?.onScroll??null,this.onCopy=s?.onCopy??null;}handleKeyDown(e){if(!this.config.enabled)return false;let t=this.getAction(e);return t?(e.preventDefault(),this.executeAction(t),true):false}getAction(e){let{key:t,shiftKey:r,ctrlKey:s,metaKey:o}=e,a=s||o;if(a&&t==="c")return "copy";if(a&&t==="a")return "select-all";if(r)switch(t){case "ArrowUp":return "extend-up";case "ArrowDown":return "extend-down";case "ArrowLeft":return "extend-left";case "ArrowRight":return "extend-right"}if(a)switch(t){case "Home":return "move-ctrl-home";case "End":return "move-ctrl-end"}switch(t){case "ArrowUp":return "move-up";case "ArrowDown":return "move-down";case "ArrowLeft":return "move-left";case "ArrowRight":return "move-right";case "PageUp":return "move-page-up";case "PageDown":return "move-page-down";case "Home":return "move-home";case "End":return "move-end";case "Tab":return r?"move-left":"move-right";case "Enter":return r?"move-up":"move-down"}return null}executeAction(e){let t=this.selection.getSelection();if(!t&&!["select-all","move-ctrl-home"].includes(e)){this.selection.selectCell("A1"),this.scrollToSelection();return}let{row:r,col:s}=t?.start??{row:0,col:0},o=r,a=s;switch(e){case "move-up":o=Math.max(0,r-1);break;case "move-down":o=Math.min(this.virtualScroll.rowCount-1,r+1);break;case "move-left":a=Math.max(0,s-1);break;case "move-right":a=Math.min(this.virtualScroll.colCount-1,s+1);break;case "move-page-up":o=Math.max(0,r-20);break;case "move-page-down":o=Math.min(this.virtualScroll.rowCount-1,r+20);break;case "move-home":a=0;break;case "move-end":a=this.virtualScroll.colCount-1;break;case "move-ctrl-home":o=0,a=0;break;case "move-ctrl-end":o=this.virtualScroll.rowCount-1,a=this.virtualScroll.colCount-1;break;case "select-all":this.selection.selectAll();return;case "copy":this.onCopy?.();return;case "extend-up":case "extend-down":case "extend-left":case "extend-right":this.extendSelection(e);return}this.selection.handleClick(o,a,{shiftKey:false,ctrlKey:false,metaKey:false}),this.scrollToSelection();}extendSelection(e){let t=this.selection.getSelection();if(!t)return;let{row:r,col:s}=t.end;switch(e){case "extend-up":r=Math.max(0,r-1);break;case "extend-down":r=Math.min(this.virtualScroll.rowCount-1,r+1);break;case "extend-left":s=Math.max(0,s-1);break;case "extend-right":s=Math.min(this.virtualScroll.colCount-1,s+1);break}this.selection.handleDrag(r,s),this.scrollToSelection();}scrollToSelection(){let e=this.selection.getSelection();!e||!this.onScroll||this.onScroll(e.start.row,e.start.col);}setVirtualScroll(e){this.virtualScroll=e;}setSelection(e){this.selection=e;}};var j=class{merges;mergeMap;constructor(e=[]){this.merges=[],this.mergeMap=new Map,this.parseMerges(e);}parseMerges(e){for(let t of e){let[r,s]=t.split(":");if(!r||!s)continue;let o=S(r),a=S(s);if(!o||!a)continue;let d={startRow:Math.min(o.row,a.row),startCol:Math.min(o.col,a.col),endRow:Math.max(o.row,a.row),endCol:Math.max(o.col,a.col),cellRef:r};this.merges.push(d);for(let h=d.startRow;h<=d.endRow;h++)for(let u=d.startCol;u<=d.endCol;u++){let b=`${h},${u}`;this.mergeMap.set(b,d);}}}getMergeAt(e,t){return this.mergeMap.get(`${e},${t}`)??null}isMergeMaster(e,t){let r=this.getMergeAt(e,t);return r?r.startRow===e&&r.startCol===t:false}isMergeHidden(e,t){let r=this.getMergeAt(e,t);return r?!(r.startRow===e&&r.startCol===t):false}getMergeMaster(e,t){let r=this.getMergeAt(e,t);return r?{row:r.startRow,col:r.startCol}:null}getMergeRect(e,t,r){let s=this.getMergeAt(e,t);if(!s||!this.isMergeMaster(e,t))return null;let o=r(s.startRow,s.startCol),a=r(s.endRow,s.endCol);return {top:o.top,left:o.left,width:a.left+a.width-o.left,height:a.top+a.height-o.top}}getAllMerges(){return [...this.merges]}getVisibleMerges(e,t,r,s){return this.merges.filter(o=>o.endRow>=e&&o.startRow<=t&&o.endCol>=r&&o.startCol<=s)}update(e){this.merges=[],this.mergeMap.clear(),this.parseMerges(e);}};var O=class{async copyToClipboard(e){let t=this.formatSelection(e);try{if(navigator.clipboard&&typeof ClipboardItem<"u"){let r=new Blob([t.html],{type:"text/html"}),s=new Blob([t.text],{type:"text/plain"});await navigator.clipboard.write([new ClipboardItem({"text/html":r,"text/plain":s})]);}else await this.copyWithExecCommand(t.text);}catch{await this.copyWithExecCommand(t.text);}return t}formatSelection(e){let{cells:t}=e,r=[];for(let d of t){let h=d.map(u=>this.getCellValue(u));r.push(h.join(" "));}let s=r.join(`
|
|
2
|
+
`),o=[];for(let d of t){let h=d.map(u=>{let b=this.escapeHtml(this.getCellValue(u));return `<td style="${this.getCellStyle(u)}">${b}</td>`});o.push(`<tr>${h.join("")}</tr>`);}let a=`
|
|
3
|
+
<table style="border-collapse: collapse; font-family: Arial, sans-serif; font-size: 12px;">
|
|
4
|
+
<tbody>
|
|
5
|
+
${o.join(`
|
|
6
|
+
`)}
|
|
7
|
+
</tbody>
|
|
8
|
+
</table>
|
|
9
|
+
`.trim();return {text:s,html:a,cells:t}}getCellValue(e){return !e||e.v===void 0||e.v===null?"":String(e.v)}getCellStyle(e){let t=["border: 1px solid #ccc","padding: 4px 8px"];return e?.t==="n"&&t.push("text-align: right"),t.join("; ")}escapeHtml(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}async copyWithExecCommand(e){let t=document.createElement("textarea");t.value=e,t.style.position="fixed",t.style.left="-9999px",document.body.appendChild(t),t.select();try{document.execCommand("copy");}finally{document.body.removeChild(t);}}};var q=class{sheet;results;currentIndex;constructor(e){this.sheet=e,this.results=[],this.currentIndex=-1;}search(e,t={}){if(!e)return this.results=[],this.currentIndex=-1,[];let{caseSensitive:r=false,regex:s=false,matchWholeCell:o=false}=t,a;try{if(s)a=new RegExp(e,r?"g":"gi");else {let h=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),u=o?`^${h}$`:h;a=new RegExp(u,r?"g":"gi");}}catch{let h=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");a=new RegExp(h,r?"g":"gi");}let d=[];for(let[h,u]of Object.entries(this.sheet.cells)){if(u.v===void 0||u.v===null)continue;let b=String(u.v);a.lastIndex=0;let p=a.exec(b);if(p){let w=this.parseCellRef(h);w&&d.push({row:w.row,col:w.col,cellRef:h,value:b,matchStart:p.index,matchEnd:p.index+p[0].length});}}return d.sort((h,u)=>h.row!==u.row?h.row-u.row:h.col-u.col),this.results=d,this.currentIndex=d.length>0?0:-1,d}next(){return this.results.length===0?null:(this.currentIndex=(this.currentIndex+1)%this.results.length,this.results[this.currentIndex])}previous(){return this.results.length===0?null:(this.currentIndex=(this.currentIndex-1+this.results.length)%this.results.length,this.results[this.currentIndex])}current(){return this.currentIndex<0||this.currentIndex>=this.results.length?null:this.results[this.currentIndex]}getResults(){return [...this.results]}getCount(){return this.results.length}getCurrentIndex(){return this.currentIndex+1}isResult(e,t){return this.results.some(r=>r.row===e&&r.col===t)}isCurrent(e,t){let r=this.current();return r?.row===e&&r?.col===t}clear(){this.results=[],this.currentIndex=-1;}setSheet(e){this.sheet=e,this.clear();}parseCellRef(e){let t=e.match(/^([A-Z]+)(\d+)$/i);if(!t)return null;let r=t[1].toUpperCase(),s=parseInt(t[2],10)-1,o=0;for(let a=0;a<r.length;a++)o=o*26+(r.charCodeAt(a)-64);return o-=1,{row:s,col:o}}};var X=class{state=null;virtualScroll;onChange;minWidth;maxWidth;constructor(e,t,r=30,s=500){this.virtualScroll=e,this.onChange=t??null,this.minWidth=r,this.maxWidth=s;}startResize(e,t){let r=this.virtualScroll.getColWidth(e);this.state={isResizing:true,colIndex:e,startX:t,startWidth:r},document.addEventListener("mousemove",this.handleMouseMove),document.addEventListener("mouseup",this.handleMouseUp),document.body.style.cursor="col-resize",document.body.style.userSelect="none";}handleMouseMove=e=>{if(!this.state)return;let t=e.clientX-this.state.startX,r=Math.min(this.maxWidth,Math.max(this.minWidth,this.state.startWidth+t));this.virtualScroll.setColWidth(this.state.colIndex,r),this.onChange?.(this.state.colIndex,r);};handleMouseUp=()=>{this.cleanup();};isResizing(){return this.state?.isResizing??false}getResizeColumn(){return this.state?.colIndex??null}cancel(){this.state&&(this.virtualScroll.setColWidth(this.state.colIndex,this.state.startWidth),this.onChange?.(this.state.colIndex,this.state.startWidth)),this.cleanup();}cleanup(){document.removeEventListener("mousemove",this.handleMouseMove),document.removeEventListener("mouseup",this.handleMouseUp),document.body.style.cursor="",document.body.style.userSelect="",this.state=null;}setVirtualScroll(e){this.virtualScroll=e;}destroy(){this.cleanup();}};var te={default:{name:"default",colors:{background:"#ffffff",foreground:"#202124",grid:"#e0e0e0",headerBackground:"#f8f9fa",headerForeground:"#5f6368",selectionBorder:"#1a73e8",selectionBackground:"rgba(26, 115, 232, 0.08)",frozenBorder:"#dadce0"},fonts:{family:"'Google Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif",size:"13px",headerSize:"11px"}},excel:{name:"excel",colors:{background:"#ffffff",foreground:"#000000",grid:"#d4d4d4",headerBackground:"#f0f0f0",headerForeground:"#000000",selectionBorder:"#217346",selectionBackground:"rgba(33, 115, 70, 0.1)",frozenBorder:"#9bc2e6"},fonts:{family:"'Calibri', 'Segoe UI', sans-serif",size:"11px",headerSize:"11px"}},modern:{name:"modern",colors:{background:"#fafafa",foreground:"#18181b",grid:"#e4e4e7",headerBackground:"#f4f4f5",headerForeground:"#71717a",selectionBorder:"#3b82f6",selectionBackground:"rgba(59, 130, 246, 0.08)",frozenBorder:"#a1a1aa"},fonts:{family:"'Inter', -apple-system, BlinkMacSystemFont, sans-serif",size:"13px",headerSize:"11px"}},minimal:{name:"minimal",colors:{background:"#ffffff",foreground:"#27272a",grid:"#f4f4f5",headerBackground:"#ffffff",headerForeground:"#a1a1aa",selectionBorder:"#18181b",selectionBackground:"rgba(24, 24, 27, 0.04)",frozenBorder:"#e4e4e7"},fonts:{family:"'SF Pro Display', -apple-system, BlinkMacSystemFont, sans-serif",size:"13px",headerSize:"11px"}},dark:{name:"dark",colors:{background:"#1e1e1e",foreground:"#d4d4d4",grid:"#3c3c3c",headerBackground:"#252526",headerForeground:"#858585",selectionBorder:"#0078d4",selectionBackground:"rgba(0, 120, 212, 0.2)",frozenBorder:"#4a4a4a"},fonts:{family:"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif",size:"13px",headerSize:"11px"}},midnight:{name:"midnight",colors:{background:"#0d1117",foreground:"#c9d1d9",grid:"#21262d",headerBackground:"#161b22",headerForeground:"#8b949e",selectionBorder:"#58a6ff",selectionBackground:"rgba(88, 166, 255, 0.15)",frozenBorder:"#30363d"},fonts:{family:"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif",size:"13px",headerSize:"11px"}},accessible:{name:"accessible",colors:{background:"#ffffff",foreground:"#000000",grid:"#000000",headerBackground:"#e6e6e6",headerForeground:"#000000",selectionBorder:"#0000ff",selectionBackground:"rgba(0, 0, 255, 0.15)",frozenBorder:"#000000"},fonts:{family:"Arial, Helvetica, sans-serif",size:"14px",headerSize:"12px"}}};function ce(f,e){let t=f.style;t.setProperty("--nup-background",e.colors.background),t.setProperty("--nup-foreground",e.colors.foreground),t.setProperty("--nup-grid",e.colors.grid),t.setProperty("--nup-header-bg",e.colors.headerBackground),t.setProperty("--nup-header-fg",e.colors.headerForeground),t.setProperty("--nup-selection-border",e.colors.selectionBorder),t.setProperty("--nup-selection-bg",e.colors.selectionBackground),t.setProperty("--nup-frozen-border",e.colors.frozenBorder),t.setProperty("--nup-font-family",e.fonts.family),t.setProperty("--nup-font-size",e.fonts.size);}function he(f){return `nup-theme-${f}`}function Pe(f,e){let t=typeof f=="string"?document.querySelector(f):f;if(!t)throw new Error("Container element not found");let{workbook:r,activeSheet:s=0,theme:o="default",width:a="100%",height:d="400px",showHeaders:h=true,showGridLines:u=true,showSheetTabs:b=true,selectable:p=true,resizable:w=true,searchable:re=false,copyable:_=true,keyboardNavigation:de=true,frozenRows:Le=0,frozenCols:Ee=0,overscan:pe=5,defaultRowHeight:me=24,defaultColWidth:fe=100,ariaLabel:ge="Spreadsheet",onCellClick:be,onCellDoubleClick:we,onCellRightClick:ve,onSelectionChange:Ce,onSheetChange:oe,onColumnResize:ye,onScroll:xe,onSearch:Re,onCopy:ne}=e,B=s,k=0,$=0,M=0,H=0,C=null,N=[],T=()=>r.sheets[B]??r.sheets[0],Se=()=>typeof o=="string"?te[o]??te.default:o,g,x,G,se,Z,Y,le,J=()=>{let n=T(),l={},m={};Object.entries(n.rows).forEach(([c,i])=>{i.h&&(l[parseInt(c)]=i.h);}),Object.entries(n.cols).forEach(([c,i])=>{i.w&&(m[parseInt(c)]=i.w);}),g=new F({rows:n.rowCount,cols:n.colCount,rowHeights:l,colWidths:m,defaultRowHeight:me,defaultColWidth:fe,overscan:pe}),x=new D(n,c=>{C=c,Ce?.(c),y();}),G=new j(n.merges??[]),se=new q(n),Z=new O,Y=new X(g,(c,i)=>{ye?.(c,i),y();}),le=new U(x,g,{enabled:de},{onScroll:(c,i)=>{let v=g.getScrollToPosition(c,i,H,M);R?.scrollTo({top:v.scrollTop,left:v.scrollLeft,behavior:"smooth"});},onCopy:async()=>{let c=x.getSelection();if(c&&_){let i=await Z.copyToClipboard(c);ne?.(i);}}});},W=h?24:0,I=h?40:0,Me=typeof o=="string"?he(o):"";t.innerHTML=`
|
|
10
|
+
<div class="nup-spreadsheet ${Me} ${u?"":"nup-no-gridlines"}"
|
|
11
|
+
style="width: ${typeof a=="number"?a+"px":a}; height: ${typeof d=="number"?d+"px":d};"
|
|
12
|
+
tabindex="0"
|
|
13
|
+
role="grid"
|
|
14
|
+
aria-label="${ge}">
|
|
15
|
+
${h?`<div class="nup-corner" style="width: ${I}px; height: ${W}px;"></div>`:""}
|
|
16
|
+
${h?`
|
|
17
|
+
<div class="nup-header-row-container" style="position: absolute; top: 0; left: ${I}px; right: 0; height: ${W}px; overflow: hidden;">
|
|
18
|
+
<div class="nup-header-row-inner" style="position: relative; height: ${W}px;"></div>
|
|
19
|
+
</div>
|
|
20
|
+
<div class="nup-header-col-container" style="position: absolute; top: ${W}px; left: 0; bottom: ${b?"32px":"0"}; width: ${I}px; overflow: hidden;">
|
|
21
|
+
<div class="nup-header-col-inner" style="position: relative; width: ${I}px;"></div>
|
|
22
|
+
</div>
|
|
23
|
+
`:""}
|
|
24
|
+
<div class="nup-scroll-container" style="top: ${W}px; left: ${I}px; right: 0; bottom: ${b?"32px":"0"};">
|
|
25
|
+
<div class="nup-content"></div>
|
|
26
|
+
</div>
|
|
27
|
+
${b&&r.sheets.length>1?'<div class="nup-sheet-tabs"></div>':""}
|
|
28
|
+
</div>
|
|
29
|
+
`;let ie=t.querySelector(".nup-spreadsheet"),R=t.querySelector(".nup-scroll-container"),P=t.querySelector(".nup-content"),z=t.querySelector(".nup-header-row-inner"),L=t.querySelector(".nup-header-col-inner"),Q=t.querySelector(".nup-sheet-tabs");ce(ie,Se()),J();let ae=new ResizeObserver(n=>{let l=n[0];l&&(M=l.contentRect.width,H=l.contentRect.height,y());});ae.observe(R),M=R.clientWidth,H=R.clientHeight,R.addEventListener("scroll",()=>{k=R.scrollTop,$=R.scrollLeft,z&&(z.style.transform=`translateX(${-$}px)`),L&&(L.style.transform=`translateY(${-k}px)`);let n=g.getVisibleRange(k,$,H,M);xe?.({scrollTop:k,scrollLeft:$,visibleRows:{start:n.startRow,end:n.endRow},visibleCols:{start:n.startCol,end:n.endCol}}),y();}),ie.addEventListener("keydown",n=>{le.handleKeyDown(n);});let y=()=>{let n=T(),l=g.getVisibleRange(k,$,H,M);P.style.width=`${g.totalWidth}px`,P.style.height=`${g.totalHeight}px`,z&&(z.style.width=`${g.totalWidth}px`),L&&(L.style.height=`${g.totalHeight}px`);let m="";for(let c=l.startRow;c<=l.endRow;c++)for(let i=l.startCol;i<=l.endCol;i++){if(G.isMergeHidden(c,i))continue;let v=G.getMergeRect(c,i,(V,We)=>g.getCellRect(V,We))??g.getCellRect(c,i),E=A(c,i),K=n.cells[E],He=x.isCellSelected(c,i),ze=x.isAnchor(c,i),Te=N.some(V=>V.row===c&&V.col===i),ke=["nup-cell",K?.t==="n"?"nup-cell-number":"",He?"nup-cell-selected":"",ze?"nup-cell-anchor":"",Te?"nup-cell-search-result":""].filter(Boolean).join(" "),$e=K?.v!==void 0&&K?.v!==null?String(K.v):"";m+=`
|
|
30
|
+
<div class="${ke}"
|
|
31
|
+
style="top: ${v.top}px; left: ${v.left}px; width: ${v.width}px; height: ${v.height}px;"
|
|
32
|
+
data-row="${c}" data-col="${i}" data-cell-ref="${E}">
|
|
33
|
+
${ue($e)}
|
|
34
|
+
</div>
|
|
35
|
+
`;}if(C){let c=g.getCellRect(C.start.row,C.start.col),i=g.getCellRect(C.end.row,C.end.col);m+=`
|
|
36
|
+
<div class="nup-selection-border"
|
|
37
|
+
style="top: ${c.top}px; left: ${c.left}px; width: ${i.left+i.width-c.left}px; height: ${i.top+i.height-c.top}px;">
|
|
38
|
+
</div>
|
|
39
|
+
`;}if(P.innerHTML=m,h&&z){let c="";for(let i=l.startCol;i<=l.endCol;i++){let v=g.getCellRect(0,i),E=C&&i>=C.start.col&&i<=C.end.col;c+=`
|
|
40
|
+
<div class="nup-header nup-header-col ${E?"nup-header-selected":""}"
|
|
41
|
+
style="left: ${v.left}px; width: ${v.width}px; height: ${W}px;">
|
|
42
|
+
${ee(i)}
|
|
43
|
+
${w?'<div class="nup-resize-handle" data-col="'+i+'"></div>':""}
|
|
44
|
+
</div>
|
|
45
|
+
`;}z.innerHTML=c;}if(h&&L){let c="";for(let i=l.startRow;i<=l.endRow;i++){let v=g.getCellRect(i,0),E=C&&i>=C.start.row&&i<=C.end.row;c+=`
|
|
46
|
+
<div class="nup-header nup-header-row ${E?"nup-header-selected":""}"
|
|
47
|
+
style="top: ${v.top}px; width: ${I}px; height: ${v.height}px;">
|
|
48
|
+
${i+1}
|
|
49
|
+
</div>
|
|
50
|
+
`;}L.innerHTML=c;}Q&&r.sheets.length>1&&(Q.innerHTML=r.sheets.map((c,i)=>`
|
|
51
|
+
<button class="nup-sheet-tab ${i===B?"nup-sheet-tab-active":""}" data-sheet="${i}">
|
|
52
|
+
${ue(c.name)}
|
|
53
|
+
</button>
|
|
54
|
+
`).join(""));};return P.addEventListener("click",n=>{if(!p)return;let l=n.target.closest(".nup-cell");if(!l)return;let m=parseInt(l.dataset.row??"0"),c=parseInt(l.dataset.col??"0"),i=l.dataset.cellRef??"";x.handleClick(m,c,{shiftKey:n.shiftKey,ctrlKey:n.ctrlKey,metaKey:n.metaKey}),be?.({cell:T().cells[i]??null,row:m,col:c,cellRef:i,originalEvent:n});}),P.addEventListener("dblclick",n=>{let l=n.target.closest(".nup-cell");if(!l)return;let m=parseInt(l.dataset.row??"0"),c=parseInt(l.dataset.col??"0"),i=l.dataset.cellRef??"";we?.({cell:T().cells[i]??null,row:m,col:c,cellRef:i,originalEvent:n});}),P.addEventListener("contextmenu",n=>{let l=n.target.closest(".nup-cell");if(!l)return;n.preventDefault();let m=parseInt(l.dataset.row??"0"),c=parseInt(l.dataset.col??"0"),i=l.dataset.cellRef??"";ve?.({cell:T().cells[i]??null,row:m,col:c,cellRef:i,originalEvent:n});}),Q?.addEventListener("click",n=>{let l=n.target.closest(".nup-sheet-tab");if(!l)return;let m=parseInt(l.dataset.sheet??"0");B=m,J(),oe?.(m),y();}),w&&z&&z.addEventListener("mousedown",n=>{let l=n.target.closest(".nup-resize-handle");if(!l)return;let m=parseInt(l.dataset.col??"0");Y.startResize(m,n.clientX);}),y(),{scrollTo:(n,l)=>{let m=g.getScrollToPosition(n,l,H,M);R.scrollTo({top:m.scrollTop,left:m.scrollLeft,behavior:"smooth"});},scrollToCell:n=>{let l=S(n);if(l){let m=g.getScrollToPosition(l.row,l.col,H,M);R.scrollTo({top:m.scrollTop,left:m.scrollLeft,behavior:"smooth"});}},select:n=>{C=n,y();},selectCell:n=>{x.selectCell(n);},selectAll:()=>{x.selectAll();},clearSelection:()=>{x.clear();},getSelection:()=>C,setActiveSheet:n=>{B=n,J(),oe?.(n),y();},getActiveSheet:()=>B,search:n=>{let l=se.search(n);return N=l,Re?.(l),y(),l},highlightResults:n=>{N=n,y();},clearHighlights:()=>{N=[],y();},getWorkbook:()=>r,getVisibleCells:()=>{let n=T(),l=g.getVisibleRange(k,$,H,M),m=[];for(let c=l.startRow;c<=l.endRow;c++){let i=[];for(let v=l.startCol;v<=l.endCol;v++)i.push(n.cells[A(c,v)]??null);m.push(i);}return m},getCellAt:(n,l)=>T().cells[A(n,l)]??null,copySelection:async()=>{let n=x.getSelection();if(n){let l=await Z.copyToClipboard(n);ne?.(l);}},setColumnWidth:(n,l)=>{g.setColWidth(n,l),y();},autoFitColumn:()=>{},autoFitAllColumns:()=>{},refresh:()=>y(),destroy:()=>{ae.disconnect(),Y.destroy(),t.innerHTML="";}}}function ue(f){return f.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}var ot=Pe;export{Pe as createSpreadsheetPreview,ot as default};//# sourceMappingURL=vanilla.js.map
|
|
55
|
+
//# sourceMappingURL=vanilla.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/core/virtual-scroll.ts","../../src/utils/cell-utils.ts","../../src/core/selection.ts","../../src/core/keyboard.ts","../../src/core/merge-handler.ts","../../src/core/clipboard.ts","../../src/core/search.ts","../../src/core/resize.ts","../../src/core/themes.ts","../../src/adapters/vanilla.ts"],"names":["VirtualScroll","config","rows","cols","rowHeights","colWidths","defaultRowHeight","defaultColWidth","overscan","frozenRows","frozenCols","i","h","positions","target","low","high","mid","start","end","scrollTop","scrollLeft","viewportHeight","viewportWidth","absoluteScrollTop","absoluteScrollLeft","startRowRaw","endRowRaw","startColRaw","endColRaw","startRow","endRow","startCol","endCol","row","col","width","oldWidth","delta","cellTop","cellLeft","colIndexToLetter","result","n","letterToColIndex","letters","upper","coordsToCellRef","cellRefToCoords","ref","match","SelectionHandler","sheet","onChange","event","shiftKey","ctrlKey","metaKey","cellRef","coords","startRef","endRef","range","newRange","minRow","maxRow","minCol","maxCol","cells","cellRefs","r","rowCells","c","KeyboardHandler","selection","virtualScroll","callbacks","action","key","ctrl","current","newRow","newCol","sel","vs","MergeHandler","mergeStrings","mergeStr","merge","getCellRect","topLeft","bottomRight","ClipboardHandler","data","blob","textBlob","textRows","textCells","cell","text","htmlRows","htmlCells","value","html","styles","str","textarea","SearchHandler","query","options","caseSensitive","regex","matchWholeCell","pattern","escaped","patternStr","results","a","b","colStr","rowNum","ResizeHandler","minWidth","maxWidth","colIndex","clientX","currentWidth","newWidth","themes","applyTheme","element","theme","style","getThemeClass","name","createSpreadsheetPreview","container","el","workbook","initialActiveSheet","themeProp","height","showHeaders","showGridLines","showSheetTabs","selectable","resizable","_searchable","copyable","keyboardNavigation","_frozenRows","_frozenCols","ariaLabel","onCellClick","onCellDoubleClick","onCellRightClick","onSelectionChange","onSheetChange","onColumnResize","onScroll","onSearch","onCopy","activeSheet","searchResults","getSheet","getThemeConfig","selectionHandler","mergeHandler","searchHandler","clipboardHandler","resizeHandler","keyboardHandler","initHandlers","idx","render","w","pos","scrollContainer","headerHeight","headerWidth","themeClass","spreadsheet","content","headerRowInner","headerColInner","sheetTabs","resizeObserver","entries","entry","e","cellsHtml","rect","isSelected","isAnchor","isSearchResult","s","classes","escapeHtml","startRect","endRect","colHeadersHtml","rowHeadersHtml","sheetIndex","index","vanilla_default"],"mappings":"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","file":"vanilla.js","sourcesContent":["/**\n * Virtual Scroll Engine\n * High-performance O(1) lookups using pre-computed positions and binary search\n */\n\nimport type { VisibleRange, CellRect } from '../types';\n\nexport interface VirtualScrollConfig {\n rows: number;\n cols: number;\n rowHeights: Record<number, number>;\n colWidths: Record<number, number>;\n defaultRowHeight?: number;\n defaultColWidth?: number;\n overscan?: number;\n frozenRows?: number;\n frozenCols?: number;\n}\n\nexport interface FrozenInfo {\n rows: number;\n cols: number;\n frozenRowsHeight: number;\n frozenColsWidth: number;\n}\n\nexport class VirtualScroll {\n private rowPositions: number[];\n private colPositions: number[];\n private rowHeightCache: number[];\n private colWidthCache: number[];\n \n public totalHeight: number;\n public totalWidth: number;\n public overscan: number;\n public rowCount: number;\n public colCount: number;\n public frozenRows: number;\n public frozenCols: number;\n public frozenRowsHeight: number;\n public frozenColsWidth: number;\n\n constructor(config: VirtualScrollConfig) {\n const {\n rows,\n cols,\n rowHeights,\n colWidths,\n defaultRowHeight = 24,\n defaultColWidth = 100,\n overscan = 5,\n frozenRows = 0,\n frozenCols = 0,\n } = config;\n \n this.frozenRows = frozenRows;\n this.frozenCols = frozenCols;\n\n this.rowCount = rows;\n this.colCount = cols;\n this.overscan = overscan;\n\n // Pre-compute row positions and heights\n this.rowPositions = new Array(rows + 1);\n this.rowHeightCache = new Array(rows);\n this.rowPositions[0] = 0;\n \n for (let i = 0; i < rows; i++) {\n const h = rowHeights[i] ?? defaultRowHeight;\n this.rowHeightCache[i] = h;\n this.rowPositions[i + 1] = this.rowPositions[i] + h;\n }\n this.totalHeight = this.rowPositions[rows];\n \n // Calculate frozen rows height\n this.frozenRowsHeight = frozenRows > 0 ? (this.rowPositions[frozenRows] ?? 0) : 0;\n\n // Pre-compute col positions and widths\n this.colPositions = new Array(cols + 1);\n this.colWidthCache = new Array(cols);\n this.colPositions[0] = 0;\n \n for (let i = 0; i < cols; i++) {\n const w = colWidths[i] ?? defaultColWidth;\n this.colWidthCache[i] = w;\n this.colPositions[i + 1] = this.colPositions[i] + w;\n }\n this.totalWidth = this.colPositions[cols];\n \n // Calculate frozen cols width\n this.frozenColsWidth = frozenCols > 0 ? (this.colPositions[frozenCols] ?? 0) : 0;\n }\n\n /**\n * Get frozen pane info\n */\n getFrozenInfo(): FrozenInfo {\n return {\n rows: this.frozenRows,\n cols: this.frozenCols,\n frozenRowsHeight: this.frozenRowsHeight,\n frozenColsWidth: this.frozenColsWidth,\n };\n }\n\n /**\n * Binary search to find index at a given scroll position\n * O(log n) lookup\n */\n private binarySearch(positions: number[], target: number): number {\n let low = 0;\n let high = positions.length - 2;\n\n while (low <= high) {\n const mid = (low + high) >>> 1;\n const start = positions[mid];\n const end = positions[mid + 1];\n\n if (target >= start && target < end) {\n return mid;\n } else if (target < start) {\n high = mid - 1;\n } else {\n low = mid + 1;\n }\n }\n\n return Math.max(0, Math.min(low, positions.length - 2));\n }\n\n /**\n * Get visible range given scroll position and viewport dimensions\n * Returns the scrollable (non-frozen) visible range\n * Frozen rows/cols are rendered separately by the adapter\n */\n getVisibleRange(\n scrollTop: number,\n scrollLeft: number,\n viewportHeight: number,\n viewportWidth: number\n ): VisibleRange {\n // The scroll position is relative to the scrollable content (after frozen area)\n // So we add frozenRowsHeight to get the actual position in the full data\n const absoluteScrollTop = scrollTop + this.frozenRowsHeight;\n const absoluteScrollLeft = scrollLeft + this.frozenColsWidth;\n \n // Find start/end rows\n const startRowRaw = this.binarySearch(this.rowPositions, absoluteScrollTop);\n const endRowRaw = this.binarySearch(this.rowPositions, absoluteScrollTop + Math.max(0, viewportHeight));\n\n // Find start/end cols\n const startColRaw = this.binarySearch(this.colPositions, absoluteScrollLeft);\n const endColRaw = this.binarySearch(this.colPositions, absoluteScrollLeft + Math.max(0, viewportWidth));\n\n // Apply overscan for smoother scrolling, but don't go below frozen boundary\n const startRow = Math.max(this.frozenRows, startRowRaw - this.overscan);\n const endRow = Math.min(this.rowCount - 1, endRowRaw + this.overscan);\n const startCol = Math.max(this.frozenCols, startColRaw - this.overscan);\n const endCol = Math.min(this.colCount - 1, endColRaw + this.overscan);\n\n return { startRow, endRow, startCol, endCol };\n }\n\n /**\n * Get frozen rows range (always visible)\n */\n getFrozenRowsRange(): { startRow: number; endRow: number } | null {\n if (this.frozenRows === 0) return null;\n return { startRow: 0, endRow: this.frozenRows - 1 };\n }\n\n /**\n * Get frozen cols range (always visible)\n */\n getFrozenColsRange(): { startCol: number; endCol: number } | null {\n if (this.frozenCols === 0) return null;\n return { startCol: 0, endCol: this.frozenCols - 1 };\n }\n\n /**\n * Get cell rectangle for absolute positioning\n */\n getCellRect(row: number, col: number): CellRect {\n return {\n top: this.rowPositions[row] ?? 0,\n left: this.colPositions[col] ?? 0,\n width: this.colWidthCache[col] ?? 100,\n height: this.rowHeightCache[row] ?? 24,\n };\n }\n\n /**\n * Get row height\n */\n getRowHeight(row: number): number {\n return this.rowHeightCache[row] ?? 24;\n }\n\n /**\n * Get column width\n */\n getColWidth(col: number): number {\n return this.colWidthCache[col] ?? 100;\n }\n\n /**\n * Update column width (for resize)\n */\n setColWidth(col: number, width: number): void {\n if (col < 0 || col >= this.colCount) return;\n \n const oldWidth = this.colWidthCache[col];\n const delta = width - oldWidth;\n \n this.colWidthCache[col] = width;\n \n // Update positions for all subsequent columns\n for (let i = col + 1; i <= this.colCount; i++) {\n this.colPositions[i] += delta;\n }\n \n this.totalWidth += delta;\n }\n\n /**\n * Find row/col at a given pixel position\n */\n getIndexAtPosition(scrollTop: number, scrollLeft: number): { row: number; col: number } {\n return {\n row: this.binarySearch(this.rowPositions, scrollTop),\n col: this.binarySearch(this.colPositions, scrollLeft),\n };\n }\n\n /**\n * Scroll offset to bring a cell into view\n */\n getScrollToPosition(\n row: number,\n col: number,\n viewportHeight: number,\n viewportWidth: number\n ): { scrollTop: number; scrollLeft: number } {\n const cellTop = this.rowPositions[row] ?? 0;\n const cellLeft = this.colPositions[col] ?? 0;\n \n return {\n scrollTop: Math.max(0, cellTop - viewportHeight / 2),\n scrollLeft: Math.max(0, cellLeft - viewportWidth / 2),\n };\n }\n}\n","/**\n * Cell Utilities\n * Helper functions for cell reference parsing and formatting\n */\n\n/**\n * Convert column index (0-based) to letter(s) (A, B, ..., Z, AA, AB, ...)\n */\nexport function colIndexToLetter(col: number): string {\n let result = '';\n let n = col;\n \n while (n >= 0) {\n result = String.fromCharCode((n % 26) + 65) + result;\n n = Math.floor(n / 26) - 1;\n }\n \n return result;\n}\n\n/**\n * Convert column letter(s) to index (0-based)\n */\nexport function letterToColIndex(letters: string): number {\n let col = 0;\n const upper = letters.toUpperCase();\n \n for (let i = 0; i < upper.length; i++) {\n col = col * 26 + (upper.charCodeAt(i) - 64);\n }\n \n return col - 1;\n}\n\n/**\n * Convert row/col coordinates to cell reference (e.g., 0, 0 -> \"A1\")\n */\nexport function coordsToCellRef(row: number, col: number): string {\n return `${colIndexToLetter(col)}${row + 1}`;\n}\n\n/**\n * Parse cell reference to row/col coordinates (e.g., \"A1\" -> { row: 0, col: 0 })\n */\nexport function cellRefToCoords(ref: string): { row: number; col: number } | null {\n const match = ref.match(/^([A-Z]+)(\\d+)$/i);\n if (!match) return null;\n \n const col = letterToColIndex(match[1]);\n const row = parseInt(match[2], 10) - 1;\n \n if (row < 0 || col < 0) return null;\n \n return { row, col };\n}\n\n/**\n * Parse range reference (e.g., \"A1:B2\")\n */\nexport function parseRange(rangeRef: string): {\n start: { row: number; col: number };\n end: { row: number; col: number };\n} | null {\n const [startRef, endRef] = rangeRef.split(':');\n if (!startRef) return null;\n \n const start = cellRefToCoords(startRef);\n if (!start) return null;\n \n if (!endRef) {\n return { start, end: start };\n }\n \n const end = cellRefToCoords(endRef);\n if (!end) return null;\n \n return {\n start: {\n row: Math.min(start.row, end.row),\n col: Math.min(start.col, end.col),\n },\n end: {\n row: Math.max(start.row, end.row),\n col: Math.max(start.col, end.col),\n },\n };\n}\n\n/**\n * Format number for display\n */\nexport function formatCellValue(value: unknown, type?: string): string {\n if (value === null || value === undefined) return '';\n \n if (type === 'n' && typeof value === 'number') {\n // Check if integer\n if (Number.isInteger(value)) {\n return value.toLocaleString();\n }\n // Format with 2 decimal places\n return value.toLocaleString(undefined, {\n minimumFractionDigits: 0,\n maximumFractionDigits: 2,\n });\n }\n \n return String(value);\n}\n\n/**\n * Check if a string looks like a formula\n */\nexport function isFormula(value: string): boolean {\n return typeof value === 'string' && value.startsWith('=');\n}\n","/**\n * Selection Handler\n * Supports click, Shift+Click, Ctrl+Click, and drag selection\n */\n\nimport type { SelectionRange, NupCell, NupWorksheet } from '../types';\nimport { cellRefToCoords, coordsToCellRef } from '../utils/cell-utils';\n\nexport interface SelectionState {\n anchor: { row: number; col: number } | null;\n focus: { row: number; col: number } | null;\n ranges: SelectionRange[];\n}\n\nexport class SelectionHandler {\n private state: SelectionState;\n private sheet: NupWorksheet;\n private onChange: ((selection: SelectionRange | null) => void) | null;\n\n constructor(sheet: NupWorksheet, onChange?: (selection: SelectionRange | null) => void) {\n this.sheet = sheet;\n this.onChange = onChange ?? null;\n this.state = {\n anchor: null,\n focus: null,\n ranges: [],\n };\n }\n\n /**\n * Handle cell click\n */\n handleClick(\n row: number,\n col: number,\n event: { shiftKey: boolean; ctrlKey: boolean; metaKey: boolean }\n ): void {\n const { shiftKey, ctrlKey, metaKey } = event;\n\n if (shiftKey && this.state.anchor) {\n // Extend selection from anchor to clicked cell\n this.state.focus = { row, col };\n this.updateRanges();\n } else if (ctrlKey || metaKey) {\n // Add new selection range (multi-select)\n this.state.anchor = { row, col };\n this.state.focus = { row, col };\n this.state.ranges.push(this.createRange(this.state.anchor, this.state.focus));\n } else {\n // Single cell selection\n this.state.anchor = { row, col };\n this.state.focus = { row, col };\n this.state.ranges = [this.createRange(this.state.anchor, this.state.focus)];\n }\n\n this.notifyChange();\n }\n\n /**\n * Handle drag selection\n */\n handleDrag(row: number, col: number): void {\n if (!this.state.anchor) return;\n \n this.state.focus = { row, col };\n this.updateRanges();\n this.notifyChange();\n }\n\n /**\n * Select a specific cell by reference (e.g., \"A1\")\n */\n selectCell(cellRef: string): void {\n const coords = cellRefToCoords(cellRef);\n if (!coords) return;\n\n this.state.anchor = coords;\n this.state.focus = coords;\n this.state.ranges = [this.createRange(coords, coords)];\n this.notifyChange();\n }\n\n /**\n * Select a range\n */\n selectRange(startRef: string, endRef: string): void {\n const start = cellRefToCoords(startRef);\n const end = cellRefToCoords(endRef);\n if (!start || !end) return;\n\n this.state.anchor = start;\n this.state.focus = end;\n this.state.ranges = [this.createRange(start, end)];\n this.notifyChange();\n }\n\n /**\n * Select all cells\n */\n selectAll(): void {\n this.state.anchor = { row: 0, col: 0 };\n this.state.focus = { row: this.sheet.rowCount - 1, col: this.sheet.colCount - 1 };\n this.state.ranges = [this.createRange(this.state.anchor, this.state.focus)];\n this.notifyChange();\n }\n\n /**\n * Clear selection\n */\n clear(): void {\n this.state.anchor = null;\n this.state.focus = null;\n this.state.ranges = [];\n this.notifyChange();\n }\n\n /**\n * Get current selection\n */\n getSelection(): SelectionRange | null {\n if (this.state.ranges.length === 0) return null;\n return this.state.ranges[0];\n }\n\n /**\n * Get all selections (for multi-select)\n */\n getAllSelections(): SelectionRange[] {\n return [...this.state.ranges];\n }\n\n /**\n * Check if a cell is selected\n */\n isCellSelected(row: number, col: number): boolean {\n return this.state.ranges.some(range => \n row >= range.start.row && row <= range.end.row &&\n col >= range.start.col && col <= range.end.col\n );\n }\n\n /**\n * Check if a cell is the anchor (main selected cell)\n */\n isAnchor(row: number, col: number): boolean {\n return this.state.anchor?.row === row && this.state.anchor?.col === col;\n }\n\n /**\n * Update sheet reference\n */\n setSheet(sheet: NupWorksheet): void {\n this.sheet = sheet;\n this.clear();\n }\n\n private updateRanges(): void {\n if (!this.state.anchor || !this.state.focus) return;\n \n // Replace last range with updated selection\n const newRange = this.createRange(this.state.anchor, this.state.focus);\n if (this.state.ranges.length > 0) {\n this.state.ranges[this.state.ranges.length - 1] = newRange;\n } else {\n this.state.ranges.push(newRange);\n }\n }\n\n private createRange(\n start: { row: number; col: number },\n end: { row: number; col: number }\n ): SelectionRange {\n // Normalize so start <= end\n const minRow = Math.min(start.row, end.row);\n const maxRow = Math.max(start.row, end.row);\n const minCol = Math.min(start.col, end.col);\n const maxCol = Math.max(start.col, end.col);\n\n const cells: (NupCell | null)[][] = [];\n const cellRefs: string[] = [];\n\n for (let r = minRow; r <= maxRow; r++) {\n const rowCells: (NupCell | null)[] = [];\n for (let c = minCol; c <= maxCol; c++) {\n const ref = coordsToCellRef(r, c);\n cellRefs.push(ref);\n rowCells.push(this.sheet.cells[ref] ?? null);\n }\n cells.push(rowCells);\n }\n\n return {\n start: { row: minRow, col: minCol },\n end: { row: maxRow, col: maxCol },\n cells,\n cellRefs,\n };\n }\n\n private notifyChange(): void {\n if (this.onChange) {\n this.onChange(this.getSelection());\n }\n }\n}\n","/**\n * Keyboard Navigation Handler\n * WCAG AA compliant keyboard navigation for spreadsheet\n */\n\nimport type { SelectionHandler } from './selection';\nimport type { VirtualScroll } from './virtual-scroll';\n\nexport interface KeyboardConfig {\n enabled: boolean;\n wrapNavigation?: boolean;\n tabBehavior?: 'cell' | 'element';\n}\n\nexport type KeyboardAction =\n | 'move-up'\n | 'move-down'\n | 'move-left'\n | 'move-right'\n | 'move-page-up'\n | 'move-page-down'\n | 'move-home'\n | 'move-end'\n | 'move-ctrl-home'\n | 'move-ctrl-end'\n | 'select-all'\n | 'copy'\n | 'extend-up'\n | 'extend-down'\n | 'extend-left'\n | 'extend-right';\n\nexport class KeyboardHandler {\n private selection: SelectionHandler;\n private virtualScroll: VirtualScroll;\n private config: KeyboardConfig;\n private onScroll: ((row: number, col: number) => void) | null;\n private onCopy: (() => void) | null;\n\n constructor(\n selection: SelectionHandler,\n virtualScroll: VirtualScroll,\n config: KeyboardConfig,\n callbacks?: {\n onScroll?: (row: number, col: number) => void;\n onCopy?: () => void;\n }\n ) {\n this.selection = selection;\n this.virtualScroll = virtualScroll;\n this.config = config;\n this.onScroll = callbacks?.onScroll ?? null;\n this.onCopy = callbacks?.onCopy ?? null;\n }\n\n /**\n * Handle keydown event\n * Returns true if event was handled\n */\n handleKeyDown(event: KeyboardEvent): boolean {\n if (!this.config.enabled) return false;\n\n const action = this.getAction(event);\n if (!action) return false;\n\n event.preventDefault();\n this.executeAction(action);\n return true;\n }\n\n private getAction(event: KeyboardEvent): KeyboardAction | null {\n const { key, shiftKey, ctrlKey, metaKey } = event;\n const ctrl = ctrlKey || metaKey;\n\n // Copy\n if (ctrl && key === 'c') return 'copy';\n \n // Select all\n if (ctrl && key === 'a') return 'select-all';\n\n // Navigation with Shift (extend selection)\n if (shiftKey) {\n switch (key) {\n case 'ArrowUp': return 'extend-up';\n case 'ArrowDown': return 'extend-down';\n case 'ArrowLeft': return 'extend-left';\n case 'ArrowRight': return 'extend-right';\n }\n }\n\n // Ctrl navigation\n if (ctrl) {\n switch (key) {\n case 'Home': return 'move-ctrl-home';\n case 'End': return 'move-ctrl-end';\n }\n }\n\n // Basic navigation\n switch (key) {\n case 'ArrowUp': return 'move-up';\n case 'ArrowDown': return 'move-down';\n case 'ArrowLeft': return 'move-left';\n case 'ArrowRight': return 'move-right';\n case 'PageUp': return 'move-page-up';\n case 'PageDown': return 'move-page-down';\n case 'Home': return 'move-home';\n case 'End': return 'move-end';\n case 'Tab': return shiftKey ? 'move-left' : 'move-right';\n case 'Enter': return shiftKey ? 'move-up' : 'move-down';\n }\n\n return null;\n }\n\n private executeAction(action: KeyboardAction): void {\n const current = this.selection.getSelection();\n if (!current && !['select-all', 'move-ctrl-home'].includes(action)) {\n // No selection, start at A1\n this.selection.selectCell('A1');\n this.scrollToSelection();\n return;\n }\n\n const { row, col } = current?.start ?? { row: 0, col: 0 };\n let newRow = row;\n let newCol = col;\n\n switch (action) {\n case 'move-up':\n newRow = Math.max(0, row - 1);\n break;\n case 'move-down':\n newRow = Math.min(this.virtualScroll.rowCount - 1, row + 1);\n break;\n case 'move-left':\n newCol = Math.max(0, col - 1);\n break;\n case 'move-right':\n newCol = Math.min(this.virtualScroll.colCount - 1, col + 1);\n break;\n case 'move-page-up':\n newRow = Math.max(0, row - 20);\n break;\n case 'move-page-down':\n newRow = Math.min(this.virtualScroll.rowCount - 1, row + 20);\n break;\n case 'move-home':\n newCol = 0;\n break;\n case 'move-end':\n newCol = this.virtualScroll.colCount - 1;\n break;\n case 'move-ctrl-home':\n newRow = 0;\n newCol = 0;\n break;\n case 'move-ctrl-end':\n newRow = this.virtualScroll.rowCount - 1;\n newCol = this.virtualScroll.colCount - 1;\n break;\n case 'select-all':\n this.selection.selectAll();\n return;\n case 'copy':\n this.onCopy?.();\n return;\n case 'extend-up':\n case 'extend-down':\n case 'extend-left':\n case 'extend-right':\n this.extendSelection(action);\n return;\n }\n\n // Move selection\n this.selection.handleClick(newRow, newCol, { shiftKey: false, ctrlKey: false, metaKey: false });\n this.scrollToSelection();\n }\n\n private extendSelection(action: KeyboardAction): void {\n const current = this.selection.getSelection();\n if (!current) return;\n\n let { row, col } = current.end;\n\n switch (action) {\n case 'extend-up':\n row = Math.max(0, row - 1);\n break;\n case 'extend-down':\n row = Math.min(this.virtualScroll.rowCount - 1, row + 1);\n break;\n case 'extend-left':\n col = Math.max(0, col - 1);\n break;\n case 'extend-right':\n col = Math.min(this.virtualScroll.colCount - 1, col + 1);\n break;\n }\n\n this.selection.handleDrag(row, col);\n this.scrollToSelection();\n }\n\n private scrollToSelection(): void {\n const sel = this.selection.getSelection();\n if (!sel || !this.onScroll) return;\n \n this.onScroll(sel.start.row, sel.start.col);\n }\n\n /**\n * Update references\n */\n setVirtualScroll(vs: VirtualScroll): void {\n this.virtualScroll = vs;\n }\n\n setSelection(sel: SelectionHandler): void {\n this.selection = sel;\n }\n}\n","/**\n * Merge Cells Handler\n * Parses and manages merged cell regions\n */\n\nimport type { MergeInfo, CellRect } from '../types';\nimport { cellRefToCoords } from '../utils/cell-utils';\n\nexport class MergeHandler {\n private merges: MergeInfo[];\n private mergeMap: Map<string, MergeInfo>;\n\n constructor(mergeStrings: string[] = []) {\n this.merges = [];\n this.mergeMap = new Map();\n this.parseMerges(mergeStrings);\n }\n\n /**\n * Parse merge strings like \"A1:B2\" into structured data\n */\n private parseMerges(mergeStrings: string[]): void {\n for (const mergeStr of mergeStrings) {\n const [startRef, endRef] = mergeStr.split(':');\n if (!startRef || !endRef) continue;\n\n const start = cellRefToCoords(startRef);\n const end = cellRefToCoords(endRef);\n if (!start || !end) continue;\n\n const merge: MergeInfo = {\n startRow: Math.min(start.row, end.row),\n startCol: Math.min(start.col, end.col),\n endRow: Math.max(start.row, end.row),\n endCol: Math.max(start.col, end.col),\n cellRef: startRef,\n };\n\n this.merges.push(merge);\n\n // Map all cells in merge to the merge info\n for (let r = merge.startRow; r <= merge.endRow; r++) {\n for (let c = merge.startCol; c <= merge.endCol; c++) {\n const key = `${r},${c}`;\n this.mergeMap.set(key, merge);\n }\n }\n }\n }\n\n /**\n * Check if a cell is part of a merge\n */\n getMergeAt(row: number, col: number): MergeInfo | null {\n return this.mergeMap.get(`${row},${col}`) ?? null;\n }\n\n /**\n * Check if this cell is the top-left of a merge (the \"master\" cell)\n */\n isMergeMaster(row: number, col: number): boolean {\n const merge = this.getMergeAt(row, col);\n if (!merge) return false;\n return merge.startRow === row && merge.startCol === col;\n }\n\n /**\n * Check if this cell should be hidden (part of merge but not master)\n */\n isMergeHidden(row: number, col: number): boolean {\n const merge = this.getMergeAt(row, col);\n if (!merge) return false;\n return !(merge.startRow === row && merge.startCol === col);\n }\n\n /**\n * Get the master cell for a merged region\n */\n getMergeMaster(row: number, col: number): { row: number; col: number } | null {\n const merge = this.getMergeAt(row, col);\n if (!merge) return null;\n return { row: merge.startRow, col: merge.startCol };\n }\n\n /**\n * Get merged cell rectangle (spans multiple cells)\n */\n getMergeRect(\n row: number,\n col: number,\n getCellRect: (r: number, c: number) => CellRect\n ): CellRect | null {\n const merge = this.getMergeAt(row, col);\n if (!merge || !this.isMergeMaster(row, col)) return null;\n\n const topLeft = getCellRect(merge.startRow, merge.startCol);\n const bottomRight = getCellRect(merge.endRow, merge.endCol);\n\n return {\n top: topLeft.top,\n left: topLeft.left,\n width: bottomRight.left + bottomRight.width - topLeft.left,\n height: bottomRight.top + bottomRight.height - topLeft.top,\n };\n }\n\n /**\n * Get all merges\n */\n getAllMerges(): MergeInfo[] {\n return [...this.merges];\n }\n\n /**\n * Get merges visible in a range\n */\n getVisibleMerges(\n startRow: number,\n endRow: number,\n startCol: number,\n endCol: number\n ): MergeInfo[] {\n return this.merges.filter(merge =>\n merge.endRow >= startRow &&\n merge.startRow <= endRow &&\n merge.endCol >= startCol &&\n merge.startCol <= endCol\n );\n }\n\n /**\n * Update with new merge strings\n */\n update(mergeStrings: string[]): void {\n this.merges = [];\n this.mergeMap.clear();\n this.parseMerges(mergeStrings);\n }\n}\n","/**\n * Clipboard Handler\n * Copy selected cells to clipboard with text and HTML formats\n */\n\nimport type { SelectionRange, NupCell, ClipboardData } from '../types';\n\nexport class ClipboardHandler {\n /**\n * Copy selection to clipboard\n */\n async copyToClipboard(selection: SelectionRange): Promise<ClipboardData> {\n const data = this.formatSelection(selection);\n\n try {\n // Modern Clipboard API\n if (navigator.clipboard && typeof ClipboardItem !== 'undefined') {\n const blob = new Blob([data.html], { type: 'text/html' });\n const textBlob = new Blob([data.text], { type: 'text/plain' });\n \n await navigator.clipboard.write([\n new ClipboardItem({\n 'text/html': blob,\n 'text/plain': textBlob,\n }),\n ]);\n } else {\n // Fallback to execCommand\n await this.copyWithExecCommand(data.text);\n }\n } catch (err) {\n // Final fallback\n await this.copyWithExecCommand(data.text);\n }\n\n return data;\n }\n\n /**\n * Format selection as text (TSV) and HTML table\n */\n formatSelection(selection: SelectionRange): ClipboardData {\n const { cells } = selection;\n \n // Text format: Tab-separated values\n const textRows: string[] = [];\n for (const row of cells) {\n const textCells = row.map(cell => this.getCellValue(cell));\n textRows.push(textCells.join('\\t'));\n }\n const text = textRows.join('\\n');\n\n // HTML format: Table with inline styles\n const htmlRows: string[] = [];\n for (const row of cells) {\n const htmlCells = row.map(cell => {\n const value = this.escapeHtml(this.getCellValue(cell));\n const style = this.getCellStyle(cell);\n return `<td style=\"${style}\">${value}</td>`;\n });\n htmlRows.push(`<tr>${htmlCells.join('')}</tr>`);\n }\n \n const html = `\n <table style=\"border-collapse: collapse; font-family: Arial, sans-serif; font-size: 12px;\">\n <tbody>\n ${htmlRows.join('\\n')}\n </tbody>\n </table>\n `.trim();\n\n return { text, html, cells };\n }\n\n private getCellValue(cell: NupCell | null): string {\n if (!cell || cell.v === undefined || cell.v === null) return '';\n return String(cell.v);\n }\n\n private getCellStyle(cell: NupCell | null): string {\n const styles: string[] = [\n 'border: 1px solid #ccc',\n 'padding: 4px 8px',\n ];\n\n // Add basic styling based on cell type\n if (cell?.t === 'n') {\n styles.push('text-align: right');\n }\n\n return styles.join('; ');\n }\n\n private escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n }\n\n private async copyWithExecCommand(text: string): Promise<void> {\n const textarea = document.createElement('textarea');\n textarea.value = text;\n textarea.style.position = 'fixed';\n textarea.style.left = '-9999px';\n document.body.appendChild(textarea);\n textarea.select();\n \n try {\n document.execCommand('copy');\n } finally {\n document.body.removeChild(textarea);\n }\n }\n}\n","/**\n * Search Handler\n * Search and highlight cells matching a query\n */\n\nimport type { NupWorksheet, SearchResult } from '../types';\n\nexport interface SearchOptions {\n caseSensitive?: boolean;\n regex?: boolean;\n matchWholeCell?: boolean;\n}\n\nexport class SearchHandler {\n private sheet: NupWorksheet;\n private results: SearchResult[];\n private currentIndex: number;\n\n constructor(sheet: NupWorksheet) {\n this.sheet = sheet;\n this.results = [];\n this.currentIndex = -1;\n }\n\n /**\n * Search for a query in the sheet\n */\n search(query: string, options: SearchOptions = {}): SearchResult[] {\n if (!query) {\n this.results = [];\n this.currentIndex = -1;\n return [];\n }\n\n const { caseSensitive = false, regex = false, matchWholeCell = false } = options;\n\n let pattern: RegExp;\n try {\n if (regex) {\n pattern = new RegExp(query, caseSensitive ? 'g' : 'gi');\n } else {\n const escaped = query.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const patternStr = matchWholeCell ? `^${escaped}$` : escaped;\n pattern = new RegExp(patternStr, caseSensitive ? 'g' : 'gi');\n }\n } catch {\n // Invalid regex, treat as literal\n const escaped = query.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n pattern = new RegExp(escaped, caseSensitive ? 'g' : 'gi');\n }\n\n const results: SearchResult[] = [];\n\n // Iterate through all cells\n for (const [cellRef, cell] of Object.entries(this.sheet.cells)) {\n if (cell.v === undefined || cell.v === null) continue;\n\n const value = String(cell.v);\n pattern.lastIndex = 0;\n const match = pattern.exec(value);\n\n if (match) {\n const coords = this.parseCellRef(cellRef);\n if (coords) {\n results.push({\n row: coords.row,\n col: coords.col,\n cellRef,\n value,\n matchStart: match.index,\n matchEnd: match.index + match[0].length,\n });\n }\n }\n }\n\n // Sort by row, then column\n results.sort((a, b) => {\n if (a.row !== b.row) return a.row - b.row;\n return a.col - b.col;\n });\n\n this.results = results;\n this.currentIndex = results.length > 0 ? 0 : -1;\n\n return results;\n }\n\n /**\n * Get next search result\n */\n next(): SearchResult | null {\n if (this.results.length === 0) return null;\n this.currentIndex = (this.currentIndex + 1) % this.results.length;\n return this.results[this.currentIndex];\n }\n\n /**\n * Get previous search result\n */\n previous(): SearchResult | null {\n if (this.results.length === 0) return null;\n this.currentIndex = (this.currentIndex - 1 + this.results.length) % this.results.length;\n return this.results[this.currentIndex];\n }\n\n /**\n * Get current result\n */\n current(): SearchResult | null {\n if (this.currentIndex < 0 || this.currentIndex >= this.results.length) {\n return null;\n }\n return this.results[this.currentIndex];\n }\n\n /**\n * Get all results\n */\n getResults(): SearchResult[] {\n return [...this.results];\n }\n\n /**\n * Get result count\n */\n getCount(): number {\n return this.results.length;\n }\n\n /**\n * Get current index (1-based for display)\n */\n getCurrentIndex(): number {\n return this.currentIndex + 1;\n }\n\n /**\n * Check if a cell is a search result\n */\n isResult(row: number, col: number): boolean {\n return this.results.some(r => r.row === row && r.col === col);\n }\n\n /**\n * Check if a cell is the current result\n */\n isCurrent(row: number, col: number): boolean {\n const current = this.current();\n return current?.row === row && current?.col === col;\n }\n\n /**\n * Clear search\n */\n clear(): void {\n this.results = [];\n this.currentIndex = -1;\n }\n\n /**\n * Update sheet reference\n */\n setSheet(sheet: NupWorksheet): void {\n this.sheet = sheet;\n this.clear();\n }\n\n private parseCellRef(ref: string): { row: number; col: number } | null {\n const match = ref.match(/^([A-Z]+)(\\d+)$/i);\n if (!match) return null;\n\n const colStr = match[1].toUpperCase();\n const rowNum = parseInt(match[2], 10) - 1;\n\n let col = 0;\n for (let i = 0; i < colStr.length; i++) {\n col = col * 26 + (colStr.charCodeAt(i) - 64);\n }\n col -= 1;\n\n return { row: rowNum, col };\n }\n}\n","/**\n * Column Resize Handler\n * Drag-to-resize column widths\n */\n\nimport type { VirtualScroll } from './virtual-scroll';\n\nexport interface ResizeState {\n isResizing: boolean;\n colIndex: number;\n startX: number;\n startWidth: number;\n}\n\nexport class ResizeHandler {\n private state: ResizeState | null = null;\n private virtualScroll: VirtualScroll;\n private onChange: ((colIndex: number, width: number) => void) | null;\n private minWidth: number;\n private maxWidth: number;\n\n constructor(\n virtualScroll: VirtualScroll,\n onChange?: (colIndex: number, width: number) => void,\n minWidth = 30,\n maxWidth = 500\n ) {\n this.virtualScroll = virtualScroll;\n this.onChange = onChange ?? null;\n this.minWidth = minWidth;\n this.maxWidth = maxWidth;\n }\n\n /**\n * Start resize operation\n */\n startResize(colIndex: number, clientX: number): void {\n const currentWidth = this.virtualScroll.getColWidth(colIndex);\n \n this.state = {\n isResizing: true,\n colIndex,\n startX: clientX,\n startWidth: currentWidth,\n };\n\n // Add global event listeners\n document.addEventListener('mousemove', this.handleMouseMove);\n document.addEventListener('mouseup', this.handleMouseUp);\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n }\n\n /**\n * Handle mouse move during resize\n */\n private handleMouseMove = (event: MouseEvent): void => {\n if (!this.state) return;\n\n const delta = event.clientX - this.state.startX;\n const newWidth = Math.min(\n this.maxWidth,\n Math.max(this.minWidth, this.state.startWidth + delta)\n );\n\n this.virtualScroll.setColWidth(this.state.colIndex, newWidth);\n this.onChange?.(this.state.colIndex, newWidth);\n };\n\n /**\n * End resize operation\n */\n private handleMouseUp = (): void => {\n this.cleanup();\n };\n\n /**\n * Check if currently resizing\n */\n isResizing(): boolean {\n return this.state?.isResizing ?? false;\n }\n\n /**\n * Get current resize column\n */\n getResizeColumn(): number | null {\n return this.state?.colIndex ?? null;\n }\n\n /**\n * Cancel resize\n */\n cancel(): void {\n if (this.state) {\n // Restore original width\n this.virtualScroll.setColWidth(this.state.colIndex, this.state.startWidth);\n this.onChange?.(this.state.colIndex, this.state.startWidth);\n }\n this.cleanup();\n }\n\n /**\n * Cleanup event listeners\n */\n private cleanup(): void {\n document.removeEventListener('mousemove', this.handleMouseMove);\n document.removeEventListener('mouseup', this.handleMouseUp);\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n this.state = null;\n }\n\n /**\n * Update virtual scroll reference\n */\n setVirtualScroll(vs: VirtualScroll): void {\n this.virtualScroll = vs;\n }\n\n /**\n * Destroy handler\n */\n destroy(): void {\n this.cleanup();\n }\n}\n","/**\n * Theme Definitions (JS version)\n * For programmatic theme access\n */\n\nimport type { NupThemeConfig } from '../types';\n\nexport const themes = {\n default: {\n name: 'default',\n colors: {\n background: '#ffffff',\n foreground: '#202124',\n grid: '#e0e0e0',\n headerBackground: '#f8f9fa',\n headerForeground: '#5f6368',\n selectionBorder: '#1a73e8',\n selectionBackground: 'rgba(26, 115, 232, 0.08)',\n frozenBorder: '#dadce0',\n },\n fonts: {\n family: \"'Google Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n size: '13px',\n headerSize: '11px',\n },\n },\n\n excel: {\n name: 'excel',\n colors: {\n background: '#ffffff',\n foreground: '#000000',\n grid: '#d4d4d4',\n headerBackground: '#f0f0f0',\n headerForeground: '#000000',\n selectionBorder: '#217346',\n selectionBackground: 'rgba(33, 115, 70, 0.1)',\n frozenBorder: '#9bc2e6',\n },\n fonts: {\n family: \"'Calibri', 'Segoe UI', sans-serif\",\n size: '11px',\n headerSize: '11px',\n },\n },\n\n modern: {\n name: 'modern',\n colors: {\n background: '#fafafa',\n foreground: '#18181b',\n grid: '#e4e4e7',\n headerBackground: '#f4f4f5',\n headerForeground: '#71717a',\n selectionBorder: '#3b82f6',\n selectionBackground: 'rgba(59, 130, 246, 0.08)',\n frozenBorder: '#a1a1aa',\n },\n fonts: {\n family: \"'Inter', -apple-system, BlinkMacSystemFont, sans-serif\",\n size: '13px',\n headerSize: '11px',\n },\n },\n\n minimal: {\n name: 'minimal',\n colors: {\n background: '#ffffff',\n foreground: '#27272a',\n grid: '#f4f4f5',\n headerBackground: '#ffffff',\n headerForeground: '#a1a1aa',\n selectionBorder: '#18181b',\n selectionBackground: 'rgba(24, 24, 27, 0.04)',\n frozenBorder: '#e4e4e7',\n },\n fonts: {\n family: \"'SF Pro Display', -apple-system, BlinkMacSystemFont, sans-serif\",\n size: '13px',\n headerSize: '11px',\n },\n },\n\n dark: {\n name: 'dark',\n colors: {\n background: '#1e1e1e',\n foreground: '#d4d4d4',\n grid: '#3c3c3c',\n headerBackground: '#252526',\n headerForeground: '#858585',\n selectionBorder: '#0078d4',\n selectionBackground: 'rgba(0, 120, 212, 0.2)',\n frozenBorder: '#4a4a4a',\n },\n fonts: {\n family: \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n size: '13px',\n headerSize: '11px',\n },\n },\n\n midnight: {\n name: 'midnight',\n colors: {\n background: '#0d1117',\n foreground: '#c9d1d9',\n grid: '#21262d',\n headerBackground: '#161b22',\n headerForeground: '#8b949e',\n selectionBorder: '#58a6ff',\n selectionBackground: 'rgba(88, 166, 255, 0.15)',\n frozenBorder: '#30363d',\n },\n fonts: {\n family: \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n size: '13px',\n headerSize: '11px',\n },\n },\n\n accessible: {\n name: 'accessible',\n colors: {\n background: '#ffffff',\n foreground: '#000000',\n grid: '#000000',\n headerBackground: '#e6e6e6',\n headerForeground: '#000000',\n selectionBorder: '#0000ff',\n selectionBackground: 'rgba(0, 0, 255, 0.15)',\n frozenBorder: '#000000',\n },\n fonts: {\n family: \"Arial, Helvetica, sans-serif\",\n size: '14px',\n headerSize: '12px',\n },\n },\n} as const satisfies Record<string, NupThemeConfig>;\n\nexport type ThemeName = keyof typeof themes;\n\n/**\n * Get theme by name\n */\nexport function getTheme(name: ThemeName): NupThemeConfig {\n return themes[name] ?? themes.default;\n}\n\n/**\n * Apply theme CSS variables to an element\n */\nexport function applyTheme(element: HTMLElement, theme: NupThemeConfig): void {\n const style = element.style;\n \n style.setProperty('--nup-background', theme.colors.background);\n style.setProperty('--nup-foreground', theme.colors.foreground);\n style.setProperty('--nup-grid', theme.colors.grid);\n style.setProperty('--nup-header-bg', theme.colors.headerBackground);\n style.setProperty('--nup-header-fg', theme.colors.headerForeground);\n style.setProperty('--nup-selection-border', theme.colors.selectionBorder);\n style.setProperty('--nup-selection-bg', theme.colors.selectionBackground);\n style.setProperty('--nup-frozen-border', theme.colors.frozenBorder);\n style.setProperty('--nup-font-family', theme.fonts.family);\n style.setProperty('--nup-font-size', theme.fonts.size);\n}\n\n/**\n * Get theme class name\n */\nexport function getThemeClass(name: ThemeName): string {\n return `nup-theme-${name}`;\n}\n","/**\n * Vanilla JS Adapter\n * @aspect/nup-xlsx-preview Vanilla JS API\n */\n\nimport type {\n PreviewConfig,\n PreviewEvents,\n PreviewInstance,\n NupWorkbook,\n NupThemeConfig,\n SelectionRange,\n SearchResult,\n} from '../types';\n\nimport { VirtualScroll } from '../core/virtual-scroll';\nimport { SelectionHandler } from '../core/selection';\nimport { KeyboardHandler } from '../core/keyboard';\nimport { MergeHandler } from '../core/merge-handler';\nimport { ClipboardHandler } from '../core/clipboard';\nimport { SearchHandler } from '../core/search';\nimport { ResizeHandler } from '../core/resize';\nimport { themes, applyTheme, getThemeClass, type ThemeName } from '../core/themes';\nimport { colIndexToLetter, coordsToCellRef, cellRefToCoords } from '../utils/cell-utils';\n\nexport interface CreatePreviewOptions extends Partial<PreviewConfig>, PreviewEvents {\n workbook: NupWorkbook;\n}\n\nexport function createSpreadsheetPreview(\n container: HTMLElement | string,\n options: CreatePreviewOptions\n): PreviewInstance {\n const el = typeof container === 'string'\n ? document.querySelector<HTMLElement>(container)\n : container;\n\n if (!el) {\n throw new Error('Container element not found');\n }\n\n const {\n workbook,\n activeSheet: initialActiveSheet = 0,\n theme: themeProp = 'default',\n width = '100%',\n height = '400px',\n showHeaders = true,\n showGridLines = true,\n showSheetTabs = true,\n selectable = true,\n resizable = true,\n searchable: _searchable = false,\n copyable = true,\n keyboardNavigation = true,\n frozenRows: _frozenRows = 0,\n frozenCols: _frozenCols = 0,\n overscan = 5,\n defaultRowHeight = 24,\n defaultColWidth = 100,\n ariaLabel = 'Spreadsheet',\n onCellClick,\n onCellDoubleClick,\n onCellRightClick,\n onSelectionChange,\n onSheetChange,\n onColumnResize,\n onScroll,\n onSearch,\n onCopy,\n } = options;\n\n // State\n let activeSheet = initialActiveSheet;\n let scrollTop = 0;\n let scrollLeft = 0;\n let viewportWidth = 0;\n let viewportHeight = 0;\n let selection: SelectionRange | null = null;\n let searchResults: SearchResult[] = [];\n\n // Get current sheet\n const getSheet = () => workbook.sheets[activeSheet] ?? workbook.sheets[0];\n\n // Get theme config\n const getThemeConfig = (): NupThemeConfig => {\n if (typeof themeProp === 'string') {\n return themes[themeProp as ThemeName] ?? themes.default;\n }\n return themeProp;\n };\n\n // Initialize handlers\n let virtualScroll: VirtualScroll;\n let selectionHandler: SelectionHandler;\n let mergeHandler: MergeHandler;\n let searchHandler: SearchHandler;\n let clipboardHandler: ClipboardHandler;\n let resizeHandler: ResizeHandler;\n let keyboardHandler: KeyboardHandler;\n\n const initHandlers = () => {\n const sheet = getSheet();\n const rowHeights: Record<number, number> = {};\n const colWidths: Record<number, number> = {};\n\n Object.entries(sheet.rows).forEach(([idx, row]) => {\n if (row.h) rowHeights[parseInt(idx)] = row.h;\n });\n\n Object.entries(sheet.cols).forEach(([idx, col]) => {\n if (col.w) colWidths[parseInt(idx)] = col.w;\n });\n\n virtualScroll = new VirtualScroll({\n rows: sheet.rowCount,\n cols: sheet.colCount,\n rowHeights,\n colWidths,\n defaultRowHeight,\n defaultColWidth,\n overscan,\n });\n\n selectionHandler = new SelectionHandler(sheet, (sel) => {\n selection = sel;\n onSelectionChange?.(sel);\n render();\n });\n\n mergeHandler = new MergeHandler(sheet.merges ?? []);\n searchHandler = new SearchHandler(sheet);\n clipboardHandler = new ClipboardHandler();\n\n resizeHandler = new ResizeHandler(virtualScroll, (colIndex, w) => {\n onColumnResize?.(colIndex, w);\n render();\n });\n\n keyboardHandler = new KeyboardHandler(\n selectionHandler,\n virtualScroll,\n { enabled: keyboardNavigation },\n {\n onScroll: (row, col) => {\n const pos = virtualScroll.getScrollToPosition(row, col, viewportHeight, viewportWidth);\n scrollContainer?.scrollTo({ top: pos.scrollTop, left: pos.scrollLeft, behavior: 'smooth' });\n },\n onCopy: async () => {\n const sel = selectionHandler.getSelection();\n if (sel && copyable) {\n const data = await clipboardHandler.copyToClipboard(sel);\n onCopy?.(data);\n }\n },\n }\n );\n };\n\n // Create DOM structure\n const headerHeight = showHeaders ? 24 : 0;\n const headerWidth = showHeaders ? 40 : 0;\n\n const themeClass = typeof themeProp === 'string' ? getThemeClass(themeProp as ThemeName) : '';\n\n el.innerHTML = `\n <div class=\"nup-spreadsheet ${themeClass} ${!showGridLines ? 'nup-no-gridlines' : ''}\"\n style=\"width: ${typeof width === 'number' ? width + 'px' : width}; height: ${typeof height === 'number' ? height + 'px' : height};\"\n tabindex=\"0\"\n role=\"grid\"\n aria-label=\"${ariaLabel}\">\n ${showHeaders ? `<div class=\"nup-corner\" style=\"width: ${headerWidth}px; height: ${headerHeight}px;\"></div>` : ''}\n ${showHeaders ? `\n <div class=\"nup-header-row-container\" style=\"position: absolute; top: 0; left: ${headerWidth}px; right: 0; height: ${headerHeight}px; overflow: hidden;\">\n <div class=\"nup-header-row-inner\" style=\"position: relative; height: ${headerHeight}px;\"></div>\n </div>\n <div class=\"nup-header-col-container\" style=\"position: absolute; top: ${headerHeight}px; left: 0; bottom: ${showSheetTabs ? '32px' : '0'}; width: ${headerWidth}px; overflow: hidden;\">\n <div class=\"nup-header-col-inner\" style=\"position: relative; width: ${headerWidth}px;\"></div>\n </div>\n ` : ''}\n <div class=\"nup-scroll-container\" style=\"top: ${headerHeight}px; left: ${headerWidth}px; right: 0; bottom: ${showSheetTabs ? '32px' : '0'};\">\n <div class=\"nup-content\"></div>\n </div>\n ${showSheetTabs && workbook.sheets.length > 1 ? '<div class=\"nup-sheet-tabs\"></div>' : ''}\n </div>\n `;\n\n const spreadsheet = el.querySelector<HTMLElement>('.nup-spreadsheet')!;\n const scrollContainer = el.querySelector<HTMLElement>('.nup-scroll-container')!;\n const content = el.querySelector<HTMLElement>('.nup-content')!;\n const headerRowInner = el.querySelector<HTMLElement>('.nup-header-row-inner');\n const headerColInner = el.querySelector<HTMLElement>('.nup-header-col-inner');\n const sheetTabs = el.querySelector<HTMLElement>('.nup-sheet-tabs');\n\n // Apply theme\n applyTheme(spreadsheet, getThemeConfig());\n\n // Initialize\n initHandlers();\n\n // Resize observer\n const resizeObserver = new ResizeObserver((entries) => {\n const entry = entries[0];\n if (entry) {\n viewportWidth = entry.contentRect.width;\n viewportHeight = entry.contentRect.height;\n render();\n }\n });\n resizeObserver.observe(scrollContainer);\n viewportWidth = scrollContainer.clientWidth;\n viewportHeight = scrollContainer.clientHeight;\n\n // Scroll handler\n scrollContainer.addEventListener('scroll', () => {\n scrollTop = scrollContainer.scrollTop;\n scrollLeft = scrollContainer.scrollLeft;\n\n if (headerRowInner) {\n headerRowInner.style.transform = `translateX(${-scrollLeft}px)`;\n }\n if (headerColInner) {\n headerColInner.style.transform = `translateY(${-scrollTop}px)`;\n }\n\n const range = virtualScroll.getVisibleRange(scrollTop, scrollLeft, viewportHeight, viewportWidth);\n onScroll?.({\n scrollTop,\n scrollLeft,\n visibleRows: { start: range.startRow, end: range.endRow },\n visibleCols: { start: range.startCol, end: range.endCol },\n });\n\n render();\n });\n\n // Keyboard handler\n spreadsheet.addEventListener('keydown', (e) => {\n keyboardHandler.handleKeyDown(e);\n });\n\n // Render function\n const render = () => {\n const sheet = getSheet();\n const range = virtualScroll.getVisibleRange(scrollTop, scrollLeft, viewportHeight, viewportWidth);\n\n // Set content size\n content.style.width = `${virtualScroll.totalWidth}px`;\n content.style.height = `${virtualScroll.totalHeight}px`;\n\n if (headerRowInner) {\n headerRowInner.style.width = `${virtualScroll.totalWidth}px`;\n }\n if (headerColInner) {\n headerColInner.style.height = `${virtualScroll.totalHeight}px`;\n }\n\n // Render cells\n let cellsHtml = '';\n for (let r = range.startRow; r <= range.endRow; r++) {\n for (let c = range.startCol; c <= range.endCol; c++) {\n if (mergeHandler.isMergeHidden(r, c)) continue;\n\n const rect = mergeHandler.getMergeRect(r, c, (row, col) => virtualScroll.getCellRect(row, col))\n ?? virtualScroll.getCellRect(r, c);\n\n const cellRef = coordsToCellRef(r, c);\n const cell = sheet.cells[cellRef];\n const isSelected = selectionHandler.isCellSelected(r, c);\n const isAnchor = selectionHandler.isAnchor(r, c);\n const isSearchResult = searchResults.some(s => s.row === r && s.col === c);\n\n const classes = [\n 'nup-cell',\n cell?.t === 'n' ? 'nup-cell-number' : '',\n isSelected ? 'nup-cell-selected' : '',\n isAnchor ? 'nup-cell-anchor' : '',\n isSearchResult ? 'nup-cell-search-result' : '',\n ].filter(Boolean).join(' ');\n\n const value = cell?.v !== undefined && cell?.v !== null ? String(cell.v) : '';\n\n cellsHtml += `\n <div class=\"${classes}\"\n style=\"top: ${rect.top}px; left: ${rect.left}px; width: ${rect.width}px; height: ${rect.height}px;\"\n data-row=\"${r}\" data-col=\"${c}\" data-cell-ref=\"${cellRef}\">\n ${escapeHtml(value)}\n </div>\n `;\n }\n }\n\n // Selection border\n if (selection) {\n const startRect = virtualScroll.getCellRect(selection.start.row, selection.start.col);\n const endRect = virtualScroll.getCellRect(selection.end.row, selection.end.col);\n cellsHtml += `\n <div class=\"nup-selection-border\"\n style=\"top: ${startRect.top}px; left: ${startRect.left}px; width: ${endRect.left + endRect.width - startRect.left}px; height: ${endRect.top + endRect.height - startRect.top}px;\">\n </div>\n `;\n }\n\n content.innerHTML = cellsHtml;\n\n // Render headers\n if (showHeaders && headerRowInner) {\n let colHeadersHtml = '';\n for (let c = range.startCol; c <= range.endCol; c++) {\n const rect = virtualScroll.getCellRect(0, c);\n const isSelected = selection && c >= selection.start.col && c <= selection.end.col;\n colHeadersHtml += `\n <div class=\"nup-header nup-header-col ${isSelected ? 'nup-header-selected' : ''}\"\n style=\"left: ${rect.left}px; width: ${rect.width}px; height: ${headerHeight}px;\">\n ${colIndexToLetter(c)}\n ${resizable ? '<div class=\"nup-resize-handle\" data-col=\"' + c + '\"></div>' : ''}\n </div>\n `;\n }\n headerRowInner.innerHTML = colHeadersHtml;\n }\n\n if (showHeaders && headerColInner) {\n let rowHeadersHtml = '';\n for (let r = range.startRow; r <= range.endRow; r++) {\n const rect = virtualScroll.getCellRect(r, 0);\n const isSelected = selection && r >= selection.start.row && r <= selection.end.row;\n rowHeadersHtml += `\n <div class=\"nup-header nup-header-row ${isSelected ? 'nup-header-selected' : ''}\"\n style=\"top: ${rect.top}px; width: ${headerWidth}px; height: ${rect.height}px;\">\n ${r + 1}\n </div>\n `;\n }\n headerColInner.innerHTML = rowHeadersHtml;\n }\n\n // Render sheet tabs\n if (sheetTabs && workbook.sheets.length > 1) {\n sheetTabs.innerHTML = workbook.sheets.map((s, i) => `\n <button class=\"nup-sheet-tab ${i === activeSheet ? 'nup-sheet-tab-active' : ''}\" data-sheet=\"${i}\">\n ${escapeHtml(s.name)}\n </button>\n `).join('');\n }\n };\n\n // Cell click handler\n content.addEventListener('click', (e) => {\n if (!selectable) return;\n\n const target = (e.target as HTMLElement).closest<HTMLElement>('.nup-cell');\n if (!target) return;\n\n const row = parseInt(target.dataset.row ?? '0');\n const col = parseInt(target.dataset.col ?? '0');\n const cellRef = target.dataset.cellRef ?? '';\n\n selectionHandler.handleClick(row, col, {\n shiftKey: e.shiftKey,\n ctrlKey: e.ctrlKey,\n metaKey: e.metaKey,\n });\n\n onCellClick?.({\n cell: getSheet().cells[cellRef] ?? null,\n row,\n col,\n cellRef,\n originalEvent: e,\n });\n });\n\n // Double click handler\n content.addEventListener('dblclick', (e) => {\n const target = (e.target as HTMLElement).closest<HTMLElement>('.nup-cell');\n if (!target) return;\n\n const row = parseInt(target.dataset.row ?? '0');\n const col = parseInt(target.dataset.col ?? '0');\n const cellRef = target.dataset.cellRef ?? '';\n\n onCellDoubleClick?.({\n cell: getSheet().cells[cellRef] ?? null,\n row,\n col,\n cellRef,\n originalEvent: e,\n });\n });\n\n // Right click handler\n content.addEventListener('contextmenu', (e) => {\n const target = (e.target as HTMLElement).closest<HTMLElement>('.nup-cell');\n if (!target) return;\n\n e.preventDefault();\n\n const row = parseInt(target.dataset.row ?? '0');\n const col = parseInt(target.dataset.col ?? '0');\n const cellRef = target.dataset.cellRef ?? '';\n\n onCellRightClick?.({\n cell: getSheet().cells[cellRef] ?? null,\n row,\n col,\n cellRef,\n originalEvent: e,\n });\n });\n\n // Sheet tab click handler\n sheetTabs?.addEventListener('click', (e) => {\n const target = (e.target as HTMLElement).closest<HTMLElement>('.nup-sheet-tab');\n if (!target) return;\n\n const sheetIndex = parseInt(target.dataset.sheet ?? '0');\n activeSheet = sheetIndex;\n initHandlers();\n onSheetChange?.(sheetIndex);\n render();\n });\n\n // Resize handle handler\n if (resizable && headerRowInner) {\n headerRowInner.addEventListener('mousedown', (e) => {\n const target = (e.target as HTMLElement).closest<HTMLElement>('.nup-resize-handle');\n if (!target) return;\n\n const col = parseInt(target.dataset.col ?? '0');\n resizeHandler.startResize(col, e.clientX);\n });\n }\n\n // Initial render\n render();\n\n // Return instance\n const instance: PreviewInstance = {\n scrollTo: (row, col) => {\n const pos = virtualScroll.getScrollToPosition(row, col, viewportHeight, viewportWidth);\n scrollContainer.scrollTo({ top: pos.scrollTop, left: pos.scrollLeft, behavior: 'smooth' });\n },\n scrollToCell: (cellRef) => {\n const coords = cellRefToCoords(cellRef);\n if (coords) {\n const pos = virtualScroll.getScrollToPosition(coords.row, coords.col, viewportHeight, viewportWidth);\n scrollContainer.scrollTo({ top: pos.scrollTop, left: pos.scrollLeft, behavior: 'smooth' });\n }\n },\n select: (range) => {\n selection = range;\n render();\n },\n selectCell: (cellRef) => {\n selectionHandler.selectCell(cellRef);\n },\n selectAll: () => {\n selectionHandler.selectAll();\n },\n clearSelection: () => {\n selectionHandler.clear();\n },\n getSelection: () => selection,\n setActiveSheet: (index) => {\n activeSheet = index;\n initHandlers();\n onSheetChange?.(index);\n render();\n },\n getActiveSheet: () => activeSheet,\n search: (query) => {\n const results = searchHandler.search(query);\n searchResults = results;\n onSearch?.(results);\n render();\n return results;\n },\n highlightResults: (results) => {\n searchResults = results;\n render();\n },\n clearHighlights: () => {\n searchResults = [];\n render();\n },\n getWorkbook: () => workbook,\n getVisibleCells: () => {\n const sheet = getSheet();\n const range = virtualScroll.getVisibleRange(scrollTop, scrollLeft, viewportHeight, viewportWidth);\n const cells: (typeof sheet.cells[string] | null)[][] = [];\n for (let r = range.startRow; r <= range.endRow; r++) {\n const row: (typeof sheet.cells[string] | null)[] = [];\n for (let c = range.startCol; c <= range.endCol; c++) {\n row.push(sheet.cells[coordsToCellRef(r, c)] ?? null);\n }\n cells.push(row);\n }\n return cells;\n },\n getCellAt: (row, col) => getSheet().cells[coordsToCellRef(row, col)] ?? null,\n copySelection: async () => {\n const sel = selectionHandler.getSelection();\n if (sel) {\n const data = await clipboardHandler.copyToClipboard(sel);\n onCopy?.(data);\n }\n },\n setColumnWidth: (col, w) => {\n virtualScroll.setColWidth(col, w);\n render();\n },\n autoFitColumn: () => {},\n autoFitAllColumns: () => {},\n refresh: () => render(),\n destroy: () => {\n resizeObserver.disconnect();\n resizeHandler.destroy();\n el.innerHTML = '';\n },\n };\n\n return instance;\n}\n\nfunction escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"');\n}\n\nexport default createSpreadsheetPreview;\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var vue=require('vue');var P=class{rowPositions;colPositions;rowHeightCache;colWidthCache;totalHeight;totalWidth;overscan;rowCount;colCount;frozenRows;frozenCols;frozenRowsHeight;frozenColsWidth;constructor(e){let{rows:t,cols:o,rowHeights:n,colWidths:r,defaultRowHeight:s=24,defaultColWidth:a=100,overscan:u=5,frozenRows:c=0,frozenCols:g=0}=e;this.frozenRows=c,this.frozenCols=g,this.rowCount=t,this.colCount=o,this.overscan=u,this.rowPositions=new Array(t+1),this.rowHeightCache=new Array(t),this.rowPositions[0]=0;for(let h=0;h<t;h++){let f=n[h]??s;this.rowHeightCache[h]=f,this.rowPositions[h+1]=this.rowPositions[h]+f;}this.totalHeight=this.rowPositions[t],this.frozenRowsHeight=c>0?this.rowPositions[c]??0:0,this.colPositions=new Array(o+1),this.colWidthCache=new Array(o),this.colPositions[0]=0;for(let h=0;h<o;h++){let f=r[h]??a;this.colWidthCache[h]=f,this.colPositions[h+1]=this.colPositions[h]+f;}this.totalWidth=this.colPositions[o],this.frozenColsWidth=g>0?this.colPositions[g]??0:0;}getFrozenInfo(){return {rows:this.frozenRows,cols:this.frozenCols,frozenRowsHeight:this.frozenRowsHeight,frozenColsWidth:this.frozenColsWidth}}binarySearch(e,t){let o=0,n=e.length-2;for(;o<=n;){let r=o+n>>>1,s=e[r],a=e[r+1];if(t>=s&&t<a)return r;t<s?n=r-1:o=r+1;}return Math.max(0,Math.min(o,e.length-2))}getVisibleRange(e,t,o,n){let r=e+this.frozenRowsHeight,s=t+this.frozenColsWidth,a=this.binarySearch(this.rowPositions,r),u=this.binarySearch(this.rowPositions,r+Math.max(0,o)),c=this.binarySearch(this.colPositions,s),g=this.binarySearch(this.colPositions,s+Math.max(0,n)),h=Math.max(this.frozenRows,a-this.overscan),f=Math.min(this.rowCount-1,u+this.overscan),T=Math.max(this.frozenCols,c-this.overscan),C=Math.min(this.colCount-1,g+this.overscan);return {startRow:h,endRow:f,startCol:T,endCol:C}}getFrozenRowsRange(){return this.frozenRows===0?null:{startRow:0,endRow:this.frozenRows-1}}getFrozenColsRange(){return this.frozenCols===0?null:{startCol:0,endCol:this.frozenCols-1}}getCellRect(e,t){return {top:this.rowPositions[e]??0,left:this.colPositions[t]??0,width:this.colWidthCache[t]??100,height:this.rowHeightCache[e]??24}}getRowHeight(e){return this.rowHeightCache[e]??24}getColWidth(e){return this.colWidthCache[e]??100}setColWidth(e,t){if(e<0||e>=this.colCount)return;let o=this.colWidthCache[e],n=t-o;this.colWidthCache[e]=t;for(let r=e+1;r<=this.colCount;r++)this.colPositions[r]+=n;this.totalWidth+=n;}getIndexAtPosition(e,t){return {row:this.binarySearch(this.rowPositions,e),col:this.binarySearch(this.colPositions,t)}}getScrollToPosition(e,t,o,n){let r=this.rowPositions[e]??0,s=this.colPositions[t]??0;return {scrollTop:Math.max(0,r-o/2),scrollLeft:Math.max(0,s-n/2)}}};function q(i){let e="",t=i;for(;t>=0;)e=String.fromCharCode(t%26+65)+e,t=Math.floor(t/26)-1;return e}function ee(i){let e=0,t=i.toUpperCase();for(let o=0;o<t.length;o++)e=e*26+(t.charCodeAt(o)-64);return e-1}function M(i,e){return `${q(e)}${i+1}`}function S(i){let e=i.match(/^([A-Z]+)(\d+)$/i);if(!e)return null;let t=ee(e[1]),o=parseInt(e[2],10)-1;return o<0||t<0?null:{row:o,col:t}}var I=class{state;sheet;onChange;constructor(e,t){this.sheet=e,this.onChange=t??null,this.state={anchor:null,focus:null,ranges:[]};}handleClick(e,t,o){let{shiftKey:n,ctrlKey:r,metaKey:s}=o;n&&this.state.anchor?(this.state.focus={row:e,col:t},this.updateRanges()):r||s?(this.state.anchor={row:e,col:t},this.state.focus={row:e,col:t},this.state.ranges.push(this.createRange(this.state.anchor,this.state.focus))):(this.state.anchor={row:e,col:t},this.state.focus={row:e,col:t},this.state.ranges=[this.createRange(this.state.anchor,this.state.focus)]),this.notifyChange();}handleDrag(e,t){this.state.anchor&&(this.state.focus={row:e,col:t},this.updateRanges(),this.notifyChange());}selectCell(e){let t=S(e);t&&(this.state.anchor=t,this.state.focus=t,this.state.ranges=[this.createRange(t,t)],this.notifyChange());}selectRange(e,t){let o=S(e),n=S(t);!o||!n||(this.state.anchor=o,this.state.focus=n,this.state.ranges=[this.createRange(o,n)],this.notifyChange());}selectAll(){this.state.anchor={row:0,col:0},this.state.focus={row:this.sheet.rowCount-1,col:this.sheet.colCount-1},this.state.ranges=[this.createRange(this.state.anchor,this.state.focus)],this.notifyChange();}clear(){this.state.anchor=null,this.state.focus=null,this.state.ranges=[],this.notifyChange();}getSelection(){return this.state.ranges.length===0?null:this.state.ranges[0]}getAllSelections(){return [...this.state.ranges]}isCellSelected(e,t){return this.state.ranges.some(o=>e>=o.start.row&&e<=o.end.row&&t>=o.start.col&&t<=o.end.col)}isAnchor(e,t){return this.state.anchor?.row===e&&this.state.anchor?.col===t}setSheet(e){this.sheet=e,this.clear();}updateRanges(){if(!this.state.anchor||!this.state.focus)return;let e=this.createRange(this.state.anchor,this.state.focus);this.state.ranges.length>0?this.state.ranges[this.state.ranges.length-1]=e:this.state.ranges.push(e);}createRange(e,t){let o=Math.min(e.row,t.row),n=Math.max(e.row,t.row),r=Math.min(e.col,t.col),s=Math.max(e.col,t.col),a=[],u=[];for(let c=o;c<=n;c++){let g=[];for(let h=r;h<=s;h++){let f=M(c,h);u.push(f),g.push(this.sheet.cells[f]??null);}a.push(g);}return {start:{row:o,col:r},end:{row:n,col:s},cells:a,cellRefs:u}}notifyChange(){this.onChange&&this.onChange(this.getSelection());}};var B=class{selection;virtualScroll;config;onScroll;onCopy;constructor(e,t,o,n){this.selection=e,this.virtualScroll=t,this.config=o,this.onScroll=n?.onScroll??null,this.onCopy=n?.onCopy??null;}handleKeyDown(e){if(!this.config.enabled)return false;let t=this.getAction(e);return t?(e.preventDefault(),this.executeAction(t),true):false}getAction(e){let{key:t,shiftKey:o,ctrlKey:n,metaKey:r}=e,s=n||r;if(s&&t==="c")return "copy";if(s&&t==="a")return "select-all";if(o)switch(t){case "ArrowUp":return "extend-up";case "ArrowDown":return "extend-down";case "ArrowLeft":return "extend-left";case "ArrowRight":return "extend-right"}if(s)switch(t){case "Home":return "move-ctrl-home";case "End":return "move-ctrl-end"}switch(t){case "ArrowUp":return "move-up";case "ArrowDown":return "move-down";case "ArrowLeft":return "move-left";case "ArrowRight":return "move-right";case "PageUp":return "move-page-up";case "PageDown":return "move-page-down";case "Home":return "move-home";case "End":return "move-end";case "Tab":return o?"move-left":"move-right";case "Enter":return o?"move-up":"move-down"}return null}executeAction(e){let t=this.selection.getSelection();if(!t&&!["select-all","move-ctrl-home"].includes(e)){this.selection.selectCell("A1"),this.scrollToSelection();return}let{row:o,col:n}=t?.start??{row:0,col:0},r=o,s=n;switch(e){case "move-up":r=Math.max(0,o-1);break;case "move-down":r=Math.min(this.virtualScroll.rowCount-1,o+1);break;case "move-left":s=Math.max(0,n-1);break;case "move-right":s=Math.min(this.virtualScroll.colCount-1,n+1);break;case "move-page-up":r=Math.max(0,o-20);break;case "move-page-down":r=Math.min(this.virtualScroll.rowCount-1,o+20);break;case "move-home":s=0;break;case "move-end":s=this.virtualScroll.colCount-1;break;case "move-ctrl-home":r=0,s=0;break;case "move-ctrl-end":r=this.virtualScroll.rowCount-1,s=this.virtualScroll.colCount-1;break;case "select-all":this.selection.selectAll();return;case "copy":this.onCopy?.();return;case "extend-up":case "extend-down":case "extend-left":case "extend-right":this.extendSelection(e);return}this.selection.handleClick(r,s,{shiftKey:false,ctrlKey:false,metaKey:false}),this.scrollToSelection();}extendSelection(e){let t=this.selection.getSelection();if(!t)return;let{row:o,col:n}=t.end;switch(e){case "extend-up":o=Math.max(0,o-1);break;case "extend-down":o=Math.min(this.virtualScroll.rowCount-1,o+1);break;case "extend-left":n=Math.max(0,n-1);break;case "extend-right":n=Math.min(this.virtualScroll.colCount-1,n+1);break}this.selection.handleDrag(o,n),this.scrollToSelection();}scrollToSelection(){let e=this.selection.getSelection();!e||!this.onScroll||this.onScroll(e.start.row,e.start.col);}setVirtualScroll(e){this.virtualScroll=e;}setSelection(e){this.selection=e;}};var A=class{merges;mergeMap;constructor(e=[]){this.merges=[],this.mergeMap=new Map,this.parseMerges(e);}parseMerges(e){for(let t of e){let[o,n]=t.split(":");if(!o||!n)continue;let r=S(o),s=S(n);if(!r||!s)continue;let a={startRow:Math.min(r.row,s.row),startCol:Math.min(r.col,s.col),endRow:Math.max(r.row,s.row),endCol:Math.max(r.col,s.col),cellRef:o};this.merges.push(a);for(let u=a.startRow;u<=a.endRow;u++)for(let c=a.startCol;c<=a.endCol;c++){let g=`${u},${c}`;this.mergeMap.set(g,a);}}}getMergeAt(e,t){return this.mergeMap.get(`${e},${t}`)??null}isMergeMaster(e,t){let o=this.getMergeAt(e,t);return o?o.startRow===e&&o.startCol===t:false}isMergeHidden(e,t){let o=this.getMergeAt(e,t);return o?!(o.startRow===e&&o.startCol===t):false}getMergeMaster(e,t){let o=this.getMergeAt(e,t);return o?{row:o.startRow,col:o.startCol}:null}getMergeRect(e,t,o){let n=this.getMergeAt(e,t);if(!n||!this.isMergeMaster(e,t))return null;let r=o(n.startRow,n.startCol),s=o(n.endRow,n.endCol);return {top:r.top,left:r.left,width:s.left+s.width-r.left,height:s.top+s.height-r.top}}getAllMerges(){return [...this.merges]}getVisibleMerges(e,t,o,n){return this.merges.filter(r=>r.endRow>=e&&r.startRow<=t&&r.endCol>=o&&r.startCol<=n)}update(e){this.merges=[],this.mergeMap.clear(),this.parseMerges(e);}};var N=class{async copyToClipboard(e){let t=this.formatSelection(e);try{if(navigator.clipboard&&typeof ClipboardItem<"u"){let o=new Blob([t.html],{type:"text/html"}),n=new Blob([t.text],{type:"text/plain"});await navigator.clipboard.write([new ClipboardItem({"text/html":o,"text/plain":n})]);}else await this.copyWithExecCommand(t.text);}catch{await this.copyWithExecCommand(t.text);}return t}formatSelection(e){let{cells:t}=e,o=[];for(let a of t){let u=a.map(c=>this.getCellValue(c));o.push(u.join(" "));}let n=o.join(`
|
|
2
|
+
`),r=[];for(let a of t){let u=a.map(c=>{let g=this.escapeHtml(this.getCellValue(c));return `<td style="${this.getCellStyle(c)}">${g}</td>`});r.push(`<tr>${u.join("")}</tr>`);}let s=`
|
|
3
|
+
<table style="border-collapse: collapse; font-family: Arial, sans-serif; font-size: 12px;">
|
|
4
|
+
<tbody>
|
|
5
|
+
${r.join(`
|
|
6
|
+
`)}
|
|
7
|
+
</tbody>
|
|
8
|
+
</table>
|
|
9
|
+
`.trim();return {text:n,html:s,cells:t}}getCellValue(e){return !e||e.v===void 0||e.v===null?"":String(e.v)}getCellStyle(e){let t=["border: 1px solid #ccc","padding: 4px 8px"];return e?.t==="n"&&t.push("text-align: right"),t.join("; ")}escapeHtml(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}async copyWithExecCommand(e){let t=document.createElement("textarea");t.value=e,t.style.position="fixed",t.style.left="-9999px",document.body.appendChild(t),t.select();try{document.execCommand("copy");}finally{document.body.removeChild(t);}}};var K=class{sheet;results;currentIndex;constructor(e){this.sheet=e,this.results=[],this.currentIndex=-1;}search(e,t={}){if(!e)return this.results=[],this.currentIndex=-1,[];let{caseSensitive:o=false,regex:n=false,matchWholeCell:r=false}=t,s;try{if(n)s=new RegExp(e,o?"g":"gi");else {let u=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),c=r?`^${u}$`:u;s=new RegExp(c,o?"g":"gi");}}catch{let u=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");s=new RegExp(u,o?"g":"gi");}let a=[];for(let[u,c]of Object.entries(this.sheet.cells)){if(c.v===void 0||c.v===null)continue;let g=String(c.v);s.lastIndex=0;let h=s.exec(g);if(h){let f=this.parseCellRef(u);f&&a.push({row:f.row,col:f.col,cellRef:u,value:g,matchStart:h.index,matchEnd:h.index+h[0].length});}}return a.sort((u,c)=>u.row!==c.row?u.row-c.row:u.col-c.col),this.results=a,this.currentIndex=a.length>0?0:-1,a}next(){return this.results.length===0?null:(this.currentIndex=(this.currentIndex+1)%this.results.length,this.results[this.currentIndex])}previous(){return this.results.length===0?null:(this.currentIndex=(this.currentIndex-1+this.results.length)%this.results.length,this.results[this.currentIndex])}current(){return this.currentIndex<0||this.currentIndex>=this.results.length?null:this.results[this.currentIndex]}getResults(){return [...this.results]}getCount(){return this.results.length}getCurrentIndex(){return this.currentIndex+1}isResult(e,t){return this.results.some(o=>o.row===e&&o.col===t)}isCurrent(e,t){let o=this.current();return o?.row===e&&o?.col===t}clear(){this.results=[],this.currentIndex=-1;}setSheet(e){this.sheet=e,this.clear();}parseCellRef(e){let t=e.match(/^([A-Z]+)(\d+)$/i);if(!t)return null;let o=t[1].toUpperCase(),n=parseInt(t[2],10)-1,r=0;for(let s=0;s<o.length;s++)r=r*26+(o.charCodeAt(s)-64);return r-=1,{row:n,col:r}}};var E=class{state=null;virtualScroll;onChange;minWidth;maxWidth;constructor(e,t,o=30,n=500){this.virtualScroll=e,this.onChange=t??null,this.minWidth=o,this.maxWidth=n;}startResize(e,t){let o=this.virtualScroll.getColWidth(e);this.state={isResizing:true,colIndex:e,startX:t,startWidth:o},document.addEventListener("mousemove",this.handleMouseMove),document.addEventListener("mouseup",this.handleMouseUp),document.body.style.cursor="col-resize",document.body.style.userSelect="none";}handleMouseMove=e=>{if(!this.state)return;let t=e.clientX-this.state.startX,o=Math.min(this.maxWidth,Math.max(this.minWidth,this.state.startWidth+t));this.virtualScroll.setColWidth(this.state.colIndex,o),this.onChange?.(this.state.colIndex,o);};handleMouseUp=()=>{this.cleanup();};isResizing(){return this.state?.isResizing??false}getResizeColumn(){return this.state?.colIndex??null}cancel(){this.state&&(this.virtualScroll.setColWidth(this.state.colIndex,this.state.startWidth),this.onChange?.(this.state.colIndex,this.state.startWidth)),this.cleanup();}cleanup(){document.removeEventListener("mousemove",this.handleMouseMove),document.removeEventListener("mouseup",this.handleMouseUp),document.body.style.cursor="",document.body.style.userSelect="",this.state=null;}setVirtualScroll(e){this.virtualScroll=e;}destroy(){this.cleanup();}};var V={default:{name:"default",colors:{background:"#ffffff",foreground:"#202124",grid:"#e0e0e0",headerBackground:"#f8f9fa",headerForeground:"#5f6368",selectionBorder:"#1a73e8",selectionBackground:"rgba(26, 115, 232, 0.08)",frozenBorder:"#dadce0"},fonts:{family:"'Google Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif",size:"13px",headerSize:"11px"}},excel:{name:"excel",colors:{background:"#ffffff",foreground:"#000000",grid:"#d4d4d4",headerBackground:"#f0f0f0",headerForeground:"#000000",selectionBorder:"#217346",selectionBackground:"rgba(33, 115, 70, 0.1)",frozenBorder:"#9bc2e6"},fonts:{family:"'Calibri', 'Segoe UI', sans-serif",size:"11px",headerSize:"11px"}},modern:{name:"modern",colors:{background:"#fafafa",foreground:"#18181b",grid:"#e4e4e7",headerBackground:"#f4f4f5",headerForeground:"#71717a",selectionBorder:"#3b82f6",selectionBackground:"rgba(59, 130, 246, 0.08)",frozenBorder:"#a1a1aa"},fonts:{family:"'Inter', -apple-system, BlinkMacSystemFont, sans-serif",size:"13px",headerSize:"11px"}},minimal:{name:"minimal",colors:{background:"#ffffff",foreground:"#27272a",grid:"#f4f4f5",headerBackground:"#ffffff",headerForeground:"#a1a1aa",selectionBorder:"#18181b",selectionBackground:"rgba(24, 24, 27, 0.04)",frozenBorder:"#e4e4e7"},fonts:{family:"'SF Pro Display', -apple-system, BlinkMacSystemFont, sans-serif",size:"13px",headerSize:"11px"}},dark:{name:"dark",colors:{background:"#1e1e1e",foreground:"#d4d4d4",grid:"#3c3c3c",headerBackground:"#252526",headerForeground:"#858585",selectionBorder:"#0078d4",selectionBackground:"rgba(0, 120, 212, 0.2)",frozenBorder:"#4a4a4a"},fonts:{family:"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif",size:"13px",headerSize:"11px"}},midnight:{name:"midnight",colors:{background:"#0d1117",foreground:"#c9d1d9",grid:"#21262d",headerBackground:"#161b22",headerForeground:"#8b949e",selectionBorder:"#58a6ff",selectionBackground:"rgba(88, 166, 255, 0.15)",frozenBorder:"#30363d"},fonts:{family:"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif",size:"13px",headerSize:"11px"}},accessible:{name:"accessible",colors:{background:"#ffffff",foreground:"#000000",grid:"#000000",headerBackground:"#e6e6e6",headerForeground:"#000000",selectionBorder:"#0000ff",selectionBackground:"rgba(0, 0, 255, 0.15)",frozenBorder:"#000000"},fonts:{family:"Arial, Helvetica, sans-serif",size:"14px",headerSize:"12px"}}};function D(i,e){let t=i.style;t.setProperty("--nup-background",e.colors.background),t.setProperty("--nup-foreground",e.colors.foreground),t.setProperty("--nup-grid",e.colors.grid),t.setProperty("--nup-header-bg",e.colors.headerBackground),t.setProperty("--nup-header-fg",e.colors.headerForeground),t.setProperty("--nup-selection-border",e.colors.selectionBorder),t.setProperty("--nup-selection-bg",e.colors.selectionBackground),t.setProperty("--nup-frozen-border",e.colors.frozenBorder),t.setProperty("--nup-font-family",e.fonts.family),t.setProperty("--nup-font-size",e.fonts.size);}function G(i){return `nup-theme-${i}`}var ne=vue.defineComponent({name:"NupSpreadsheetPreview",props:{workbook:{type:Object,required:true},activeSheet:{type:Number,default:0},theme:{type:[Object,String],default:"default"},width:{type:[Number,String],default:"100%"},height:{type:[Number,String],default:"400px"},showHeaders:{type:Boolean,default:true},showGridLines:{type:Boolean,default:true},showSheetTabs:{type:Boolean,default:true},selectable:{type:Boolean,default:true},resizable:{type:Boolean,default:true},searchable:{type:Boolean,default:false},copyable:{type:Boolean,default:true},keyboardNavigation:{type:Boolean,default:true},frozenRows:{type:Number,default:0},frozenCols:{type:Number,default:0},overscan:{type:Number,default:5},defaultRowHeight:{type:Number,default:24},defaultColWidth:{type:Number,default:100},ariaLabel:{type:String,default:"Spreadsheet"}},emits:["cellClick","cellDoubleClick","cellRightClick","selectionChange","sheetChange","columnResize","scroll","search","copy"],setup(i,{emit:e,expose:t}){let o=vue.ref(null),n=vue.ref(null),r=vue.ref(i.activeSheet),s=vue.ref({top:0,left:0}),a=vue.ref({width:0,height:0}),u=vue.ref(null),c=vue.ref([]),g=vue.ref(""),h=vue.ref(0),f=vue.computed(()=>i.workbook.sheets[r.value]??i.workbook.sheets[0]),T=vue.computed(()=>typeof i.theme=="string"?V[i.theme]??V.default:i.theme),C,y,$,U,L,F,j,O=()=>{let l=f.value,d={},w={};Object.entries(l.rows).forEach(([m,p])=>{p.h&&(d[parseInt(m)]=p.h);}),Object.entries(l.cols).forEach(([m,p])=>{p.w&&(w[parseInt(m)]=p.w);}),C=new P({rows:l.rowCount,cols:l.colCount,rowHeights:d,colWidths:w,defaultRowHeight:i.defaultRowHeight,defaultColWidth:i.defaultColWidth,overscan:i.overscan}),y=new I(l,m=>{u.value=m,e("selectionChange",m);}),$=new A(l.merges??[]),U=new K(l),L=new N,F=new E(C,(m,p)=>{h.value++,e("columnResize",m,p);}),j=new B(y,C,{enabled:i.keyboardNavigation},{onScroll:(m,p)=>{let H=C.getScrollToPosition(m,p,a.value.height,a.value.width);n.value?.scrollTo({top:H.scrollTop,left:H.scrollLeft,behavior:"smooth"});},onCopy:async()=>{let m=y.getSelection();if(m&&i.copyable){let p=await L.copyToClipboard(m);e("copy",p);}}});};return vue.onMounted(()=>{O();let l=n.value;l&&(new ResizeObserver(w=>{let m=w[0];m&&(a.value={width:m.contentRect.width,height:m.contentRect.height});}).observe(l),a.value={width:l.clientWidth,height:l.clientHeight}),o.value&&D(o.value,T.value);}),vue.onUnmounted(()=>{F?.destroy();}),vue.watch(()=>i.activeSheet,l=>{r.value=l,O();}),vue.watch(T,l=>{o.value&&D(o.value,l);}),t({scrollTo:(l,d)=>{let w=C.getScrollToPosition(l,d,a.value.height,a.value.width);n.value?.scrollTo({top:w.scrollTop,left:w.scrollLeft,behavior:"smooth"});},scrollToCell:l=>{let d=S(l);if(d){let w=C.getScrollToPosition(d.row,d.col,a.value.height,a.value.width);n.value?.scrollTo({top:w.scrollTop,left:w.scrollLeft,behavior:"smooth"});}},select:l=>{u.value=l;},selectCell:l=>{y.selectCell(l);},selectAll:()=>{y.selectAll();},clearSelection:()=>{y.clear();},getSelection:()=>u.value,setActiveSheet:l=>{r.value=l,e("sheetChange",l);},getActiveSheet:()=>r.value,search:l=>{g.value=l;let d=U.search(l);return c.value=d,e("search",d),d},highlightResults:l=>{c.value=l;},clearHighlights:()=>{c.value=[],g.value="";},getWorkbook:()=>i.workbook,getVisibleCells:()=>{let l=C.getVisibleRange(s.value.top,s.value.left,a.value.height,a.value.width),d=[];for(let w=l.startRow;w<=l.endRow;w++){let m=[];for(let p=l.startCol;p<=l.endCol;p++)m.push(f.value.cells[M(w,p)]??null);d.push(m);}return d},getCellAt:(l,d)=>f.value.cells[M(l,d)]??null,copySelection:async()=>{let l=y.getSelection();if(l){let d=await L.copyToClipboard(l);e("copy",d);}},setColumnWidth:(l,d)=>{C.setColWidth(l,d),h.value++;},autoFitColumn:()=>{},autoFitAllColumns:()=>{},refresh:()=>{h.value++;},destroy:()=>{F?.destroy();}}),()=>{let l=f.value,d=i.showHeaders?24:0,w=i.showHeaders?40:0,m=C?.getVisibleRange(s.value.top,s.value.left,a.value.height,a.value.width)??{startRow:0,endRow:0,startCol:0,endCol:0},p=[];for(let b=m.startRow;b<=m.endRow;b++)for(let v=m.startCol;v<=m.endCol;v++){if($?.isMergeHidden(b,v))continue;let z=$?.getMergeRect(b,v,(k,_)=>C.getCellRect(k,_))??C?.getCellRect(b,v);if(!z)continue;let X=M(b,v),W=l.cells[X],J=y?.isCellSelected(b,v),Y=y?.isAnchor(b,v);p.push(vue.h("div",{key:`${b}-${v}`,class:["nup-cell",{"nup-cell-number":W?.t==="n"},{"nup-cell-selected":J},{"nup-cell-anchor":Y}],style:{top:`${z.top}px`,left:`${z.left}px`,width:`${z.width}px`,height:`${z.height}px`},onClick:k=>{i.selectable&&(y?.handleClick(b,v,{shiftKey:k.shiftKey,ctrlKey:k.ctrlKey,metaKey:k.metaKey}),e("cellClick",{cell:W,row:b,col:v,cellRef:X,originalEvent:k}));}},W?.v!==void 0&&W?.v!==null?String(W.v):""));}let H=typeof i.theme=="string"?G(i.theme):"";return vue.h("div",{ref:o,class:["nup-spreadsheet",H,{"nup-no-gridlines":!i.showGridLines}],style:{width:i.width,height:i.height},tabindex:0,onKeydown:b=>j?.handleKeyDown(b)},[i.showHeaders&&vue.h("div",{class:"nup-corner",style:{width:`${w}px`,height:`${d}px`}}),vue.h("div",{ref:n,class:"nup-scroll-container",style:{top:`${d}px`,left:`${w}px`,right:0,bottom:i.showSheetTabs?"32px":0},onScroll:b=>{let v=b.target;s.value={top:v.scrollTop,left:v.scrollLeft};}},[vue.h("div",{class:"nup-content",style:{width:`${C?.totalWidth??0}px`,height:`${C?.totalHeight??0}px`}},p)]),i.showSheetTabs&&i.workbook.sheets.length>1&&vue.h("div",{class:"nup-sheet-tabs"},i.workbook.sheets.map((b,v)=>vue.h("button",{key:b.id,class:["nup-sheet-tab",{"nup-sheet-tab-active":v===r.value}],onClick:()=>{r.value=v,e("sheetChange",v);}},b.name)))])}}}),ze=ne;exports.NupSpreadsheetPreview=ne;exports.default=ze;//# sourceMappingURL=vue.cjs.map
|
|
10
|
+
//# sourceMappingURL=vue.cjs.map
|