@nuptechs/nup-xlsx-preview 1.0.0 → 1.0.3

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.
@@ -5,11 +5,51 @@ import { PropType } from 'vue';
5
5
  * @aspect/nup-xlsx-preview - Types
6
6
  * Ultra-light Excel visualization component
7
7
  */
8
+ interface NupCellFont {
9
+ name?: string;
10
+ size?: number;
11
+ bold?: boolean;
12
+ italic?: boolean;
13
+ underline?: boolean;
14
+ strike?: boolean;
15
+ color?: string;
16
+ }
17
+ interface NupCellFill {
18
+ type?: 'solid' | 'pattern' | 'gradient';
19
+ color?: string;
20
+ patternColor?: string;
21
+ tint?: number;
22
+ }
23
+ interface NupCellBorder {
24
+ style?: 'thin' | 'medium' | 'thick' | 'dashed' | 'dotted' | 'double';
25
+ color?: string;
26
+ }
27
+ interface NupCellBorders {
28
+ top?: NupCellBorder;
29
+ right?: NupCellBorder;
30
+ bottom?: NupCellBorder;
31
+ left?: NupCellBorder;
32
+ }
33
+ interface NupCellAlignment {
34
+ horizontal?: 'left' | 'center' | 'right' | 'justify';
35
+ vertical?: 'top' | 'middle' | 'bottom';
36
+ wrapText?: boolean;
37
+ indent?: number;
38
+ rotation?: number;
39
+ }
40
+ interface NupCellStyle {
41
+ font?: NupCellFont;
42
+ fill?: NupCellFill;
43
+ border?: NupCellBorders;
44
+ alignment?: NupCellAlignment;
45
+ numberFormat?: string;
46
+ }
8
47
  interface NupCell {
9
48
  v?: string | number | boolean | null;
10
49
  f?: string;
11
50
  s?: number | string;
12
51
  t?: 's' | 'n' | 'b' | 'e' | 'd';
52
+ style?: NupCellStyle;
13
53
  }
14
54
  interface NupRow {
15
55
  h?: number;
@@ -50,7 +90,7 @@ interface NupThemeConfig {
50
90
  interface NupWorkbook {
51
91
  sheets: NupWorksheet[];
52
92
  activeSheet: number;
53
- styles?: Record<string, unknown>;
93
+ styles?: Record<string | number, NupCellStyle>;
54
94
  theme?: NupThemeConfig;
55
95
  }
56
96
 
@@ -266,6 +306,11 @@ declare const NupSpreadsheetPreview: vue.DefineComponent<vue.ExtractPropTypes<{
266
306
  type: StringConstructor;
267
307
  default: string;
268
308
  };
309
+ zoomLevel: {
310
+ type: NumberConstructor;
311
+ default: number;
312
+ validator: (v: number) => boolean;
313
+ };
269
314
  }>, () => vue.VNode<vue.RendererNode, vue.RendererElement, {
270
315
  [key: string]: any;
271
316
  }>, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, "cellClick" | "cellDoubleClick" | "cellRightClick" | "selectionChange" | "sheetChange" | "columnResize" | "scroll" | "search" | "copy", vue.PublicProps, Readonly<vue.ExtractPropTypes<{
@@ -345,6 +390,11 @@ declare const NupSpreadsheetPreview: vue.DefineComponent<vue.ExtractPropTypes<{
345
390
  type: StringConstructor;
346
391
  default: string;
347
392
  };
393
+ zoomLevel: {
394
+ type: NumberConstructor;
395
+ default: number;
396
+ validator: (v: number) => boolean;
397
+ };
348
398
  }>> & Readonly<{}>, {
349
399
  activeSheet: number;
350
400
  theme: NupThemeConfig | "default" | "excel" | "modern" | "minimal" | "dark" | "midnight" | "accessible";
@@ -364,6 +414,7 @@ declare const NupSpreadsheetPreview: vue.DefineComponent<vue.ExtractPropTypes<{
364
414
  defaultRowHeight: number;
365
415
  defaultColWidth: number;
366
416
  ariaLabel: string;
417
+ zoomLevel: number;
367
418
  }, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
368
419
 
369
420
  export { NupSpreadsheetPreview, NupSpreadsheetPreview as default };
@@ -5,11 +5,51 @@ import { PropType } from 'vue';
5
5
  * @aspect/nup-xlsx-preview - Types
6
6
  * Ultra-light Excel visualization component
7
7
  */
8
+ interface NupCellFont {
9
+ name?: string;
10
+ size?: number;
11
+ bold?: boolean;
12
+ italic?: boolean;
13
+ underline?: boolean;
14
+ strike?: boolean;
15
+ color?: string;
16
+ }
17
+ interface NupCellFill {
18
+ type?: 'solid' | 'pattern' | 'gradient';
19
+ color?: string;
20
+ patternColor?: string;
21
+ tint?: number;
22
+ }
23
+ interface NupCellBorder {
24
+ style?: 'thin' | 'medium' | 'thick' | 'dashed' | 'dotted' | 'double';
25
+ color?: string;
26
+ }
27
+ interface NupCellBorders {
28
+ top?: NupCellBorder;
29
+ right?: NupCellBorder;
30
+ bottom?: NupCellBorder;
31
+ left?: NupCellBorder;
32
+ }
33
+ interface NupCellAlignment {
34
+ horizontal?: 'left' | 'center' | 'right' | 'justify';
35
+ vertical?: 'top' | 'middle' | 'bottom';
36
+ wrapText?: boolean;
37
+ indent?: number;
38
+ rotation?: number;
39
+ }
40
+ interface NupCellStyle {
41
+ font?: NupCellFont;
42
+ fill?: NupCellFill;
43
+ border?: NupCellBorders;
44
+ alignment?: NupCellAlignment;
45
+ numberFormat?: string;
46
+ }
8
47
  interface NupCell {
9
48
  v?: string | number | boolean | null;
10
49
  f?: string;
11
50
  s?: number | string;
12
51
  t?: 's' | 'n' | 'b' | 'e' | 'd';
52
+ style?: NupCellStyle;
13
53
  }
14
54
  interface NupRow {
15
55
  h?: number;
@@ -50,7 +90,7 @@ interface NupThemeConfig {
50
90
  interface NupWorkbook {
51
91
  sheets: NupWorksheet[];
52
92
  activeSheet: number;
53
- styles?: Record<string, unknown>;
93
+ styles?: Record<string | number, NupCellStyle>;
54
94
  theme?: NupThemeConfig;
55
95
  }
56
96
 
@@ -266,6 +306,11 @@ declare const NupSpreadsheetPreview: vue.DefineComponent<vue.ExtractPropTypes<{
266
306
  type: StringConstructor;
267
307
  default: string;
268
308
  };
309
+ zoomLevel: {
310
+ type: NumberConstructor;
311
+ default: number;
312
+ validator: (v: number) => boolean;
313
+ };
269
314
  }>, () => vue.VNode<vue.RendererNode, vue.RendererElement, {
270
315
  [key: string]: any;
271
316
  }>, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, "cellClick" | "cellDoubleClick" | "cellRightClick" | "selectionChange" | "sheetChange" | "columnResize" | "scroll" | "search" | "copy", vue.PublicProps, Readonly<vue.ExtractPropTypes<{
@@ -345,6 +390,11 @@ declare const NupSpreadsheetPreview: vue.DefineComponent<vue.ExtractPropTypes<{
345
390
  type: StringConstructor;
346
391
  default: string;
347
392
  };
393
+ zoomLevel: {
394
+ type: NumberConstructor;
395
+ default: number;
396
+ validator: (v: number) => boolean;
397
+ };
348
398
  }>> & Readonly<{}>, {
349
399
  activeSheet: number;
350
400
  theme: NupThemeConfig | "default" | "excel" | "modern" | "minimal" | "dark" | "midnight" | "accessible";
@@ -364,6 +414,7 @@ declare const NupSpreadsheetPreview: vue.DefineComponent<vue.ExtractPropTypes<{
364
414
  defaultRowHeight: number;
365
415
  defaultColWidth: number;
366
416
  ariaLabel: string;
417
+ zoomLevel: number;
367
418
  }, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
368
419
 
369
420
  export { NupSpreadsheetPreview, NupSpreadsheetPreview as default };
@@ -1,10 +1,10 @@
1
- import {defineComponent,ref,computed,onMounted,onUnmounted,watch,h}from'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=`
1
+ import {defineComponent,ref,computed,onMounted,onUnmounted,watch,h}from'vue';var I=class{rowPositions;colPositions;rowHeightCache;colWidthCache;totalHeight;totalWidth;overscan;rowCount;colCount;frozenRows;frozenCols;frozenRowsHeight;frozenColsWidth;constructor(e){let{rows:t,cols:o,rowHeights:s,colWidths:n,defaultRowHeight:l=24,defaultColWidth:a=100,overscan:c=5,frozenRows:h=0,frozenCols:v=0}=e;this.frozenRows=h,this.frozenCols=v,this.rowCount=t,this.colCount=o,this.overscan=c,this.rowPositions=new Array(t+1),this.rowHeightCache=new Array(t),this.rowPositions[0]=0;for(let d=0;d<t;d++){let b=s[d]??l;this.rowHeightCache[d]=b,this.rowPositions[d+1]=this.rowPositions[d]+b;}this.totalHeight=this.rowPositions[t],this.frozenRowsHeight=h>0?this.rowPositions[h]??0:0,this.colPositions=new Array(o+1),this.colWidthCache=new Array(o),this.colPositions[0]=0;for(let d=0;d<o;d++){let b=n[d]??a;this.colWidthCache[d]=b,this.colPositions[d+1]=this.colPositions[d]+b;}this.totalWidth=this.colPositions[o],this.frozenColsWidth=v>0?this.colPositions[v]??0:0;}getFrozenInfo(){return {rows:this.frozenRows,cols:this.frozenCols,frozenRowsHeight:this.frozenRowsHeight,frozenColsWidth:this.frozenColsWidth}}binarySearch(e,t){let o=0,s=e.length-2;for(;o<=s;){let n=o+s>>>1,l=e[n],a=e[n+1];if(t>=l&&t<a)return n;t<l?s=n-1:o=n+1;}return Math.max(0,Math.min(o,e.length-2))}getVisibleRange(e,t,o,s){let n=e+this.frozenRowsHeight,l=t+this.frozenColsWidth,a=this.binarySearch(this.rowPositions,n),c=this.binarySearch(this.rowPositions,n+Math.max(0,o)),h=this.binarySearch(this.colPositions,l),v=this.binarySearch(this.colPositions,l+Math.max(0,s)),d=Math.max(this.frozenRows,a-this.overscan),b=Math.min(this.rowCount-1,c+this.overscan),H=Math.max(this.frozenCols,h-this.overscan),w=Math.min(this.colCount-1,v+this.overscan);return {startRow:d,endRow:b,startCol:H,endCol:w}}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],s=t-o;this.colWidthCache[e]=t;for(let n=e+1;n<=this.colCount;n++)this.colPositions[n]+=s;this.totalWidth+=s;}getIndexAtPosition(e,t){return {row:this.binarySearch(this.rowPositions,e),col:this.binarySearch(this.colPositions,t)}}getScrollToPosition(e,t,o,s){let n=this.rowPositions[e]??0,l=this.colPositions[t]??0;return {scrollTop:Math.max(0,n-o/2),scrollLeft:Math.max(0,l-s/2)}}};function D(r){let e="",t=r;for(;t>=0;)e=String.fromCharCode(t%26+65)+e,t=Math.floor(t/26)-1;return e}function he(r){let e=0,t=r.toUpperCase();for(let o=0;o<t.length;o++)e=e*26+(t.charCodeAt(o)-64);return e-1}function W(r,e){return `${D(e)}${r+1}`}function M(r){let e=r.match(/^([A-Z]+)(\d+)$/i);if(!e)return null;let t=he(e[1]),o=parseInt(e[2],10)-1;return o<0||t<0?null:{row:o,col:t}}var P=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:s,ctrlKey:n,metaKey:l}=o;s&&this.state.anchor?(this.state.focus={row:e,col:t},this.updateRanges()):n||l?(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=M(e);t&&(this.state.anchor=t,this.state.focus=t,this.state.ranges=[this.createRange(t,t)],this.notifyChange());}selectRange(e,t){let o=M(e),s=M(t);!o||!s||(this.state.anchor=o,this.state.focus=s,this.state.ranges=[this.createRange(o,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(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),s=Math.max(e.row,t.row),n=Math.min(e.col,t.col),l=Math.max(e.col,t.col),a=[],c=[];for(let h=o;h<=s;h++){let v=[];for(let d=n;d<=l;d++){let b=W(h,d);c.push(b),v.push(this.sheet.cells[b]??null);}a.push(v);}return {start:{row:o,col:n},end:{row:s,col:l},cells:a,cellRefs:c}}notifyChange(){this.onChange&&this.onChange(this.getSelection());}};var B=class{selection;virtualScroll;config;onScroll;onCopy;constructor(e,t,o,s){this.selection=e,this.virtualScroll=t,this.config=o,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:o,ctrlKey:s,metaKey:n}=e,l=s||n;if(l&&t==="c")return "copy";if(l&&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(l)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:s}=t?.start??{row:0,col:0},n=o,l=s;switch(e){case "move-up":n=Math.max(0,o-1);break;case "move-down":n=Math.min(this.virtualScroll.rowCount-1,o+1);break;case "move-left":l=Math.max(0,s-1);break;case "move-right":l=Math.min(this.virtualScroll.colCount-1,s+1);break;case "move-page-up":n=Math.max(0,o-20);break;case "move-page-down":n=Math.min(this.virtualScroll.rowCount-1,o+20);break;case "move-home":l=0;break;case "move-end":l=this.virtualScroll.colCount-1;break;case "move-ctrl-home":n=0,l=0;break;case "move-ctrl-end":n=this.virtualScroll.rowCount-1,l=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(n,l,{shiftKey:false,ctrlKey:false,metaKey:false}),this.scrollToSelection();}extendSelection(e){let t=this.selection.getSelection();if(!t)return;let{row:o,col:s}=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":s=Math.max(0,s-1);break;case "extend-right":s=Math.min(this.virtualScroll.colCount-1,s+1);break}this.selection.handleDrag(o,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 N=class{merges;mergeMap;constructor(e=[]){this.merges=[],this.mergeMap=new Map,this.parseMerges(e);}parseMerges(e){for(let t of e){let[o,s]=t.split(":");if(!o||!s)continue;let n=M(o),l=M(s);if(!n||!l)continue;let a={startRow:Math.min(n.row,l.row),startCol:Math.min(n.col,l.col),endRow:Math.max(n.row,l.row),endCol:Math.max(n.col,l.col),cellRef:o};this.merges.push(a);for(let c=a.startRow;c<=a.endRow;c++)for(let h=a.startCol;h<=a.endCol;h++){let v=`${c},${h}`;this.mergeMap.set(v,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 s=this.getMergeAt(e,t);if(!s||!this.isMergeMaster(e,t))return null;let n=o(s.startRow,s.startCol),l=o(s.endRow,s.endCol);return {top:n.top,left:n.left,width:l.left+l.width-n.left,height:l.top+l.height-n.top}}getAllMerges(){return [...this.merges]}getVisibleMerges(e,t,o,s){return this.merges.filter(n=>n.endRow>=e&&n.startRow<=t&&n.endCol>=o&&n.startCol<=s)}update(e){this.merges=[],this.mergeMap.clear(),this.parseMerges(e);}};var A=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"}),s=new Blob([t.text],{type:"text/plain"});await navigator.clipboard.write([new ClipboardItem({"text/html":o,"text/plain":s})]);}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 c=a.map(h=>this.getCellValue(h));o.push(c.join(" "));}let s=o.join(`
2
+ `),n=[];for(let a of t){let c=a.map(h=>{let v=this.escapeHtml(this.getCellValue(h));return `<td style="${this.getCellStyle(h)}">${v}</td>`});n.push(`<tr>${c.join("")}</tr>`);}let l=`
3
3
  <table style="border-collapse: collapse; font-family: Arial, sans-serif; font-size: 12px;">
4
4
  <tbody>
5
- ${r.join(`
5
+ ${n.join(`
6
6
  `)}
7
7
  </tbody>
8
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,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}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=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=ref(null),n=ref(null),r=ref(i.activeSheet),s=ref({top:0,left:0}),a=ref({width:0,height:0}),u=ref(null),c=ref([]),g=ref(""),h$1=ref(0),f=computed(()=>i.workbook.sheets[r.value]??i.workbook.sheets[0]),T=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$1.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 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);}),onUnmounted(()=>{F?.destroy();}),watch(()=>i.activeSheet,l=>{r.value=l,O();}),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$1.value++;},autoFitColumn:()=>{},autoFitAllColumns:()=>{},refresh:()=>{h$1.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(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 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&&h("div",{class:"nup-corner",style:{width:`${w}px`,height:`${d}px`}}),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};}},[h("div",{class:"nup-content",style:{width:`${C?.totalWidth??0}px`,height:`${C?.totalHeight??0}px`}},p)]),i.showSheetTabs&&i.workbook.sheets.length>1&&h("div",{class:"nup-sheet-tabs"},i.workbook.sheets.map((b,v)=>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;export{ne as NupSpreadsheetPreview,ze as default};//# sourceMappingURL=vue.js.map
9
+ `.trim();return {text:s,html:l,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,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}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 $=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:s=false,matchWholeCell:n=false}=t,l;try{if(s)l=new RegExp(e,o?"g":"gi");else {let c=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),h=n?`^${c}$`:c;l=new RegExp(h,o?"g":"gi");}}catch{let c=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");l=new RegExp(c,o?"g":"gi");}let a=[];for(let[c,h]of Object.entries(this.sheet.cells)){if(h.v===void 0||h.v===null)continue;let v=String(h.v);l.lastIndex=0;let d=l.exec(v);if(d){let b=this.parseCellRef(c);b&&a.push({row:b.row,col:b.col,cellRef:c,value:v,matchStart:d.index,matchEnd:d.index+d[0].length});}}return a.sort((c,h)=>c.row!==h.row?c.row-h.row:c.col-h.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(),s=parseInt(t[2],10)-1,n=0;for(let l=0;l<o.length;l++)n=n*26+(o.charCodeAt(l)-64);return n-=1,{row:s,col:n}}};var K=class{state=null;virtualScroll;onChange;minWidth;maxWidth;constructor(e,t,o=30,s=500){this.virtualScroll=e,this.onChange=t??null,this.minWidth=o,this.maxWidth=s;}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 j={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 U(r,e){let t=r.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 q(r){return `nup-theme-${r}`}var de={thin:"1px solid",medium:"2px solid",thick:"3px solid",dashed:"1px dashed",dotted:"1px dotted",double:"3px double"};function L(r){if(!r||!r.style)return;let e=de[r.style]||"1px solid",t=r.color||"#000000";return `${e} ${t}`}function fe(r,e){let t=r.replace("#",""),o=parseInt(t.substring(0,2),16),s=parseInt(t.substring(2,4),16),n=parseInt(t.substring(4,6),16),l,a,c;return e<0?(l=Math.round(o*(1+e)),a=Math.round(s*(1+e)),c=Math.round(n*(1+e))):(l=Math.round(o+(255-o)*e),a=Math.round(s+(255-s)*e),c=Math.round(n+(255-n)*e)),`#${l.toString(16).padStart(2,"0")}${a.toString(16).padStart(2,"0")}${c.toString(16).padStart(2,"0")}`}function ee(r){if(!r)return {};let e={};if(r.font){let t=r.font;t.name&&(e.fontFamily=t.name),t.size&&(e.fontSize=`${t.size}pt`),t.bold&&(e.fontWeight="bold"),t.italic&&(e.fontStyle="italic"),t.color&&(e.color=t.color);let o=[];t.underline&&o.push("underline"),t.strike&&o.push("line-through"),o.length>0&&(e.textDecoration=o.join(" "));}if(r.fill){let t=r.fill;if(t.color){let o=t.color;t.tint!==void 0&&t.tint!==0&&(o=fe(o,t.tint)),e.backgroundColor=o;}}if(r.alignment){let t=r.alignment;t.horizontal&&(e.textAlign=t.horizontal),t.vertical&&(e.verticalAlign=t.vertical==="middle"?"middle":t.vertical),t.wrapText&&(e.whiteSpace="pre-wrap"),t.indent&&(e.paddingLeft=`${t.indent*8}px`),t.rotation&&(e.transform=`rotate(${t.rotation}deg)`);}if(r.border){let t=r.border;e.borderTop=L(t.top),e.borderRight=L(t.right),e.borderBottom=L(t.bottom),e.borderLeft=L(t.left);}return e}function ge(r,e){if(r!==void 0&&e.styles)return e.styles[r]??e.styles[String(r)]}function te(r,e,t){let o=t?ge(e,t):void 0;if(!(!r&&!o))return r?o?{...o,...r,font:{...o.font,...r.font},fill:{...o.fill,...r.fill},border:{...o.border,...r.border},alignment:{...o.alignment,...r.alignment}}:r:o}var ve=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"},zoomLevel:{type:Number,default:100,validator:r=>r>=50&&r<=200}},emits:["cellClick","cellDoubleClick","cellRightClick","selectionChange","sheetChange","columnResize","scroll","search","copy"],setup(r,{emit:e,expose:t}){let o=ref(null),s=ref(null),n=ref(r.activeSheet),l=ref({top:0,left:0}),a=ref({width:0,height:0}),c=ref(null),h$1=ref([]),v=ref(""),d=ref(0),b=computed(()=>r.workbook.sheets[n.value]??r.workbook.sheets[0]),H=computed(()=>typeof r.theme=="string"?j[r.theme]??j.default:r.theme),w,x,E,O,F,V,G,X=()=>{let i=b.value,f={},p={};Object.entries(i.rows).forEach(([m,C])=>{C.h&&(f[parseInt(m)]=C.h);}),Object.entries(i.cols).forEach(([m,C])=>{C.w&&(p[parseInt(m)]=C.w);}),w=new I({rows:i.rowCount,cols:i.colCount,rowHeights:f,colWidths:p,defaultRowHeight:r.defaultRowHeight,defaultColWidth:r.defaultColWidth,overscan:r.overscan}),x=new P(i,m=>{c.value=m,e("selectionChange",m);}),E=new N(i.merges??[]),O=new $(i),F=new A,V=new K(w,(m,C)=>{d.value++,e("columnResize",m,C);}),G=new B(x,w,{enabled:r.keyboardNavigation},{onScroll:(m,C)=>{let y=w.getScrollToPosition(m,C,a.value.height,a.value.width);s.value?.scrollTo({top:y.scrollTop,left:y.scrollLeft,behavior:"smooth"});},onCopy:async()=>{let m=x.getSelection();if(m&&r.copyable){let C=await F.copyToClipboard(m);e("copy",C);}}});};return onMounted(()=>{X();let i=s.value;i&&(new ResizeObserver(p=>{let m=p[0];m&&(a.value={width:m.contentRect.width,height:m.contentRect.height});}).observe(i),a.value={width:i.clientWidth,height:i.clientHeight}),o.value&&U(o.value,H.value);}),onUnmounted(()=>{V?.destroy();}),watch(()=>r.activeSheet,i=>{n.value=i,X();}),watch(H,i=>{o.value&&U(o.value,i);}),t({scrollTo:(i,f)=>{let p=w.getScrollToPosition(i,f,a.value.height,a.value.width);s.value?.scrollTo({top:p.scrollTop,left:p.scrollLeft,behavior:"smooth"});},scrollToCell:i=>{let f=M(i);if(f){let p=w.getScrollToPosition(f.row,f.col,a.value.height,a.value.width);s.value?.scrollTo({top:p.scrollTop,left:p.scrollLeft,behavior:"smooth"});}},select:i=>{c.value=i;},selectCell:i=>{x.selectCell(i);},selectAll:()=>{x.selectAll();},clearSelection:()=>{x.clear();},getSelection:()=>c.value,setActiveSheet:i=>{n.value=i,e("sheetChange",i);},getActiveSheet:()=>n.value,search:i=>{v.value=i;let f=O.search(i);return h$1.value=f,e("search",f),f},highlightResults:i=>{h$1.value=i;},clearHighlights:()=>{h$1.value=[],v.value="";},getWorkbook:()=>r.workbook,getVisibleCells:()=>{let i=w.getVisibleRange(l.value.top,l.value.left,a.value.height,a.value.width),f=[];for(let p=i.startRow;p<=i.endRow;p++){let m=[];for(let C=i.startCol;C<=i.endCol;C++)m.push(b.value.cells[W(p,C)]??null);f.push(m);}return f},getCellAt:(i,f)=>b.value.cells[W(i,f)]??null,copySelection:async()=>{let i=x.getSelection();if(i){let f=await F.copyToClipboard(i);e("copy",f);}},setColumnWidth:(i,f)=>{w.setColWidth(i,f),d.value++;},autoFitColumn:()=>{},autoFitAllColumns:()=>{},refresh:()=>{d.value++;},destroy:()=>{V?.destroy();}}),()=>{let i=b.value,f=r.showHeaders?24:0,p=r.showHeaders?40:0,m=a.value.height||400,C=a.value.width||800,y=w?.getVisibleRange(l.value.top,l.value.left,m,C)??{startRow:0,endRow:Math.min(50,i.rowCount-1),startCol:0,endCol:Math.min(20,i.colCount-1)},Z=[];for(let u=y.startRow;u<=y.endRow;u++)for(let g=y.startCol;g<=y.endCol;g++){if(E?.isMergeHidden(u,g))continue;let R=E?.getMergeRect(u,g,(T,ue)=>w.getCellRect(T,ue))??w?.getCellRect(u,g);if(!R)continue;let J=W(u,g),z=i.cells[J],le=x?.isCellSelected(u,g),ie=x?.isAnchor(u,g),ae=te(z?.style,z?.s,r.workbook),ce=ee(ae);Z.push(h("div",{key:`${u}-${g}`,class:["nup-cell",{"nup-cell-number":z?.t==="n"},{"nup-cell-selected":le},{"nup-cell-anchor":ie}],style:{top:`${R.top}px`,left:`${R.left}px`,width:`${R.width}px`,height:`${R.height}px`,...ce},onClick:T=>{r.selectable&&(x?.handleClick(u,g,{shiftKey:T.shiftKey,ctrlKey:T.ctrlKey,metaKey:T.metaKey}),e("cellClick",{cell:z,row:u,col:g,cellRef:J,originalEvent:T}));}},z?.v!==void 0&&z?.v!==null?String(z.v):""));}let ne=typeof r.theme=="string"?q(r.theme):"",_=[];if(r.showHeaders)for(let u=y.startCol;u<=y.endCol;u++){let g=w?.getCellRect(0,u);if(!g)continue;let R=c.value&&u>=c.value.start.col&&u<=c.value.end.col;_.push(h("div",{key:`col-${u}`,class:["nup-header","nup-header-col",{"nup-header-selected":R}],style:{left:`${g.left-l.value.left+p}px`,top:0,width:`${g.width}px`,height:`${f}px`}},D(u)));}let Q=[];if(r.showHeaders)for(let u=y.startRow;u<=y.endRow;u++){let g=w?.getCellRect(u,0);if(!g)continue;let R=c.value&&u>=c.value.start.row&&u<=c.value.end.row;Q.push(h("div",{key:`row-${u}`,class:["nup-header","nup-header-row",{"nup-header-selected":R}],style:{top:`${g.top-l.value.top+f}px`,left:0,width:`${p}px`,height:`${g.height}px`}},String(u+1)));}let Y=r.zoomLevel/100,se=Y!==1?{transform:`scale(${Y})`,transformOrigin:"top left"}:{};return h("div",{ref:o,class:["nup-spreadsheet",ne,{"nup-no-gridlines":!r.showGridLines}],style:{width:r.width,height:r.height,...se},tabindex:0,onKeydown:u=>G?.handleKeyDown(u)},[r.showHeaders&&h("div",{class:"nup-corner",style:{width:`${p}px`,height:`${f}px`}}),r.showHeaders&&h("div",{class:"nup-col-headers",style:{position:"absolute",top:0,left:0,right:0,height:`${f}px`,overflow:"hidden",zIndex:20}},_),r.showHeaders&&h("div",{class:"nup-row-headers",style:{position:"absolute",top:0,left:0,bottom:r.showSheetTabs?"32px":0,width:`${p}px`,overflow:"hidden",zIndex:20}},Q),h("div",{ref:s,class:"nup-scroll-container",style:{top:`${f}px`,left:`${p}px`,right:0,bottom:r.showSheetTabs?"32px":0},onScroll:u=>{let g=u.target;l.value={top:g.scrollTop,left:g.scrollLeft};}},[h("div",{class:"nup-content",style:{width:`${w?.totalWidth??0}px`,height:`${w?.totalHeight??0}px`}},Z)]),r.showSheetTabs&&r.workbook.sheets.length>1&&h("div",{class:"nup-sheet-tabs",style:{position:"absolute",bottom:0,left:0,right:0}},r.workbook.sheets.map((u,g)=>h("button",{key:u.id,class:["nup-sheet-tab",{"nup-sheet-tab-active":g===n.value}],onClick:()=>{n.value=g,e("sheetChange",g);}},u.name)))])}}}),je=ve;export{ve as NupSpreadsheetPreview,je as default};//# sourceMappingURL=vue.js.map
10
10
  //# sourceMappingURL=vue.js.map