From 3a1367a90132457d73ee09e0a6d60f7280ad0698 Mon Sep 17 00:00:00 2001 From: Eugene Date: Wed, 26 Jul 2023 15:19:26 +0300 Subject: [PATCH] Dist update --- dist/components/scroller.d.ts | 1 + dist/main.cjs | 6 +- dist/main.cjs.map | 2 +- dist/main.d.ts | 10 +- dist/main.js | 444 ++++++++++++++++++++-------------- dist/main.js.map | 2 +- dist/modules/config.d.ts | 11 + dist/modules/events.d.ts | 31 +++ dist/style.css | 2 +- dist/utils/position.d.ts | 3 + 10 files changed, 321 insertions(+), 191 deletions(-) create mode 100644 dist/modules/events.d.ts create mode 100644 dist/utils/position.d.ts diff --git a/dist/components/scroller.d.ts b/dist/components/scroller.d.ts index ec5b2ef..530afbf 100644 --- a/dist/components/scroller.d.ts +++ b/dist/components/scroller.d.ts @@ -12,6 +12,7 @@ export declare class Scroller { private root; private isSelecting; constructor(root: Spreadsheet); + setSelectingMode(mode: boolean): void; private handleMouseMove; private handleMouseUp; private handleDoubleClick; diff --git a/dist/main.cjs b/dist/main.cjs index b649e69..1e61b0d 100644 --- a/dist/main.cjs +++ b/dist/main.cjs @@ -1,5 +1,5 @@ -"use strict";var P=Object.defineProperty;var L=(n,t,e)=>t in n?P(n,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):n[t]=e;var s=(n,t,e)=>(L(n,typeof t!="symbol"?t+"":t,e),e);Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});class u{constructor(t,e){s(this,"x");s(this,"y");s(this,"width");s(this,"height");this.x=this.getXCoord(e.column,t),this.y=this.getYCoord(e.row,t),this.width=t.columns[e.column].width,this.height=t.rows[e.row].height}getXCoord(t,e){let o=0;for(let i=0;i{const{key:e}=t;switch(e){case"Escape":{this.hide();break}case"Enter":this.root.changeCellValues(this.root.selection.selectedCell,{value:this.element.value,displayValue:this.element.value}),this.hide()}});s(this,"handleClickOutside",t=>{const e=t.target;this.element.contains(e)||this.hide()});this.root=t;const e=document.createElement("input");e.classList.add(a+"editor"),this.element=e,this.hide()}hide(){this.element.style.display="none",this.element.classList.add("hide"),this.element.blur(),window.removeEventListener("click",this.handleClickOutside),this.element.removeEventListener("keydown",this.handleKeydown),this.root.focusTable()}show(t,e){const{height:o,width:i,x:r,y:l}=new u(this.root.config,t),h=this.root.getCell(t);this.element.classList.remove("hide"),this.element.style.top=l-this.root.viewport.top+this.root.columnsBarHeight+"px",this.element.style.left=r-this.root.viewport.left+this.root.rowsBarWidth+"px",this.element.style.width=i+"px",this.element.style.height=o+"px",this.element.style.display="block",window.addEventListener("click",this.handleClickOutside),this.element.addEventListener("keydown",this.handleKeydown),this.element.value=e||h.value,this.element.focus(),e||this.element.select()}}class A{constructor(t){s(this,"element");s(this,"verticalScroller");s(this,"horizontalScroller");s(this,"root");s(this,"isSelecting",!1);s(this,"handleMouseMove",t=>{if(!this.isSelecting)return;const{offsetX:e,offsetY:o}=t,i=this.root.getCellByCoords(e,o);this.root.selection.selectedRange&&(this.root.selection.selectedRange.to=i),this.root.renderSheet(),this.root.renderColumnsBar(),this.root.renderRowsBar()});s(this,"handleMouseUp",()=>{this.isSelecting=!1,this.root.selection.selectedRange&&this.root.selection.selectedRange.from.row===this.root.selection.selectedRange.to.row&&this.root.selection.selectedRange.from.column===this.root.selection.selectedRange.to.column&&(this.root.selection.selectedRange=null),this.root.renderSheet(),this.root.renderColumnsBar(),this.root.renderRowsBar()});s(this,"handleDoubleClick",t=>{t.preventDefault();const e=this.root.getCellByCoords(t.offsetX,t.offsetY);this.root.showEditor(e)});s(this,"handleKeydown",t=>{if(console.log(t),["ArrowLeft","ArrowRight","ArrowUp","ArrowDown"].includes(t.key))switch(t.preventDefault(),this.root.selection.selectedRange=null,t.key){case"ArrowLeft":{this.root.selection.selectedCell&&this.root.selection.selectedCell.column>0&&(console.log("tick"),this.root.selection.selectedCell.column-=1,this.root.renderSheet());break}case"ArrowRight":{this.root.selection.selectedCell&&this.root.selection.selectedCell.column0&&(this.root.selection.selectedCell.row-=1,this.root.renderSheet());break}case"ArrowDown":{this.root.selection.selectedCell&&this.root.selection.selectedCell.row{if(t.button!==0)return;const{offsetX:e,offsetY:o}=t,i=this.root.getCellByCoords(e,o);this.isSelecting=!0,this.root.selection.selectedRange={from:i,to:i},this.root.selection.selectedCell=i,this.root.renderSheet(),this.root.renderColumnsBar(),this.root.renderRowsBar()});s(this,"handleScroll",()=>{const t=this.getViewportBoundlingRect();this.root.viewport.updateValues(t),this.root.renderSheet(),this.root.renderColumnsBar(),this.root.renderRowsBar()});this.root=t;const{horizontalScroller:e,scroller:o,verticalScroller:i}=this.buildComponent();this.element=o,this.verticalScroller=i,this.horizontalScroller=e,this.element.style.height=this.root.config.view.height+"px",this.element.style.width=this.root.config.view.width+"px",this.element.style.top=this.root.columnsBarHeight+"px",this.element.style.left=this.root.rowsBarWidth+"px",this.element.tabIndex=-1,this.updateScrollerSize(),this.element.addEventListener("scroll",this.handleScroll),this.element.addEventListener("mousedown",this.handleClick),this.element.addEventListener("mousemove",this.handleMouseMove),this.element.addEventListener("mouseup",this.handleMouseUp),this.element.addEventListener("dblclick",this.handleDoubleClick),this.element.addEventListener("keydown",this.handleKeydown)}getViewportBoundlingRect(){const{scrollTop:t,scrollLeft:e}=this.element,{height:o,width:i}=this.element.getBoundingClientRect(),r=t+o,l=e+i;return{top:t,left:e,bottom:r,right:l}}buildComponent(){const t=document.createElement("div"),e=document.createElement("div"),o=document.createElement("div"),i=document.createElement("div"),r=document.createElement("div");return e.style.width="0px",e.style.pointerEvents="none",o.style.pointerEvents="none",i.style.display="flex",r.appendChild(e),r.appendChild(o),i.appendChild(r),this.verticalScroller=e,this.horizontalScroller=o,t.appendChild(i),t.classList.add(a+"scroller"),{scroller:t,verticalScroller:e,horizontalScroller:o}}getActualHeight(){return this.root.config.rows.reduce((t,e)=>(t+=e.height,t),0)}getActualWidth(){return this.root.config.columns.reduce((t,e)=>(t+=e.width,t),0)}updateScrollerSize(){const t=this.getActualHeight(),e=this.getActualWidth();this.setScrollerHeight(t),this.setScrollerWidth(e)}setScrollerHeight(t){this.verticalScroller.style.height=t+"px"}setScrollerWidth(t){this.horizontalScroller.style.width=t+"px"}}class S{constructor(t){s(this,"fontSize",16);s(this,"fontColor","black");s(this,"background","white");s(this,"borderColor","black");s(this,"selectedBackground","#4287f5");s(this,"selectedFontColor","#ffffff");t&&Object.assign(this,t)}}class R{constructor(t,e){s(this,"row");s(this,"column");this.row=t,this.column=e}}class v{constructor(t){s(this,"value");s(this,"displayValue");s(this,"resultValue");s(this,"position");s(this,"style");this.value=t.value,this.displayValue=t.displayValue,this.resultValue=t.resultValue,this.position=t.position,this.style=t.style}}class f{constructor(t){s(this,"value");s(this,"displayValue");s(this,"resultValue");s(this,"position");s(this,"style",null);this.value=t.value,this.displayValue=t.displayValue,this.resultValue=t.resultValue,this.position=t.position,this.style=t.style}getSerializableCell(){return new v({displayValue:this.displayValue,position:this.position,resultValue:this.resultValue,style:this.style,value:this.value})}changeStyles(t){this.style=t}changeValues(t){Object.assign(this,t)}isCellInRange(t){const{column:e,row:o}=this.position,{selectedRange:i}=t.selection;if(!i)return!1;const r=o>=Math.min(i.from.row,i.to.row)&&o<=Math.max(i.to.row,i.from.row);return e>=Math.min(i.from.column,i.to.column)&&e<=Math.max(i.to.column,i.from.column)&&r}render(t){var y;const e=new u(t.config,this.position);let{x:o,y:i}=e;const{height:r,width:l}=e,{ctx:h}=t,c=((y=t.selection.selectedCell)==null?void 0:y.row)===this.position.row&&t.selection.selectedCell.column===this.position.column,w=this.isCellInRange(t);i-=t.viewport.top,o-=t.viewport.left;const d=this.style??t.styles.cells;h.clearRect(o,i,l,r),h.fillStyle=c||w?d.selectedBackground:d.background,h.strokeStyle="black",h.fillRect(o,i,l-1,r-1),h.strokeRect(o,i,l,r),h.fillStyle=c||w?d.selectedFontColor:d.fontColor,h.textAlign="left",h.font=`${d.fontSize}px Arial`,h.textBaseline="middle",h.fillText(this.displayValue,o+2,i+r/2)}}class M{constructor(t){s(this,"element");s(this,"ctx");s(this,"root");this.root=t;const e=document.createElement("canvas");e.classList.add(a+"sheet"),e.height=this.root.config.view.height,e.width=this.root.config.view.width,e.style.width=this.root.config.view.width+"px",e.style.height=this.root.config.view.height+"px",e.style.left="0px",this.element=e;const o=this.element.getContext("2d");if(!o)throw new Error("Enable hardware acceleration");this.ctx=o}getCellByCoords(t,e){let o=0,i=0;for(;i<=e&&(i+=this.root.config.rows[o].height,!(i>=e));)o++;let r=0,l=0;for(;l<=t&&(l+=this.root.config.columns[r].width,!(l>=t));)r++;return new R(o,r)}renderCell(t){const{column:e,row:o}=t;this.root.data[o][e].render(this.root)}renderSheet(){const t=this.root.viewport.firstRow,e=this.root.viewport.lastCol+3,o=this.root.viewport.lastRow+3,i=this.root.viewport.firstCol;for(let r=t;r<=o;r++)for(let l=i;l<=e&&!(!this.root.config.columns[l]||!this.root.config.rows[r]);l++)this.renderCell({column:l,row:r})}}class z{constructor(t){s(this,"element");s(this,"root");this.root=t;const e=document.createElement("div");e.classList.add(a+"spreadsheet_container"),this.element=e,this.changeElementSizes(this.root.viewProps)}changeElementSizes(t){const{height:e,width:o}=t;this.element.style.width=o+this.root.rowsBarWidth+"px",this.element.style.height=e+this.root.columnsBarHeight+"px"}}class D{constructor(t){s(this,"element");s(this,"root");s(this,"height",0);this.root=t;const e=document.createElement("div");e.classList.add(a+"toolbar"),this.element=e}}class m{constructor(t){s(this,"rows");s(this,"columns");s(this,"view",{width:800,height:600});this.columns=t.columns,this.rows=t.rows,this.view=t.view}}class b{constructor(){s(this,"selectedCell",null);s(this,"selectedRange",null)}}class B{constructor(){s(this,"cells");this.cells=new S}}class g{constructor(t,e){s(this,"root");s(this,"top");s(this,"left");s(this,"right");s(this,"bottom");s(this,"firstRow");s(this,"lastRow");s(this,"firstCol");s(this,"lastCol");this.root=t,this.top=e.top,this.left=e.left,this.right=e.right,this.bottom=e.bottom,this.firstRow=this.getFirstRow(),this.lastCol=this.getFirstRow();//!Temp +"use strict";var A=Object.defineProperty;var T=(r,t,e)=>t in r?A(r,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):r[t]=e;var s=(r,t,e)=>(T(r,typeof t!="symbol"?t+"":t,e),e);Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});var a;(function(r){r.CELL_CLICK="CELL_CLICK",r.SELECTION_CHANGE="CHANGE_SELECTION",r.CELL_CHANGE="CELL_CHANGE"})(a||(a={}));class H{constructor(t){s(this,"root");s(this,"cellClick",(t,e)=>{var c,d;if(t.button!==0)return;const{offsetX:o,offsetY:l}=t,i=this.root.getCellByCoords(o,l),n=this.root.getCell(i),h=new y;h.selectedCell=i,h.selectedRange={from:i,to:i},e.setSelectingMode(!0),this.changeSelection(h,!0),(d=(c=this.root.config).onCellClick)==null||d.call(c,t,n)});s(this,"changeSelection",(t,e=!1)=>{var o,l;this.root.selection=t,e&&((l=(o=this.root.config).onSelectonChange)==null||l.call(o,t)),this.root.renderSheet(),this.root.renderColumnsBar(),this.root.renderRowsBar()});this.root=t}dispatch(t){switch(t.type){case a.CELL_CLICK:{const{event:e,scroller:o}=t;this.cellClick(e,o);break}case a.SELECTION_CHANGE:{const{selection:e,enableCallback:o}=t;this.changeSelection(e,o);break}case a.CELL_CHANGE:{const{cell:e,values:o}=t;this.changeCellValues(e,o);break}}}changeCellValues(t,e){var o,l;this.root.changeCellValues(t.position,e),(l=(o=this.root.config).onCellChange)==null||l.call(o,t)}}class g{constructor(t,e){s(this,"x");s(this,"y");s(this,"width");s(this,"height");this.x=this.getXCoord(e.column,t),this.y=this.getYCoord(e.row,t),this.width=t.columns[e.column].width,this.height=t.rows[e.row].height}getXCoord(t,e){let o=0;for(let l=0;l{const{key:e}=t;switch(e){case"Escape":{this.hide();break}case"Enter":{if(!this.root.selection.selectedCell)return;this.root.events.dispatch({type:a.CELL_CHANGE,cell:this.root.getCell(this.root.selection.selectedCell),values:{value:this.element.value,displayValue:this.element.value}}),this.hide()}}});s(this,"handleClickOutside",t=>{const e=t.target;this.element.contains(e)||this.hide()});this.root=t;const e=document.createElement("input");e.classList.add(u+"editor"),this.element=e,this.hide()}hide(){this.element.style.display="none",this.element.classList.add("hide"),this.element.blur(),window.removeEventListener("click",this.handleClickOutside),this.element.removeEventListener("keydown",this.handleKeydown),this.root.focusTable()}show(t,e){const{height:o,width:l,x:i,y:n}=new g(this.root.config,t),h=this.root.getCell(t);this.element.classList.remove("hide"),this.element.style.top=n-this.root.viewport.top+this.root.columnsBarHeight+"px",this.element.style.left=i-this.root.viewport.left+this.root.rowsBarWidth+"px",this.element.style.width=l+"px",this.element.style.height=o+"px",this.element.style.display="block",window.addEventListener("click",this.handleClickOutside),this.element.addEventListener("keydown",this.handleKeydown),this.element.value=e||h.value,this.element.focus(),e||this.element.select()}}function b(r,t){return r.column===t.column&&r.row===t.row}class z{constructor(t){s(this,"element");s(this,"verticalScroller");s(this,"horizontalScroller");s(this,"root");s(this,"isSelecting",!1);s(this,"handleMouseMove",t=>{if(!this.isSelecting)return;const{offsetX:e,offsetY:o}=t,l=this.root.getCellByCoords(e,o);let i=!1;this.root.selection.selectedRange&&(i=!b(this.root.selection.selectedRange.to,l),i&&(this.root.selection.selectedRange.to=l,this.root.events.dispatch({type:a.SELECTION_CHANGE,selection:this.root.selection,enableCallback:!0})))});s(this,"handleMouseUp",()=>{this.isSelecting=!1;const t={...this.root.selection};this.root.selection.selectedRange&&b(this.root.selection.selectedRange.from,this.root.selection.selectedRange.to)&&(t.selectedRange=null,this.root.events.dispatch({type:a.SELECTION_CHANGE,selection:t,enableCallback:!1})),this.root.renderSheet(),this.root.renderColumnsBar(),this.root.renderRowsBar()});s(this,"handleDoubleClick",t=>{t.preventDefault();const e=this.root.getCellByCoords(t.offsetX,t.offsetY);this.root.showEditor(e)});s(this,"handleKeydown",t=>{if(["ArrowLeft","ArrowRight","ArrowUp","ArrowDown"].includes(t.key)){switch(t.preventDefault(),this.root.selection.selectedRange=null,t.key){case"ArrowLeft":{this.root.selection.selectedCell&&this.root.selection.selectedCell.column>0&&(this.root.selection.selectedCell.column-=1);break}case"ArrowRight":{this.root.selection.selectedCell&&this.root.selection.selectedCell.column0&&(this.root.selection.selectedCell.row-=1);break}case"ArrowDown":{this.root.selection.selectedCell&&this.root.selection.selectedCell.row{this.root.events.dispatch({type:a.CELL_CLICK,event:t,scroller:this})});s(this,"handleScroll",()=>{const t=this.getViewportBoundlingRect();this.root.viewport.updateValues(t),this.root.renderSheet(),this.root.renderColumnsBar(),this.root.renderRowsBar()});this.root=t;const{horizontalScroller:e,scroller:o,verticalScroller:l}=this.buildComponent();this.element=o,this.verticalScroller=l,this.horizontalScroller=e,this.element.style.height=this.root.config.view.height+"px",this.element.style.width=this.root.config.view.width+"px",this.element.style.top=this.root.columnsBarHeight+"px",this.element.style.left=this.root.rowsBarWidth+"px",this.element.tabIndex=-1,this.updateScrollerSize(),this.element.addEventListener("scroll",this.handleScroll),this.element.addEventListener("mousedown",this.handleClick),this.element.addEventListener("mousemove",this.handleMouseMove),this.element.addEventListener("mouseup",this.handleMouseUp),this.element.addEventListener("dblclick",this.handleDoubleClick),this.element.addEventListener("keydown",this.handleKeydown)}setSelectingMode(t){this.isSelecting=t}getViewportBoundlingRect(){const{scrollTop:t,scrollLeft:e}=this.element,{height:o,width:l}=this.element.getBoundingClientRect(),i=t+o,n=e+l;return{top:t,left:e,bottom:i,right:n}}buildComponent(){const t=document.createElement("div"),e=document.createElement("div"),o=document.createElement("div"),l=document.createElement("div"),i=document.createElement("div");return e.style.width="0px",e.style.pointerEvents="none",o.style.pointerEvents="none",l.style.display="flex",i.appendChild(e),i.appendChild(o),l.appendChild(i),this.verticalScroller=e,this.horizontalScroller=o,t.appendChild(l),t.classList.add(u+"scroller"),{scroller:t,verticalScroller:e,horizontalScroller:o}}getActualHeight(){return this.root.config.rows.reduce((t,e)=>(t+=e.height,t),0)}getActualWidth(){return this.root.config.columns.reduce((t,e)=>(t+=e.width,t),0)}updateScrollerSize(){const t=this.getActualHeight(),e=this.getActualWidth();this.setScrollerHeight(t),this.setScrollerWidth(e)}setScrollerHeight(t){this.verticalScroller.style.height=t+"px"}setScrollerWidth(t){this.horizontalScroller.style.width=t+"px"}}class R{constructor(t){s(this,"fontSize",16);s(this,"fontColor","black");s(this,"background","white");s(this,"borderColor","black");s(this,"selectedBackground","#4287f5");s(this,"selectedFontColor","#ffffff");t&&Object.assign(this,t)}}class k{constructor(t,e){s(this,"row");s(this,"column");this.row=t,this.column=e}}class E{constructor(t){s(this,"value");s(this,"displayValue");s(this,"resultValue");s(this,"position");s(this,"style");this.value=t.value,this.displayValue=t.displayValue,this.resultValue=t.resultValue,this.position=t.position,this.style=t.style}}class f{constructor(t){s(this,"value");s(this,"displayValue");s(this,"resultValue");s(this,"position");s(this,"style",null);this.value=t.value,this.displayValue=t.displayValue,this.resultValue=t.resultValue,this.position=t.position,this.style=t.style}getSerializableCell(){return new E({displayValue:this.displayValue,position:this.position,resultValue:this.resultValue,style:this.style,value:this.value})}changeStyles(t){this.style=t}changeValues(t){Object.assign(this,t)}isCellInRange(t){const{column:e,row:o}=this.position,{selectedRange:l}=t.selection;if(!l)return!1;const i=o>=Math.min(l.from.row,l.to.row)&&o<=Math.max(l.to.row,l.from.row);return e>=Math.min(l.from.column,l.to.column)&&e<=Math.max(l.to.column,l.from.column)&&i}render(t){var v;const e=new g(t.config,this.position);let{x:o,y:l}=e;const{height:i,width:n}=e,{ctx:h}=t,c=((v=t.selection.selectedCell)==null?void 0:v.row)===this.position.row&&t.selection.selectedCell.column===this.position.column,d=this.isCellInRange(t);l-=t.viewport.top,o-=t.viewport.left;const w=this.style??t.styles.cells;h.clearRect(o,l,n,i),h.fillStyle=c||d?w.selectedBackground:w.background,h.strokeStyle="black",h.fillRect(o,l,n-1,i-1),h.strokeRect(o,l,n,i),h.fillStyle=c||d?w.selectedFontColor:w.fontColor,h.textAlign="left",h.font=`${w.fontSize}px Arial`,h.textBaseline="middle",h.fillText(this.displayValue,o+2,l+i/2)}}class _{constructor(t){s(this,"element");s(this,"ctx");s(this,"root");this.root=t;const e=document.createElement("canvas");e.classList.add(u+"sheet"),e.height=this.root.config.view.height,e.width=this.root.config.view.width,e.style.width=this.root.config.view.width+"px",e.style.height=this.root.config.view.height+"px",e.style.left="0px",this.element=e;const o=this.element.getContext("2d");if(!o)throw new Error("Enable hardware acceleration");this.ctx=o}getCellByCoords(t,e){let o=0,l=0;for(;l<=e&&(l+=this.root.config.rows[o].height,!(l>=e));)o++;let i=0,n=0;for(;n<=t&&(n+=this.root.config.columns[i].width,!(n>=t));)i++;return new k(o,i)}renderCell(t){const{column:e,row:o}=t;this.root.data[o][e].render(this.root)}renderSheet(){const t=this.root.viewport.firstRow,e=this.root.viewport.lastCol+3,o=this.root.viewport.lastRow+3,l=this.root.viewport.firstCol;for(let i=t;i<=o;i++)for(let n=l;n<=e&&!(!this.root.config.columns[n]||!this.root.config.rows[i]);n++)this.renderCell({column:n,row:i})}}class D{constructor(t){s(this,"element");s(this,"root");this.root=t;const e=document.createElement("div");e.classList.add(u+"spreadsheet_container"),this.element=e,this.changeElementSizes(this.root.viewProps)}changeElementSizes(t){const{height:e,width:o}=t;this.element.style.width=o+this.root.rowsBarWidth+"px",this.element.style.height=e+this.root.columnsBarHeight+"px"}}class N{constructor(t){s(this,"element");s(this,"root");s(this,"height",0);this.root=t;const e=document.createElement("div");e.classList.add(u+"toolbar"),this.element=e}}class m{constructor(t){s(this,"rows");s(this,"columns");s(this,"view",{width:800,height:600});s(this,"onCellClick",null);s(this,"onSelectonChange",null);s(this,"onCellChange",null);this.columns=t.columns,this.rows=t.rows,this.view=t.view,this.onCellClick=t.onCellClick??null,this.onSelectonChange=t.onSelectionChange??null,this.onCellChange=t.onCellChange??null}}class y{constructor(){s(this,"selectedCell",null);s(this,"selectedRange",null)}}class B{constructor(){s(this,"cells");this.cells=new R}}class C{constructor(t,e){s(this,"root");s(this,"top");s(this,"left");s(this,"right");s(this,"bottom");s(this,"firstRow");s(this,"lastRow");s(this,"firstCol");s(this,"lastCol");this.root=t,this.top=e.top,this.left=e.left,this.right=e.right,this.bottom=e.bottom,this.firstRow=this.getFirstRow(),this.lastCol=this.getFirstRow();//!Temp this.firstCol=this.getFirstRow();//!Temp -this.lastRow=this.getLastRow(),this.updateValues({top:0,left:0,right:this.root.viewProps.width,bottom:this.root.viewProps.height})}updateValues(t){this.top=t.top,this.left=t.left,this.right=t.right,this.bottom=t.bottom,this.firstRow=this.getFirstRow(),this.lastRow=this.getLastRow(),this.firstCol=this.getFirstCol(),this.lastCol=this.getLastCol()}getFirstRow(){return this.root.cache.getRowByYCoord(this.top)}getLastRow(){return this.root.cache.getRowByYCoord(this.bottom)}getFirstCol(){return this.root.cache.getColumnByXCoord(this.left)}getLastCol(){return this.root.cache.getColumnByXCoord(this.right)}}class C{constructor(t){s(this,"width");s(this,"title");this.width=t.width,this.title=t.title}}class x{constructor(t){s(this,"height");s(this,"title");this.height=t.height,this.title=t.title}}function p(n,t,e=!1){const o=[];for(let i=0;i<=n;i++){const r=[];for(let l=0;l<=t;l++){const h=e?`${i}:${l}`:"",c=new f({displayValue:h,resultValue:h,value:h,position:{column:l,row:i},style:null});r.push(c)}o.push(r)}return o}function k(n,t){const e=[];for(let r=0;r<=n;r++){const l=new x({height:40,title:String(r)});e.push(l)}const o=[];for(let r=0;r<=t;r++){const l=new C({title:String(r),width:150});o.push(l)}return new m({columns:o,rows:e,view:{height:600,width:800}})}function F(n,t){const e=p(n,t),o=k(n,t);return{data:e,config:o}}class E{constructor(t){s(this,"xPos");s(this,"colIdx");this.xPos=t.xPos,this.colIdx=t.colIdx}}class V{constructor(t){s(this,"yPos");s(this,"rowIdx");this.yPos=t.yPos,this.rowIdx=t.rowIdx}}class I{constructor(t){s(this,"columns");s(this,"rows");this.columns=t.columns,this.rows=t.rows}getRowByYCoord(t){let e=0;for(let o=0;o=Math.min(o.from.column,o.to.column)&&t<=Math.max(o.from.column,o.to.column):!1}renderText(t,e){const{width:o,x:i}=e;this.ctx.fillStyle="black",this.ctx.textAlign="center",this.ctx.textBaseline="middle",this.ctx.font="16px Arial",this.ctx.fillText(this.root.config.columns[t].title,i+o/2-this.root.viewport.left,0+this.height/2)}renderRect(t,e){const{width:o,x:i}=e,r=this.isColumnSelected(t);this.ctx.fillStyle=r?this.root.styles.cells.selectedBackground:"white",this.ctx.strokeStyle="black",this.ctx.lineWidth=1;const l=i-this.root.viewport.left;this.ctx.fillRect(l-1,0,o,this.height),this.ctx.strokeRect(l-1,0,o,this.height)}renderSingleColumn(t){const e=new u(this.root.config,{row:0,column:t});this.renderRect(t,e),this.renderText(t,e)}renderBar(){const t=this.root.viewport.lastCol+3,e=this.root.viewport.firstCol;this.ctx.beginPath(),this.ctx.strokeStyle="black",this.ctx.lineWidth=1,this.ctx.moveTo(0,0),this.ctx.lineTo(0,this.height),this.ctx.closePath(),this.ctx.stroke();for(let o=e;o<=t&&this.root.config.columns[o];o++)this.renderSingleColumn(o)}}class W{constructor(t){s(this,"element");s(this,"ctx");s(this,"root");s(this,"width",30);s(this,"height");s(this,"resizerHeight",1);this.root=t,this.element=this.createElement();const e=this.element.getContext("2d");if(!e)throw new Error("Enable hardware acceleration");this.ctx=e,this.height=this.root.viewProps.height}createElement(){const t=document.createElement("canvas");return t.style.position="absolute",t.style.height=this.root.viewProps.height+"px",t.style.width=this.width+"px",t.style.display="block",t.style.borderTop="1px solid black",t.width=this.width,t.height=this.root.viewProps.height,t}setElementPosition(t,e){this.element.style.top=t+"px",this.element.style.left=e+"px"}isRowSelected(t){const{selectedCell:e,selectedRange:o}=this.root.selection;return e&&e.row===t?!0:o?t>=Math.min(o.from.row,o.to.row)&&t<=Math.max(o.from.row,o.to.row):!1}renderText(t,e){const{y:o,height:i}=e;this.ctx.fillStyle="black",this.ctx.textAlign="center",this.ctx.textBaseline="middle",this.ctx.font="16px Arial",this.ctx.fillText(this.root.config.rows[t].title,this.width/2,o-this.root.viewport.top+i/2)}renderRect(t,e){const{y:o,height:i}=e,r=this.isRowSelected(t);this.ctx.fillStyle=r?this.root.styles.cells.selectedBackground:"white",this.ctx.strokeStyle="black",this.ctx.lineWidth=this.resizerHeight;const l=o-this.root.viewport.top;this.ctx.fillRect(0,l-1,this.width,i),this.ctx.strokeRect(0,l-1,this.width,i)}renderSingleRow(t){const e=new u(this.root.config,{column:0,row:t});this.renderRect(t,e),this.renderText(t,e)}renderBar(){const t=this.root.viewport.lastRow+3,e=this.root.viewport.firstRow;this.ctx.beginPath(),this.ctx.moveTo(0,0),this.ctx.strokeStyle="black",this.ctx.lineWidth=16,this.ctx.lineTo(35,0),this.ctx.closePath(),this.ctx.stroke();for(let o=e;o<=t&&this.root.config.rows[o];o++)this.renderSingleRow(o)}}const a="modern_sc_";class X{constructor(t,e){s(this,"table");s(this,"scroller");s(this,"toolbar");s(this,"rowsBar");s(this,"columnsBar");s(this,"sheet");s(this,"editor");s(this,"styles");s(this,"config");s(this,"data");s(this,"viewport");s(this,"selection");s(this,"cache");const o=p(40,40),i=this.makeConfigFromData(o,(e==null?void 0:e.view)??{height:600,width:800});e!=null&&e.view&&(i.view=e.view),this.config=new m(i),this.rowsBar=new W(this),this.columnsBar=new H(this),this.sheet=new M(this),this.table=new z(this),this.scroller=new A(this),this.toolbar=new D(this),this.editor=new T(this),this.cache=this.getInitialCache(),this.viewport=new g(this,this.scroller.getViewportBoundlingRect()),this.selection=new b,this.data=o,this.styles=new B,this.buildComponent(),this.setElementsPositions(),this.appendTableToTarget(t),this.renderSheet(),this.renderColumnsBar(),this.renderRowsBar()}setRowsBarPosition(){const t=this.columnsBar.height+this.toolbar.height,e=0;this.rowsBar.setElementPosition(t,e)}setColumnsBarPosition(){const t=this.toolbar.height,e=this.rowsBar.width;console.log(t,e),this.columnsBar.setElementPosition(t,e)}setElementsPositions(){this.setRowsBarPosition(),this.setColumnsBarPosition()}getInitialCache(){const t=[];let e=0;for(let l=0;l<=this.config.columns.length-1;l++){const h=this.config.columns[l];e+=h.width;const c=new E({xPos:e,colIdx:l});t.push(c)}const o=[];let i=0;for(let l=0;l<=this.config.rows.length-1;l++){const h=this.config.rows[l];i+=h.height;const c=new V({yPos:i,rowIdx:l});o.push(c)}const r=new I({columns:t,rows:o});return console.log("CACHE: ",r),console.log("CONFIG: ",this.config),r}buildComponent(){const t=document.createElement("div");t.style.top=this.columnsBarHeight+"px",t.style.left=this.rowsBarWidth+"px",t.appendChild(this.sheet.element),t.classList.add(a+"content"),this.table.element.appendChild(this.toolbar.element),this.table.element.appendChild(this.rowsBar.element),this.table.element.appendChild(this.columnsBar.element),this.table.element.appendChild(t),this.table.element.appendChild(this.scroller.element),this.table.element.append(this.editor.element)}destroy(){this.table.element.remove()}appendTableToTarget(t){if(typeof t=="string"){const e=document.querySelector(t);if(!e)throw new Error(`Element with selector ${t} is not finded in DOM. - Make sure it exists.`);e==null||e.appendChild(this.table.element)}t instanceof HTMLElement&&t.append(this.table.element)}get ctx(){return this.sheet.ctx}get viewProps(){return this.config.view}get columnsBarHeight(){return this.columnsBar.height}get rowsBarWidth(){return this.rowsBar.width}get toolbarHeight(){return this.toolbar.height}focusTable(){this.scroller.element.focus()}getCellByCoords(t,e){return this.sheet.getCellByCoords(t,e)}getCell(t){const{column:e,row:o}=t;return this.data[o][e]}changeCellValues(t,e){const{column:o,row:i}=t;this.data[i][o].changeValues(e),this.renderCell(i,o)}changeCellStyles(t,e){const{column:o,row:i}=t;this.data[i][o].changeStyles(e),this.renderCell(i,o)}applyActionToRange(t,e){const o=Math.min(t.from.row,t.to.row),i=Math.max(t.from.row,t.to.row),r=Math.min(t.from.column,t.to.column),l=Math.max(t.from.column,t.to.column);for(let h=o;h<=i;h++)for(let c=r;c<=l;c++){const w=this.data[h][c];e(w)}}deleteSelectedCellsValues(){if(this.selection.selectedRange!==null)this.applyActionToRange(this.selection.selectedRange,t=>{this.changeCellValues(t.position,{displayValue:"",resultValue:"",value:""})});else{if(!this.selection.selectedCell)return;this.changeCellValues(this.selection.selectedCell,{displayValue:"",resultValue:"",value:""})}}showEditor(t,e){this.editor.show(t,e)}renderSheet(){this.sheet.renderSheet()}renderColumnsBar(){this.columnsBar.renderBar()}renderRowsBar(){this.rowsBar.renderBar()}renderCell(t,e){this.data[t][e].render(this)}loadData(t){const e=t.length,o=t[0]?this.data[0].length:0;this.data=[];const i=[];for(let r=0;r=Math.min(o.from.column,o.to.column)&&t<=Math.max(o.from.column,o.to.column):!1}renderText(t,e){const{width:o,x:l}=e;this.ctx.fillStyle="black",this.ctx.textAlign="center",this.ctx.textBaseline="middle",this.ctx.font="12px Arial",this.ctx.fillText(this.root.config.columns[t].title,l+o/2-this.root.viewport.left,0+this.height/2)}renderRect(t,e){const{width:o,x:l}=e,i=this.isColumnSelected(t);this.ctx.fillStyle=i?this.root.styles.cells.selectedBackground:"white",this.ctx.strokeStyle="black",this.ctx.lineWidth=1;const n=l-this.root.viewport.left;this.ctx.fillRect(n-1,0,o,this.height),this.ctx.strokeRect(n-1,0,o,this.height)}renderSingleColumn(t){const e=new g(this.root.config,{row:0,column:t});this.renderRect(t,e),this.renderText(t,e)}renderBar(){const t=this.root.viewport.lastCol+3,e=this.root.viewport.firstCol;this.ctx.beginPath(),this.ctx.strokeStyle="black",this.ctx.lineWidth=1,this.ctx.moveTo(0,0),this.ctx.lineTo(0,this.height),this.ctx.closePath(),this.ctx.stroke();for(let o=e;o<=t&&this.root.config.columns[o];o++)this.renderSingleColumn(o)}}class O{constructor(t){s(this,"element");s(this,"ctx");s(this,"root");s(this,"width",35);s(this,"height");s(this,"resizerHeight",1);this.root=t,this.element=this.createElement();const e=this.element.getContext("2d");if(!e)throw new Error("Enable hardware acceleration");this.ctx=e,this.height=this.root.viewProps.height}createElement(){const t=document.createElement("canvas");return t.style.position="absolute",t.style.height=this.root.viewProps.height+"px",t.style.width=this.width+"px",t.style.display="block",t.style.borderTop="1px solid black",t.width=this.width,t.height=this.root.viewProps.height,t}setElementPosition(t,e){this.element.style.top=t+"px",this.element.style.left=e+"px"}isRowSelected(t){const{selectedCell:e,selectedRange:o}=this.root.selection;return e&&e.row===t?!0:o?t>=Math.min(o.from.row,o.to.row)&&t<=Math.max(o.from.row,o.to.row):!1}renderText(t,e){const{y:o,height:l}=e;this.ctx.fillStyle="black",this.ctx.textAlign="center",this.ctx.textBaseline="middle",this.ctx.font="12px Arial",this.ctx.fillText(this.root.config.rows[t].title,this.width/2,o-this.root.viewport.top+l/2)}renderRect(t,e){const{y:o,height:l}=e,i=this.isRowSelected(t);this.ctx.fillStyle=i?this.root.styles.cells.selectedBackground:"white",this.ctx.strokeStyle="black",this.ctx.lineWidth=this.resizerHeight;const n=o-this.root.viewport.top;this.ctx.fillRect(0,n-1,this.width,l),this.ctx.strokeRect(0,n-1,this.width,l)}renderSingleRow(t){const e=new g(this.root.config,{column:0,row:t});this.renderRect(t,e),this.renderText(t,e)}renderBar(){const t=this.root.viewport.lastRow+3,e=this.root.viewport.firstRow;this.ctx.beginPath(),this.ctx.moveTo(0,0),this.ctx.strokeStyle="black",this.ctx.lineWidth=16,this.ctx.lineTo(35,0),this.ctx.closePath(),this.ctx.stroke();for(let o=e;o<=t&&this.root.config.rows[o];o++)this.renderSingleRow(o)}}const u="modern_sc_";class K{constructor(t,e){s(this,"table");s(this,"scroller");s(this,"toolbar");s(this,"rowsBar");s(this,"columnsBar");s(this,"sheet");s(this,"editor");s(this,"styles");s(this,"config");s(this,"data");s(this,"viewport");s(this,"selection");s(this,"cache");s(this,"events");const o=S(40,40),l=this.makeConfigFromData(o,(e==null?void 0:e.view)??{height:600,width:800});e!=null&&e.view&&(l.view=e.view),this.config=new m(l),this.config.onCellClick=(e==null?void 0:e.onCellClick)??null,this.config.onSelectonChange=(e==null?void 0:e.onSelectionChange)??null,this.config.onCellChange=(e==null?void 0:e.onCellChange)??null,this.rowsBar=new O(this),this.columnsBar=new W(this),this.sheet=new _(this),this.table=new D(this),this.scroller=new z(this),this.toolbar=new N(this),this.editor=new M(this),this.cache=this.getInitialCache(),this.viewport=new C(this,this.scroller.getViewportBoundlingRect()),this.selection=new y,this.events=new H(this),this.data=o,this.styles=new B,this.buildComponent(),this.setElementsPositions(),this.appendTableToTarget(t),this.renderSheet(),this.renderColumnsBar(),this.renderRowsBar()}setRowsBarPosition(){const t=this.columnsBar.height+this.toolbar.height,e=0;this.rowsBar.setElementPosition(t,e)}setColumnsBarPosition(){const t=this.toolbar.height,e=this.rowsBar.width;console.log(t,e),this.columnsBar.setElementPosition(t,e)}setElementsPositions(){this.setRowsBarPosition(),this.setColumnsBarPosition()}getInitialCache(){const t=[];let e=0;for(let n=0;n<=this.config.columns.length-1;n++){const h=this.config.columns[n];e+=h.width;const c=new I({xPos:e,colIdx:n});t.push(c)}const o=[];let l=0;for(let n=0;n<=this.config.rows.length-1;n++){const h=this.config.rows[n];l+=h.height;const c=new V({yPos:l,rowIdx:n});o.push(c)}const i=new P({columns:t,rows:o});return console.log("CACHE: ",i),console.log("CONFIG: ",this.config),i}buildComponent(){const t=document.createElement("div");t.style.top=this.columnsBarHeight+"px",t.style.left=this.rowsBarWidth+"px",t.appendChild(this.sheet.element),t.classList.add(u+"content"),this.table.element.appendChild(this.toolbar.element),this.table.element.appendChild(this.rowsBar.element),this.table.element.appendChild(this.columnsBar.element),this.table.element.appendChild(t),this.table.element.appendChild(this.scroller.element),this.table.element.append(this.editor.element)}destroy(){this.table.element.remove()}appendTableToTarget(t){if(typeof t=="string"){const e=document.querySelector(t);if(!e)throw new Error(`Element with selector ${t} is not finded in DOM. + Make sure it exists.`);e==null||e.appendChild(this.table.element)}t instanceof HTMLElement&&t.append(this.table.element)}get ctx(){return this.sheet.ctx}get viewProps(){return this.config.view}get columnsBarHeight(){return this.columnsBar.height}get rowsBarWidth(){return this.rowsBar.width}get toolbarHeight(){return this.toolbar.height}focusTable(){this.scroller.element.focus()}getCellByCoords(t,e){return this.sheet.getCellByCoords(t,e)}getCell(t){const{column:e,row:o}=t;return this.data[o][e]}changeCellValues(t,e){const{column:o,row:l}=t;this.data[l][o].changeValues(e),this.renderCell(l,o)}changeCellStyles(t,e){const{column:o,row:l}=t;this.data[l][o].changeStyles(e),this.renderCell(l,o)}applyActionToRange(t,e){const o=Math.min(t.from.row,t.to.row),l=Math.max(t.from.row,t.to.row),i=Math.min(t.from.column,t.to.column),n=Math.max(t.from.column,t.to.column);for(let h=o;h<=l;h++)for(let c=i;c<=n;c++){const d=this.data[h][c];e(d)}}deleteSelectedCellsValues(){if(this.selection.selectedRange!==null)this.applyActionToRange(this.selection.selectedRange,t=>{this.changeCellValues(t.position,{displayValue:"",resultValue:"",value:""})});else{if(!this.selection.selectedCell)return;this.changeCellValues(this.selection.selectedCell,{displayValue:"",resultValue:"",value:""})}}showEditor(t,e){this.editor.show(t,e)}renderSheet(){this.sheet.renderSheet()}renderColumnsBar(){this.columnsBar.renderBar()}renderRowsBar(){this.rowsBar.renderBar()}renderCell(t,e){this.data[t][e].render(this)}loadData(t){const e=t.length,o=t[0]?this.data[0].length:0;this.data=[];const l=[];for(let i=0;i {\n const { key } = event;\n switch (key) {\n case \"Escape\": {\n this.hide();\n break;\n }\n case \"Enter\": {\n this.root.changeCellValues(this.root.selection.selectedCell, {\n value: this.element.value,\n displayValue: this.element.value,\n });\n this.hide();\n }\n }\n };\n handleClickOutside = (event) => {\n const target = event.target;\n if (!this.element.contains(target)) {\n this.hide();\n }\n };\n}\n","import { CSS_PREFIX } from \"../main\";\nexport class Scroller {\n element;\n verticalScroller;\n horizontalScroller;\n root;\n isSelecting = false;\n constructor(root) {\n this.root = root;\n const { horizontalScroller, scroller, verticalScroller } = this.buildComponent();\n this.element = scroller;\n this.verticalScroller = verticalScroller;\n this.horizontalScroller = horizontalScroller;\n this.element.style.height = this.root.config.view.height + \"px\";\n this.element.style.width = this.root.config.view.width + \"px\";\n this.element.style.top = this.root.columnsBarHeight + \"px\";\n this.element.style.left = this.root.rowsBarWidth + \"px\";\n this.element.tabIndex = -1;\n this.updateScrollerSize(); //* Init size set\n this.element.addEventListener(\"scroll\", this.handleScroll);\n this.element.addEventListener(\"mousedown\", this.handleClick);\n this.element.addEventListener(\"mousemove\", this.handleMouseMove);\n this.element.addEventListener(\"mouseup\", this.handleMouseUp);\n this.element.addEventListener(\"dblclick\", this.handleDoubleClick);\n this.element.addEventListener(\"keydown\", this.handleKeydown);\n }\n handleMouseMove = (event) => {\n if (!this.isSelecting)\n return;\n const { offsetX, offsetY } = event;\n const lastSelectedCell = this.root.getCellByCoords(offsetX, offsetY);\n if (this.root.selection.selectedRange) {\n this.root.selection.selectedRange.to = lastSelectedCell;\n }\n this.root.renderSheet();\n this.root.renderColumnsBar();\n this.root.renderRowsBar();\n };\n handleMouseUp = () => {\n this.isSelecting = false;\n if (this.root.selection.selectedRange) {\n if (this.root.selection.selectedRange.from.row ===\n this.root.selection.selectedRange.to.row &&\n this.root.selection.selectedRange.from.column ===\n this.root.selection.selectedRange.to.column) {\n this.root.selection.selectedRange = null;\n }\n }\n this.root.renderSheet();\n this.root.renderColumnsBar();\n this.root.renderRowsBar();\n };\n handleDoubleClick = (event) => {\n event.preventDefault();\n const position = this.root.getCellByCoords(event.offsetX, event.offsetY);\n this.root.showEditor(position);\n };\n handleKeydown = (event) => {\n console.log(event);\n //* Navigation\n if ([\"ArrowLeft\", \"ArrowRight\", \"ArrowUp\", \"ArrowDown\"].includes(event.key)) {\n event.preventDefault();\n this.root.selection.selectedRange = null;\n switch (event.key) {\n case \"ArrowLeft\": {\n if (this.root.selection.selectedCell &&\n this.root.selection.selectedCell.column > 0) {\n console.log(\"tick\");\n this.root.selection.selectedCell.column -= 1;\n this.root.renderSheet();\n }\n break;\n }\n case \"ArrowRight\": {\n if (this.root.selection.selectedCell &&\n this.root.selection.selectedCell.column <\n this.root.config.columns.length - 1) {\n this.root.selection.selectedCell.column += 1;\n this.root.renderSheet();\n }\n break;\n }\n case \"ArrowUp\": {\n if (this.root.selection.selectedCell &&\n this.root.selection.selectedCell.row > 0) {\n this.root.selection.selectedCell.row -= 1;\n this.root.renderSheet();\n }\n break;\n }\n case \"ArrowDown\": {\n if (this.root.selection.selectedCell &&\n this.root.selection.selectedCell.row <\n this.root.config.rows.length - 1) {\n this.root.selection.selectedCell.row += 1;\n this.root.renderSheet();\n }\n break;\n }\n }\n }\n const keysRegex = /^([a-z]|[а-я])$/;\n if (!event.metaKey && !event.ctrlKey) {\n //* Prevent handle shortcutrs\n const isPressedLetterKey = keysRegex.test(event.key.toLowerCase());\n if (event.key === \"F2\" || isPressedLetterKey) {\n //* English and Russian keyboard. Or F2 button\n event.preventDefault();\n if (!this.root.selection.selectedCell)\n return;\n this.root.showEditor(this.root.selection.selectedCell, isPressedLetterKey ? event.key : undefined);\n }\n }\n if (event.key === \"Delete\") {\n event.preventDefault();\n this.root.deleteSelectedCellsValues();\n this.root.renderSheet();\n }\n };\n handleClick = (event) => {\n if (event.button !== 0)\n return; // Left mouse button\n const { offsetX, offsetY } = event;\n const clickedCell = this.root.getCellByCoords(offsetX, offsetY);\n this.isSelecting = true;\n this.root.selection.selectedRange = {\n from: clickedCell,\n to: clickedCell,\n };\n this.root.selection.selectedCell = clickedCell;\n this.root.renderSheet();\n this.root.renderColumnsBar();\n this.root.renderRowsBar();\n };\n handleScroll = () => {\n const rect = this.getViewportBoundlingRect();\n this.root.viewport.updateValues(rect);\n this.root.renderSheet();\n this.root.renderColumnsBar();\n this.root.renderRowsBar();\n };\n getViewportBoundlingRect() {\n const { scrollTop, scrollLeft } = this.element;\n const { height, width } = this.element.getBoundingClientRect();\n const bottom = scrollTop + height;\n const right = scrollLeft + width;\n return {\n top: scrollTop,\n left: scrollLeft,\n bottom,\n right,\n };\n }\n buildComponent() {\n const scroller = document.createElement(\"div\");\n const verticalScroller = document.createElement(\"div\");\n const horizontalScroller = document.createElement(\"div\");\n const groupScrollers = document.createElement(\"div\");\n const stack = document.createElement(\"div\");\n verticalScroller.style.width = \"0px\";\n verticalScroller.style.pointerEvents = \"none\";\n horizontalScroller.style.pointerEvents = \"none\";\n groupScrollers.style.display = \"flex\";\n stack.appendChild(verticalScroller);\n stack.appendChild(horizontalScroller);\n groupScrollers.appendChild(stack);\n this.verticalScroller = verticalScroller;\n this.horizontalScroller = horizontalScroller;\n scroller.appendChild(groupScrollers);\n scroller.classList.add(CSS_PREFIX + \"scroller\");\n return { scroller, verticalScroller, horizontalScroller };\n }\n getActualHeight() {\n return this.root.config.rows.reduce((acc, curr) => {\n acc += curr.height;\n return acc;\n }, 0);\n }\n getActualWidth() {\n return this.root.config.columns.reduce((acc, curr) => {\n acc += curr.width;\n return acc;\n }, 0);\n }\n updateScrollerSize() {\n const totalHeight = this.getActualHeight();\n const totalWidth = this.getActualWidth();\n this.setScrollerHeight(totalHeight);\n this.setScrollerWidth(totalWidth);\n }\n setScrollerHeight(height) {\n this.verticalScroller.style.height = height + \"px\";\n }\n setScrollerWidth(width) {\n this.horizontalScroller.style.width = width + \"px\";\n }\n}\n","import { RenderBox } from \"./renderBox\";\nexport class CellStyles {\n fontSize = 16;\n fontColor = \"black\";\n background = \"white\";\n borderColor = \"black\";\n selectedBackground = \"#4287f5\";\n selectedFontColor = \"#ffffff\";\n constructor(props) {\n if (props) {\n Object.assign(this, props); // Override default styles\n }\n }\n}\nexport class Position {\n row;\n column;\n constructor(row, column) {\n this.row = row;\n this.column = column;\n }\n}\nexport class SerializableCell {\n value;\n displayValue;\n resultValue;\n position;\n style;\n constructor(props) {\n this.value = props.value;\n this.displayValue = props.displayValue;\n this.resultValue = props.resultValue;\n this.position = props.position;\n this.style = props.style;\n }\n}\nexport class Cell {\n /** True value (data) */\n value;\n /** Value to render */\n displayValue;\n /** This refers to the values that were obtained by calculations, for example, after calculating the formula */\n resultValue;\n position;\n style = null;\n constructor(props) {\n this.value = props.value;\n this.displayValue = props.displayValue;\n this.resultValue = props.resultValue;\n this.position = props.position;\n this.style = props.style;\n }\n getSerializableCell() {\n const cell = new SerializableCell({\n displayValue: this.displayValue,\n position: this.position,\n resultValue: this.resultValue,\n style: this.style,\n value: this.value,\n });\n return cell;\n }\n changeStyles(styles) {\n this.style = styles;\n }\n changeValues(values) {\n Object.assign(this, values);\n }\n isCellInRange(root) {\n const { column, row } = this.position;\n const { selectedRange } = root.selection;\n if (!selectedRange)\n return false;\n const isCellInRow = row >= Math.min(selectedRange.from.row, selectedRange.to.row) &&\n row <= Math.max(selectedRange.to.row, selectedRange.from.row);\n const isCellInCol = column >= Math.min(selectedRange.from.column, selectedRange.to.column) &&\n column <= Math.max(selectedRange.to.column, selectedRange.from.column);\n return isCellInCol && isCellInRow;\n }\n render(root) {\n const renderBox = new RenderBox(root.config, this.position);\n let { x, y } = renderBox;\n const { height, width } = renderBox;\n const { ctx } = root;\n const isCellSelected = root.selection.selectedCell?.row === this.position.row &&\n root.selection.selectedCell.column === this.position.column;\n const isCellInRange = this.isCellInRange(root);\n y -= root.viewport.top;\n x -= root.viewport.left;\n const styles = this.style ?? root.styles.cells;\n ctx.clearRect(x, y, width, height);\n ctx.fillStyle =\n isCellSelected || isCellInRange\n ? styles.selectedBackground\n : styles.background;\n ctx.strokeStyle = \"black\";\n ctx.fillRect(x, y, width - 1, height - 1);\n ctx.strokeRect(x, y, width, height);\n ctx.fillStyle =\n isCellSelected || isCellInRange\n ? styles.selectedFontColor\n : styles.fontColor;\n ctx.textAlign = \"left\";\n ctx.font = `${styles.fontSize}px Arial`;\n ctx.textBaseline = \"middle\";\n ctx.fillText(this.displayValue, x + 2, y + height / 2);\n }\n}\n","import { CSS_PREFIX } from \"../main\";\nimport { Position } from \"../modules/cell\";\n/**\n * Display (CANVAS) element where cells render\n */\nexport class Sheet {\n element;\n ctx;\n root;\n constructor(root) {\n this.root = root;\n const canvas = document.createElement(\"canvas\");\n canvas.classList.add(CSS_PREFIX + \"sheet\");\n //* Set up canvas sizes based on provided root config\n canvas.height = this.root.config.view.height;\n canvas.width = this.root.config.view.width;\n canvas.style.width = this.root.config.view.width + \"px\";\n canvas.style.height = this.root.config.view.height + \"px\";\n canvas.style.left = \"0px\";\n this.element = canvas;\n const ctx = this.element.getContext(\"2d\");\n if (!ctx)\n throw new Error(\"Enable hardware acceleration\");\n this.ctx = ctx;\n }\n getCellByCoords(x, y) {\n let row = 0;\n let height = 0;\n while (height <= y) {\n height += this.root.config.rows[row].height;\n if (height >= y)\n break;\n row++;\n }\n let col = 0;\n let width = 0;\n while (width <= x) {\n width += this.root.config.columns[col].width;\n if (width >= x)\n break;\n col++;\n }\n return new Position(row, col);\n }\n renderCell(position) {\n const { column, row } = position;\n this.root.data[row][column].render(this.root);\n }\n renderSheet() {\n const firstRowIdx = this.root.viewport.firstRow;\n const lastColIdx = this.root.viewport.lastCol + 3;\n const lastRowIdx = this.root.viewport.lastRow + 3;\n const firstColIdx = this.root.viewport.firstCol;\n for (let row = firstRowIdx; row <= lastRowIdx; row++) {\n for (let col = firstColIdx; col <= lastColIdx; col++) {\n if (!this.root.config.columns[col] || !this.root.config.rows[row])\n break; //* Prevent read undefined\n this.renderCell({ column: col, row });\n }\n }\n }\n}\n","import { CSS_PREFIX } from \"../main\";\n/** Base (root) component */\nexport class Table {\n element;\n root;\n constructor(root) {\n this.root = root;\n const container = document.createElement(\"div\");\n container.classList.add(CSS_PREFIX + \"spreadsheet_container\");\n this.element = container;\n this.changeElementSizes(this.root.viewProps);\n }\n changeElementSizes(sizes) {\n const { height, width } = sizes;\n this.element.style.width = width + this.root.rowsBarWidth + \"px\";\n this.element.style.height = height + this.root.columnsBarHeight + \"px\";\n }\n}\n","import { CSS_PREFIX } from \"../main\";\nexport class Toolbar {\n element;\n root;\n height = 0;\n constructor(root) {\n this.root = root;\n const toolbarElement = document.createElement(\"div\");\n toolbarElement.classList.add(CSS_PREFIX + \"toolbar\");\n this.element = toolbarElement;\n }\n}\n","export class Config {\n rows;\n columns;\n view = {\n width: 800,\n height: 600,\n };\n constructor(props) {\n this.columns = props.columns;\n this.rows = props.rows;\n this.view = props.view;\n }\n}\n","export class Selection {\n selectedCell = null;\n selectedRange = null;\n}\n","import { CellStyles } from \"./cell\";\nexport class Styles {\n cells;\n constructor() {\n this.cells = new CellStyles();\n }\n}\n","export class Viewport {\n root;\n top;\n left;\n right;\n bottom;\n firstRow;\n lastRow;\n firstCol;\n lastCol;\n constructor(root, props) {\n this.root = root;\n this.top = props.top;\n this.left = props.left;\n this.right = props.right;\n this.bottom = props.bottom;\n this.firstRow = this.getFirstRow();\n this.lastCol = this.getFirstRow(); //!Temp\n this.firstCol = this.getFirstRow(); //!Temp\n this.lastRow = this.getLastRow();\n this.updateValues({\n top: 0,\n left: 0,\n right: this.root.viewProps.width,\n bottom: this.root.viewProps.height,\n });\n }\n updateValues(props) {\n this.top = props.top;\n this.left = props.left;\n this.right = props.right;\n this.bottom = props.bottom;\n this.firstRow = this.getFirstRow();\n this.lastRow = this.getLastRow();\n this.firstCol = this.getFirstCol();\n this.lastCol = this.getLastCol();\n }\n /** Get index of first row in viewport */\n getFirstRow() {\n const rowIdx = this.root.cache.getRowByYCoord(this.top);\n return rowIdx;\n }\n getLastRow() {\n const rowIdx = this.root.cache.getRowByYCoord(this.bottom);\n return rowIdx;\n }\n getFirstCol() {\n const colIdx = this.root.cache.getColumnByXCoord(this.left);\n return colIdx;\n }\n getLastCol() {\n const colIdx = this.root.cache.getColumnByXCoord(this.right);\n return colIdx;\n }\n}\n","export class Column {\n width;\n title;\n constructor(props) {\n this.width = props.width;\n this.title = props.title;\n }\n}\n","export class Row {\n height;\n title;\n constructor(props) {\n this.height = props.height;\n this.title = props.title;\n }\n}\n","import { Cell } from \"../modules/cell\";\nimport { Column } from \"../modules/column\";\nimport { Config } from \"../modules/config\";\nimport { Row } from \"../modules/row\";\nexport function createSampleData(rows, columns, fillCellsByCoords = false) {\n const data = [];\n for (let row = 0; row <= rows; row++) {\n const innerRow = [];\n for (let col = 0; col <= columns; col++) {\n const value = fillCellsByCoords ? `${row}:${col}` : \"\";\n const cell = new Cell({\n displayValue: value,\n resultValue: value,\n value,\n position: {\n column: col,\n row: row,\n },\n style: null,\n });\n innerRow.push(cell);\n }\n data.push(innerRow);\n }\n return data;\n}\nexport function createSampleConfig(rows, columns) {\n const rowsArr = [];\n for (let i = 0; i <= rows; i++) {\n const rowItem = new Row({\n height: 40,\n title: String(i),\n });\n rowsArr.push(rowItem);\n }\n const colsArr = [];\n for (let i = 0; i <= columns; i++) {\n const colItem = new Column({\n title: String(i),\n width: 150,\n });\n colsArr.push(colItem);\n }\n const config = new Config({\n columns: colsArr,\n rows: rowsArr,\n view: {\n height: 600,\n width: 800,\n },\n });\n return config;\n}\nexport function makeSpreadsheetConfigAndData(rows, columns) {\n const data = createSampleData(rows, columns);\n const config = createSampleConfig(rows, columns);\n return { data, config };\n}\n","export class CachedColumn {\n xPos;\n colIdx;\n constructor(props) {\n this.xPos = props.xPos;\n this.colIdx = props.colIdx;\n }\n}\nexport class CachedRow {\n yPos;\n rowIdx;\n constructor(props) {\n this.yPos = props.yPos;\n this.rowIdx = props.rowIdx;\n }\n}\nexport class Cache {\n columns;\n rows;\n constructor(initial) {\n this.columns = initial.columns;\n this.rows = initial.rows;\n }\n getRowByYCoord(y) {\n let rowIdx = 0;\n for (let i = 0; i < this.rows.length; i++) {\n if (y <= this.rows[i].yPos) {\n //* Intersection detect\n rowIdx = i;\n break;\n }\n }\n return rowIdx;\n }\n getColumnByXCoord(x) {\n let colIdx = 0;\n for (let i = 0; i < this.columns.length; i++) {\n if (x <= this.columns[i].xPos) {\n //* Intersection detect\n colIdx = i;\n break;\n }\n }\n return colIdx;\n }\n}\n","import { RenderBox } from \"../main\";\nexport class ColumnsBar {\n element;\n root;\n height = 32;\n width;\n // private resizerWidth = 1;\n ctx;\n constructor(root) {\n this.root = root;\n this.element = this.createElement();\n const ctx = this.element.getContext(\"2d\");\n if (!ctx)\n throw new Error(\"Enable hardware acceleration\");\n this.ctx = ctx;\n this.width = this.root.viewProps.width;\n }\n createElement() {\n const element = document.createElement(\"canvas\");\n element.style.position = \"absolute\";\n element.style.height = this.height + \"px\";\n element.style.width = this.root.viewProps.width + \"px\";\n element.style.display = \"block\";\n element.style.borderLeft = \"1px solid black\";\n // element.style.boxSizing = 'border-box'\n element.width = this.root.viewProps.width;\n element.height = this.height;\n return element;\n }\n setElementPosition(top, left) {\n this.element.style.top = top + \"px\";\n this.element.style.left = left + \"px\";\n }\n isColumnSelected(column) {\n const { selectedCell, selectedRange } = this.root.selection;\n if (selectedCell && selectedCell.column === column)\n return true;\n if (selectedRange) {\n const inRange = column >=\n Math.min(selectedRange.from.column, selectedRange.to.column) &&\n column <= Math.max(selectedRange.from.column, selectedRange.to.column);\n return inRange;\n }\n return false;\n }\n // private getYCoordWithOffset(renderBox: RenderBox): number {\n // const {y} = renderBox\n // return y + this.root.toolbarHeight\n // }\n // private getXCoordWithOffset(renderBox: RenderBox): number {\n // const {x} = renderBox\n // return x\n // }\n renderText(column, renderBox) {\n const { width, x } = renderBox;\n this.ctx.fillStyle = \"black\";\n this.ctx.textAlign = \"center\";\n this.ctx.textBaseline = \"middle\";\n this.ctx.font = \"16px Arial\";\n this.ctx.fillText(this.root.config.columns[column].title, x + width / 2 - this.root.viewport.left, 0 + this.height / 2);\n }\n renderRect(column, renderBox) {\n const { width, x } = renderBox;\n const isColSelected = this.isColumnSelected(column);\n this.ctx.fillStyle = isColSelected\n ? this.root.styles.cells.selectedBackground\n : \"white\";\n this.ctx.strokeStyle = \"black\";\n this.ctx.lineWidth = 1;\n const specialX = x - this.root.viewport.left;\n this.ctx.fillRect(specialX - 1, 0, width, this.height);\n this.ctx.strokeRect(specialX - 1, 0, width, this.height);\n }\n renderSingleColumn(column) {\n const renderBox = new RenderBox(this.root.config, {\n row: 0,\n column: column,\n });\n this.renderRect(column, renderBox);\n this.renderText(column, renderBox);\n }\n renderBar() {\n const lastColIdx = this.root.viewport.lastCol + 3;\n const firstColIdx = this.root.viewport.firstCol;\n this.ctx.beginPath();\n this.ctx.strokeStyle = \"black\";\n this.ctx.lineWidth = 1;\n this.ctx.moveTo(0, 0);\n this.ctx.lineTo(0, this.height);\n this.ctx.closePath();\n this.ctx.stroke();\n for (let col = firstColIdx; col <= lastColIdx; col++) {\n if (!this.root.config.columns[col])\n break;\n this.renderSingleColumn(col);\n }\n }\n}\n","import { RenderBox } from \"../main\";\nexport class RowsBar {\n element;\n ctx;\n root;\n width = 30;\n height;\n resizerHeight = 1;\n constructor(root) {\n this.root = root;\n this.element = this.createElement();\n const ctx = this.element.getContext(\"2d\");\n if (!ctx)\n throw new Error(\"Enable hardware acceleration\");\n this.ctx = ctx;\n this.height = this.root.viewProps.height;\n }\n createElement() {\n const element = document.createElement(\"canvas\");\n element.style.position = \"absolute\";\n element.style.height = this.root.viewProps.height + \"px\";\n element.style.width = this.width + \"px\";\n element.style.display = \"block\";\n element.style.borderTop = \"1px solid black\";\n // element.style.boxSizing = 'border-box'\n element.width = this.width;\n element.height = this.root.viewProps.height;\n return element;\n }\n setElementPosition(top, left) {\n this.element.style.top = top + \"px\";\n this.element.style.left = left + \"px\";\n }\n isRowSelected(row) {\n const { selectedCell, selectedRange } = this.root.selection;\n if (selectedCell && selectedCell.row === row)\n return true;\n if (selectedRange) {\n const inRange = row >= Math.min(selectedRange.from.row, selectedRange.to.row) &&\n row <= Math.max(selectedRange.from.row, selectedRange.to.row);\n return inRange;\n }\n return false;\n }\n renderText(row, renderBox) {\n const { y, height } = renderBox;\n this.ctx.fillStyle = \"black\";\n this.ctx.textAlign = \"center\";\n this.ctx.textBaseline = \"middle\";\n this.ctx.font = \"16px Arial\";\n this.ctx.fillText(this.root.config.rows[row].title, this.width / 2, y - this.root.viewport.top + height / 2);\n }\n renderRect(column, renderBox) {\n const { y, height } = renderBox;\n const isRowSeleted = this.isRowSelected(column);\n this.ctx.fillStyle = isRowSeleted\n ? this.root.styles.cells.selectedBackground\n : \"white\";\n this.ctx.strokeStyle = \"black\";\n this.ctx.lineWidth = this.resizerHeight;\n const specialY = y - this.root.viewport.top;\n this.ctx.fillRect(0, specialY - 1, this.width, height);\n this.ctx.strokeRect(0, specialY - 1, this.width, height);\n }\n renderSingleRow(row) {\n const renderBox = new RenderBox(this.root.config, {\n column: 0,\n row: row,\n });\n this.renderRect(row, renderBox);\n this.renderText(row, renderBox);\n }\n renderBar() {\n const lastRowIdx = this.root.viewport.lastRow + 3;\n const firstRowIdx = this.root.viewport.firstRow;\n this.ctx.beginPath();\n this.ctx.moveTo(0, 0);\n this.ctx.strokeStyle = \"black\";\n this.ctx.lineWidth = 16;\n this.ctx.lineTo(35, 0);\n this.ctx.closePath();\n this.ctx.stroke();\n for (let row = firstRowIdx; row <= lastRowIdx; row++) {\n if (!this.root.config.rows[row])\n break;\n this.renderSingleRow(row);\n }\n }\n}\n","import { Editor } from \"./components/editor\";\nimport { Scroller } from \"./components/scroller\";\nimport { Sheet } from \"./components/sheet\";\nimport { Table } from \"./components/table\";\nimport { Toolbar } from \"./components/toolbar\";\nimport { Cell, } from \"./modules/cell\";\nimport { Config } from \"./modules/config\";\nimport { Selection } from \"./modules/selection\";\nimport { Styles } from \"./modules/styles\";\nimport { Viewport } from \"./modules/viewport\";\nimport \"./scss/main.scss\";\nimport { createSampleData } from \"./utils/createData\";\nimport { Cache, CachedColumn, CachedRow } from \"./modules/cache\";\nimport { Row } from \"./modules/row\";\nimport { Column } from \"./modules/column\";\nimport { ColumnsBar } from \"./components/columnsBar\";\nimport { RowsBar } from \"./components/rowsBar\";\nexport const CSS_PREFIX = \"modern_sc_\";\nexport default class Spreadsheet {\n table;\n scroller;\n toolbar;\n rowsBar;\n columnsBar;\n sheet;\n editor;\n styles;\n config;\n data;\n viewport;\n selection;\n cache;\n constructor(target, props) {\n const data = createSampleData(40, 40);\n const config = this.makeConfigFromData(data, props?.view ?? { height: 600, width: 800 });\n if (props?.view) {\n config.view = props.view;\n }\n this.config = new Config(config);\n this.rowsBar = new RowsBar(this);\n this.columnsBar = new ColumnsBar(this);\n this.sheet = new Sheet(this);\n this.table = new Table(this);\n this.scroller = new Scroller(this);\n this.toolbar = new Toolbar(this);\n this.editor = new Editor(this);\n this.cache = this.getInitialCache();\n this.viewport = new Viewport(this, this.scroller.getViewportBoundlingRect());\n this.selection = new Selection();\n this.data = data;\n this.styles = new Styles();\n this.buildComponent();\n this.setElementsPositions();\n this.appendTableToTarget(target);\n this.renderSheet();\n this.renderColumnsBar();\n this.renderRowsBar();\n }\n setRowsBarPosition() {\n const top = this.columnsBar.height + this.toolbar.height;\n const left = 0;\n this.rowsBar.setElementPosition(top, left);\n }\n setColumnsBarPosition() {\n const top = this.toolbar.height;\n const left = this.rowsBar.width;\n console.log(top, left);\n this.columnsBar.setElementPosition(top, left);\n }\n setElementsPositions() {\n this.setRowsBarPosition();\n this.setColumnsBarPosition();\n }\n getInitialCache() {\n const cachedCols = [];\n let currentWidth = 0;\n for (let i = 0; i <= this.config.columns.length - 1; i++) {\n const col = this.config.columns[i];\n currentWidth += col.width;\n const cacheCol = new CachedColumn({\n xPos: currentWidth,\n colIdx: i,\n });\n cachedCols.push(cacheCol);\n }\n const cachedRows = [];\n let currentHeight = 0;\n for (let i = 0; i <= this.config.rows.length - 1; i++) {\n const row = this.config.rows[i];\n currentHeight += row.height;\n const cacheRow = new CachedRow({\n yPos: currentHeight,\n rowIdx: i,\n });\n cachedRows.push(cacheRow);\n }\n const cache = new Cache({\n columns: cachedCols,\n rows: cachedRows,\n });\n console.log(\"CACHE: \", cache);\n console.log(\"CONFIG: \", this.config);\n return cache;\n }\n buildComponent() {\n const content = document.createElement(\"div\"); //* Abstract\n content.style.top = this.columnsBarHeight + \"px\";\n content.style.left = this.rowsBarWidth + \"px\";\n content.appendChild(this.sheet.element);\n content.classList.add(CSS_PREFIX + \"content\");\n this.table.element.appendChild(this.toolbar.element);\n this.table.element.appendChild(this.rowsBar.element);\n this.table.element.appendChild(this.columnsBar.element);\n this.table.element.appendChild(content);\n this.table.element.appendChild(this.scroller.element);\n this.table.element.append(this.editor.element);\n }\n /**Destroy spreadsheet DOM element.\n *\n * May be usefull when need to rerender component.\n */\n destroy() {\n this.table.element.remove();\n }\n appendTableToTarget(target) {\n if (typeof target === \"string\") {\n const element = document.querySelector(target);\n if (!element)\n throw new Error(`Element with selector ${target} is not finded in DOM.\\n Make sure it exists.`);\n element?.appendChild(this.table.element);\n }\n if (target instanceof HTMLElement) {\n target.append(this.table.element);\n }\n }\n /** Canvas rendering context 2D.\n *\n * Abble to draw on canvas with default CanvasAPI methods\n */\n get ctx() {\n return this.sheet.ctx;\n }\n get viewProps() {\n return this.config.view;\n }\n get columnsBarHeight() {\n return this.columnsBar.height;\n }\n get rowsBarWidth() {\n return this.rowsBar.width;\n }\n get toolbarHeight() {\n return this.toolbar.height;\n }\n /** Focusing on interactive part of spreadsheet */\n focusTable() {\n this.scroller.element.focus();\n }\n getCellByCoords(x, y) {\n return this.sheet.getCellByCoords(x, y);\n }\n getCell(position) {\n const { column, row } = position;\n return this.data[row][column];\n }\n changeCellValues(position, values) {\n const { column, row } = position;\n this.data[row][column].changeValues(values);\n this.renderCell(row, column);\n }\n changeCellStyles(position, styles) {\n const { column, row } = position;\n this.data[row][column].changeStyles(styles);\n this.renderCell(row, column);\n }\n applyActionToRange(range, callback) {\n const fromRow = Math.min(range.from.row, range.to.row);\n const toRow = Math.max(range.from.row, range.to.row);\n const fromCol = Math.min(range.from.column, range.to.column);\n const toCol = Math.max(range.from.column, range.to.column);\n for (let row = fromRow; row <= toRow; row++) {\n for (let col = fromCol; col <= toCol; col++) {\n const cell = this.data[row][col];\n callback(cell);\n }\n }\n }\n deleteSelectedCellsValues() {\n if (this.selection.selectedRange !== null) {\n this.applyActionToRange(this.selection.selectedRange, (cell) => {\n this.changeCellValues(cell.position, {\n displayValue: \"\",\n resultValue: \"\",\n value: \"\",\n });\n });\n }\n else {\n if (!this.selection.selectedCell)\n return;\n this.changeCellValues(this.selection.selectedCell, {\n displayValue: \"\",\n resultValue: \"\",\n value: \"\",\n });\n }\n }\n showEditor(position, initialString) {\n this.editor.show(position, initialString);\n }\n renderSheet() {\n this.sheet.renderSheet();\n }\n renderColumnsBar() {\n this.columnsBar.renderBar();\n }\n renderRowsBar() {\n this.rowsBar.renderBar();\n }\n renderCell(row, col) {\n this.data[row][col].render(this);\n }\n loadData(data) {\n const rowsLength = data.length;\n const colsLength = data[0] ? this.data[0].length : 0;\n this.data = [];\n const formattedData = [];\n for (let row = 0; row < rowsLength; row++) {\n const innerRow = [];\n for (let col = 0; col < colsLength; col++) {\n const cell = data[row][col];\n innerRow.push(new Cell({\n displayValue: cell.displayValue,\n position: cell.position,\n resultValue: cell.resultValue,\n value: cell.value,\n style: cell.style,\n }));\n }\n formattedData.push(innerRow);\n }\n this.data = formattedData;\n this.selection.selectedCell = null;\n this.selection.selectedRange = null;\n this.config = this.makeConfigFromData(formattedData, this.config.view);\n this.cache = this.getInitialCache();\n this.scroller.updateScrollerSize();\n this.viewport = new Viewport(this, this.scroller.getViewportBoundlingRect());\n this.renderSheet();\n return this;\n }\n makeConfigFromData(data, view) {\n const lastRowIdx = data.length - 1;\n const lastColIdx = data[0] ? data[0].length : 0;\n const rows = [];\n for (let row = 0; row < lastRowIdx; row++) {\n rows.push(new Row({\n height: 40,\n title: String(row),\n }));\n }\n const columns = [];\n for (let col = 0; col < lastColIdx; col++) {\n columns.push(new Column({\n width: 150,\n title: String(col),\n }));\n }\n const config = new Config({\n view,\n rows,\n columns,\n });\n return config;\n }\n serializeData() {\n const rowsLength = this.data.length;\n const colsLength = this.data[0] ? this.data[0].length : 0;\n const cellsArray = [];\n for (let row = 0; row < rowsLength; row++) {\n const innerRow = [];\n for (let col = 0; col < colsLength; col++) {\n innerRow.push(this.data[row][col].getSerializableCell());\n }\n cellsArray.push(innerRow);\n }\n return cellsArray;\n }\n}\nexport * from \"./modules/cache\";\nexport * from \"./modules/cell\";\nexport * from \"./modules/column\";\nexport * from \"./modules/config\";\nexport * from \"./modules/renderBox\";\nexport * from \"./modules/row\";\nexport * from \"./modules/selection\";\nexport * from \"./modules/styles\";\nexport * from \"./modules/viewport\";\nexport * from \"./utils/createData\";\n"],"names":["RenderBox","config","cellPosition","__publicField","column","x","row","y","Editor","root","event","key","target","element","CSS_PREFIX","position","initialString","height","width","cell","Scroller","offsetX","offsetY","lastSelectedCell","keysRegex","isPressedLetterKey","clickedCell","rect","horizontalScroller","scroller","verticalScroller","scrollTop","scrollLeft","bottom","right","groupScrollers","stack","acc","curr","totalHeight","totalWidth","CellStyles","props","Position","SerializableCell","Cell","styles","values","selectedRange","isCellInRow","renderBox","ctx","isCellSelected","_a","isCellInRange","Sheet","canvas","col","firstRowIdx","lastColIdx","lastRowIdx","firstColIdx","Table","container","sizes","Toolbar","toolbarElement","Config","Selection","Styles","Viewport","Column","Row","createSampleData","rows","columns","fillCellsByCoords","data","innerRow","value","createSampleConfig","rowsArr","i","rowItem","colsArr","colItem","makeSpreadsheetConfigAndData","CachedColumn","CachedRow","Cache","initial","rowIdx","colIdx","ColumnsBar","top","left","selectedCell","isColSelected","specialX","RowsBar","isRowSeleted","specialY","Spreadsheet","cachedCols","currentWidth","cacheCol","cachedRows","currentHeight","cacheRow","cache","content","range","callback","fromRow","toRow","fromCol","toCol","rowsLength","colsLength","formattedData","view","cellsArray"],"mappings":"oRAAO,MAAMA,CAAU,CAKnB,YAAYC,EAAQC,EAAc,CAJlCC,EAAA,UACAA,EAAA,UACAA,EAAA,cACAA,EAAA,eAEI,KAAK,EAAI,KAAK,UAAUD,EAAa,OAAQD,CAAM,EACnD,KAAK,EAAI,KAAK,UAAUC,EAAa,IAAKD,CAAM,EAChD,KAAK,MAAQA,EAAO,QAAQC,EAAa,MAAM,EAAE,MACjD,KAAK,OAASD,EAAO,KAAKC,EAAa,GAAG,EAAE,MAChD,CACA,UAAUE,EAAQH,EAAQ,CACtB,IAAII,EAAI,EACR,QAAS,EAAI,EAAG,EAAID,EAAQ,IACnBC,GAAAJ,EAAO,QAAQ,CAAC,EAAE,MAEpB,OAAAI,CACX,CACA,UAAUC,EAAKL,EAAQ,CACnB,IAAIM,EAAI,EACR,QAAS,EAAI,EAAG,EAAID,EAAK,IAChBC,GAAAN,EAAO,KAAK,CAAC,EAAE,OAEjB,OAAAM,CACX,CACJ,CCvBO,MAAMC,CAAO,CAGhB,YAAYC,EAAM,CAFlBN,EAAA,gBACAA,EAAA,aAkCAA,EAAA,qBAAiBO,GAAU,CACjB,KAAA,CAAE,IAAAC,CAAQ,EAAAD,EAChB,OAAQC,EAAK,CACT,IAAK,SAAU,CACX,KAAK,KAAK,EACV,KACJ,CACA,IAAK,QACD,KAAK,KAAK,iBAAiB,KAAK,KAAK,UAAU,aAAc,CACzD,MAAO,KAAK,QAAQ,MACpB,aAAc,KAAK,QAAQ,KAAA,CAC9B,EACD,KAAK,KAAK,CAElB,CAAA,GAEJR,EAAA,0BAAsBO,GAAU,CAC5B,MAAME,EAASF,EAAM,OAChB,KAAK,QAAQ,SAASE,CAAM,GAC7B,KAAK,KAAK,CACd,GApDA,KAAK,KAAOH,EACN,MAAAI,EAAU,SAAS,cAAc,OAAO,EACtCA,EAAA,UAAU,IAAIC,EAAa,QAAQ,EAC3C,KAAK,QAAUD,EACf,KAAK,KAAK,CACd,CACA,MAAO,CACE,KAAA,QAAQ,MAAM,QAAU,OACxB,KAAA,QAAQ,UAAU,IAAI,MAAM,EACjC,KAAK,QAAQ,OACN,OAAA,oBAAoB,QAAS,KAAK,kBAAkB,EAC3D,KAAK,QAAQ,oBAAoB,UAAW,KAAK,aAAa,EAC9D,KAAK,KAAK,YACd,CACA,KAAKE,EAAUC,EAAe,CACpB,KAAA,CAAE,OAAAC,EAAQ,MAAAC,EAAO,EAAAb,EAAG,EAAAE,CAAM,EAAA,IAAIP,EAAU,KAAK,KAAK,OAAQe,CAAQ,EAClEI,EAAO,KAAK,KAAK,QAAQJ,CAAQ,EAClC,KAAA,QAAQ,UAAU,OAAO,MAAM,EAC/B,KAAA,QAAQ,MAAM,IACfR,EAAI,KAAK,KAAK,SAAS,IAAM,KAAK,KAAK,iBAAmB,KACzD,KAAA,QAAQ,MAAM,KACfF,EAAI,KAAK,KAAK,SAAS,KAAO,KAAK,KAAK,aAAe,KACtD,KAAA,QAAQ,MAAM,MAAQa,EAAQ,KAC9B,KAAA,QAAQ,MAAM,OAASD,EAAS,KAChC,KAAA,QAAQ,MAAM,QAAU,QACtB,OAAA,iBAAiB,QAAS,KAAK,kBAAkB,EACxD,KAAK,QAAQ,iBAAiB,UAAW,KAAK,aAAa,EAC3D,KAAK,QAAQ,MAAQD,GAAgCG,EAAK,MAC1D,KAAK,QAAQ,QACRH,GACD,KAAK,QAAQ,QACrB,CAuBJ,CC3DO,MAAMI,CAAS,CAMlB,YAAYX,EAAM,CALlBN,EAAA,gBACAA,EAAA,yBACAA,EAAA,2BACAA,EAAA,aACAA,EAAA,mBAAc,IAoBdA,EAAA,uBAAmBO,GAAU,CACzB,GAAI,CAAC,KAAK,YACN,OACE,KAAA,CAAE,QAAAW,EAAS,QAAAC,CAAY,EAAAZ,EACvBa,EAAmB,KAAK,KAAK,gBAAgBF,EAASC,CAAO,EAC/D,KAAK,KAAK,UAAU,gBACf,KAAA,KAAK,UAAU,cAAc,GAAKC,GAE3C,KAAK,KAAK,cACV,KAAK,KAAK,mBACV,KAAK,KAAK,eAAc,GAE5BpB,EAAA,qBAAgB,IAAM,CAClB,KAAK,YAAc,GACf,KAAK,KAAK,UAAU,eAChB,KAAK,KAAK,UAAU,cAAc,KAAK,MACvC,KAAK,KAAK,UAAU,cAAc,GAAG,KACrC,KAAK,KAAK,UAAU,cAAc,KAAK,SACnC,KAAK,KAAK,UAAU,cAAc,GAAG,SACpC,KAAA,KAAK,UAAU,cAAgB,MAG5C,KAAK,KAAK,cACV,KAAK,KAAK,mBACV,KAAK,KAAK,eAAc,GAE5BA,EAAA,yBAAqBO,GAAU,CAC3BA,EAAM,eAAe,EACrB,MAAMK,EAAW,KAAK,KAAK,gBAAgBL,EAAM,QAASA,EAAM,OAAO,EAClE,KAAA,KAAK,WAAWK,CAAQ,CAAA,GAEjCZ,EAAA,qBAAiBO,GAAU,CAGnB,GAFJ,QAAQ,IAAIA,CAAK,EAEb,CAAC,YAAa,aAAc,UAAW,WAAW,EAAE,SAASA,EAAM,GAAG,EAGtE,OAFAA,EAAM,eAAe,EAChB,KAAA,KAAK,UAAU,cAAgB,KAC5BA,EAAM,IAAK,CACf,IAAK,YAAa,CACV,KAAK,KAAK,UAAU,cACpB,KAAK,KAAK,UAAU,aAAa,OAAS,IAC1C,QAAQ,IAAI,MAAM,EACb,KAAA,KAAK,UAAU,aAAa,QAAU,EAC3C,KAAK,KAAK,eAEd,KACJ,CACA,IAAK,aAAc,CACX,KAAK,KAAK,UAAU,cACpB,KAAK,KAAK,UAAU,aAAa,OAC7B,KAAK,KAAK,OAAO,QAAQ,OAAS,IACjC,KAAA,KAAK,UAAU,aAAa,QAAU,EAC3C,KAAK,KAAK,eAEd,KACJ,CACA,IAAK,UAAW,CACR,KAAK,KAAK,UAAU,cACpB,KAAK,KAAK,UAAU,aAAa,IAAM,IAClC,KAAA,KAAK,UAAU,aAAa,KAAO,EACxC,KAAK,KAAK,eAEd,KACJ,CACA,IAAK,YAAa,CACV,KAAK,KAAK,UAAU,cACpB,KAAK,KAAK,UAAU,aAAa,IAC7B,KAAK,KAAK,OAAO,KAAK,OAAS,IAC9B,KAAA,KAAK,UAAU,aAAa,KAAO,EACxC,KAAK,KAAK,eAEd,KACJ,CACJ,CAEJ,MAAMc,EAAY,kBAClB,GAAI,CAACd,EAAM,SAAW,CAACA,EAAM,QAAS,CAElC,MAAMe,EAAqBD,EAAU,KAAKd,EAAM,IAAI,aAAa,EAC7D,GAAAA,EAAM,MAAQ,MAAQe,EAAoB,CAGtC,GADJf,EAAM,eAAe,EACjB,CAAC,KAAK,KAAK,UAAU,aACrB,OACC,KAAA,KAAK,WAAW,KAAK,KAAK,UAAU,aAAce,EAAqBf,EAAM,IAAM,MAAS,CACrG,CACJ,CACIA,EAAM,MAAQ,WACdA,EAAM,eAAe,EACrB,KAAK,KAAK,4BACV,KAAK,KAAK,cACd,GAEJP,EAAA,mBAAeO,GAAU,CACrB,GAAIA,EAAM,SAAW,EACjB,OACE,KAAA,CAAE,QAAAW,EAAS,QAAAC,CAAY,EAAAZ,EACvBgB,EAAc,KAAK,KAAK,gBAAgBL,EAASC,CAAO,EAC9D,KAAK,YAAc,GACd,KAAA,KAAK,UAAU,cAAgB,CAChC,KAAMI,EACN,GAAIA,CAAA,EAEH,KAAA,KAAK,UAAU,aAAeA,EACnC,KAAK,KAAK,cACV,KAAK,KAAK,mBACV,KAAK,KAAK,eAAc,GAE5BvB,EAAA,oBAAe,IAAM,CACX,MAAAwB,EAAO,KAAK,2BACb,KAAA,KAAK,SAAS,aAAaA,CAAI,EACpC,KAAK,KAAK,cACV,KAAK,KAAK,mBACV,KAAK,KAAK,eAAc,GAnIxB,KAAK,KAAOlB,EACZ,KAAM,CAAE,mBAAAmB,EAAoB,SAAAC,EAAU,iBAAAC,CAAiB,EAAI,KAAK,iBAChE,KAAK,QAAUD,EACf,KAAK,iBAAmBC,EACxB,KAAK,mBAAqBF,EAC1B,KAAK,QAAQ,MAAM,OAAS,KAAK,KAAK,OAAO,KAAK,OAAS,KAC3D,KAAK,QAAQ,MAAM,MAAQ,KAAK,KAAK,OAAO,KAAK,MAAQ,KACzD,KAAK,QAAQ,MAAM,IAAM,KAAK,KAAK,iBAAmB,KACtD,KAAK,QAAQ,MAAM,KAAO,KAAK,KAAK,aAAe,KACnD,KAAK,QAAQ,SAAW,GACxB,KAAK,mBAAmB,EACxB,KAAK,QAAQ,iBAAiB,SAAU,KAAK,YAAY,EACzD,KAAK,QAAQ,iBAAiB,YAAa,KAAK,WAAW,EAC3D,KAAK,QAAQ,iBAAiB,YAAa,KAAK,eAAe,EAC/D,KAAK,QAAQ,iBAAiB,UAAW,KAAK,aAAa,EAC3D,KAAK,QAAQ,iBAAiB,WAAY,KAAK,iBAAiB,EAChE,KAAK,QAAQ,iBAAiB,UAAW,KAAK,aAAa,CAC/D,CAoHA,0BAA2B,CACvB,KAAM,CAAE,UAAAG,EAAW,WAAAC,GAAe,KAAK,QACjC,CAAE,OAAAf,EAAQ,MAAAC,CAAA,EAAU,KAAK,QAAQ,wBACjCe,EAASF,EAAYd,EACrBiB,EAAQF,EAAad,EACpB,MAAA,CACH,IAAKa,EACL,KAAMC,EACN,OAAAC,EACA,MAAAC,CAAA,CAER,CACA,gBAAiB,CACP,MAAAL,EAAW,SAAS,cAAc,KAAK,EACvCC,EAAmB,SAAS,cAAc,KAAK,EAC/CF,EAAqB,SAAS,cAAc,KAAK,EACjDO,EAAiB,SAAS,cAAc,KAAK,EAC7CC,EAAQ,SAAS,cAAc,KAAK,EAC1C,OAAAN,EAAiB,MAAM,MAAQ,MAC/BA,EAAiB,MAAM,cAAgB,OACvCF,EAAmB,MAAM,cAAgB,OACzCO,EAAe,MAAM,QAAU,OAC/BC,EAAM,YAAYN,CAAgB,EAClCM,EAAM,YAAYR,CAAkB,EACpCO,EAAe,YAAYC,CAAK,EAChC,KAAK,iBAAmBN,EACxB,KAAK,mBAAqBF,EAC1BC,EAAS,YAAYM,CAAc,EAC1BN,EAAA,UAAU,IAAIf,EAAa,UAAU,EACvC,CAAE,SAAAe,EAAU,iBAAAC,EAAkB,mBAAAF,EACzC,CACA,iBAAkB,CACd,OAAO,KAAK,KAAK,OAAO,KAAK,OAAO,CAACS,EAAKC,KACtCD,GAAOC,EAAK,OACLD,GACR,CAAC,CACR,CACA,gBAAiB,CACb,OAAO,KAAK,KAAK,OAAO,QAAQ,OAAO,CAACA,EAAKC,KACzCD,GAAOC,EAAK,MACLD,GACR,CAAC,CACR,CACA,oBAAqB,CACX,MAAAE,EAAc,KAAK,kBACnBC,EAAa,KAAK,iBACxB,KAAK,kBAAkBD,CAAW,EAClC,KAAK,iBAAiBC,CAAU,CACpC,CACA,kBAAkBvB,EAAQ,CACjB,KAAA,iBAAiB,MAAM,OAASA,EAAS,IAClD,CACA,iBAAiBC,EAAO,CACf,KAAA,mBAAmB,MAAM,MAAQA,EAAQ,IAClD,CACJ,CCnMO,MAAMuB,CAAW,CAOpB,YAAYC,EAAO,CANnBvC,EAAA,gBAAW,IACXA,EAAA,iBAAY,SACZA,EAAA,kBAAa,SACbA,EAAA,mBAAc,SACdA,EAAA,0BAAqB,WACrBA,EAAA,yBAAoB,WAEZuC,GACO,OAAA,OAAO,KAAMA,CAAK,CAEjC,CACJ,CACO,MAAMC,CAAS,CAGlB,YAAYrC,EAAKF,EAAQ,CAFzBD,EAAA,YACAA,EAAA,eAEI,KAAK,IAAMG,EACX,KAAK,OAASF,CAClB,CACJ,CACO,MAAMwC,CAAiB,CAM1B,YAAYF,EAAO,CALnBvC,EAAA,cACAA,EAAA,qBACAA,EAAA,oBACAA,EAAA,iBACAA,EAAA,cAEI,KAAK,MAAQuC,EAAM,MACnB,KAAK,aAAeA,EAAM,aAC1B,KAAK,YAAcA,EAAM,YACzB,KAAK,SAAWA,EAAM,SACtB,KAAK,MAAQA,EAAM,KACvB,CACJ,CACO,MAAMG,CAAK,CASd,YAAYH,EAAO,CAPnBvC,EAAA,cAEAA,EAAA,qBAEAA,EAAA,oBACAA,EAAA,iBACAA,EAAA,aAAQ,MAEJ,KAAK,MAAQuC,EAAM,MACnB,KAAK,aAAeA,EAAM,aAC1B,KAAK,YAAcA,EAAM,YACzB,KAAK,SAAWA,EAAM,SACtB,KAAK,MAAQA,EAAM,KACvB,CACA,qBAAsB,CAQX,OAPM,IAAIE,EAAiB,CAC9B,aAAc,KAAK,aACnB,SAAU,KAAK,SACf,YAAa,KAAK,YAClB,MAAO,KAAK,MACZ,MAAO,KAAK,KAAA,CACf,CAEL,CACA,aAAaE,EAAQ,CACjB,KAAK,MAAQA,CACjB,CACA,aAAaC,EAAQ,CACV,OAAA,OAAO,KAAMA,CAAM,CAC9B,CACA,cAActC,EAAM,CAChB,KAAM,CAAE,OAAAL,EAAQ,IAAAE,GAAQ,KAAK,SACvB,CAAE,cAAA0C,CAAc,EAAIvC,EAAK,UAC/B,GAAI,CAACuC,EACM,MAAA,GACX,MAAMC,EAAc3C,GAAO,KAAK,IAAI0C,EAAc,KAAK,IAAKA,EAAc,GAAG,GAAG,GAC5E1C,GAAO,KAAK,IAAI0C,EAAc,GAAG,IAAKA,EAAc,KAAK,GAAG,EAGhE,OAFoB5C,GAAU,KAAK,IAAI4C,EAAc,KAAK,OAAQA,EAAc,GAAG,MAAM,GACrF5C,GAAU,KAAK,IAAI4C,EAAc,GAAG,OAAQA,EAAc,KAAK,MAAM,GACnDC,CAC1B,CACA,OAAOxC,EAAM,OACT,MAAMyC,EAAY,IAAIlD,EAAUS,EAAK,OAAQ,KAAK,QAAQ,EACtD,GAAA,CAAE,EAAAJ,EAAG,EAAAE,CAAM,EAAA2C,EACT,KAAA,CAAE,OAAAjC,EAAQ,MAAAC,CAAU,EAAAgC,EACpB,CAAE,IAAAC,CAAQ,EAAA1C,EACV2C,IAAiBC,EAAA5C,EAAK,UAAU,eAAf,YAAA4C,EAA6B,OAAQ,KAAK,SAAS,KACtE5C,EAAK,UAAU,aAAa,SAAW,KAAK,SAAS,OACnD6C,EAAgB,KAAK,cAAc7C,CAAI,EAC7CF,GAAKE,EAAK,SAAS,IACnBJ,GAAKI,EAAK,SAAS,KACnB,MAAMqC,EAAS,KAAK,OAASrC,EAAK,OAAO,MACzC0C,EAAI,UAAU9C,EAAGE,EAAGW,EAAOD,CAAM,EACjCkC,EAAI,UACAC,GAAkBE,EACZR,EAAO,mBACPA,EAAO,WACjBK,EAAI,YAAc,QAClBA,EAAI,SAAS9C,EAAGE,EAAGW,EAAQ,EAAGD,EAAS,CAAC,EACxCkC,EAAI,WAAW9C,EAAGE,EAAGW,EAAOD,CAAM,EAClCkC,EAAI,UACAC,GAAkBE,EACZR,EAAO,kBACPA,EAAO,UACjBK,EAAI,UAAY,OACZA,EAAA,KAAO,GAAGL,EAAO,QAAQ,WAC7BK,EAAI,aAAe,SACnBA,EAAI,SAAS,KAAK,aAAc9C,EAAI,EAAGE,EAAIU,EAAS,CAAC,CACzD,CACJ,CCtGO,MAAMsC,CAAM,CAIf,YAAY9C,EAAM,CAHlBN,EAAA,gBACAA,EAAA,YACAA,EAAA,aAEI,KAAK,KAAOM,EACN,MAAA+C,EAAS,SAAS,cAAc,QAAQ,EACvCA,EAAA,UAAU,IAAI1C,EAAa,OAAO,EAEzC0C,EAAO,OAAS,KAAK,KAAK,OAAO,KAAK,OACtCA,EAAO,MAAQ,KAAK,KAAK,OAAO,KAAK,MACrCA,EAAO,MAAM,MAAQ,KAAK,KAAK,OAAO,KAAK,MAAQ,KACnDA,EAAO,MAAM,OAAS,KAAK,KAAK,OAAO,KAAK,OAAS,KACrDA,EAAO,MAAM,KAAO,MACpB,KAAK,QAAUA,EACf,MAAML,EAAM,KAAK,QAAQ,WAAW,IAAI,EACxC,GAAI,CAACA,EACK,MAAA,IAAI,MAAM,8BAA8B,EAClD,KAAK,IAAMA,CACf,CACA,gBAAgB9C,EAAGE,EAAG,CAClB,IAAID,EAAM,EACNW,EAAS,EACb,KAAOA,GAAUV,IACbU,GAAU,KAAK,KAAK,OAAO,KAAKX,CAAG,EAAE,OACjC,EAAAW,GAAUV,KAEdD,IAEJ,IAAImD,EAAM,EACNvC,EAAQ,EACZ,KAAOA,GAASb,IACZa,GAAS,KAAK,KAAK,OAAO,QAAQuC,CAAG,EAAE,MACnC,EAAAvC,GAASb,KAEboD,IAEG,OAAA,IAAId,EAASrC,EAAKmD,CAAG,CAChC,CACA,WAAW1C,EAAU,CACX,KAAA,CAAE,OAAAX,EAAQ,IAAAE,CAAQ,EAAAS,EACnB,KAAA,KAAK,KAAKT,CAAG,EAAEF,CAAM,EAAE,OAAO,KAAK,IAAI,CAChD,CACA,aAAc,CACJ,MAAAsD,EAAc,KAAK,KAAK,SAAS,SACjCC,EAAa,KAAK,KAAK,SAAS,QAAU,EAC1CC,EAAa,KAAK,KAAK,SAAS,QAAU,EAC1CC,EAAc,KAAK,KAAK,SAAS,SACvC,QAASvD,EAAMoD,EAAapD,GAAOsD,EAAYtD,IAC3C,QAASmD,EAAMI,EAAaJ,GAAOE,GAC3B,GAAC,KAAK,KAAK,OAAO,QAAQF,CAAG,GAAK,CAAC,KAAK,KAAK,OAAO,KAAKnD,CAAG,GADrBmD,IAG3C,KAAK,WAAW,CAAE,OAAQA,EAAK,IAAAnD,CAAK,CAAA,CAGhD,CACJ,CC3DO,MAAMwD,CAAM,CAGf,YAAYrD,EAAM,CAFlBN,EAAA,gBACAA,EAAA,aAEI,KAAK,KAAOM,EACN,MAAAsD,EAAY,SAAS,cAAc,KAAK,EACpCA,EAAA,UAAU,IAAIjD,EAAa,uBAAuB,EAC5D,KAAK,QAAUiD,EACV,KAAA,mBAAmB,KAAK,KAAK,SAAS,CAC/C,CACA,mBAAmBC,EAAO,CAChB,KAAA,CAAE,OAAA/C,EAAQ,MAAAC,CAAU,EAAA8C,EAC1B,KAAK,QAAQ,MAAM,MAAQ9C,EAAQ,KAAK,KAAK,aAAe,KAC5D,KAAK,QAAQ,MAAM,OAASD,EAAS,KAAK,KAAK,iBAAmB,IACtE,CACJ,CChBO,MAAMgD,CAAQ,CAIjB,YAAYxD,EAAM,CAHlBN,EAAA,gBACAA,EAAA,aACAA,EAAA,cAAS,GAEL,KAAK,KAAOM,EACN,MAAAyD,EAAiB,SAAS,cAAc,KAAK,EACpCA,EAAA,UAAU,IAAIpD,EAAa,SAAS,EACnD,KAAK,QAAUoD,CACnB,CACJ,CCXO,MAAMC,CAAO,CAOhB,YAAYzB,EAAO,CANnBvC,EAAA,aACAA,EAAA,gBACAA,EAAA,YAAO,CACH,MAAO,IACP,OAAQ,GAAA,GAGR,KAAK,QAAUuC,EAAM,QACrB,KAAK,KAAOA,EAAM,KAClB,KAAK,KAAOA,EAAM,IACtB,CACJ,CCZO,MAAM0B,CAAU,CAAhB,cACHjE,EAAA,oBAAe,MACfA,EAAA,qBAAgB,MACpB,CCFO,MAAMkE,CAAO,CAEhB,aAAc,CADdlE,EAAA,cAES,KAAA,MAAQ,IAAIsC,CACrB,CACJ,CCNO,MAAM6B,CAAS,CAUlB,YAAY7D,EAAMiC,EAAO,CATzBvC,EAAA,aACAA,EAAA,YACAA,EAAA,aACAA,EAAA,cACAA,EAAA,eACAA,EAAA,iBACAA,EAAA,gBACAA,EAAA,iBACAA,EAAA,gBAEI,KAAK,KAAOM,EACZ,KAAK,IAAMiC,EAAM,IACjB,KAAK,KAAOA,EAAM,KAClB,KAAK,MAAQA,EAAM,MACnB,KAAK,OAASA,EAAM,OACf,KAAA,SAAW,KAAK,cAChB,KAAA,QAAU,KAAK,cAAY;AAC3B,KAAA,SAAW,KAAK,cAAY;AAC5B,KAAA,QAAU,KAAK,aACpB,KAAK,aAAa,CACd,IAAK,EACL,KAAM,EACN,MAAO,KAAK,KAAK,UAAU,MAC3B,OAAQ,KAAK,KAAK,UAAU,MAAA,CAC/B,CACL,CACA,aAAaA,EAAO,CAChB,KAAK,IAAMA,EAAM,IACjB,KAAK,KAAOA,EAAM,KAClB,KAAK,MAAQA,EAAM,MACnB,KAAK,OAASA,EAAM,OACf,KAAA,SAAW,KAAK,cAChB,KAAA,QAAU,KAAK,aACf,KAAA,SAAW,KAAK,cAChB,KAAA,QAAU,KAAK,YACxB,CAEA,aAAc,CAEH,OADQ,KAAK,KAAK,MAAM,eAAe,KAAK,GAAG,CAE1D,CACA,YAAa,CAEF,OADQ,KAAK,KAAK,MAAM,eAAe,KAAK,MAAM,CAE7D,CACA,aAAc,CAEH,OADQ,KAAK,KAAK,MAAM,kBAAkB,KAAK,IAAI,CAE9D,CACA,YAAa,CAEF,OADQ,KAAK,KAAK,MAAM,kBAAkB,KAAK,KAAK,CAE/D,CACJ,CCtDO,MAAM6B,CAAO,CAGhB,YAAY7B,EAAO,CAFnBvC,EAAA,cACAA,EAAA,cAEI,KAAK,MAAQuC,EAAM,MACnB,KAAK,MAAQA,EAAM,KACvB,CACJ,CCPO,MAAM8B,CAAI,CAGb,YAAY9B,EAAO,CAFnBvC,EAAA,eACAA,EAAA,cAEI,KAAK,OAASuC,EAAM,OACpB,KAAK,MAAQA,EAAM,KACvB,CACJ,CCHO,SAAS+B,EAAiBC,EAAMC,EAASC,EAAoB,GAAO,CACvE,MAAMC,EAAO,CAAA,EACb,QAASvE,EAAM,EAAGA,GAAOoE,EAAMpE,IAAO,CAClC,MAAMwE,EAAW,CAAA,EACjB,QAASrB,EAAM,EAAGA,GAAOkB,EAASlB,IAAO,CACrC,MAAMsB,EAAQH,EAAoB,GAAGtE,CAAG,IAAImD,CAAG,GAAK,GAC9CtC,EAAO,IAAI0B,EAAK,CAClB,aAAckC,EACd,YAAaA,EACb,MAAAA,EACA,SAAU,CACN,OAAQtB,EACR,IAAAnD,CACJ,EACA,MAAO,IAAA,CACV,EACDwE,EAAS,KAAK3D,CAAI,CACtB,CACA0D,EAAK,KAAKC,CAAQ,CACtB,CACO,OAAAD,CACX,CACgB,SAAAG,EAAmBN,EAAMC,EAAS,CAC9C,MAAMM,EAAU,CAAA,EAChB,QAASC,EAAI,EAAGA,GAAKR,EAAMQ,IAAK,CACtB,MAAAC,EAAU,IAAIX,EAAI,CACpB,OAAQ,GACR,MAAO,OAAOU,CAAC,CAAA,CAClB,EACDD,EAAQ,KAAKE,CAAO,CACxB,CACA,MAAMC,EAAU,CAAA,EAChB,QAASF,EAAI,EAAGA,GAAKP,EAASO,IAAK,CACzB,MAAAG,EAAU,IAAId,EAAO,CACvB,MAAO,OAAOW,CAAC,EACf,MAAO,GAAA,CACV,EACDE,EAAQ,KAAKC,CAAO,CACxB,CASO,OARQ,IAAIlB,EAAO,CACtB,QAASiB,EACT,KAAMH,EACN,KAAM,CACF,OAAQ,IACR,MAAO,GACX,CAAA,CACH,CAEL,CACgB,SAAAK,EAA6BZ,EAAMC,EAAS,CAClD,MAAAE,EAAOJ,EAAiBC,EAAMC,CAAO,EACrC1E,EAAS+E,EAAmBN,EAAMC,CAAO,EACxC,MAAA,CAAE,KAAAE,EAAM,OAAA5E,EACnB,CCzDO,MAAMsF,CAAa,CAGtB,YAAY7C,EAAO,CAFnBvC,EAAA,aACAA,EAAA,eAEI,KAAK,KAAOuC,EAAM,KAClB,KAAK,OAASA,EAAM,MACxB,CACJ,CACO,MAAM8C,CAAU,CAGnB,YAAY9C,EAAO,CAFnBvC,EAAA,aACAA,EAAA,eAEI,KAAK,KAAOuC,EAAM,KAClB,KAAK,OAASA,EAAM,MACxB,CACJ,CACO,MAAM+C,CAAM,CAGf,YAAYC,EAAS,CAFrBvF,EAAA,gBACAA,EAAA,aAEI,KAAK,QAAUuF,EAAQ,QACvB,KAAK,KAAOA,EAAQ,IACxB,CACA,eAAenF,EAAG,CACd,IAAIoF,EAAS,EACb,QAAST,EAAI,EAAGA,EAAI,KAAK,KAAK,OAAQA,IAClC,GAAI3E,GAAK,KAAK,KAAK2E,CAAC,EAAE,KAAM,CAEfS,EAAAT,EACT,KACJ,CAEG,OAAAS,CACX,CACA,kBAAkBtF,EAAG,CACjB,IAAIuF,EAAS,EACb,QAASV,EAAI,EAAGA,EAAI,KAAK,QAAQ,OAAQA,IACrC,GAAI7E,GAAK,KAAK,QAAQ6E,CAAC,EAAE,KAAM,CAElBU,EAAAV,EACT,KACJ,CAEG,OAAAU,CACX,CACJ,CC5CO,MAAMC,CAAW,CAOpB,YAAYpF,EAAM,CANlBN,EAAA,gBACAA,EAAA,aACAA,EAAA,cAAS,IACTA,EAAA,cAEAA,EAAA,YAEI,KAAK,KAAOM,EACP,KAAA,QAAU,KAAK,gBACpB,MAAM0C,EAAM,KAAK,QAAQ,WAAW,IAAI,EACxC,GAAI,CAACA,EACK,MAAA,IAAI,MAAM,8BAA8B,EAClD,KAAK,IAAMA,EACN,KAAA,MAAQ,KAAK,KAAK,UAAU,KACrC,CACA,eAAgB,CACN,MAAAtC,EAAU,SAAS,cAAc,QAAQ,EAC/C,OAAAA,EAAQ,MAAM,SAAW,WACjBA,EAAA,MAAM,OAAS,KAAK,OAAS,KACrCA,EAAQ,MAAM,MAAQ,KAAK,KAAK,UAAU,MAAQ,KAClDA,EAAQ,MAAM,QAAU,QACxBA,EAAQ,MAAM,WAAa,kBAEnBA,EAAA,MAAQ,KAAK,KAAK,UAAU,MACpCA,EAAQ,OAAS,KAAK,OACfA,CACX,CACA,mBAAmBiF,EAAKC,EAAM,CACrB,KAAA,QAAQ,MAAM,IAAMD,EAAM,KAC1B,KAAA,QAAQ,MAAM,KAAOC,EAAO,IACrC,CACA,iBAAiB3F,EAAQ,CACrB,KAAM,CAAE,aAAA4F,EAAc,cAAAhD,CAAc,EAAI,KAAK,KAAK,UAC9C,OAAAgD,GAAgBA,EAAa,SAAW5F,EACjC,GACP4C,EACgB5C,GACZ,KAAK,IAAI4C,EAAc,KAAK,OAAQA,EAAc,GAAG,MAAM,GAC3D5C,GAAU,KAAK,IAAI4C,EAAc,KAAK,OAAQA,EAAc,GAAG,MAAM,EAGtE,EACX,CASA,WAAW5C,EAAQ8C,EAAW,CACpB,KAAA,CAAE,MAAAhC,EAAO,EAAAb,CAAM,EAAA6C,EACrB,KAAK,IAAI,UAAY,QACrB,KAAK,IAAI,UAAY,SACrB,KAAK,IAAI,aAAe,SACxB,KAAK,IAAI,KAAO,aAChB,KAAK,IAAI,SAAS,KAAK,KAAK,OAAO,QAAQ9C,CAAM,EAAE,MAAOC,EAAIa,EAAQ,EAAI,KAAK,KAAK,SAAS,KAAM,EAAI,KAAK,OAAS,CAAC,CAC1H,CACA,WAAWd,EAAQ8C,EAAW,CACpB,KAAA,CAAE,MAAAhC,EAAO,EAAAb,CAAM,EAAA6C,EACf+C,EAAgB,KAAK,iBAAiB7F,CAAM,EAClD,KAAK,IAAI,UAAY6F,EACf,KAAK,KAAK,OAAO,MAAM,mBACvB,QACN,KAAK,IAAI,YAAc,QACvB,KAAK,IAAI,UAAY,EACrB,MAAMC,EAAW7F,EAAI,KAAK,KAAK,SAAS,KACxC,KAAK,IAAI,SAAS6F,EAAW,EAAG,EAAGhF,EAAO,KAAK,MAAM,EACrD,KAAK,IAAI,WAAWgF,EAAW,EAAG,EAAGhF,EAAO,KAAK,MAAM,CAC3D,CACA,mBAAmBd,EAAQ,CACvB,MAAM8C,EAAY,IAAIlD,EAAU,KAAK,KAAK,OAAQ,CAC9C,IAAK,EACL,OAAAI,CAAA,CACH,EACI,KAAA,WAAWA,EAAQ8C,CAAS,EAC5B,KAAA,WAAW9C,EAAQ8C,CAAS,CACrC,CACA,WAAY,CACR,MAAMS,EAAa,KAAK,KAAK,SAAS,QAAU,EAC1CE,EAAc,KAAK,KAAK,SAAS,SACvC,KAAK,IAAI,YACT,KAAK,IAAI,YAAc,QACvB,KAAK,IAAI,UAAY,EAChB,KAAA,IAAI,OAAO,EAAG,CAAC,EACpB,KAAK,IAAI,OAAO,EAAG,KAAK,MAAM,EAC9B,KAAK,IAAI,YACT,KAAK,IAAI,SACT,QAASJ,EAAMI,EAAaJ,GAAOE,GAC1B,KAAK,KAAK,OAAO,QAAQF,CAAG,EADUA,IAG3C,KAAK,mBAAmBA,CAAG,CAEnC,CACJ,CChGO,MAAM0C,CAAQ,CAOjB,YAAY1F,EAAM,CANlBN,EAAA,gBACAA,EAAA,YACAA,EAAA,aACAA,EAAA,aAAQ,IACRA,EAAA,eACAA,EAAA,qBAAgB,GAEZ,KAAK,KAAOM,EACP,KAAA,QAAU,KAAK,gBACpB,MAAM0C,EAAM,KAAK,QAAQ,WAAW,IAAI,EACxC,GAAI,CAACA,EACK,MAAA,IAAI,MAAM,8BAA8B,EAClD,KAAK,IAAMA,EACN,KAAA,OAAS,KAAK,KAAK,UAAU,MACtC,CACA,eAAgB,CACN,MAAAtC,EAAU,SAAS,cAAc,QAAQ,EAC/C,OAAAA,EAAQ,MAAM,SAAW,WACzBA,EAAQ,MAAM,OAAS,KAAK,KAAK,UAAU,OAAS,KAC5CA,EAAA,MAAM,MAAQ,KAAK,MAAQ,KACnCA,EAAQ,MAAM,QAAU,QACxBA,EAAQ,MAAM,UAAY,kBAE1BA,EAAQ,MAAQ,KAAK,MACbA,EAAA,OAAS,KAAK,KAAK,UAAU,OAC9BA,CACX,CACA,mBAAmBiF,EAAKC,EAAM,CACrB,KAAA,QAAQ,MAAM,IAAMD,EAAM,KAC1B,KAAA,QAAQ,MAAM,KAAOC,EAAO,IACrC,CACA,cAAczF,EAAK,CACf,KAAM,CAAE,aAAA0F,EAAc,cAAAhD,CAAc,EAAI,KAAK,KAAK,UAC9C,OAAAgD,GAAgBA,EAAa,MAAQ1F,EAC9B,GACP0C,EACgB1C,GAAO,KAAK,IAAI0C,EAAc,KAAK,IAAKA,EAAc,GAAG,GAAG,GACxE1C,GAAO,KAAK,IAAI0C,EAAc,KAAK,IAAKA,EAAc,GAAG,GAAG,EAG7D,EACX,CACA,WAAW1C,EAAK4C,EAAW,CACjB,KAAA,CAAE,EAAA3C,EAAG,OAAAU,CAAW,EAAAiC,EACtB,KAAK,IAAI,UAAY,QACrB,KAAK,IAAI,UAAY,SACrB,KAAK,IAAI,aAAe,SACxB,KAAK,IAAI,KAAO,aAChB,KAAK,IAAI,SAAS,KAAK,KAAK,OAAO,KAAK5C,CAAG,EAAE,MAAO,KAAK,MAAQ,EAAGC,EAAI,KAAK,KAAK,SAAS,IAAMU,EAAS,CAAC,CAC/G,CACA,WAAWb,EAAQ8C,EAAW,CACpB,KAAA,CAAE,EAAA3C,EAAG,OAAAU,CAAW,EAAAiC,EAChBkD,EAAe,KAAK,cAAchG,CAAM,EAC9C,KAAK,IAAI,UAAYgG,EACf,KAAK,KAAK,OAAO,MAAM,mBACvB,QACN,KAAK,IAAI,YAAc,QAClB,KAAA,IAAI,UAAY,KAAK,cAC1B,MAAMC,EAAW9F,EAAI,KAAK,KAAK,SAAS,IACxC,KAAK,IAAI,SAAS,EAAG8F,EAAW,EAAG,KAAK,MAAOpF,CAAM,EACrD,KAAK,IAAI,WAAW,EAAGoF,EAAW,EAAG,KAAK,MAAOpF,CAAM,CAC3D,CACA,gBAAgBX,EAAK,CACjB,MAAM4C,EAAY,IAAIlD,EAAU,KAAK,KAAK,OAAQ,CAC9C,OAAQ,EACR,IAAAM,CAAA,CACH,EACI,KAAA,WAAWA,EAAK4C,CAAS,EACzB,KAAA,WAAW5C,EAAK4C,CAAS,CAClC,CACA,WAAY,CACR,MAAMU,EAAa,KAAK,KAAK,SAAS,QAAU,EAC1CF,EAAc,KAAK,KAAK,SAAS,SACvC,KAAK,IAAI,YACJ,KAAA,IAAI,OAAO,EAAG,CAAC,EACpB,KAAK,IAAI,YAAc,QACvB,KAAK,IAAI,UAAY,GAChB,KAAA,IAAI,OAAO,GAAI,CAAC,EACrB,KAAK,IAAI,YACT,KAAK,IAAI,SACT,QAASpD,EAAMoD,EAAapD,GAAOsD,GAC1B,KAAK,KAAK,OAAO,KAAKtD,CAAG,EADaA,IAG3C,KAAK,gBAAgBA,CAAG,CAEhC,CACJ,CCvEO,MAAMQ,EAAa,aAC1B,MAAqBwF,CAAY,CAc7B,YAAY1F,EAAQ8B,EAAO,CAb3BvC,EAAA,cACAA,EAAA,iBACAA,EAAA,gBACAA,EAAA,gBACAA,EAAA,mBACAA,EAAA,cACAA,EAAA,eACAA,EAAA,eACAA,EAAA,eACAA,EAAA,aACAA,EAAA,iBACAA,EAAA,kBACAA,EAAA,cAEU,MAAA0E,EAAOJ,EAAiB,GAAI,EAAE,EAC9BxE,EAAS,KAAK,mBAAmB4E,GAAMnC,GAAA,YAAAA,EAAO,OAAQ,CAAE,OAAQ,IAAK,MAAO,GAAK,CAAA,EACnFA,GAAA,MAAAA,EAAO,OACPzC,EAAO,KAAOyC,EAAM,MAEnB,KAAA,OAAS,IAAIyB,EAAOlE,CAAM,EAC1B,KAAA,QAAU,IAAIkG,EAAQ,IAAI,EAC1B,KAAA,WAAa,IAAIN,EAAW,IAAI,EAChC,KAAA,MAAQ,IAAItC,EAAM,IAAI,EACtB,KAAA,MAAQ,IAAIO,EAAM,IAAI,EACtB,KAAA,SAAW,IAAI1C,EAAS,IAAI,EAC5B,KAAA,QAAU,IAAI6C,EAAQ,IAAI,EAC1B,KAAA,OAAS,IAAIzD,EAAO,IAAI,EACxB,KAAA,MAAQ,KAAK,kBAClB,KAAK,SAAW,IAAI8D,EAAS,KAAM,KAAK,SAAS,0BAA0B,EACtE,KAAA,UAAY,IAAIF,EACrB,KAAK,KAAOS,EACP,KAAA,OAAS,IAAIR,EAClB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,oBAAoBzD,CAAM,EAC/B,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,cAAc,CACvB,CACA,oBAAqB,CACjB,MAAMkF,EAAM,KAAK,WAAW,OAAS,KAAK,QAAQ,OAC5CC,EAAO,EACR,KAAA,QAAQ,mBAAmBD,EAAKC,CAAI,CAC7C,CACA,uBAAwB,CACd,MAAAD,EAAM,KAAK,QAAQ,OACnBC,EAAO,KAAK,QAAQ,MAClB,QAAA,IAAID,EAAKC,CAAI,EAChB,KAAA,WAAW,mBAAmBD,EAAKC,CAAI,CAChD,CACA,sBAAuB,CACnB,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,CAC/B,CACA,iBAAkB,CACd,MAAMQ,EAAa,CAAA,EACnB,IAAIC,EAAe,EACV,QAAAtB,EAAI,EAAGA,GAAK,KAAK,OAAO,QAAQ,OAAS,EAAGA,IAAK,CACtD,MAAMzB,EAAM,KAAK,OAAO,QAAQyB,CAAC,EACjCsB,GAAgB/C,EAAI,MACd,MAAAgD,EAAW,IAAIlB,EAAa,CAC9B,KAAMiB,EACN,OAAQtB,CAAA,CACX,EACDqB,EAAW,KAAKE,CAAQ,CAC5B,CACA,MAAMC,EAAa,CAAA,EACnB,IAAIC,EAAgB,EACX,QAAAzB,EAAI,EAAGA,GAAK,KAAK,OAAO,KAAK,OAAS,EAAGA,IAAK,CACnD,MAAM5E,EAAM,KAAK,OAAO,KAAK4E,CAAC,EAC9ByB,GAAiBrG,EAAI,OACf,MAAAsG,EAAW,IAAIpB,EAAU,CAC3B,KAAMmB,EACN,OAAQzB,CAAA,CACX,EACDwB,EAAW,KAAKE,CAAQ,CAC5B,CACM,MAAAC,EAAQ,IAAIpB,EAAM,CACpB,QAASc,EACT,KAAMG,CAAA,CACT,EACO,eAAA,IAAI,UAAWG,CAAK,EACpB,QAAA,IAAI,WAAY,KAAK,MAAM,EAC5BA,CACX,CACA,gBAAiB,CACP,MAAAC,EAAU,SAAS,cAAc,KAAK,EACpCA,EAAA,MAAM,IAAM,KAAK,iBAAmB,KACpCA,EAAA,MAAM,KAAO,KAAK,aAAe,KACjCA,EAAA,YAAY,KAAK,MAAM,OAAO,EAC9BA,EAAA,UAAU,IAAIhG,EAAa,SAAS,EAC5C,KAAK,MAAM,QAAQ,YAAY,KAAK,QAAQ,OAAO,EACnD,KAAK,MAAM,QAAQ,YAAY,KAAK,QAAQ,OAAO,EACnD,KAAK,MAAM,QAAQ,YAAY,KAAK,WAAW,OAAO,EACjD,KAAA,MAAM,QAAQ,YAAYgG,CAAO,EACtC,KAAK,MAAM,QAAQ,YAAY,KAAK,SAAS,OAAO,EACpD,KAAK,MAAM,QAAQ,OAAO,KAAK,OAAO,OAAO,CACjD,CAKA,SAAU,CACD,KAAA,MAAM,QAAQ,QACvB,CACA,oBAAoBlG,EAAQ,CACpB,GAAA,OAAOA,GAAW,SAAU,CACtB,MAAAC,EAAU,SAAS,cAAcD,CAAM,EAC7C,GAAI,CAACC,EACK,MAAA,IAAI,MAAM,yBAAyBD,CAAM;AAAA,sBAA+C,EACzFC,GAAA,MAAAA,EAAA,YAAY,KAAK,MAAM,QACpC,CACID,aAAkB,aACXA,EAAA,OAAO,KAAK,MAAM,OAAO,CAExC,CAKA,IAAI,KAAM,CACN,OAAO,KAAK,MAAM,GACtB,CACA,IAAI,WAAY,CACZ,OAAO,KAAK,OAAO,IACvB,CACA,IAAI,kBAAmB,CACnB,OAAO,KAAK,WAAW,MAC3B,CACA,IAAI,cAAe,CACf,OAAO,KAAK,QAAQ,KACxB,CACA,IAAI,eAAgB,CAChB,OAAO,KAAK,QAAQ,MACxB,CAEA,YAAa,CACJ,KAAA,SAAS,QAAQ,OAC1B,CACA,gBAAgBP,EAAGE,EAAG,CAClB,OAAO,KAAK,MAAM,gBAAgBF,EAAGE,CAAC,CAC1C,CACA,QAAQQ,EAAU,CACR,KAAA,CAAE,OAAAX,EAAQ,IAAAE,CAAQ,EAAAS,EACxB,OAAO,KAAK,KAAKT,CAAG,EAAEF,CAAM,CAChC,CACA,iBAAiBW,EAAUgC,EAAQ,CACzB,KAAA,CAAE,OAAA3C,EAAQ,IAAAE,CAAQ,EAAAS,EACxB,KAAK,KAAKT,CAAG,EAAEF,CAAM,EAAE,aAAa2C,CAAM,EACrC,KAAA,WAAWzC,EAAKF,CAAM,CAC/B,CACA,iBAAiBW,EAAU+B,EAAQ,CACzB,KAAA,CAAE,OAAA1C,EAAQ,IAAAE,CAAQ,EAAAS,EACxB,KAAK,KAAKT,CAAG,EAAEF,CAAM,EAAE,aAAa0C,CAAM,EACrC,KAAA,WAAWxC,EAAKF,CAAM,CAC/B,CACA,mBAAmB2G,EAAOC,EAAU,CAC1B,MAAAC,EAAU,KAAK,IAAIF,EAAM,KAAK,IAAKA,EAAM,GAAG,GAAG,EAC/CG,EAAQ,KAAK,IAAIH,EAAM,KAAK,IAAKA,EAAM,GAAG,GAAG,EAC7CI,EAAU,KAAK,IAAIJ,EAAM,KAAK,OAAQA,EAAM,GAAG,MAAM,EACrDK,EAAQ,KAAK,IAAIL,EAAM,KAAK,OAAQA,EAAM,GAAG,MAAM,EACzD,QAASzG,EAAM2G,EAAS3G,GAAO4G,EAAO5G,IAClC,QAASmD,EAAM0D,EAAS1D,GAAO2D,EAAO3D,IAAO,CACzC,MAAMtC,EAAO,KAAK,KAAKb,CAAG,EAAEmD,CAAG,EAC/BuD,EAAS7F,CAAI,CACjB,CAER,CACA,2BAA4B,CACpB,GAAA,KAAK,UAAU,gBAAkB,KACjC,KAAK,mBAAmB,KAAK,UAAU,cAAgBA,GAAS,CACvD,KAAA,iBAAiBA,EAAK,SAAU,CACjC,aAAc,GACd,YAAa,GACb,MAAO,EAAA,CACV,CAAA,CACJ,MAEA,CACG,GAAA,CAAC,KAAK,UAAU,aAChB,OACC,KAAA,iBAAiB,KAAK,UAAU,aAAc,CAC/C,aAAc,GACd,YAAa,GACb,MAAO,EAAA,CACV,CACL,CACJ,CACA,WAAWJ,EAAUC,EAAe,CAC3B,KAAA,OAAO,KAAKD,EAAUC,CAAa,CAC5C,CACA,aAAc,CACV,KAAK,MAAM,aACf,CACA,kBAAmB,CACf,KAAK,WAAW,WACpB,CACA,eAAgB,CACZ,KAAK,QAAQ,WACjB,CACA,WAAWV,EAAKmD,EAAK,CACjB,KAAK,KAAKnD,CAAG,EAAEmD,CAAG,EAAE,OAAO,IAAI,CACnC,CACA,SAASoB,EAAM,CACX,MAAMwC,EAAaxC,EAAK,OAClByC,EAAazC,EAAK,CAAC,EAAI,KAAK,KAAK,CAAC,EAAE,OAAS,EACnD,KAAK,KAAO,GACZ,MAAM0C,EAAgB,CAAA,EACtB,QAASjH,EAAM,EAAGA,EAAM+G,EAAY/G,IAAO,CACvC,MAAMwE,EAAW,CAAA,EACjB,QAASrB,EAAM,EAAGA,EAAM6D,EAAY7D,IAAO,CACvC,MAAMtC,EAAO0D,EAAKvE,CAAG,EAAEmD,CAAG,EACjBqB,EAAA,KAAK,IAAIjC,EAAK,CACnB,aAAc1B,EAAK,aACnB,SAAUA,EAAK,SACf,YAAaA,EAAK,YAClB,MAAOA,EAAK,MACZ,MAAOA,EAAK,KACf,CAAA,CAAC,CACN,CACAoG,EAAc,KAAKzC,CAAQ,CAC/B,CACA,YAAK,KAAOyC,EACZ,KAAK,UAAU,aAAe,KAC9B,KAAK,UAAU,cAAgB,KAC/B,KAAK,OAAS,KAAK,mBAAmBA,EAAe,KAAK,OAAO,IAAI,EAChE,KAAA,MAAQ,KAAK,kBAClB,KAAK,SAAS,qBACd,KAAK,SAAW,IAAIjD,EAAS,KAAM,KAAK,SAAS,0BAA0B,EAC3E,KAAK,YAAY,EACV,IACX,CACA,mBAAmBO,EAAM2C,EAAM,CACrB,MAAA5D,EAAaiB,EAAK,OAAS,EAC3BlB,EAAakB,EAAK,CAAC,EAAIA,EAAK,CAAC,EAAE,OAAS,EACxCH,EAAO,CAAA,EACb,QAASpE,EAAM,EAAGA,EAAMsD,EAAYtD,IAC3BoE,EAAA,KAAK,IAAIF,EAAI,CACd,OAAQ,GACR,MAAO,OAAOlE,CAAG,CACpB,CAAA,CAAC,EAEN,MAAMqE,EAAU,CAAA,EAChB,QAASlB,EAAM,EAAGA,EAAME,EAAYF,IACxBkB,EAAA,KAAK,IAAIJ,EAAO,CACpB,MAAO,IACP,MAAO,OAAOd,CAAG,CACpB,CAAA,CAAC,EAOC,OALQ,IAAIU,EAAO,CACtB,KAAAqD,EACA,KAAA9C,EACA,QAAAC,CAAA,CACH,CAEL,CACA,eAAgB,CACN,MAAA0C,EAAa,KAAK,KAAK,OACvBC,EAAa,KAAK,KAAK,CAAC,EAAI,KAAK,KAAK,CAAC,EAAE,OAAS,EAClDG,EAAa,CAAA,EACnB,QAASnH,EAAM,EAAGA,EAAM+G,EAAY/G,IAAO,CACvC,MAAMwE,EAAW,CAAA,EACjB,QAASrB,EAAM,EAAGA,EAAM6D,EAAY7D,IACvBqB,EAAA,KAAK,KAAK,KAAKxE,CAAG,EAAEmD,CAAG,EAAE,qBAAqB,EAE3DgE,EAAW,KAAK3C,CAAQ,CAC5B,CACO,OAAA2C,CACX,CACJ"} \ No newline at end of file +{"version":3,"file":"main.cjs","sources":["../src/modules/events.ts","../src/modules/renderBox.ts","../src/components/editor.ts","../src/utils/position.ts","../src/components/scroller.ts","../src/modules/cell.ts","../src/components/sheet.ts","../src/components/table.ts","../src/components/toolbar.ts","../src/modules/config.ts","../src/modules/selection.ts","../src/modules/styles.ts","../src/modules/viewport.ts","../src/modules/column.ts","../src/modules/row.ts","../src/utils/createData.ts","../src/modules/cache.ts","../src/components/columnsBar.ts","../src/components/rowsBar.ts","../src/main.ts"],"sourcesContent":["import { Selection } from \"../main\";\nexport var EventTypes;\n(function (EventTypes) {\n EventTypes[\"CELL_CLICK\"] = \"CELL_CLICK\";\n EventTypes[\"SELECTION_CHANGE\"] = \"CHANGE_SELECTION\";\n EventTypes[\"CELL_CHANGE\"] = \"CELL_CHANGE\";\n})(EventTypes || (EventTypes = {}));\nexport class Events {\n root;\n constructor(root) {\n this.root = root;\n }\n dispatch(action) {\n switch (action.type) {\n case EventTypes.CELL_CLICK: {\n const { event, scroller } = action;\n //\n //* Here may be side effects\n //\n this.cellClick(event, scroller);\n break;\n }\n case EventTypes.SELECTION_CHANGE: {\n const { selection, enableCallback } = action;\n //\n //* Here may be side effects\n //\n this.changeSelection(selection, enableCallback);\n break;\n }\n case EventTypes.CELL_CHANGE: {\n const { cell, values } = action;\n //\n //* Here may be side effects\n //\n this.changeCellValues(cell, values);\n break;\n }\n default: {\n break;\n }\n }\n }\n cellClick = (event, scroller) => {\n if (event.button !== 0)\n return; // Left mouse button\n const { offsetX, offsetY } = event;\n const clickedCell = this.root.getCellByCoords(offsetX, offsetY);\n const cell = this.root.getCell(clickedCell);\n const selection = new Selection();\n selection.selectedCell = clickedCell;\n selection.selectedRange = {\n from: clickedCell,\n to: clickedCell,\n };\n scroller.setSelectingMode(true);\n this.changeSelection(selection, true);\n this.root.config.onCellClick?.(event, cell);\n };\n changeSelection = (selection, enableCallback = false) => {\n this.root.selection = selection;\n if (enableCallback)\n this.root.config.onSelectonChange?.(selection);\n this.root.renderSheet();\n this.root.renderColumnsBar();\n this.root.renderRowsBar();\n };\n changeCellValues(cell, values) {\n this.root.changeCellValues(cell.position, values);\n this.root.config.onCellChange?.(cell);\n }\n}\n","export class RenderBox {\n x;\n y;\n width;\n height;\n constructor(config, cellPosition) {\n this.x = this.getXCoord(cellPosition.column, config);\n this.y = this.getYCoord(cellPosition.row, config);\n this.width = config.columns[cellPosition.column].width;\n this.height = config.rows[cellPosition.row].height;\n }\n getXCoord(column, config) {\n let x = 0;\n for (let i = 0; i < column; i++) {\n x += config.columns[i].width;\n }\n return x;\n }\n getYCoord(row, config) {\n let y = 0;\n for (let i = 0; i < row; i++) {\n y += config.rows[i].height;\n }\n return y;\n }\n}\n","import { CSS_PREFIX } from \"../main\";\nimport { EventTypes } from \"../modules/events\";\nimport { RenderBox } from \"../modules/renderBox\";\nexport class Editor {\n element;\n root;\n constructor(root) {\n this.root = root;\n const element = document.createElement(\"input\");\n element.classList.add(CSS_PREFIX + \"editor\");\n this.element = element;\n this.hide();\n }\n hide() {\n this.element.style.display = \"none\";\n this.element.classList.add(\"hide\");\n this.element.blur();\n window.removeEventListener(\"click\", this.handleClickOutside);\n this.element.removeEventListener(\"keydown\", this.handleKeydown);\n this.root.focusTable();\n }\n show(position, initialString) {\n const { height, width, x, y } = new RenderBox(this.root.config, position);\n const cell = this.root.getCell(position);\n this.element.classList.remove(\"hide\");\n this.element.style.top =\n y - this.root.viewport.top + this.root.columnsBarHeight + \"px\";\n this.element.style.left =\n x - this.root.viewport.left + this.root.rowsBarWidth + \"px\";\n this.element.style.width = width + \"px\";\n this.element.style.height = height + \"px\";\n this.element.style.display = \"block\";\n window.addEventListener(\"click\", this.handleClickOutside);\n this.element.addEventListener(\"keydown\", this.handleKeydown);\n this.element.value = initialString ? initialString : cell.value;\n this.element.focus();\n if (!initialString)\n this.element.select();\n }\n handleKeydown = (event) => {\n const { key } = event;\n switch (key) {\n case \"Escape\": {\n this.hide();\n break;\n }\n case \"Enter\": {\n if (!this.root.selection.selectedCell)\n return;\n this.root.events.dispatch({\n type: EventTypes.CELL_CHANGE,\n cell: this.root.getCell(this.root.selection.selectedCell),\n values: {\n value: this.element.value,\n displayValue: this.element.value,\n },\n });\n this.hide();\n }\n }\n };\n handleClickOutside = (event) => {\n const target = event.target;\n if (!this.element.contains(target)) {\n this.hide();\n }\n };\n}\n","export function checkEqualRanges(range1, range2) {\n const equalRows = range1.from.row === range2.to.row;\n const equalColumns = range1.from.column === range2.to.column;\n return equalRows && equalColumns;\n}\nexport function checkEqualCellSelections(selection1, selection2) {\n return (selection1.column === selection2.column && selection1.row === selection2.row);\n}\n","import { CSS_PREFIX } from \"../main\";\nimport { EventTypes } from \"../modules/events\";\nimport { checkEqualCellSelections } from \"../utils/position\";\nexport class Scroller {\n element;\n verticalScroller;\n horizontalScroller;\n root;\n isSelecting = false;\n constructor(root) {\n this.root = root;\n const { horizontalScroller, scroller, verticalScroller } = this.buildComponent();\n this.element = scroller;\n this.verticalScroller = verticalScroller;\n this.horizontalScroller = horizontalScroller;\n this.element.style.height = this.root.config.view.height + \"px\";\n this.element.style.width = this.root.config.view.width + \"px\";\n this.element.style.top = this.root.columnsBarHeight + \"px\";\n this.element.style.left = this.root.rowsBarWidth + \"px\";\n this.element.tabIndex = -1;\n this.updateScrollerSize(); //* Init size set\n this.element.addEventListener(\"scroll\", this.handleScroll);\n this.element.addEventListener(\"mousedown\", this.handleClick);\n this.element.addEventListener(\"mousemove\", this.handleMouseMove);\n this.element.addEventListener(\"mouseup\", this.handleMouseUp);\n this.element.addEventListener(\"dblclick\", this.handleDoubleClick);\n this.element.addEventListener(\"keydown\", this.handleKeydown);\n }\n setSelectingMode(mode) {\n this.isSelecting = mode;\n }\n handleMouseMove = (event) => {\n if (!this.isSelecting)\n return;\n const { offsetX, offsetY } = event;\n const lastSelectedCell = this.root.getCellByCoords(offsetX, offsetY);\n let isRangeChanged = false;\n if (this.root.selection.selectedRange) {\n isRangeChanged = !checkEqualCellSelections(this.root.selection.selectedRange.to, lastSelectedCell);\n if (isRangeChanged) {\n this.root.selection.selectedRange.to = lastSelectedCell;\n this.root.events.dispatch({\n type: EventTypes.SELECTION_CHANGE,\n selection: this.root.selection,\n enableCallback: true,\n });\n }\n }\n };\n handleMouseUp = () => {\n this.isSelecting = false;\n const newSelection = { ...this.root.selection };\n if (this.root.selection.selectedRange) {\n if (checkEqualCellSelections(this.root.selection.selectedRange.from, this.root.selection.selectedRange.to)) {\n newSelection.selectedRange = null;\n this.root.events.dispatch({\n type: EventTypes.SELECTION_CHANGE,\n selection: newSelection,\n enableCallback: false,\n });\n }\n }\n this.root.renderSheet();\n this.root.renderColumnsBar();\n this.root.renderRowsBar();\n };\n handleDoubleClick = (event) => {\n event.preventDefault();\n const position = this.root.getCellByCoords(event.offsetX, event.offsetY);\n this.root.showEditor(position);\n };\n handleKeydown = (event) => {\n //* Navigation\n if ([\"ArrowLeft\", \"ArrowRight\", \"ArrowUp\", \"ArrowDown\"].includes(event.key)) {\n event.preventDefault();\n this.root.selection.selectedRange = null;\n switch (event.key) {\n case \"ArrowLeft\": {\n if (this.root.selection.selectedCell &&\n this.root.selection.selectedCell.column > 0) {\n this.root.selection.selectedCell.column -= 1;\n // this.root.renderSheet();\n }\n break;\n }\n case \"ArrowRight\": {\n if (this.root.selection.selectedCell &&\n this.root.selection.selectedCell.column <\n this.root.config.columns.length - 1) {\n this.root.selection.selectedCell.column += 1;\n // this.root.renderSheet();\n }\n break;\n }\n case \"ArrowUp\": {\n if (this.root.selection.selectedCell &&\n this.root.selection.selectedCell.row > 0) {\n this.root.selection.selectedCell.row -= 1;\n // this.root.renderSheet();\n }\n break;\n }\n case \"ArrowDown\": {\n if (this.root.selection.selectedCell &&\n this.root.selection.selectedCell.row <\n this.root.config.rows.length - 1) {\n this.root.selection.selectedCell.row += 1;\n // this.root.renderSheet();\n }\n break;\n }\n }\n this.root.events.dispatch({\n type: EventTypes.SELECTION_CHANGE,\n selection: this.root.selection,\n enableCallback: true,\n });\n }\n //* Start typings\n const keysRegex = /^([a-z]|[а-я])$/;\n if (!event.metaKey && !event.ctrlKey) {\n //* Prevent handle shortcutrs\n const isPressedLetterKey = keysRegex.test(event.key.toLowerCase());\n if (event.key === \"F2\" || isPressedLetterKey) {\n //* English and Russian keyboard. Or F2 button\n event.preventDefault();\n if (!this.root.selection.selectedCell)\n return;\n this.root.showEditor(this.root.selection.selectedCell, isPressedLetterKey ? event.key : undefined);\n }\n }\n if (event.key === \"Delete\") {\n event.preventDefault();\n this.root.deleteSelectedCellsValues();\n this.root.renderSheet();\n }\n };\n handleClick = (event) => {\n this.root.events.dispatch({\n type: EventTypes.CELL_CLICK,\n event,\n scroller: this,\n });\n };\n handleScroll = () => {\n const rect = this.getViewportBoundlingRect();\n this.root.viewport.updateValues(rect);\n this.root.renderSheet();\n this.root.renderColumnsBar();\n this.root.renderRowsBar();\n };\n getViewportBoundlingRect() {\n const { scrollTop, scrollLeft } = this.element;\n const { height, width } = this.element.getBoundingClientRect();\n const bottom = scrollTop + height;\n const right = scrollLeft + width;\n return {\n top: scrollTop,\n left: scrollLeft,\n bottom,\n right,\n };\n }\n buildComponent() {\n const scroller = document.createElement(\"div\");\n const verticalScroller = document.createElement(\"div\");\n const horizontalScroller = document.createElement(\"div\");\n const groupScrollers = document.createElement(\"div\");\n const stack = document.createElement(\"div\");\n verticalScroller.style.width = \"0px\";\n verticalScroller.style.pointerEvents = \"none\";\n horizontalScroller.style.pointerEvents = \"none\";\n groupScrollers.style.display = \"flex\";\n stack.appendChild(verticalScroller);\n stack.appendChild(horizontalScroller);\n groupScrollers.appendChild(stack);\n this.verticalScroller = verticalScroller;\n this.horizontalScroller = horizontalScroller;\n scroller.appendChild(groupScrollers);\n scroller.classList.add(CSS_PREFIX + \"scroller\");\n return { scroller, verticalScroller, horizontalScroller };\n }\n getActualHeight() {\n return this.root.config.rows.reduce((acc, curr) => {\n acc += curr.height;\n return acc;\n }, 0);\n }\n getActualWidth() {\n return this.root.config.columns.reduce((acc, curr) => {\n acc += curr.width;\n return acc;\n }, 0);\n }\n updateScrollerSize() {\n const totalHeight = this.getActualHeight();\n const totalWidth = this.getActualWidth();\n this.setScrollerHeight(totalHeight);\n this.setScrollerWidth(totalWidth);\n }\n setScrollerHeight(height) {\n this.verticalScroller.style.height = height + \"px\";\n }\n setScrollerWidth(width) {\n this.horizontalScroller.style.width = width + \"px\";\n }\n}\n","import { RenderBox } from \"./renderBox\";\nexport class CellStyles {\n fontSize = 16;\n fontColor = \"black\";\n background = \"white\";\n borderColor = \"black\";\n selectedBackground = \"#4287f5\";\n selectedFontColor = \"#ffffff\";\n constructor(props) {\n if (props) {\n Object.assign(this, props); // Override default styles\n }\n }\n}\nexport class Position {\n row;\n column;\n constructor(row, column) {\n this.row = row;\n this.column = column;\n }\n}\nexport class SerializableCell {\n value;\n displayValue;\n resultValue;\n position;\n style;\n constructor(props) {\n this.value = props.value;\n this.displayValue = props.displayValue;\n this.resultValue = props.resultValue;\n this.position = props.position;\n this.style = props.style;\n }\n}\nexport class Cell {\n /** True value (data) */\n value;\n /** Value to render */\n displayValue;\n /** This refers to the values that were obtained by calculations, for example, after calculating the formula */\n resultValue;\n position;\n style = null;\n constructor(props) {\n this.value = props.value;\n this.displayValue = props.displayValue;\n this.resultValue = props.resultValue;\n this.position = props.position;\n this.style = props.style;\n }\n getSerializableCell() {\n const cell = new SerializableCell({\n displayValue: this.displayValue,\n position: this.position,\n resultValue: this.resultValue,\n style: this.style,\n value: this.value,\n });\n return cell;\n }\n changeStyles(styles) {\n this.style = styles;\n }\n changeValues(values) {\n Object.assign(this, values);\n }\n isCellInRange(root) {\n const { column, row } = this.position;\n const { selectedRange } = root.selection;\n if (!selectedRange)\n return false;\n const isCellInRow = row >= Math.min(selectedRange.from.row, selectedRange.to.row) &&\n row <= Math.max(selectedRange.to.row, selectedRange.from.row);\n const isCellInCol = column >= Math.min(selectedRange.from.column, selectedRange.to.column) &&\n column <= Math.max(selectedRange.to.column, selectedRange.from.column);\n return isCellInCol && isCellInRow;\n }\n render(root) {\n const renderBox = new RenderBox(root.config, this.position);\n let { x, y } = renderBox;\n const { height, width } = renderBox;\n const { ctx } = root;\n const isCellSelected = root.selection.selectedCell?.row === this.position.row &&\n root.selection.selectedCell.column === this.position.column;\n const isCellInRange = this.isCellInRange(root);\n y -= root.viewport.top;\n x -= root.viewport.left;\n const styles = this.style ?? root.styles.cells;\n ctx.clearRect(x, y, width, height);\n ctx.fillStyle =\n isCellSelected || isCellInRange\n ? styles.selectedBackground\n : styles.background;\n ctx.strokeStyle = \"black\";\n ctx.fillRect(x, y, width - 1, height - 1);\n ctx.strokeRect(x, y, width, height);\n ctx.fillStyle =\n isCellSelected || isCellInRange\n ? styles.selectedFontColor\n : styles.fontColor;\n ctx.textAlign = \"left\";\n ctx.font = `${styles.fontSize}px Arial`;\n ctx.textBaseline = \"middle\";\n ctx.fillText(this.displayValue, x + 2, y + height / 2);\n }\n}\n","import { CSS_PREFIX } from \"../main\";\nimport { Position } from \"../modules/cell\";\n/**\n * Display (CANVAS) element where cells render\n */\nexport class Sheet {\n element;\n ctx;\n root;\n constructor(root) {\n this.root = root;\n const canvas = document.createElement(\"canvas\");\n canvas.classList.add(CSS_PREFIX + \"sheet\");\n //* Set up canvas sizes based on provided root config\n canvas.height = this.root.config.view.height;\n canvas.width = this.root.config.view.width;\n canvas.style.width = this.root.config.view.width + \"px\";\n canvas.style.height = this.root.config.view.height + \"px\";\n canvas.style.left = \"0px\";\n this.element = canvas;\n const ctx = this.element.getContext(\"2d\");\n if (!ctx)\n throw new Error(\"Enable hardware acceleration\");\n this.ctx = ctx;\n }\n getCellByCoords(x, y) {\n let row = 0;\n let height = 0;\n while (height <= y) {\n height += this.root.config.rows[row].height;\n if (height >= y)\n break;\n row++;\n }\n let col = 0;\n let width = 0;\n while (width <= x) {\n width += this.root.config.columns[col].width;\n if (width >= x)\n break;\n col++;\n }\n return new Position(row, col);\n }\n renderCell(position) {\n const { column, row } = position;\n this.root.data[row][column].render(this.root);\n }\n renderSheet() {\n const firstRowIdx = this.root.viewport.firstRow;\n const lastColIdx = this.root.viewport.lastCol + 3;\n const lastRowIdx = this.root.viewport.lastRow + 3;\n const firstColIdx = this.root.viewport.firstCol;\n for (let row = firstRowIdx; row <= lastRowIdx; row++) {\n for (let col = firstColIdx; col <= lastColIdx; col++) {\n if (!this.root.config.columns[col] || !this.root.config.rows[row])\n break; //* Prevent read undefined\n this.renderCell({ column: col, row });\n }\n }\n }\n}\n","import { CSS_PREFIX } from \"../main\";\n/** Base (root) component */\nexport class Table {\n element;\n root;\n constructor(root) {\n this.root = root;\n const container = document.createElement(\"div\");\n container.classList.add(CSS_PREFIX + \"spreadsheet_container\");\n this.element = container;\n this.changeElementSizes(this.root.viewProps);\n }\n changeElementSizes(sizes) {\n const { height, width } = sizes;\n this.element.style.width = width + this.root.rowsBarWidth + \"px\";\n this.element.style.height = height + this.root.columnsBarHeight + \"px\";\n }\n}\n","import { CSS_PREFIX } from \"../main\";\nexport class Toolbar {\n element;\n root;\n height = 0;\n constructor(root) {\n this.root = root;\n const toolbarElement = document.createElement(\"div\");\n toolbarElement.classList.add(CSS_PREFIX + \"toolbar\");\n this.element = toolbarElement;\n }\n}\n","export class Config {\n rows;\n columns;\n view = {\n width: 800,\n height: 600,\n };\n onCellClick = null;\n onSelectonChange = null;\n onCellChange = null;\n constructor(props) {\n this.columns = props.columns;\n this.rows = props.rows;\n this.view = props.view;\n this.onCellClick = props.onCellClick ?? null;\n this.onSelectonChange = props.onSelectionChange ?? null;\n this.onCellChange = props.onCellChange ?? null;\n }\n}\n","export class Selection {\n selectedCell = null;\n selectedRange = null;\n}\n","import { CellStyles } from \"./cell\";\nexport class Styles {\n cells;\n constructor() {\n this.cells = new CellStyles();\n }\n}\n","export class Viewport {\n root;\n top;\n left;\n right;\n bottom;\n firstRow;\n lastRow;\n firstCol;\n lastCol;\n constructor(root, props) {\n this.root = root;\n this.top = props.top;\n this.left = props.left;\n this.right = props.right;\n this.bottom = props.bottom;\n this.firstRow = this.getFirstRow();\n this.lastCol = this.getFirstRow(); //!Temp\n this.firstCol = this.getFirstRow(); //!Temp\n this.lastRow = this.getLastRow();\n this.updateValues({\n top: 0,\n left: 0,\n right: this.root.viewProps.width,\n bottom: this.root.viewProps.height,\n });\n }\n updateValues(props) {\n this.top = props.top;\n this.left = props.left;\n this.right = props.right;\n this.bottom = props.bottom;\n this.firstRow = this.getFirstRow();\n this.lastRow = this.getLastRow();\n this.firstCol = this.getFirstCol();\n this.lastCol = this.getLastCol();\n }\n /** Get index of first row in viewport */\n getFirstRow() {\n const rowIdx = this.root.cache.getRowByYCoord(this.top);\n return rowIdx;\n }\n getLastRow() {\n const rowIdx = this.root.cache.getRowByYCoord(this.bottom);\n return rowIdx;\n }\n getFirstCol() {\n const colIdx = this.root.cache.getColumnByXCoord(this.left);\n return colIdx;\n }\n getLastCol() {\n const colIdx = this.root.cache.getColumnByXCoord(this.right);\n return colIdx;\n }\n}\n","export class Column {\n width;\n title;\n constructor(props) {\n this.width = props.width;\n this.title = props.title;\n }\n}\n","export class Row {\n height;\n title;\n constructor(props) {\n this.height = props.height;\n this.title = props.title;\n }\n}\n","import { Cell } from \"../modules/cell\";\nimport { Column } from \"../modules/column\";\nimport { Config } from \"../modules/config\";\nimport { Row } from \"../modules/row\";\nexport function createSampleData(rows, columns, fillCellsByCoords = false) {\n const data = [];\n for (let row = 0; row <= rows; row++) {\n const innerRow = [];\n for (let col = 0; col <= columns; col++) {\n const value = fillCellsByCoords ? `${row}:${col}` : \"\";\n const cell = new Cell({\n displayValue: value,\n resultValue: value,\n value,\n position: {\n column: col,\n row: row,\n },\n style: null,\n });\n innerRow.push(cell);\n }\n data.push(innerRow);\n }\n return data;\n}\nexport function createSampleConfig(rows, columns) {\n const rowsArr = [];\n for (let i = 0; i <= rows; i++) {\n const rowItem = new Row({\n height: 40,\n title: String(i),\n });\n rowsArr.push(rowItem);\n }\n const colsArr = [];\n for (let i = 0; i <= columns; i++) {\n const colItem = new Column({\n title: String(i),\n width: 150,\n });\n colsArr.push(colItem);\n }\n const config = new Config({\n columns: colsArr,\n rows: rowsArr,\n view: {\n height: 600,\n width: 800,\n },\n });\n return config;\n}\nexport function makeSpreadsheetConfigAndData(rows, columns) {\n const data = createSampleData(rows, columns);\n const config = createSampleConfig(rows, columns);\n return { data, config };\n}\n","export class CachedColumn {\n xPos;\n colIdx;\n constructor(props) {\n this.xPos = props.xPos;\n this.colIdx = props.colIdx;\n }\n}\nexport class CachedRow {\n yPos;\n rowIdx;\n constructor(props) {\n this.yPos = props.yPos;\n this.rowIdx = props.rowIdx;\n }\n}\nexport class Cache {\n columns;\n rows;\n constructor(initial) {\n this.columns = initial.columns;\n this.rows = initial.rows;\n }\n getRowByYCoord(y) {\n let rowIdx = 0;\n for (let i = 0; i < this.rows.length; i++) {\n if (y <= this.rows[i].yPos) {\n //* Intersection detect\n rowIdx = i;\n break;\n }\n }\n return rowIdx;\n }\n getColumnByXCoord(x) {\n let colIdx = 0;\n for (let i = 0; i < this.columns.length; i++) {\n if (x <= this.columns[i].xPos) {\n //* Intersection detect\n colIdx = i;\n break;\n }\n }\n return colIdx;\n }\n}\n","import { RenderBox } from \"../main\";\nexport class ColumnsBar {\n element;\n root;\n height = 35;\n width;\n // private resizerWidth = 1;\n ctx;\n constructor(root) {\n this.root = root;\n this.element = this.createElement();\n const ctx = this.element.getContext(\"2d\");\n if (!ctx)\n throw new Error(\"Enable hardware acceleration\");\n this.ctx = ctx;\n this.width = this.root.viewProps.width;\n }\n createElement() {\n const element = document.createElement(\"canvas\");\n element.style.position = \"absolute\";\n element.style.height = this.height + \"px\";\n element.style.width = this.root.viewProps.width + \"px\";\n element.style.display = \"block\";\n element.style.borderLeft = \"1px solid black\";\n // element.style.boxSizing = 'border-box'\n element.width = this.root.viewProps.width;\n element.height = this.height;\n return element;\n }\n setElementPosition(top, left) {\n this.element.style.top = top + \"px\";\n this.element.style.left = left + \"px\";\n }\n isColumnSelected(column) {\n const { selectedCell, selectedRange } = this.root.selection;\n if (selectedCell && selectedCell.column === column)\n return true;\n if (selectedRange) {\n const inRange = column >=\n Math.min(selectedRange.from.column, selectedRange.to.column) &&\n column <= Math.max(selectedRange.from.column, selectedRange.to.column);\n return inRange;\n }\n return false;\n }\n // private getYCoordWithOffset(renderBox: RenderBox): number {\n // const {y} = renderBox\n // return y + this.root.toolbarHeight\n // }\n // private getXCoordWithOffset(renderBox: RenderBox): number {\n // const {x} = renderBox\n // return x\n // }\n renderText(column, renderBox) {\n const { width, x } = renderBox;\n this.ctx.fillStyle = \"black\";\n this.ctx.textAlign = \"center\";\n this.ctx.textBaseline = \"middle\";\n this.ctx.font = \"12px Arial\";\n this.ctx.fillText(this.root.config.columns[column].title, x + width / 2 - this.root.viewport.left, 0 + this.height / 2);\n }\n renderRect(column, renderBox) {\n const { width, x } = renderBox;\n const isColSelected = this.isColumnSelected(column);\n this.ctx.fillStyle = isColSelected\n ? this.root.styles.cells.selectedBackground\n : \"white\";\n this.ctx.strokeStyle = \"black\";\n this.ctx.lineWidth = 1;\n const specialX = x - this.root.viewport.left;\n this.ctx.fillRect(specialX - 1, 0, width, this.height);\n this.ctx.strokeRect(specialX - 1, 0, width, this.height);\n }\n renderSingleColumn(column) {\n const renderBox = new RenderBox(this.root.config, {\n row: 0,\n column: column,\n });\n this.renderRect(column, renderBox);\n this.renderText(column, renderBox);\n }\n renderBar() {\n const lastColIdx = this.root.viewport.lastCol + 3;\n const firstColIdx = this.root.viewport.firstCol;\n this.ctx.beginPath();\n this.ctx.strokeStyle = \"black\";\n this.ctx.lineWidth = 1;\n this.ctx.moveTo(0, 0);\n this.ctx.lineTo(0, this.height);\n this.ctx.closePath();\n this.ctx.stroke();\n for (let col = firstColIdx; col <= lastColIdx; col++) {\n if (!this.root.config.columns[col])\n break;\n this.renderSingleColumn(col);\n }\n }\n}\n","import { RenderBox } from \"../main\";\nexport class RowsBar {\n element;\n ctx;\n root;\n width = 35;\n height;\n resizerHeight = 1;\n constructor(root) {\n this.root = root;\n this.element = this.createElement();\n const ctx = this.element.getContext(\"2d\");\n if (!ctx)\n throw new Error(\"Enable hardware acceleration\");\n this.ctx = ctx;\n this.height = this.root.viewProps.height;\n }\n createElement() {\n const element = document.createElement(\"canvas\");\n element.style.position = \"absolute\";\n element.style.height = this.root.viewProps.height + \"px\";\n element.style.width = this.width + \"px\";\n element.style.display = \"block\";\n element.style.borderTop = \"1px solid black\";\n // element.style.boxSizing = 'border-box'\n element.width = this.width;\n element.height = this.root.viewProps.height;\n return element;\n }\n setElementPosition(top, left) {\n this.element.style.top = top + \"px\";\n this.element.style.left = left + \"px\";\n }\n isRowSelected(row) {\n const { selectedCell, selectedRange } = this.root.selection;\n if (selectedCell && selectedCell.row === row)\n return true;\n if (selectedRange) {\n const inRange = row >= Math.min(selectedRange.from.row, selectedRange.to.row) &&\n row <= Math.max(selectedRange.from.row, selectedRange.to.row);\n return inRange;\n }\n return false;\n }\n renderText(row, renderBox) {\n const { y, height } = renderBox;\n this.ctx.fillStyle = \"black\";\n this.ctx.textAlign = \"center\";\n this.ctx.textBaseline = \"middle\";\n this.ctx.font = \"12px Arial\";\n this.ctx.fillText(this.root.config.rows[row].title, this.width / 2, y - this.root.viewport.top + height / 2);\n }\n renderRect(column, renderBox) {\n const { y, height } = renderBox;\n const isRowSeleted = this.isRowSelected(column);\n this.ctx.fillStyle = isRowSeleted\n ? this.root.styles.cells.selectedBackground\n : \"white\";\n this.ctx.strokeStyle = \"black\";\n this.ctx.lineWidth = this.resizerHeight;\n const specialY = y - this.root.viewport.top;\n this.ctx.fillRect(0, specialY - 1, this.width, height);\n this.ctx.strokeRect(0, specialY - 1, this.width, height);\n }\n renderSingleRow(row) {\n const renderBox = new RenderBox(this.root.config, {\n column: 0,\n row: row,\n });\n this.renderRect(row, renderBox);\n this.renderText(row, renderBox);\n }\n renderBar() {\n const lastRowIdx = this.root.viewport.lastRow + 3;\n const firstRowIdx = this.root.viewport.firstRow;\n this.ctx.beginPath();\n this.ctx.moveTo(0, 0);\n this.ctx.strokeStyle = \"black\";\n this.ctx.lineWidth = 16;\n this.ctx.lineTo(35, 0);\n this.ctx.closePath();\n this.ctx.stroke();\n for (let row = firstRowIdx; row <= lastRowIdx; row++) {\n if (!this.root.config.rows[row])\n break;\n this.renderSingleRow(row);\n }\n }\n}\n","import { Editor } from \"./components/editor\";\nimport { Scroller } from \"./components/scroller\";\nimport { Sheet } from \"./components/sheet\";\nimport { Table } from \"./components/table\";\nimport { Toolbar } from \"./components/toolbar\";\nimport { Cell, } from \"./modules/cell\";\nimport { Config, } from \"./modules/config\";\nimport { Selection } from \"./modules/selection\";\nimport { Styles } from \"./modules/styles\";\nimport { Viewport } from \"./modules/viewport\";\nimport \"./scss/main.scss\";\nimport { createSampleData } from \"./utils/createData\";\nimport { Cache, CachedColumn, CachedRow } from \"./modules/cache\";\nimport { Row } from \"./modules/row\";\nimport { Column } from \"./modules/column\";\nimport { ColumnsBar } from \"./components/columnsBar\";\nimport { RowsBar } from \"./components/rowsBar\";\nimport { Events } from \"./modules/events\";\nexport const CSS_PREFIX = \"modern_sc_\";\nexport default class Spreadsheet {\n table;\n scroller;\n toolbar;\n rowsBar;\n columnsBar;\n sheet;\n editor;\n styles;\n config;\n data;\n viewport;\n selection;\n cache;\n events;\n constructor(target, props) {\n const data = createSampleData(40, 40);\n const config = this.makeConfigFromData(data, props?.view ?? { height: 600, width: 800 });\n if (props?.view) {\n config.view = props.view;\n }\n this.config = new Config(config);\n this.config.onCellClick = props?.onCellClick ?? null;\n this.config.onSelectonChange = props?.onSelectionChange ?? null;\n this.config.onCellChange = props?.onCellChange ?? null;\n this.rowsBar = new RowsBar(this);\n this.columnsBar = new ColumnsBar(this);\n this.sheet = new Sheet(this);\n this.table = new Table(this);\n this.scroller = new Scroller(this);\n this.toolbar = new Toolbar(this);\n this.editor = new Editor(this);\n this.cache = this.getInitialCache();\n this.viewport = new Viewport(this, this.scroller.getViewportBoundlingRect());\n this.selection = new Selection();\n this.events = new Events(this);\n this.data = data;\n this.styles = new Styles();\n this.buildComponent();\n this.setElementsPositions();\n this.appendTableToTarget(target);\n this.renderSheet();\n this.renderColumnsBar();\n this.renderRowsBar();\n }\n setRowsBarPosition() {\n const top = this.columnsBar.height + this.toolbar.height;\n const left = 0;\n this.rowsBar.setElementPosition(top, left);\n }\n setColumnsBarPosition() {\n const top = this.toolbar.height;\n const left = this.rowsBar.width;\n console.log(top, left);\n this.columnsBar.setElementPosition(top, left);\n }\n setElementsPositions() {\n this.setRowsBarPosition();\n this.setColumnsBarPosition();\n }\n getInitialCache() {\n const cachedCols = [];\n let currentWidth = 0;\n for (let i = 0; i <= this.config.columns.length - 1; i++) {\n const col = this.config.columns[i];\n currentWidth += col.width;\n const cacheCol = new CachedColumn({\n xPos: currentWidth,\n colIdx: i,\n });\n cachedCols.push(cacheCol);\n }\n const cachedRows = [];\n let currentHeight = 0;\n for (let i = 0; i <= this.config.rows.length - 1; i++) {\n const row = this.config.rows[i];\n currentHeight += row.height;\n const cacheRow = new CachedRow({\n yPos: currentHeight,\n rowIdx: i,\n });\n cachedRows.push(cacheRow);\n }\n const cache = new Cache({\n columns: cachedCols,\n rows: cachedRows,\n });\n console.log(\"CACHE: \", cache);\n console.log(\"CONFIG: \", this.config);\n return cache;\n }\n buildComponent() {\n const content = document.createElement(\"div\"); //* Abstract\n content.style.top = this.columnsBarHeight + \"px\";\n content.style.left = this.rowsBarWidth + \"px\";\n content.appendChild(this.sheet.element);\n content.classList.add(CSS_PREFIX + \"content\");\n this.table.element.appendChild(this.toolbar.element);\n this.table.element.appendChild(this.rowsBar.element);\n this.table.element.appendChild(this.columnsBar.element);\n this.table.element.appendChild(content);\n this.table.element.appendChild(this.scroller.element);\n this.table.element.append(this.editor.element);\n }\n /**Destroy spreadsheet DOM element.\n *\n * May be usefull when need to rerender component.\n */\n destroy() {\n this.table.element.remove();\n }\n appendTableToTarget(target) {\n if (typeof target === \"string\") {\n const element = document.querySelector(target);\n if (!element)\n throw new Error(`Element with selector ${target} is not finded in DOM.\\n Make sure it exists.`);\n element?.appendChild(this.table.element);\n }\n if (target instanceof HTMLElement) {\n target.append(this.table.element);\n }\n }\n /** Canvas rendering context 2D.\n *\n * Abble to draw on canvas with default CanvasAPI methods\n */\n get ctx() {\n return this.sheet.ctx;\n }\n get viewProps() {\n return this.config.view;\n }\n get columnsBarHeight() {\n return this.columnsBar.height;\n }\n get rowsBarWidth() {\n return this.rowsBar.width;\n }\n get toolbarHeight() {\n return this.toolbar.height;\n }\n /** Focusing on interactive part of spreadsheet */\n focusTable() {\n this.scroller.element.focus();\n }\n getCellByCoords(x, y) {\n return this.sheet.getCellByCoords(x, y);\n }\n getCell(position) {\n const { column, row } = position;\n return this.data[row][column];\n }\n changeCellValues(position, values) {\n const { column, row } = position;\n this.data[row][column].changeValues(values);\n this.renderCell(row, column);\n }\n changeCellStyles(position, styles) {\n const { column, row } = position;\n this.data[row][column].changeStyles(styles);\n this.renderCell(row, column);\n }\n applyActionToRange(range, callback) {\n const fromRow = Math.min(range.from.row, range.to.row);\n const toRow = Math.max(range.from.row, range.to.row);\n const fromCol = Math.min(range.from.column, range.to.column);\n const toCol = Math.max(range.from.column, range.to.column);\n for (let row = fromRow; row <= toRow; row++) {\n for (let col = fromCol; col <= toCol; col++) {\n const cell = this.data[row][col];\n callback(cell);\n }\n }\n }\n deleteSelectedCellsValues() {\n if (this.selection.selectedRange !== null) {\n this.applyActionToRange(this.selection.selectedRange, (cell) => {\n this.changeCellValues(cell.position, {\n displayValue: \"\",\n resultValue: \"\",\n value: \"\",\n });\n });\n }\n else {\n if (!this.selection.selectedCell)\n return;\n this.changeCellValues(this.selection.selectedCell, {\n displayValue: \"\",\n resultValue: \"\",\n value: \"\",\n });\n }\n }\n showEditor(position, initialString) {\n this.editor.show(position, initialString);\n }\n renderSheet() {\n this.sheet.renderSheet();\n }\n renderColumnsBar() {\n this.columnsBar.renderBar();\n }\n renderRowsBar() {\n this.rowsBar.renderBar();\n }\n renderCell(row, col) {\n this.data[row][col].render(this);\n }\n loadData(data) {\n const rowsLength = data.length;\n const colsLength = data[0] ? this.data[0].length : 0;\n this.data = [];\n const formattedData = [];\n for (let row = 0; row < rowsLength; row++) {\n const innerRow = [];\n for (let col = 0; col < colsLength; col++) {\n const cell = data[row][col];\n innerRow.push(new Cell({\n displayValue: cell.displayValue,\n position: cell.position,\n resultValue: cell.resultValue,\n value: cell.value,\n style: cell.style,\n }));\n }\n formattedData.push(innerRow);\n }\n this.data = formattedData;\n this.selection.selectedCell = null;\n this.selection.selectedRange = null;\n this.config = this.makeConfigFromData(formattedData, this.config.view);\n this.cache = this.getInitialCache();\n this.scroller.updateScrollerSize();\n this.viewport = new Viewport(this, this.scroller.getViewportBoundlingRect());\n this.renderSheet();\n return this;\n }\n makeConfigFromData(data, view) {\n const lastRowIdx = data.length - 1;\n const lastColIdx = data[0] ? data[0].length : 0;\n const rows = [];\n for (let row = 0; row < lastRowIdx; row++) {\n rows.push(new Row({\n height: 40,\n title: String(row),\n }));\n }\n const columns = [];\n for (let col = 0; col < lastColIdx; col++) {\n columns.push(new Column({\n width: 150,\n title: String(col),\n }));\n }\n const config = new Config({\n view,\n rows,\n columns,\n onCellClick: null,\n });\n return config;\n }\n serializeData() {\n const rowsLength = this.data.length;\n const colsLength = this.data[0] ? this.data[0].length : 0;\n const cellsArray = [];\n for (let row = 0; row < rowsLength; row++) {\n const innerRow = [];\n for (let col = 0; col < colsLength; col++) {\n innerRow.push(this.data[row][col].getSerializableCell());\n }\n cellsArray.push(innerRow);\n }\n return cellsArray;\n }\n}\nexport * from \"./modules/cache\";\nexport * from \"./modules/cell\";\nexport * from \"./modules/column\";\nexport * from \"./modules/config\";\nexport * from \"./modules/renderBox\";\nexport * from \"./modules/row\";\nexport * from \"./modules/selection\";\nexport * from \"./modules/styles\";\nexport * from \"./modules/viewport\";\nexport * from \"./utils/createData\";\n"],"names":["EventTypes","Events","root","__publicField","event","scroller","offsetX","offsetY","clickedCell","cell","selection","Selection","_b","_a","enableCallback","action","values","RenderBox","config","cellPosition","column","x","i","row","y","Editor","key","target","element","CSS_PREFIX","position","initialString","height","width","checkEqualCellSelections","selection1","selection2","Scroller","lastSelectedCell","isRangeChanged","newSelection","keysRegex","isPressedLetterKey","rect","horizontalScroller","verticalScroller","mode","scrollTop","scrollLeft","bottom","right","groupScrollers","stack","acc","curr","totalHeight","totalWidth","CellStyles","props","Position","SerializableCell","Cell","styles","selectedRange","isCellInRow","renderBox","ctx","isCellSelected","isCellInRange","Sheet","canvas","col","firstRowIdx","lastColIdx","lastRowIdx","firstColIdx","Table","container","sizes","Toolbar","toolbarElement","Config","Styles","Viewport","Column","Row","createSampleData","rows","columns","fillCellsByCoords","data","innerRow","value","createSampleConfig","rowsArr","rowItem","colsArr","colItem","makeSpreadsheetConfigAndData","CachedColumn","CachedRow","Cache","initial","rowIdx","colIdx","ColumnsBar","top","left","selectedCell","isColSelected","specialX","RowsBar","isRowSeleted","specialY","Spreadsheet","cachedCols","currentWidth","cacheCol","cachedRows","currentHeight","cacheRow","cache","content","range","callback","fromRow","toRow","fromCol","toCol","rowsLength","colsLength","formattedData","view","cellsArray"],"mappings":"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"} \ No newline at end of file diff --git a/dist/main.d.ts b/dist/main.d.ts index d68365a..28452c6 100644 --- a/dist/main.d.ts +++ b/dist/main.d.ts @@ -1,13 +1,16 @@ import { Cell, CellConstructorProps, CellStyles, Position, SerializableCell } from "./modules/cell"; -import { Config, ViewProperties } from "./modules/config"; +import { CellChangeEvent, CellClickEvent, Config, SelectionChangeEvent, ViewProperties } from "./modules/config"; import { RangeSelectionType, Selection } from "./modules/selection"; import { Styles } from "./modules/styles"; import { Viewport } from "./modules/viewport"; import "./scss/main.scss"; import { Cache } from "./modules/cache"; -interface SpreadsheetConstructorProperties { - config?: Omit; +import { Events } from "./modules/events"; +export interface SpreadsheetConstructorProperties { view?: ViewProperties; + onCellClick?: CellClickEvent | null; + onSelectionChange?: SelectionChangeEvent | null; + onCellChange?: CellChangeEvent | null; } export declare const CSS_PREFIX = "modern_sc_"; export default class Spreadsheet { @@ -24,6 +27,7 @@ export default class Spreadsheet { viewport: Viewport; selection: Selection; cache: Cache; + events: Events; constructor(target: string | HTMLElement, props?: SpreadsheetConstructorProperties); private setRowsBarPosition; private setColumnsBarPosition; diff --git a/dist/main.js b/dist/main.js index cb7c7da..5ca2b07 100644 --- a/dist/main.js +++ b/dist/main.js @@ -1,7 +1,54 @@ var R = Object.defineProperty; -var v = (n, t, e) => t in n ? R(n, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : n[t] = e; -var s = (n, t, e) => (v(n, typeof t != "symbol" ? t + "" : t, e), e); -class w { +var k = (r, t, e) => t in r ? R(r, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : r[t] = e; +var s = (r, t, e) => (k(r, typeof t != "symbol" ? t + "" : t, e), e); +var a; +(function(r) { + r.CELL_CLICK = "CELL_CLICK", r.SELECTION_CHANGE = "CHANGE_SELECTION", r.CELL_CHANGE = "CELL_CHANGE"; +})(a || (a = {})); +class E { + constructor(t) { + s(this, "root"); + s(this, "cellClick", (t, e) => { + var c, d; + if (t.button !== 0) + return; + const { offsetX: o, offsetY: l } = t, i = this.root.getCellByCoords(o, l), n = this.root.getCell(i), h = new p(); + h.selectedCell = i, h.selectedRange = { + from: i, + to: i + }, e.setSelectingMode(!0), this.changeSelection(h, !0), (d = (c = this.root.config).onCellClick) == null || d.call(c, t, n); + }); + s(this, "changeSelection", (t, e = !1) => { + var o, l; + this.root.selection = t, e && ((l = (o = this.root.config).onSelectonChange) == null || l.call(o, t)), this.root.renderSheet(), this.root.renderColumnsBar(), this.root.renderRowsBar(); + }); + this.root = t; + } + dispatch(t) { + switch (t.type) { + case a.CELL_CLICK: { + const { event: e, scroller: o } = t; + this.cellClick(e, o); + break; + } + case a.SELECTION_CHANGE: { + const { selection: e, enableCallback: o } = t; + this.changeSelection(e, o); + break; + } + case a.CELL_CHANGE: { + const { cell: e, values: o } = t; + this.changeCellValues(e, o); + break; + } + } + } + changeCellValues(t, e) { + var o, l; + this.root.changeCellValues(t.position, e), (l = (o = this.root.config).onCellChange) == null || l.call(o, t); + } +} +class g { constructor(t, e) { s(this, "x"); s(this, "y"); @@ -11,18 +58,18 @@ class w { } getXCoord(t, e) { let o = 0; - for (let i = 0; i < t; i++) - o += e.columns[i].width; + for (let l = 0; l < t; l++) + o += e.columns[l].width; return o; } getYCoord(t, e) { let o = 0; - for (let i = 0; i < t; i++) - o += e.rows[i].height; + for (let l = 0; l < t; l++) + o += e.rows[l].height; return o; } } -class S { +class B { constructor(t) { s(this, "element"); s(this, "root"); @@ -33,11 +80,18 @@ class S { this.hide(); break; } - case "Enter": - this.root.changeCellValues(this.root.selection.selectedCell, { - value: this.element.value, - displayValue: this.element.value + case "Enter": { + if (!this.root.selection.selectedCell) + return; + this.root.events.dispatch({ + type: a.CELL_CHANGE, + cell: this.root.getCell(this.root.selection.selectedCell), + values: { + value: this.element.value, + displayValue: this.element.value + } }), this.hide(); + } } }); s(this, "handleClickOutside", (t) => { @@ -46,17 +100,20 @@ class S { }); this.root = t; const e = document.createElement("input"); - e.classList.add(a + "editor"), this.element = e, this.hide(); + e.classList.add(u + "editor"), this.element = e, this.hide(); } hide() { this.element.style.display = "none", this.element.classList.add("hide"), this.element.blur(), window.removeEventListener("click", this.handleClickOutside), this.element.removeEventListener("keydown", this.handleKeydown), this.root.focusTable(); } show(t, e) { - const { height: o, width: i, x: r, y: l } = new w(this.root.config, t), h = this.root.getCell(t); - this.element.classList.remove("hide"), this.element.style.top = l - this.root.viewport.top + this.root.columnsBarHeight + "px", this.element.style.left = r - this.root.viewport.left + this.root.rowsBarWidth + "px", this.element.style.width = i + "px", this.element.style.height = o + "px", this.element.style.display = "block", window.addEventListener("click", this.handleClickOutside), this.element.addEventListener("keydown", this.handleKeydown), this.element.value = e || h.value, this.element.focus(), e || this.element.select(); + const { height: o, width: l, x: i, y: n } = new g(this.root.config, t), h = this.root.getCell(t); + this.element.classList.remove("hide"), this.element.style.top = n - this.root.viewport.top + this.root.columnsBarHeight + "px", this.element.style.left = i - this.root.viewport.left + this.root.rowsBarWidth + "px", this.element.style.width = l + "px", this.element.style.height = o + "px", this.element.style.display = "block", window.addEventListener("click", this.handleClickOutside), this.element.addEventListener("keydown", this.handleKeydown), this.element.value = e || h.value, this.element.focus(), e || this.element.select(); } } -class b { +function f(r, t) { + return r.column === t.column && r.row === t.row; +} +class L { constructor(t) { s(this, "element"); s(this, "verticalScroller"); @@ -66,11 +123,22 @@ class b { s(this, "handleMouseMove", (t) => { if (!this.isSelecting) return; - const { offsetX: e, offsetY: o } = t, i = this.root.getCellByCoords(e, o); - this.root.selection.selectedRange && (this.root.selection.selectedRange.to = i), this.root.renderSheet(), this.root.renderColumnsBar(), this.root.renderRowsBar(); + const { offsetX: e, offsetY: o } = t, l = this.root.getCellByCoords(e, o); + let i = !1; + this.root.selection.selectedRange && (i = !f(this.root.selection.selectedRange.to, l), i && (this.root.selection.selectedRange.to = l, this.root.events.dispatch({ + type: a.SELECTION_CHANGE, + selection: this.root.selection, + enableCallback: !0 + }))); }); s(this, "handleMouseUp", () => { - this.isSelecting = !1, this.root.selection.selectedRange && this.root.selection.selectedRange.from.row === this.root.selection.selectedRange.to.row && this.root.selection.selectedRange.from.column === this.root.selection.selectedRange.to.column && (this.root.selection.selectedRange = null), this.root.renderSheet(), this.root.renderColumnsBar(), this.root.renderRowsBar(); + this.isSelecting = !1; + const t = { ...this.root.selection }; + this.root.selection.selectedRange && f(this.root.selection.selectedRange.from, this.root.selection.selectedRange.to) && (t.selectedRange = null, this.root.events.dispatch({ + type: a.SELECTION_CHANGE, + selection: t, + enableCallback: !1 + })), this.root.renderSheet(), this.root.renderColumnsBar(), this.root.renderRowsBar(); }); s(this, "handleDoubleClick", (t) => { t.preventDefault(); @@ -78,25 +146,31 @@ class b { this.root.showEditor(e); }); s(this, "handleKeydown", (t) => { - if (console.log(t), ["ArrowLeft", "ArrowRight", "ArrowUp", "ArrowDown"].includes(t.key)) + if (["ArrowLeft", "ArrowRight", "ArrowUp", "ArrowDown"].includes(t.key)) { switch (t.preventDefault(), this.root.selection.selectedRange = null, t.key) { case "ArrowLeft": { - this.root.selection.selectedCell && this.root.selection.selectedCell.column > 0 && (console.log("tick"), this.root.selection.selectedCell.column -= 1, this.root.renderSheet()); + this.root.selection.selectedCell && this.root.selection.selectedCell.column > 0 && (this.root.selection.selectedCell.column -= 1); break; } case "ArrowRight": { - this.root.selection.selectedCell && this.root.selection.selectedCell.column < this.root.config.columns.length - 1 && (this.root.selection.selectedCell.column += 1, this.root.renderSheet()); + this.root.selection.selectedCell && this.root.selection.selectedCell.column < this.root.config.columns.length - 1 && (this.root.selection.selectedCell.column += 1); break; } case "ArrowUp": { - this.root.selection.selectedCell && this.root.selection.selectedCell.row > 0 && (this.root.selection.selectedCell.row -= 1, this.root.renderSheet()); + this.root.selection.selectedCell && this.root.selection.selectedCell.row > 0 && (this.root.selection.selectedCell.row -= 1); break; } case "ArrowDown": { - this.root.selection.selectedCell && this.root.selection.selectedCell.row < this.root.config.rows.length - 1 && (this.root.selection.selectedCell.row += 1, this.root.renderSheet()); + this.root.selection.selectedCell && this.root.selection.selectedCell.row < this.root.config.rows.length - 1 && (this.root.selection.selectedCell.row += 1); break; } } + this.root.events.dispatch({ + type: a.SELECTION_CHANGE, + selection: this.root.selection, + enableCallback: !0 + }); + } const e = /^([a-z]|[а-я])$/; if (!t.metaKey && !t.ctrlKey) { const o = e.test(t.key.toLowerCase()); @@ -109,34 +183,35 @@ class b { t.key === "Delete" && (t.preventDefault(), this.root.deleteSelectedCellsValues(), this.root.renderSheet()); }); s(this, "handleClick", (t) => { - if (t.button !== 0) - return; - const { offsetX: e, offsetY: o } = t, i = this.root.getCellByCoords(e, o); - this.isSelecting = !0, this.root.selection.selectedRange = { - from: i, - to: i - }, this.root.selection.selectedCell = i, this.root.renderSheet(), this.root.renderColumnsBar(), this.root.renderRowsBar(); + this.root.events.dispatch({ + type: a.CELL_CLICK, + event: t, + scroller: this + }); }); s(this, "handleScroll", () => { const t = this.getViewportBoundlingRect(); this.root.viewport.updateValues(t), this.root.renderSheet(), this.root.renderColumnsBar(), this.root.renderRowsBar(); }); this.root = t; - const { horizontalScroller: e, scroller: o, verticalScroller: i } = this.buildComponent(); - this.element = o, this.verticalScroller = i, this.horizontalScroller = e, this.element.style.height = this.root.config.view.height + "px", this.element.style.width = this.root.config.view.width + "px", this.element.style.top = this.root.columnsBarHeight + "px", this.element.style.left = this.root.rowsBarWidth + "px", this.element.tabIndex = -1, this.updateScrollerSize(), this.element.addEventListener("scroll", this.handleScroll), this.element.addEventListener("mousedown", this.handleClick), this.element.addEventListener("mousemove", this.handleMouseMove), this.element.addEventListener("mouseup", this.handleMouseUp), this.element.addEventListener("dblclick", this.handleDoubleClick), this.element.addEventListener("keydown", this.handleKeydown); + const { horizontalScroller: e, scroller: o, verticalScroller: l } = this.buildComponent(); + this.element = o, this.verticalScroller = l, this.horizontalScroller = e, this.element.style.height = this.root.config.view.height + "px", this.element.style.width = this.root.config.view.width + "px", this.element.style.top = this.root.columnsBarHeight + "px", this.element.style.left = this.root.rowsBarWidth + "px", this.element.tabIndex = -1, this.updateScrollerSize(), this.element.addEventListener("scroll", this.handleScroll), this.element.addEventListener("mousedown", this.handleClick), this.element.addEventListener("mousemove", this.handleMouseMove), this.element.addEventListener("mouseup", this.handleMouseUp), this.element.addEventListener("dblclick", this.handleDoubleClick), this.element.addEventListener("keydown", this.handleKeydown); + } + setSelectingMode(t) { + this.isSelecting = t; } getViewportBoundlingRect() { - const { scrollTop: t, scrollLeft: e } = this.element, { height: o, width: i } = this.element.getBoundingClientRect(), r = t + o, l = e + i; + const { scrollTop: t, scrollLeft: e } = this.element, { height: o, width: l } = this.element.getBoundingClientRect(), i = t + o, n = e + l; return { top: t, left: e, - bottom: r, - right: l + bottom: i, + right: n }; } buildComponent() { - const t = document.createElement("div"), e = document.createElement("div"), o = document.createElement("div"), i = document.createElement("div"), r = document.createElement("div"); - return e.style.width = "0px", e.style.pointerEvents = "none", o.style.pointerEvents = "none", i.style.display = "flex", r.appendChild(e), r.appendChild(o), i.appendChild(r), this.verticalScroller = e, this.horizontalScroller = o, t.appendChild(i), t.classList.add(a + "scroller"), { scroller: t, verticalScroller: e, horizontalScroller: o }; + const t = document.createElement("div"), e = document.createElement("div"), o = document.createElement("div"), l = document.createElement("div"), i = document.createElement("div"); + return e.style.width = "0px", e.style.pointerEvents = "none", o.style.pointerEvents = "none", l.style.display = "flex", i.appendChild(e), i.appendChild(o), l.appendChild(i), this.verticalScroller = e, this.horizontalScroller = o, t.appendChild(l), t.classList.add(u + "scroller"), { scroller: t, verticalScroller: e, horizontalScroller: o }; } getActualHeight() { return this.root.config.rows.reduce((t, e) => (t += e.height, t), 0); @@ -155,7 +230,7 @@ class b { this.horizontalScroller.style.width = t + "px"; } } -class B { +class I { constructor(t) { s(this, "fontSize", 16); s(this, "fontColor", "black"); @@ -166,14 +241,14 @@ class B { t && Object.assign(this, t); } } -class k { +class V { constructor(t, e) { s(this, "row"); s(this, "column"); this.row = t, this.column = e; } } -class E { +class A { constructor(t) { s(this, "value"); s(this, "displayValue"); @@ -183,7 +258,7 @@ class E { this.value = t.value, this.displayValue = t.displayValue, this.resultValue = t.resultValue, this.position = t.position, this.style = t.style; } } -class C { +class y { constructor(t) { /** True value (data) */ s(this, "value"); @@ -196,7 +271,7 @@ class C { this.value = t.value, this.displayValue = t.displayValue, this.resultValue = t.resultValue, this.position = t.position, this.style = t.style; } getSerializableCell() { - return new E({ + return new A({ displayValue: this.displayValue, position: this.position, resultValue: this.resultValue, @@ -211,76 +286,76 @@ class C { Object.assign(this, t); } isCellInRange(t) { - const { column: e, row: o } = this.position, { selectedRange: i } = t.selection; - if (!i) + const { column: e, row: o } = this.position, { selectedRange: l } = t.selection; + if (!l) return !1; - const r = o >= Math.min(i.from.row, i.to.row) && o <= Math.max(i.to.row, i.from.row); - return e >= Math.min(i.from.column, i.to.column) && e <= Math.max(i.to.column, i.from.column) && r; + const i = o >= Math.min(l.from.row, l.to.row) && o <= Math.max(l.to.row, l.from.row); + return e >= Math.min(l.from.column, l.to.column) && e <= Math.max(l.to.column, l.from.column) && i; } render(t) { - var g; - const e = new w(t.config, this.position); - let { x: o, y: i } = e; - const { height: r, width: l } = e, { ctx: h } = t, c = ((g = t.selection.selectedCell) == null ? void 0 : g.row) === this.position.row && t.selection.selectedCell.column === this.position.column, u = this.isCellInRange(t); - i -= t.viewport.top, o -= t.viewport.left; - const d = this.style ?? t.styles.cells; - h.clearRect(o, i, l, r), h.fillStyle = c || u ? d.selectedBackground : d.background, h.strokeStyle = "black", h.fillRect(o, i, l - 1, r - 1), h.strokeRect(o, i, l, r), h.fillStyle = c || u ? d.selectedFontColor : d.fontColor, h.textAlign = "left", h.font = `${d.fontSize}px Arial`, h.textBaseline = "middle", h.fillText(this.displayValue, o + 2, i + r / 2); + var C; + const e = new g(t.config, this.position); + let { x: o, y: l } = e; + const { height: i, width: n } = e, { ctx: h } = t, c = ((C = t.selection.selectedCell) == null ? void 0 : C.row) === this.position.row && t.selection.selectedCell.column === this.position.column, d = this.isCellInRange(t); + l -= t.viewport.top, o -= t.viewport.left; + const w = this.style ?? t.styles.cells; + h.clearRect(o, l, n, i), h.fillStyle = c || d ? w.selectedBackground : w.background, h.strokeStyle = "black", h.fillRect(o, l, n - 1, i - 1), h.strokeRect(o, l, n, i), h.fillStyle = c || d ? w.selectedFontColor : w.fontColor, h.textAlign = "left", h.font = `${w.fontSize}px Arial`, h.textBaseline = "middle", h.fillText(this.displayValue, o + 2, l + i / 2); } } -class V { +class P { constructor(t) { s(this, "element"); s(this, "ctx"); s(this, "root"); this.root = t; const e = document.createElement("canvas"); - e.classList.add(a + "sheet"), e.height = this.root.config.view.height, e.width = this.root.config.view.width, e.style.width = this.root.config.view.width + "px", e.style.height = this.root.config.view.height + "px", e.style.left = "0px", this.element = e; + e.classList.add(u + "sheet"), e.height = this.root.config.view.height, e.width = this.root.config.view.width, e.style.width = this.root.config.view.width + "px", e.style.height = this.root.config.view.height + "px", e.style.left = "0px", this.element = e; const o = this.element.getContext("2d"); if (!o) throw new Error("Enable hardware acceleration"); this.ctx = o; } getCellByCoords(t, e) { - let o = 0, i = 0; - for (; i <= e && (i += this.root.config.rows[o].height, !(i >= e)); ) + let o = 0, l = 0; + for (; l <= e && (l += this.root.config.rows[o].height, !(l >= e)); ) o++; - let r = 0, l = 0; - for (; l <= t && (l += this.root.config.columns[r].width, !(l >= t)); ) - r++; - return new k(o, r); + let i = 0, n = 0; + for (; n <= t && (n += this.root.config.columns[i].width, !(n >= t)); ) + i++; + return new V(o, i); } renderCell(t) { const { column: e, row: o } = t; this.root.data[o][e].render(this.root); } renderSheet() { - const t = this.root.viewport.firstRow, e = this.root.viewport.lastCol + 3, o = this.root.viewport.lastRow + 3, i = this.root.viewport.firstCol; - for (let r = t; r <= o; r++) - for (let l = i; l <= e && !(!this.root.config.columns[l] || !this.root.config.rows[r]); l++) - this.renderCell({ column: l, row: r }); + const t = this.root.viewport.firstRow, e = this.root.viewport.lastCol + 3, o = this.root.viewport.lastRow + 3, l = this.root.viewport.firstCol; + for (let i = t; i <= o; i++) + for (let n = l; n <= e && !(!this.root.config.columns[n] || !this.root.config.rows[i]); n++) + this.renderCell({ column: n, row: i }); } } -class I { +class T { constructor(t) { s(this, "element"); s(this, "root"); this.root = t; const e = document.createElement("div"); - e.classList.add(a + "spreadsheet_container"), this.element = e, this.changeElementSizes(this.root.viewProps); + e.classList.add(u + "spreadsheet_container"), this.element = e, this.changeElementSizes(this.root.viewProps); } changeElementSizes(t) { const { height: e, width: o } = t; this.element.style.width = o + this.root.rowsBarWidth + "px", this.element.style.height = e + this.root.columnsBarHeight + "px"; } } -class L { +class H { constructor(t) { s(this, "element"); s(this, "root"); s(this, "height", 0); this.root = t; const e = document.createElement("div"); - e.classList.add(a + "toolbar"), this.element = e; + e.classList.add(u + "toolbar"), this.element = e; } } class m { @@ -291,22 +366,25 @@ class m { width: 800, height: 600 }); - this.columns = t.columns, this.rows = t.rows, this.view = t.view; + s(this, "onCellClick", null); + s(this, "onSelectonChange", null); + s(this, "onCellChange", null); + this.columns = t.columns, this.rows = t.rows, this.view = t.view, this.onCellClick = t.onCellClick ?? null, this.onSelectonChange = t.onSelectionChange ?? null, this.onCellChange = t.onCellChange ?? null; } } -class P { +class p { constructor() { s(this, "selectedCell", null); s(this, "selectedRange", null); } } -class T { +class M { constructor() { s(this, "cells"); - this.cells = new B(); + this.cells = new I(); } } -class f { +class x { constructor(t, e) { s(this, "root"); s(this, "top"); @@ -345,57 +423,57 @@ class f { return this.root.cache.getColumnByXCoord(this.right); } } -class x { +class S { constructor(t) { s(this, "width"); s(this, "title"); this.width = t.width, this.title = t.title; } } -class p { +class v { constructor(t) { s(this, "height"); s(this, "title"); this.height = t.height, this.title = t.title; } } -function y(n, t, e = !1) { +function b(r, t, e = !1) { const o = []; - for (let i = 0; i <= n; i++) { - const r = []; - for (let l = 0; l <= t; l++) { - const h = e ? `${i}:${l}` : "", c = new C({ + for (let l = 0; l <= r; l++) { + const i = []; + for (let n = 0; n <= t; n++) { + const h = e ? `${l}:${n}` : "", c = new y({ displayValue: h, resultValue: h, value: h, position: { - column: l, - row: i + column: n, + row: l }, style: null }); - r.push(c); + i.push(c); } - o.push(r); + o.push(i); } return o; } -function A(n, t) { +function z(r, t) { const e = []; - for (let r = 0; r <= n; r++) { - const l = new p({ + for (let i = 0; i <= r; i++) { + const n = new v({ height: 40, - title: String(r) + title: String(i) }); - e.push(l); + e.push(n); } const o = []; - for (let r = 0; r <= t; r++) { - const l = new x({ - title: String(r), + for (let i = 0; i <= t; i++) { + const n = new S({ + title: String(i), width: 150 }); - o.push(l); + o.push(n); } return new m({ columns: o, @@ -406,25 +484,25 @@ function A(n, t) { } }); } -function X(n, t) { - const e = y(n, t), o = A(n, t); +function K(r, t) { + const e = b(r, t), o = z(r, t); return { data: e, config: o }; } -class M { +class D { constructor(t) { s(this, "xPos"); s(this, "colIdx"); this.xPos = t.xPos, this.colIdx = t.colIdx; } } -class z { +class _ { constructor(t) { s(this, "yPos"); s(this, "rowIdx"); this.yPos = t.yPos, this.rowIdx = t.rowIdx; } } -class D { +class N { constructor(t) { s(this, "columns"); s(this, "rows"); @@ -449,11 +527,11 @@ class D { return e; } } -class H { +class F { constructor(t) { s(this, "element"); s(this, "root"); - s(this, "height", 32); + s(this, "height", 35); s(this, "width"); // private resizerWidth = 1; s(this, "ctx"); @@ -483,17 +561,17 @@ class H { // return x // } renderText(t, e) { - const { width: o, x: i } = e; - this.ctx.fillStyle = "black", this.ctx.textAlign = "center", this.ctx.textBaseline = "middle", this.ctx.font = "16px Arial", this.ctx.fillText(this.root.config.columns[t].title, i + o / 2 - this.root.viewport.left, 0 + this.height / 2); + const { width: o, x: l } = e; + this.ctx.fillStyle = "black", this.ctx.textAlign = "center", this.ctx.textBaseline = "middle", this.ctx.font = "12px Arial", this.ctx.fillText(this.root.config.columns[t].title, l + o / 2 - this.root.viewport.left, 0 + this.height / 2); } renderRect(t, e) { - const { width: o, x: i } = e, r = this.isColumnSelected(t); - this.ctx.fillStyle = r ? this.root.styles.cells.selectedBackground : "white", this.ctx.strokeStyle = "black", this.ctx.lineWidth = 1; - const l = i - this.root.viewport.left; - this.ctx.fillRect(l - 1, 0, o, this.height), this.ctx.strokeRect(l - 1, 0, o, this.height); + const { width: o, x: l } = e, i = this.isColumnSelected(t); + this.ctx.fillStyle = i ? this.root.styles.cells.selectedBackground : "white", this.ctx.strokeStyle = "black", this.ctx.lineWidth = 1; + const n = l - this.root.viewport.left; + this.ctx.fillRect(n - 1, 0, o, this.height), this.ctx.strokeRect(n - 1, 0, o, this.height); } renderSingleColumn(t) { - const e = new w(this.root.config, { + const e = new g(this.root.config, { row: 0, column: t }); @@ -506,12 +584,12 @@ class H { this.renderSingleColumn(o); } } -class F { +class W { constructor(t) { s(this, "element"); s(this, "ctx"); s(this, "root"); - s(this, "width", 30); + s(this, "width", 35); s(this, "height"); s(this, "resizerHeight", 1); this.root = t, this.element = this.createElement(); @@ -532,17 +610,17 @@ class F { return e && e.row === t ? !0 : o ? t >= Math.min(o.from.row, o.to.row) && t <= Math.max(o.from.row, o.to.row) : !1; } renderText(t, e) { - const { y: o, height: i } = e; - this.ctx.fillStyle = "black", this.ctx.textAlign = "center", this.ctx.textBaseline = "middle", this.ctx.font = "16px Arial", this.ctx.fillText(this.root.config.rows[t].title, this.width / 2, o - this.root.viewport.top + i / 2); + const { y: o, height: l } = e; + this.ctx.fillStyle = "black", this.ctx.textAlign = "center", this.ctx.textBaseline = "middle", this.ctx.font = "12px Arial", this.ctx.fillText(this.root.config.rows[t].title, this.width / 2, o - this.root.viewport.top + l / 2); } renderRect(t, e) { - const { y: o, height: i } = e, r = this.isRowSelected(t); - this.ctx.fillStyle = r ? this.root.styles.cells.selectedBackground : "white", this.ctx.strokeStyle = "black", this.ctx.lineWidth = this.resizerHeight; - const l = o - this.root.viewport.top; - this.ctx.fillRect(0, l - 1, this.width, i), this.ctx.strokeRect(0, l - 1, this.width, i); + const { y: o, height: l } = e, i = this.isRowSelected(t); + this.ctx.fillStyle = i ? this.root.styles.cells.selectedBackground : "white", this.ctx.strokeStyle = "black", this.ctx.lineWidth = this.resizerHeight; + const n = o - this.root.viewport.top; + this.ctx.fillRect(0, n - 1, this.width, l), this.ctx.strokeRect(0, n - 1, this.width, l); } renderSingleRow(t) { - const e = new w(this.root.config, { + const e = new g(this.root.config, { column: 0, row: t }); @@ -555,8 +633,8 @@ class F { this.renderSingleRow(o); } } -const a = "modern_sc_"; -class Y { +const u = "modern_sc_"; +class G { constructor(t, e) { s(this, "table"); s(this, "scroller"); @@ -571,8 +649,9 @@ class Y { s(this, "viewport"); s(this, "selection"); s(this, "cache"); - const o = y(40, 40), i = this.makeConfigFromData(o, (e == null ? void 0 : e.view) ?? { height: 600, width: 800 }); - e != null && e.view && (i.view = e.view), this.config = new m(i), this.rowsBar = new F(this), this.columnsBar = new H(this), this.sheet = new V(this), this.table = new I(this), this.scroller = new b(this), this.toolbar = new L(this), this.editor = new S(this), this.cache = this.getInitialCache(), this.viewport = new f(this, this.scroller.getViewportBoundlingRect()), this.selection = new P(), this.data = o, this.styles = new T(), this.buildComponent(), this.setElementsPositions(), this.appendTableToTarget(t), this.renderSheet(), this.renderColumnsBar(), this.renderRowsBar(); + s(this, "events"); + const o = b(40, 40), l = this.makeConfigFromData(o, (e == null ? void 0 : e.view) ?? { height: 600, width: 800 }); + e != null && e.view && (l.view = e.view), this.config = new m(l), this.config.onCellClick = (e == null ? void 0 : e.onCellClick) ?? null, this.config.onSelectonChange = (e == null ? void 0 : e.onSelectionChange) ?? null, this.config.onCellChange = (e == null ? void 0 : e.onCellChange) ?? null, this.rowsBar = new W(this), this.columnsBar = new F(this), this.sheet = new P(this), this.table = new T(this), this.scroller = new L(this), this.toolbar = new H(this), this.editor = new B(this), this.cache = this.getInitialCache(), this.viewport = new x(this, this.scroller.getViewportBoundlingRect()), this.selection = new p(), this.events = new E(this), this.data = o, this.styles = new M(), this.buildComponent(), this.setElementsPositions(), this.appendTableToTarget(t), this.renderSheet(), this.renderColumnsBar(), this.renderRowsBar(); } setRowsBarPosition() { const t = this.columnsBar.height + this.toolbar.height, e = 0; @@ -588,35 +667,35 @@ class Y { getInitialCache() { const t = []; let e = 0; - for (let l = 0; l <= this.config.columns.length - 1; l++) { - const h = this.config.columns[l]; + for (let n = 0; n <= this.config.columns.length - 1; n++) { + const h = this.config.columns[n]; e += h.width; - const c = new M({ + const c = new D({ xPos: e, - colIdx: l + colIdx: n }); t.push(c); } const o = []; - let i = 0; - for (let l = 0; l <= this.config.rows.length - 1; l++) { - const h = this.config.rows[l]; - i += h.height; - const c = new z({ - yPos: i, - rowIdx: l + let l = 0; + for (let n = 0; n <= this.config.rows.length - 1; n++) { + const h = this.config.rows[n]; + l += h.height; + const c = new _({ + yPos: l, + rowIdx: n }); o.push(c); } - const r = new D({ + const i = new N({ columns: t, rows: o }); - return console.log("CACHE: ", r), console.log("CONFIG: ", this.config), r; + return console.log("CACHE: ", i), console.log("CONFIG: ", this.config), i; } buildComponent() { const t = document.createElement("div"); - t.style.top = this.columnsBarHeight + "px", t.style.left = this.rowsBarWidth + "px", t.appendChild(this.sheet.element), t.classList.add(a + "content"), this.table.element.appendChild(this.toolbar.element), this.table.element.appendChild(this.rowsBar.element), this.table.element.appendChild(this.columnsBar.element), this.table.element.appendChild(t), this.table.element.appendChild(this.scroller.element), this.table.element.append(this.editor.element); + t.style.top = this.columnsBarHeight + "px", t.style.left = this.rowsBarWidth + "px", t.appendChild(this.sheet.element), t.classList.add(u + "content"), this.table.element.appendChild(this.toolbar.element), this.table.element.appendChild(this.rowsBar.element), this.table.element.appendChild(this.columnsBar.element), this.table.element.appendChild(t), this.table.element.appendChild(this.scroller.element), this.table.element.append(this.editor.element); } /**Destroy spreadsheet DOM element. * @@ -666,19 +745,19 @@ class Y { return this.data[o][e]; } changeCellValues(t, e) { - const { column: o, row: i } = t; - this.data[i][o].changeValues(e), this.renderCell(i, o); + const { column: o, row: l } = t; + this.data[l][o].changeValues(e), this.renderCell(l, o); } changeCellStyles(t, e) { - const { column: o, row: i } = t; - this.data[i][o].changeStyles(e), this.renderCell(i, o); + const { column: o, row: l } = t; + this.data[l][o].changeStyles(e), this.renderCell(l, o); } applyActionToRange(t, e) { - const o = Math.min(t.from.row, t.to.row), i = Math.max(t.from.row, t.to.row), r = Math.min(t.from.column, t.to.column), l = Math.max(t.from.column, t.to.column); - for (let h = o; h <= i; h++) - for (let c = r; c <= l; c++) { - const u = this.data[h][c]; - e(u); + const o = Math.min(t.from.row, t.to.row), l = Math.max(t.from.row, t.to.row), i = Math.min(t.from.column, t.to.column), n = Math.max(t.from.column, t.to.column); + for (let h = o; h <= l; h++) + for (let c = i; c <= n; c++) { + const d = this.data[h][c]; + e(d); } } deleteSelectedCellsValues() { @@ -718,12 +797,12 @@ class Y { loadData(t) { const e = t.length, o = t[0] ? this.data[0].length : 0; this.data = []; - const i = []; - for (let r = 0; r < e; r++) { - const l = []; + const l = []; + for (let i = 0; i < e; i++) { + const n = []; for (let h = 0; h < o; h++) { - const c = t[r][h]; - l.push(new C({ + const c = t[i][h]; + n.push(new y({ displayValue: c.displayValue, position: c.position, resultValue: c.resultValue, @@ -731,59 +810,60 @@ class Y { style: c.style })); } - i.push(l); + l.push(n); } - return this.data = i, this.selection.selectedCell = null, this.selection.selectedRange = null, this.config = this.makeConfigFromData(i, this.config.view), this.cache = this.getInitialCache(), this.scroller.updateScrollerSize(), this.viewport = new f(this, this.scroller.getViewportBoundlingRect()), this.renderSheet(), this; + return this.data = l, this.selection.selectedCell = null, this.selection.selectedRange = null, this.config = this.makeConfigFromData(l, this.config.view), this.cache = this.getInitialCache(), this.scroller.updateScrollerSize(), this.viewport = new x(this, this.scroller.getViewportBoundlingRect()), this.renderSheet(), this; } makeConfigFromData(t, e) { - const o = t.length - 1, i = t[0] ? t[0].length : 0, r = []; + const o = t.length - 1, l = t[0] ? t[0].length : 0, i = []; for (let c = 0; c < o; c++) - r.push(new p({ + i.push(new v({ height: 40, title: String(c) })); - const l = []; - for (let c = 0; c < i; c++) - l.push(new x({ + const n = []; + for (let c = 0; c < l; c++) + n.push(new S({ width: 150, title: String(c) })); return new m({ view: e, - rows: r, - columns: l + rows: i, + columns: n, + onCellClick: null }); } serializeData() { const t = this.data.length, e = this.data[0] ? this.data[0].length : 0, o = []; - for (let i = 0; i < t; i++) { - const r = []; - for (let l = 0; l < e; l++) - r.push(this.data[i][l].getSerializableCell()); - o.push(r); + for (let l = 0; l < t; l++) { + const i = []; + for (let n = 0; n < e; n++) + i.push(this.data[l][n].getSerializableCell()); + o.push(i); } return o; } } export { - a as CSS_PREFIX, - D as Cache, - M as CachedColumn, - z as CachedRow, - C as Cell, - B as CellStyles, - x as Column, + u as CSS_PREFIX, + N as Cache, + D as CachedColumn, + _ as CachedRow, + y as Cell, + I as CellStyles, + S as Column, m as Config, - k as Position, - w as RenderBox, - p as Row, - P as Selection, - E as SerializableCell, - T as Styles, - f as Viewport, - A as createSampleConfig, - y as createSampleData, - Y as default, - X as makeSpreadsheetConfigAndData + V as Position, + g as RenderBox, + v as Row, + p as Selection, + A as SerializableCell, + M as Styles, + x as Viewport, + z as createSampleConfig, + b as createSampleData, + G as default, + K as makeSpreadsheetConfigAndData }; //# sourceMappingURL=main.js.map diff --git a/dist/main.js.map b/dist/main.js.map index fd5f3a8..67e0737 100644 --- a/dist/main.js.map +++ b/dist/main.js.map @@ -1 +1 @@ -{"version":3,"file":"main.js","sources":["../src/modules/renderBox.ts","../src/components/editor.ts","../src/components/scroller.ts","../src/modules/cell.ts","../src/components/sheet.ts","../src/components/table.ts","../src/components/toolbar.ts","../src/modules/config.ts","../src/modules/selection.ts","../src/modules/styles.ts","../src/modules/viewport.ts","../src/modules/column.ts","../src/modules/row.ts","../src/utils/createData.ts","../src/modules/cache.ts","../src/components/columnsBar.ts","../src/components/rowsBar.ts","../src/main.ts"],"sourcesContent":["export class RenderBox {\n x;\n y;\n width;\n height;\n constructor(config, cellPosition) {\n this.x = this.getXCoord(cellPosition.column, config);\n this.y = this.getYCoord(cellPosition.row, config);\n this.width = config.columns[cellPosition.column].width;\n this.height = config.rows[cellPosition.row].height;\n }\n getXCoord(column, config) {\n let x = 0;\n for (let i = 0; i < column; i++) {\n x += config.columns[i].width;\n }\n return x;\n }\n getYCoord(row, config) {\n let y = 0;\n for (let i = 0; i < row; i++) {\n y += config.rows[i].height;\n }\n return y;\n }\n}\n","import { CSS_PREFIX } from \"../main\";\nimport { RenderBox } from \"../modules/renderBox\";\nexport class Editor {\n element;\n root;\n constructor(root) {\n this.root = root;\n const element = document.createElement(\"input\");\n element.classList.add(CSS_PREFIX + \"editor\");\n this.element = element;\n this.hide();\n }\n hide() {\n this.element.style.display = \"none\";\n this.element.classList.add(\"hide\");\n this.element.blur();\n window.removeEventListener(\"click\", this.handleClickOutside);\n this.element.removeEventListener(\"keydown\", this.handleKeydown);\n this.root.focusTable();\n }\n show(position, initialString) {\n const { height, width, x, y } = new RenderBox(this.root.config, position);\n const cell = this.root.getCell(position);\n this.element.classList.remove(\"hide\");\n this.element.style.top =\n y - this.root.viewport.top + this.root.columnsBarHeight + \"px\";\n this.element.style.left =\n x - this.root.viewport.left + this.root.rowsBarWidth + \"px\";\n this.element.style.width = width + \"px\";\n this.element.style.height = height + \"px\";\n this.element.style.display = \"block\";\n window.addEventListener(\"click\", this.handleClickOutside);\n this.element.addEventListener(\"keydown\", this.handleKeydown);\n this.element.value = initialString ? initialString : cell.value;\n this.element.focus();\n if (!initialString)\n this.element.select();\n }\n handleKeydown = (event) => {\n const { key } = event;\n switch (key) {\n case \"Escape\": {\n this.hide();\n break;\n }\n case \"Enter\": {\n this.root.changeCellValues(this.root.selection.selectedCell, {\n value: this.element.value,\n displayValue: this.element.value,\n });\n this.hide();\n }\n }\n };\n handleClickOutside = (event) => {\n const target = event.target;\n if (!this.element.contains(target)) {\n this.hide();\n }\n };\n}\n","import { CSS_PREFIX } from \"../main\";\nexport class Scroller {\n element;\n verticalScroller;\n horizontalScroller;\n root;\n isSelecting = false;\n constructor(root) {\n this.root = root;\n const { horizontalScroller, scroller, verticalScroller } = this.buildComponent();\n this.element = scroller;\n this.verticalScroller = verticalScroller;\n this.horizontalScroller = horizontalScroller;\n this.element.style.height = this.root.config.view.height + \"px\";\n this.element.style.width = this.root.config.view.width + \"px\";\n this.element.style.top = this.root.columnsBarHeight + \"px\";\n this.element.style.left = this.root.rowsBarWidth + \"px\";\n this.element.tabIndex = -1;\n this.updateScrollerSize(); //* Init size set\n this.element.addEventListener(\"scroll\", this.handleScroll);\n this.element.addEventListener(\"mousedown\", this.handleClick);\n this.element.addEventListener(\"mousemove\", this.handleMouseMove);\n this.element.addEventListener(\"mouseup\", this.handleMouseUp);\n this.element.addEventListener(\"dblclick\", this.handleDoubleClick);\n this.element.addEventListener(\"keydown\", this.handleKeydown);\n }\n handleMouseMove = (event) => {\n if (!this.isSelecting)\n return;\n const { offsetX, offsetY } = event;\n const lastSelectedCell = this.root.getCellByCoords(offsetX, offsetY);\n if (this.root.selection.selectedRange) {\n this.root.selection.selectedRange.to = lastSelectedCell;\n }\n this.root.renderSheet();\n this.root.renderColumnsBar();\n this.root.renderRowsBar();\n };\n handleMouseUp = () => {\n this.isSelecting = false;\n if (this.root.selection.selectedRange) {\n if (this.root.selection.selectedRange.from.row ===\n this.root.selection.selectedRange.to.row &&\n this.root.selection.selectedRange.from.column ===\n this.root.selection.selectedRange.to.column) {\n this.root.selection.selectedRange = null;\n }\n }\n this.root.renderSheet();\n this.root.renderColumnsBar();\n this.root.renderRowsBar();\n };\n handleDoubleClick = (event) => {\n event.preventDefault();\n const position = this.root.getCellByCoords(event.offsetX, event.offsetY);\n this.root.showEditor(position);\n };\n handleKeydown = (event) => {\n console.log(event);\n //* Navigation\n if ([\"ArrowLeft\", \"ArrowRight\", \"ArrowUp\", \"ArrowDown\"].includes(event.key)) {\n event.preventDefault();\n this.root.selection.selectedRange = null;\n switch (event.key) {\n case \"ArrowLeft\": {\n if (this.root.selection.selectedCell &&\n this.root.selection.selectedCell.column > 0) {\n console.log(\"tick\");\n this.root.selection.selectedCell.column -= 1;\n this.root.renderSheet();\n }\n break;\n }\n case \"ArrowRight\": {\n if (this.root.selection.selectedCell &&\n this.root.selection.selectedCell.column <\n this.root.config.columns.length - 1) {\n this.root.selection.selectedCell.column += 1;\n this.root.renderSheet();\n }\n break;\n }\n case \"ArrowUp\": {\n if (this.root.selection.selectedCell &&\n this.root.selection.selectedCell.row > 0) {\n this.root.selection.selectedCell.row -= 1;\n this.root.renderSheet();\n }\n break;\n }\n case \"ArrowDown\": {\n if (this.root.selection.selectedCell &&\n this.root.selection.selectedCell.row <\n this.root.config.rows.length - 1) {\n this.root.selection.selectedCell.row += 1;\n this.root.renderSheet();\n }\n break;\n }\n }\n }\n const keysRegex = /^([a-z]|[а-я])$/;\n if (!event.metaKey && !event.ctrlKey) {\n //* Prevent handle shortcutrs\n const isPressedLetterKey = keysRegex.test(event.key.toLowerCase());\n if (event.key === \"F2\" || isPressedLetterKey) {\n //* English and Russian keyboard. Or F2 button\n event.preventDefault();\n if (!this.root.selection.selectedCell)\n return;\n this.root.showEditor(this.root.selection.selectedCell, isPressedLetterKey ? event.key : undefined);\n }\n }\n if (event.key === \"Delete\") {\n event.preventDefault();\n this.root.deleteSelectedCellsValues();\n this.root.renderSheet();\n }\n };\n handleClick = (event) => {\n if (event.button !== 0)\n return; // Left mouse button\n const { offsetX, offsetY } = event;\n const clickedCell = this.root.getCellByCoords(offsetX, offsetY);\n this.isSelecting = true;\n this.root.selection.selectedRange = {\n from: clickedCell,\n to: clickedCell,\n };\n this.root.selection.selectedCell = clickedCell;\n this.root.renderSheet();\n this.root.renderColumnsBar();\n this.root.renderRowsBar();\n };\n handleScroll = () => {\n const rect = this.getViewportBoundlingRect();\n this.root.viewport.updateValues(rect);\n this.root.renderSheet();\n this.root.renderColumnsBar();\n this.root.renderRowsBar();\n };\n getViewportBoundlingRect() {\n const { scrollTop, scrollLeft } = this.element;\n const { height, width } = this.element.getBoundingClientRect();\n const bottom = scrollTop + height;\n const right = scrollLeft + width;\n return {\n top: scrollTop,\n left: scrollLeft,\n bottom,\n right,\n };\n }\n buildComponent() {\n const scroller = document.createElement(\"div\");\n const verticalScroller = document.createElement(\"div\");\n const horizontalScroller = document.createElement(\"div\");\n const groupScrollers = document.createElement(\"div\");\n const stack = document.createElement(\"div\");\n verticalScroller.style.width = \"0px\";\n verticalScroller.style.pointerEvents = \"none\";\n horizontalScroller.style.pointerEvents = \"none\";\n groupScrollers.style.display = \"flex\";\n stack.appendChild(verticalScroller);\n stack.appendChild(horizontalScroller);\n groupScrollers.appendChild(stack);\n this.verticalScroller = verticalScroller;\n this.horizontalScroller = horizontalScroller;\n scroller.appendChild(groupScrollers);\n scroller.classList.add(CSS_PREFIX + \"scroller\");\n return { scroller, verticalScroller, horizontalScroller };\n }\n getActualHeight() {\n return this.root.config.rows.reduce((acc, curr) => {\n acc += curr.height;\n return acc;\n }, 0);\n }\n getActualWidth() {\n return this.root.config.columns.reduce((acc, curr) => {\n acc += curr.width;\n return acc;\n }, 0);\n }\n updateScrollerSize() {\n const totalHeight = this.getActualHeight();\n const totalWidth = this.getActualWidth();\n this.setScrollerHeight(totalHeight);\n this.setScrollerWidth(totalWidth);\n }\n setScrollerHeight(height) {\n this.verticalScroller.style.height = height + \"px\";\n }\n setScrollerWidth(width) {\n this.horizontalScroller.style.width = width + \"px\";\n }\n}\n","import { RenderBox } from \"./renderBox\";\nexport class CellStyles {\n fontSize = 16;\n fontColor = \"black\";\n background = \"white\";\n borderColor = \"black\";\n selectedBackground = \"#4287f5\";\n selectedFontColor = \"#ffffff\";\n constructor(props) {\n if (props) {\n Object.assign(this, props); // Override default styles\n }\n }\n}\nexport class Position {\n row;\n column;\n constructor(row, column) {\n this.row = row;\n this.column = column;\n }\n}\nexport class SerializableCell {\n value;\n displayValue;\n resultValue;\n position;\n style;\n constructor(props) {\n this.value = props.value;\n this.displayValue = props.displayValue;\n this.resultValue = props.resultValue;\n this.position = props.position;\n this.style = props.style;\n }\n}\nexport class Cell {\n /** True value (data) */\n value;\n /** Value to render */\n displayValue;\n /** This refers to the values that were obtained by calculations, for example, after calculating the formula */\n resultValue;\n position;\n style = null;\n constructor(props) {\n this.value = props.value;\n this.displayValue = props.displayValue;\n this.resultValue = props.resultValue;\n this.position = props.position;\n this.style = props.style;\n }\n getSerializableCell() {\n const cell = new SerializableCell({\n displayValue: this.displayValue,\n position: this.position,\n resultValue: this.resultValue,\n style: this.style,\n value: this.value,\n });\n return cell;\n }\n changeStyles(styles) {\n this.style = styles;\n }\n changeValues(values) {\n Object.assign(this, values);\n }\n isCellInRange(root) {\n const { column, row } = this.position;\n const { selectedRange } = root.selection;\n if (!selectedRange)\n return false;\n const isCellInRow = row >= Math.min(selectedRange.from.row, selectedRange.to.row) &&\n row <= Math.max(selectedRange.to.row, selectedRange.from.row);\n const isCellInCol = column >= Math.min(selectedRange.from.column, selectedRange.to.column) &&\n column <= Math.max(selectedRange.to.column, selectedRange.from.column);\n return isCellInCol && isCellInRow;\n }\n render(root) {\n const renderBox = new RenderBox(root.config, this.position);\n let { x, y } = renderBox;\n const { height, width } = renderBox;\n const { ctx } = root;\n const isCellSelected = root.selection.selectedCell?.row === this.position.row &&\n root.selection.selectedCell.column === this.position.column;\n const isCellInRange = this.isCellInRange(root);\n y -= root.viewport.top;\n x -= root.viewport.left;\n const styles = this.style ?? root.styles.cells;\n ctx.clearRect(x, y, width, height);\n ctx.fillStyle =\n isCellSelected || isCellInRange\n ? styles.selectedBackground\n : styles.background;\n ctx.strokeStyle = \"black\";\n ctx.fillRect(x, y, width - 1, height - 1);\n ctx.strokeRect(x, y, width, height);\n ctx.fillStyle =\n isCellSelected || isCellInRange\n ? styles.selectedFontColor\n : styles.fontColor;\n ctx.textAlign = \"left\";\n ctx.font = `${styles.fontSize}px Arial`;\n ctx.textBaseline = \"middle\";\n ctx.fillText(this.displayValue, x + 2, y + height / 2);\n }\n}\n","import { CSS_PREFIX } from \"../main\";\nimport { Position } from \"../modules/cell\";\n/**\n * Display (CANVAS) element where cells render\n */\nexport class Sheet {\n element;\n ctx;\n root;\n constructor(root) {\n this.root = root;\n const canvas = document.createElement(\"canvas\");\n canvas.classList.add(CSS_PREFIX + \"sheet\");\n //* Set up canvas sizes based on provided root config\n canvas.height = this.root.config.view.height;\n canvas.width = this.root.config.view.width;\n canvas.style.width = this.root.config.view.width + \"px\";\n canvas.style.height = this.root.config.view.height + \"px\";\n canvas.style.left = \"0px\";\n this.element = canvas;\n const ctx = this.element.getContext(\"2d\");\n if (!ctx)\n throw new Error(\"Enable hardware acceleration\");\n this.ctx = ctx;\n }\n getCellByCoords(x, y) {\n let row = 0;\n let height = 0;\n while (height <= y) {\n height += this.root.config.rows[row].height;\n if (height >= y)\n break;\n row++;\n }\n let col = 0;\n let width = 0;\n while (width <= x) {\n width += this.root.config.columns[col].width;\n if (width >= x)\n break;\n col++;\n }\n return new Position(row, col);\n }\n renderCell(position) {\n const { column, row } = position;\n this.root.data[row][column].render(this.root);\n }\n renderSheet() {\n const firstRowIdx = this.root.viewport.firstRow;\n const lastColIdx = this.root.viewport.lastCol + 3;\n const lastRowIdx = this.root.viewport.lastRow + 3;\n const firstColIdx = this.root.viewport.firstCol;\n for (let row = firstRowIdx; row <= lastRowIdx; row++) {\n for (let col = firstColIdx; col <= lastColIdx; col++) {\n if (!this.root.config.columns[col] || !this.root.config.rows[row])\n break; //* Prevent read undefined\n this.renderCell({ column: col, row });\n }\n }\n }\n}\n","import { CSS_PREFIX } from \"../main\";\n/** Base (root) component */\nexport class Table {\n element;\n root;\n constructor(root) {\n this.root = root;\n const container = document.createElement(\"div\");\n container.classList.add(CSS_PREFIX + \"spreadsheet_container\");\n this.element = container;\n this.changeElementSizes(this.root.viewProps);\n }\n changeElementSizes(sizes) {\n const { height, width } = sizes;\n this.element.style.width = width + this.root.rowsBarWidth + \"px\";\n this.element.style.height = height + this.root.columnsBarHeight + \"px\";\n }\n}\n","import { CSS_PREFIX } from \"../main\";\nexport class Toolbar {\n element;\n root;\n height = 0;\n constructor(root) {\n this.root = root;\n const toolbarElement = document.createElement(\"div\");\n toolbarElement.classList.add(CSS_PREFIX + \"toolbar\");\n this.element = toolbarElement;\n }\n}\n","export class Config {\n rows;\n columns;\n view = {\n width: 800,\n height: 600,\n };\n constructor(props) {\n this.columns = props.columns;\n this.rows = props.rows;\n this.view = props.view;\n }\n}\n","export class Selection {\n selectedCell = null;\n selectedRange = null;\n}\n","import { CellStyles } from \"./cell\";\nexport class Styles {\n cells;\n constructor() {\n this.cells = new CellStyles();\n }\n}\n","export class Viewport {\n root;\n top;\n left;\n right;\n bottom;\n firstRow;\n lastRow;\n firstCol;\n lastCol;\n constructor(root, props) {\n this.root = root;\n this.top = props.top;\n this.left = props.left;\n this.right = props.right;\n this.bottom = props.bottom;\n this.firstRow = this.getFirstRow();\n this.lastCol = this.getFirstRow(); //!Temp\n this.firstCol = this.getFirstRow(); //!Temp\n this.lastRow = this.getLastRow();\n this.updateValues({\n top: 0,\n left: 0,\n right: this.root.viewProps.width,\n bottom: this.root.viewProps.height,\n });\n }\n updateValues(props) {\n this.top = props.top;\n this.left = props.left;\n this.right = props.right;\n this.bottom = props.bottom;\n this.firstRow = this.getFirstRow();\n this.lastRow = this.getLastRow();\n this.firstCol = this.getFirstCol();\n this.lastCol = this.getLastCol();\n }\n /** Get index of first row in viewport */\n getFirstRow() {\n const rowIdx = this.root.cache.getRowByYCoord(this.top);\n return rowIdx;\n }\n getLastRow() {\n const rowIdx = this.root.cache.getRowByYCoord(this.bottom);\n return rowIdx;\n }\n getFirstCol() {\n const colIdx = this.root.cache.getColumnByXCoord(this.left);\n return colIdx;\n }\n getLastCol() {\n const colIdx = this.root.cache.getColumnByXCoord(this.right);\n return colIdx;\n }\n}\n","export class Column {\n width;\n title;\n constructor(props) {\n this.width = props.width;\n this.title = props.title;\n }\n}\n","export class Row {\n height;\n title;\n constructor(props) {\n this.height = props.height;\n this.title = props.title;\n }\n}\n","import { Cell } from \"../modules/cell\";\nimport { Column } from \"../modules/column\";\nimport { Config } from \"../modules/config\";\nimport { Row } from \"../modules/row\";\nexport function createSampleData(rows, columns, fillCellsByCoords = false) {\n const data = [];\n for (let row = 0; row <= rows; row++) {\n const innerRow = [];\n for (let col = 0; col <= columns; col++) {\n const value = fillCellsByCoords ? `${row}:${col}` : \"\";\n const cell = new Cell({\n displayValue: value,\n resultValue: value,\n value,\n position: {\n column: col,\n row: row,\n },\n style: null,\n });\n innerRow.push(cell);\n }\n data.push(innerRow);\n }\n return data;\n}\nexport function createSampleConfig(rows, columns) {\n const rowsArr = [];\n for (let i = 0; i <= rows; i++) {\n const rowItem = new Row({\n height: 40,\n title: String(i),\n });\n rowsArr.push(rowItem);\n }\n const colsArr = [];\n for (let i = 0; i <= columns; i++) {\n const colItem = new Column({\n title: String(i),\n width: 150,\n });\n colsArr.push(colItem);\n }\n const config = new Config({\n columns: colsArr,\n rows: rowsArr,\n view: {\n height: 600,\n width: 800,\n },\n });\n return config;\n}\nexport function makeSpreadsheetConfigAndData(rows, columns) {\n const data = createSampleData(rows, columns);\n const config = createSampleConfig(rows, columns);\n return { data, config };\n}\n","export class CachedColumn {\n xPos;\n colIdx;\n constructor(props) {\n this.xPos = props.xPos;\n this.colIdx = props.colIdx;\n }\n}\nexport class CachedRow {\n yPos;\n rowIdx;\n constructor(props) {\n this.yPos = props.yPos;\n this.rowIdx = props.rowIdx;\n }\n}\nexport class Cache {\n columns;\n rows;\n constructor(initial) {\n this.columns = initial.columns;\n this.rows = initial.rows;\n }\n getRowByYCoord(y) {\n let rowIdx = 0;\n for (let i = 0; i < this.rows.length; i++) {\n if (y <= this.rows[i].yPos) {\n //* Intersection detect\n rowIdx = i;\n break;\n }\n }\n return rowIdx;\n }\n getColumnByXCoord(x) {\n let colIdx = 0;\n for (let i = 0; i < this.columns.length; i++) {\n if (x <= this.columns[i].xPos) {\n //* Intersection detect\n colIdx = i;\n break;\n }\n }\n return colIdx;\n }\n}\n","import { RenderBox } from \"../main\";\nexport class ColumnsBar {\n element;\n root;\n height = 32;\n width;\n // private resizerWidth = 1;\n ctx;\n constructor(root) {\n this.root = root;\n this.element = this.createElement();\n const ctx = this.element.getContext(\"2d\");\n if (!ctx)\n throw new Error(\"Enable hardware acceleration\");\n this.ctx = ctx;\n this.width = this.root.viewProps.width;\n }\n createElement() {\n const element = document.createElement(\"canvas\");\n element.style.position = \"absolute\";\n element.style.height = this.height + \"px\";\n element.style.width = this.root.viewProps.width + \"px\";\n element.style.display = \"block\";\n element.style.borderLeft = \"1px solid black\";\n // element.style.boxSizing = 'border-box'\n element.width = this.root.viewProps.width;\n element.height = this.height;\n return element;\n }\n setElementPosition(top, left) {\n this.element.style.top = top + \"px\";\n this.element.style.left = left + \"px\";\n }\n isColumnSelected(column) {\n const { selectedCell, selectedRange } = this.root.selection;\n if (selectedCell && selectedCell.column === column)\n return true;\n if (selectedRange) {\n const inRange = column >=\n Math.min(selectedRange.from.column, selectedRange.to.column) &&\n column <= Math.max(selectedRange.from.column, selectedRange.to.column);\n return inRange;\n }\n return false;\n }\n // private getYCoordWithOffset(renderBox: RenderBox): number {\n // const {y} = renderBox\n // return y + this.root.toolbarHeight\n // }\n // private getXCoordWithOffset(renderBox: RenderBox): number {\n // const {x} = renderBox\n // return x\n // }\n renderText(column, renderBox) {\n const { width, x } = renderBox;\n this.ctx.fillStyle = \"black\";\n this.ctx.textAlign = \"center\";\n this.ctx.textBaseline = \"middle\";\n this.ctx.font = \"16px Arial\";\n this.ctx.fillText(this.root.config.columns[column].title, x + width / 2 - this.root.viewport.left, 0 + this.height / 2);\n }\n renderRect(column, renderBox) {\n const { width, x } = renderBox;\n const isColSelected = this.isColumnSelected(column);\n this.ctx.fillStyle = isColSelected\n ? this.root.styles.cells.selectedBackground\n : \"white\";\n this.ctx.strokeStyle = \"black\";\n this.ctx.lineWidth = 1;\n const specialX = x - this.root.viewport.left;\n this.ctx.fillRect(specialX - 1, 0, width, this.height);\n this.ctx.strokeRect(specialX - 1, 0, width, this.height);\n }\n renderSingleColumn(column) {\n const renderBox = new RenderBox(this.root.config, {\n row: 0,\n column: column,\n });\n this.renderRect(column, renderBox);\n this.renderText(column, renderBox);\n }\n renderBar() {\n const lastColIdx = this.root.viewport.lastCol + 3;\n const firstColIdx = this.root.viewport.firstCol;\n this.ctx.beginPath();\n this.ctx.strokeStyle = \"black\";\n this.ctx.lineWidth = 1;\n this.ctx.moveTo(0, 0);\n this.ctx.lineTo(0, this.height);\n this.ctx.closePath();\n this.ctx.stroke();\n for (let col = firstColIdx; col <= lastColIdx; col++) {\n if (!this.root.config.columns[col])\n break;\n this.renderSingleColumn(col);\n }\n }\n}\n","import { RenderBox } from \"../main\";\nexport class RowsBar {\n element;\n ctx;\n root;\n width = 30;\n height;\n resizerHeight = 1;\n constructor(root) {\n this.root = root;\n this.element = this.createElement();\n const ctx = this.element.getContext(\"2d\");\n if (!ctx)\n throw new Error(\"Enable hardware acceleration\");\n this.ctx = ctx;\n this.height = this.root.viewProps.height;\n }\n createElement() {\n const element = document.createElement(\"canvas\");\n element.style.position = \"absolute\";\n element.style.height = this.root.viewProps.height + \"px\";\n element.style.width = this.width + \"px\";\n element.style.display = \"block\";\n element.style.borderTop = \"1px solid black\";\n // element.style.boxSizing = 'border-box'\n element.width = this.width;\n element.height = this.root.viewProps.height;\n return element;\n }\n setElementPosition(top, left) {\n this.element.style.top = top + \"px\";\n this.element.style.left = left + \"px\";\n }\n isRowSelected(row) {\n const { selectedCell, selectedRange } = this.root.selection;\n if (selectedCell && selectedCell.row === row)\n return true;\n if (selectedRange) {\n const inRange = row >= Math.min(selectedRange.from.row, selectedRange.to.row) &&\n row <= Math.max(selectedRange.from.row, selectedRange.to.row);\n return inRange;\n }\n return false;\n }\n renderText(row, renderBox) {\n const { y, height } = renderBox;\n this.ctx.fillStyle = \"black\";\n this.ctx.textAlign = \"center\";\n this.ctx.textBaseline = \"middle\";\n this.ctx.font = \"16px Arial\";\n this.ctx.fillText(this.root.config.rows[row].title, this.width / 2, y - this.root.viewport.top + height / 2);\n }\n renderRect(column, renderBox) {\n const { y, height } = renderBox;\n const isRowSeleted = this.isRowSelected(column);\n this.ctx.fillStyle = isRowSeleted\n ? this.root.styles.cells.selectedBackground\n : \"white\";\n this.ctx.strokeStyle = \"black\";\n this.ctx.lineWidth = this.resizerHeight;\n const specialY = y - this.root.viewport.top;\n this.ctx.fillRect(0, specialY - 1, this.width, height);\n this.ctx.strokeRect(0, specialY - 1, this.width, height);\n }\n renderSingleRow(row) {\n const renderBox = new RenderBox(this.root.config, {\n column: 0,\n row: row,\n });\n this.renderRect(row, renderBox);\n this.renderText(row, renderBox);\n }\n renderBar() {\n const lastRowIdx = this.root.viewport.lastRow + 3;\n const firstRowIdx = this.root.viewport.firstRow;\n this.ctx.beginPath();\n this.ctx.moveTo(0, 0);\n this.ctx.strokeStyle = \"black\";\n this.ctx.lineWidth = 16;\n this.ctx.lineTo(35, 0);\n this.ctx.closePath();\n this.ctx.stroke();\n for (let row = firstRowIdx; row <= lastRowIdx; row++) {\n if (!this.root.config.rows[row])\n break;\n this.renderSingleRow(row);\n }\n }\n}\n","import { Editor } from \"./components/editor\";\nimport { Scroller } from \"./components/scroller\";\nimport { Sheet } from \"./components/sheet\";\nimport { Table } from \"./components/table\";\nimport { Toolbar } from \"./components/toolbar\";\nimport { Cell, } from \"./modules/cell\";\nimport { Config } from \"./modules/config\";\nimport { Selection } from \"./modules/selection\";\nimport { Styles } from \"./modules/styles\";\nimport { Viewport } from \"./modules/viewport\";\nimport \"./scss/main.scss\";\nimport { createSampleData } from \"./utils/createData\";\nimport { Cache, CachedColumn, CachedRow } from \"./modules/cache\";\nimport { Row } from \"./modules/row\";\nimport { Column } from \"./modules/column\";\nimport { ColumnsBar } from \"./components/columnsBar\";\nimport { RowsBar } from \"./components/rowsBar\";\nexport const CSS_PREFIX = \"modern_sc_\";\nexport default class Spreadsheet {\n table;\n scroller;\n toolbar;\n rowsBar;\n columnsBar;\n sheet;\n editor;\n styles;\n config;\n data;\n viewport;\n selection;\n cache;\n constructor(target, props) {\n const data = createSampleData(40, 40);\n const config = this.makeConfigFromData(data, props?.view ?? { height: 600, width: 800 });\n if (props?.view) {\n config.view = props.view;\n }\n this.config = new Config(config);\n this.rowsBar = new RowsBar(this);\n this.columnsBar = new ColumnsBar(this);\n this.sheet = new Sheet(this);\n this.table = new Table(this);\n this.scroller = new Scroller(this);\n this.toolbar = new Toolbar(this);\n this.editor = new Editor(this);\n this.cache = this.getInitialCache();\n this.viewport = new Viewport(this, this.scroller.getViewportBoundlingRect());\n this.selection = new Selection();\n this.data = data;\n this.styles = new Styles();\n this.buildComponent();\n this.setElementsPositions();\n this.appendTableToTarget(target);\n this.renderSheet();\n this.renderColumnsBar();\n this.renderRowsBar();\n }\n setRowsBarPosition() {\n const top = this.columnsBar.height + this.toolbar.height;\n const left = 0;\n this.rowsBar.setElementPosition(top, left);\n }\n setColumnsBarPosition() {\n const top = this.toolbar.height;\n const left = this.rowsBar.width;\n console.log(top, left);\n this.columnsBar.setElementPosition(top, left);\n }\n setElementsPositions() {\n this.setRowsBarPosition();\n this.setColumnsBarPosition();\n }\n getInitialCache() {\n const cachedCols = [];\n let currentWidth = 0;\n for (let i = 0; i <= this.config.columns.length - 1; i++) {\n const col = this.config.columns[i];\n currentWidth += col.width;\n const cacheCol = new CachedColumn({\n xPos: currentWidth,\n colIdx: i,\n });\n cachedCols.push(cacheCol);\n }\n const cachedRows = [];\n let currentHeight = 0;\n for (let i = 0; i <= this.config.rows.length - 1; i++) {\n const row = this.config.rows[i];\n currentHeight += row.height;\n const cacheRow = new CachedRow({\n yPos: currentHeight,\n rowIdx: i,\n });\n cachedRows.push(cacheRow);\n }\n const cache = new Cache({\n columns: cachedCols,\n rows: cachedRows,\n });\n console.log(\"CACHE: \", cache);\n console.log(\"CONFIG: \", this.config);\n return cache;\n }\n buildComponent() {\n const content = document.createElement(\"div\"); //* Abstract\n content.style.top = this.columnsBarHeight + \"px\";\n content.style.left = this.rowsBarWidth + \"px\";\n content.appendChild(this.sheet.element);\n content.classList.add(CSS_PREFIX + \"content\");\n this.table.element.appendChild(this.toolbar.element);\n this.table.element.appendChild(this.rowsBar.element);\n this.table.element.appendChild(this.columnsBar.element);\n this.table.element.appendChild(content);\n this.table.element.appendChild(this.scroller.element);\n this.table.element.append(this.editor.element);\n }\n /**Destroy spreadsheet DOM element.\n *\n * May be usefull when need to rerender component.\n */\n destroy() {\n this.table.element.remove();\n }\n appendTableToTarget(target) {\n if (typeof target === \"string\") {\n const element = document.querySelector(target);\n if (!element)\n throw new Error(`Element with selector ${target} is not finded in DOM.\\n Make sure it exists.`);\n element?.appendChild(this.table.element);\n }\n if (target instanceof HTMLElement) {\n target.append(this.table.element);\n }\n }\n /** Canvas rendering context 2D.\n *\n * Abble to draw on canvas with default CanvasAPI methods\n */\n get ctx() {\n return this.sheet.ctx;\n }\n get viewProps() {\n return this.config.view;\n }\n get columnsBarHeight() {\n return this.columnsBar.height;\n }\n get rowsBarWidth() {\n return this.rowsBar.width;\n }\n get toolbarHeight() {\n return this.toolbar.height;\n }\n /** Focusing on interactive part of spreadsheet */\n focusTable() {\n this.scroller.element.focus();\n }\n getCellByCoords(x, y) {\n return this.sheet.getCellByCoords(x, y);\n }\n getCell(position) {\n const { column, row } = position;\n return this.data[row][column];\n }\n changeCellValues(position, values) {\n const { column, row } = position;\n this.data[row][column].changeValues(values);\n this.renderCell(row, column);\n }\n changeCellStyles(position, styles) {\n const { column, row } = position;\n this.data[row][column].changeStyles(styles);\n this.renderCell(row, column);\n }\n applyActionToRange(range, callback) {\n const fromRow = Math.min(range.from.row, range.to.row);\n const toRow = Math.max(range.from.row, range.to.row);\n const fromCol = Math.min(range.from.column, range.to.column);\n const toCol = Math.max(range.from.column, range.to.column);\n for (let row = fromRow; row <= toRow; row++) {\n for (let col = fromCol; col <= toCol; col++) {\n const cell = this.data[row][col];\n callback(cell);\n }\n }\n }\n deleteSelectedCellsValues() {\n if (this.selection.selectedRange !== null) {\n this.applyActionToRange(this.selection.selectedRange, (cell) => {\n this.changeCellValues(cell.position, {\n displayValue: \"\",\n resultValue: \"\",\n value: \"\",\n });\n });\n }\n else {\n if (!this.selection.selectedCell)\n return;\n this.changeCellValues(this.selection.selectedCell, {\n displayValue: \"\",\n resultValue: \"\",\n value: \"\",\n });\n }\n }\n showEditor(position, initialString) {\n this.editor.show(position, initialString);\n }\n renderSheet() {\n this.sheet.renderSheet();\n }\n renderColumnsBar() {\n this.columnsBar.renderBar();\n }\n renderRowsBar() {\n this.rowsBar.renderBar();\n }\n renderCell(row, col) {\n this.data[row][col].render(this);\n }\n loadData(data) {\n const rowsLength = data.length;\n const colsLength = data[0] ? this.data[0].length : 0;\n this.data = [];\n const formattedData = [];\n for (let row = 0; row < rowsLength; row++) {\n const innerRow = [];\n for (let col = 0; col < colsLength; col++) {\n const cell = data[row][col];\n innerRow.push(new Cell({\n displayValue: cell.displayValue,\n position: cell.position,\n resultValue: cell.resultValue,\n value: cell.value,\n style: cell.style,\n }));\n }\n formattedData.push(innerRow);\n }\n this.data = formattedData;\n this.selection.selectedCell = null;\n this.selection.selectedRange = null;\n this.config = this.makeConfigFromData(formattedData, this.config.view);\n this.cache = this.getInitialCache();\n this.scroller.updateScrollerSize();\n this.viewport = new Viewport(this, this.scroller.getViewportBoundlingRect());\n this.renderSheet();\n return this;\n }\n makeConfigFromData(data, view) {\n const lastRowIdx = data.length - 1;\n const lastColIdx = data[0] ? data[0].length : 0;\n const rows = [];\n for (let row = 0; row < lastRowIdx; row++) {\n rows.push(new Row({\n height: 40,\n title: String(row),\n }));\n }\n const columns = [];\n for (let col = 0; col < lastColIdx; col++) {\n columns.push(new Column({\n width: 150,\n title: String(col),\n }));\n }\n const config = new Config({\n view,\n rows,\n columns,\n });\n return config;\n }\n serializeData() {\n const rowsLength = this.data.length;\n const colsLength = this.data[0] ? this.data[0].length : 0;\n const cellsArray = [];\n for (let row = 0; row < rowsLength; row++) {\n const innerRow = [];\n for (let col = 0; col < colsLength; col++) {\n innerRow.push(this.data[row][col].getSerializableCell());\n }\n cellsArray.push(innerRow);\n }\n return cellsArray;\n }\n}\nexport * from \"./modules/cache\";\nexport * from \"./modules/cell\";\nexport * from \"./modules/column\";\nexport * from \"./modules/config\";\nexport * from \"./modules/renderBox\";\nexport * from \"./modules/row\";\nexport * from \"./modules/selection\";\nexport * from \"./modules/styles\";\nexport * from \"./modules/viewport\";\nexport * from \"./utils/createData\";\n"],"names":["RenderBox","config","cellPosition","__publicField","column","x","row","y","Editor","root","event","key","target","element","CSS_PREFIX","position","initialString","height","width","cell","Scroller","offsetX","offsetY","lastSelectedCell","keysRegex","isPressedLetterKey","clickedCell","rect","horizontalScroller","scroller","verticalScroller","scrollTop","scrollLeft","bottom","right","groupScrollers","stack","acc","curr","totalHeight","totalWidth","CellStyles","props","Position","SerializableCell","Cell","styles","values","selectedRange","isCellInRow","_a","renderBox","ctx","isCellSelected","isCellInRange","Sheet","canvas","col","firstRowIdx","lastColIdx","lastRowIdx","firstColIdx","Table","container","sizes","Toolbar","toolbarElement","Config","Selection","Styles","Viewport","Column","Row","createSampleData","rows","columns","fillCellsByCoords","data","innerRow","value","createSampleConfig","rowsArr","i","rowItem","colsArr","colItem","makeSpreadsheetConfigAndData","CachedColumn","CachedRow","Cache","initial","rowIdx","colIdx","ColumnsBar","top","left","selectedCell","isColSelected","specialX","RowsBar","isRowSeleted","specialY","Spreadsheet","cachedCols","currentWidth","cacheCol","cachedRows","currentHeight","cacheRow","cache","content","range","callback","fromRow","toRow","fromCol","toCol","rowsLength","colsLength","formattedData","view","cellsArray"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"main.js","sources":["../src/modules/events.ts","../src/modules/renderBox.ts","../src/components/editor.ts","../src/utils/position.ts","../src/components/scroller.ts","../src/modules/cell.ts","../src/components/sheet.ts","../src/components/table.ts","../src/components/toolbar.ts","../src/modules/config.ts","../src/modules/selection.ts","../src/modules/styles.ts","../src/modules/viewport.ts","../src/modules/column.ts","../src/modules/row.ts","../src/utils/createData.ts","../src/modules/cache.ts","../src/components/columnsBar.ts","../src/components/rowsBar.ts","../src/main.ts"],"sourcesContent":["import { Selection } from \"../main\";\nexport var EventTypes;\n(function (EventTypes) {\n EventTypes[\"CELL_CLICK\"] = \"CELL_CLICK\";\n EventTypes[\"SELECTION_CHANGE\"] = \"CHANGE_SELECTION\";\n EventTypes[\"CELL_CHANGE\"] = \"CELL_CHANGE\";\n})(EventTypes || (EventTypes = {}));\nexport class Events {\n root;\n constructor(root) {\n this.root = root;\n }\n dispatch(action) {\n switch (action.type) {\n case EventTypes.CELL_CLICK: {\n const { event, scroller } = action;\n //\n //* Here may be side effects\n //\n this.cellClick(event, scroller);\n break;\n }\n case EventTypes.SELECTION_CHANGE: {\n const { selection, enableCallback } = action;\n //\n //* Here may be side effects\n //\n this.changeSelection(selection, enableCallback);\n break;\n }\n case EventTypes.CELL_CHANGE: {\n const { cell, values } = action;\n //\n //* Here may be side effects\n //\n this.changeCellValues(cell, values);\n break;\n }\n default: {\n break;\n }\n }\n }\n cellClick = (event, scroller) => {\n if (event.button !== 0)\n return; // Left mouse button\n const { offsetX, offsetY } = event;\n const clickedCell = this.root.getCellByCoords(offsetX, offsetY);\n const cell = this.root.getCell(clickedCell);\n const selection = new Selection();\n selection.selectedCell = clickedCell;\n selection.selectedRange = {\n from: clickedCell,\n to: clickedCell,\n };\n scroller.setSelectingMode(true);\n this.changeSelection(selection, true);\n this.root.config.onCellClick?.(event, cell);\n };\n changeSelection = (selection, enableCallback = false) => {\n this.root.selection = selection;\n if (enableCallback)\n this.root.config.onSelectonChange?.(selection);\n this.root.renderSheet();\n this.root.renderColumnsBar();\n this.root.renderRowsBar();\n };\n changeCellValues(cell, values) {\n this.root.changeCellValues(cell.position, values);\n this.root.config.onCellChange?.(cell);\n }\n}\n","export class RenderBox {\n x;\n y;\n width;\n height;\n constructor(config, cellPosition) {\n this.x = this.getXCoord(cellPosition.column, config);\n this.y = this.getYCoord(cellPosition.row, config);\n this.width = config.columns[cellPosition.column].width;\n this.height = config.rows[cellPosition.row].height;\n }\n getXCoord(column, config) {\n let x = 0;\n for (let i = 0; i < column; i++) {\n x += config.columns[i].width;\n }\n return x;\n }\n getYCoord(row, config) {\n let y = 0;\n for (let i = 0; i < row; i++) {\n y += config.rows[i].height;\n }\n return y;\n }\n}\n","import { CSS_PREFIX } from \"../main\";\nimport { EventTypes } from \"../modules/events\";\nimport { RenderBox } from \"../modules/renderBox\";\nexport class Editor {\n element;\n root;\n constructor(root) {\n this.root = root;\n const element = document.createElement(\"input\");\n element.classList.add(CSS_PREFIX + \"editor\");\n this.element = element;\n this.hide();\n }\n hide() {\n this.element.style.display = \"none\";\n this.element.classList.add(\"hide\");\n this.element.blur();\n window.removeEventListener(\"click\", this.handleClickOutside);\n this.element.removeEventListener(\"keydown\", this.handleKeydown);\n this.root.focusTable();\n }\n show(position, initialString) {\n const { height, width, x, y } = new RenderBox(this.root.config, position);\n const cell = this.root.getCell(position);\n this.element.classList.remove(\"hide\");\n this.element.style.top =\n y - this.root.viewport.top + this.root.columnsBarHeight + \"px\";\n this.element.style.left =\n x - this.root.viewport.left + this.root.rowsBarWidth + \"px\";\n this.element.style.width = width + \"px\";\n this.element.style.height = height + \"px\";\n this.element.style.display = \"block\";\n window.addEventListener(\"click\", this.handleClickOutside);\n this.element.addEventListener(\"keydown\", this.handleKeydown);\n this.element.value = initialString ? initialString : cell.value;\n this.element.focus();\n if (!initialString)\n this.element.select();\n }\n handleKeydown = (event) => {\n const { key } = event;\n switch (key) {\n case \"Escape\": {\n this.hide();\n break;\n }\n case \"Enter\": {\n if (!this.root.selection.selectedCell)\n return;\n this.root.events.dispatch({\n type: EventTypes.CELL_CHANGE,\n cell: this.root.getCell(this.root.selection.selectedCell),\n values: {\n value: this.element.value,\n displayValue: this.element.value,\n },\n });\n this.hide();\n }\n }\n };\n handleClickOutside = (event) => {\n const target = event.target;\n if (!this.element.contains(target)) {\n this.hide();\n }\n };\n}\n","export function checkEqualRanges(range1, range2) {\n const equalRows = range1.from.row === range2.to.row;\n const equalColumns = range1.from.column === range2.to.column;\n return equalRows && equalColumns;\n}\nexport function checkEqualCellSelections(selection1, selection2) {\n return (selection1.column === selection2.column && selection1.row === selection2.row);\n}\n","import { CSS_PREFIX } from \"../main\";\nimport { EventTypes } from \"../modules/events\";\nimport { checkEqualCellSelections } from \"../utils/position\";\nexport class Scroller {\n element;\n verticalScroller;\n horizontalScroller;\n root;\n isSelecting = false;\n constructor(root) {\n this.root = root;\n const { horizontalScroller, scroller, verticalScroller } = this.buildComponent();\n this.element = scroller;\n this.verticalScroller = verticalScroller;\n this.horizontalScroller = horizontalScroller;\n this.element.style.height = this.root.config.view.height + \"px\";\n this.element.style.width = this.root.config.view.width + \"px\";\n this.element.style.top = this.root.columnsBarHeight + \"px\";\n this.element.style.left = this.root.rowsBarWidth + \"px\";\n this.element.tabIndex = -1;\n this.updateScrollerSize(); //* Init size set\n this.element.addEventListener(\"scroll\", this.handleScroll);\n this.element.addEventListener(\"mousedown\", this.handleClick);\n this.element.addEventListener(\"mousemove\", this.handleMouseMove);\n this.element.addEventListener(\"mouseup\", this.handleMouseUp);\n this.element.addEventListener(\"dblclick\", this.handleDoubleClick);\n this.element.addEventListener(\"keydown\", this.handleKeydown);\n }\n setSelectingMode(mode) {\n this.isSelecting = mode;\n }\n handleMouseMove = (event) => {\n if (!this.isSelecting)\n return;\n const { offsetX, offsetY } = event;\n const lastSelectedCell = this.root.getCellByCoords(offsetX, offsetY);\n let isRangeChanged = false;\n if (this.root.selection.selectedRange) {\n isRangeChanged = !checkEqualCellSelections(this.root.selection.selectedRange.to, lastSelectedCell);\n if (isRangeChanged) {\n this.root.selection.selectedRange.to = lastSelectedCell;\n this.root.events.dispatch({\n type: EventTypes.SELECTION_CHANGE,\n selection: this.root.selection,\n enableCallback: true,\n });\n }\n }\n };\n handleMouseUp = () => {\n this.isSelecting = false;\n const newSelection = { ...this.root.selection };\n if (this.root.selection.selectedRange) {\n if (checkEqualCellSelections(this.root.selection.selectedRange.from, this.root.selection.selectedRange.to)) {\n newSelection.selectedRange = null;\n this.root.events.dispatch({\n type: EventTypes.SELECTION_CHANGE,\n selection: newSelection,\n enableCallback: false,\n });\n }\n }\n this.root.renderSheet();\n this.root.renderColumnsBar();\n this.root.renderRowsBar();\n };\n handleDoubleClick = (event) => {\n event.preventDefault();\n const position = this.root.getCellByCoords(event.offsetX, event.offsetY);\n this.root.showEditor(position);\n };\n handleKeydown = (event) => {\n //* Navigation\n if ([\"ArrowLeft\", \"ArrowRight\", \"ArrowUp\", \"ArrowDown\"].includes(event.key)) {\n event.preventDefault();\n this.root.selection.selectedRange = null;\n switch (event.key) {\n case \"ArrowLeft\": {\n if (this.root.selection.selectedCell &&\n this.root.selection.selectedCell.column > 0) {\n this.root.selection.selectedCell.column -= 1;\n // this.root.renderSheet();\n }\n break;\n }\n case \"ArrowRight\": {\n if (this.root.selection.selectedCell &&\n this.root.selection.selectedCell.column <\n this.root.config.columns.length - 1) {\n this.root.selection.selectedCell.column += 1;\n // this.root.renderSheet();\n }\n break;\n }\n case \"ArrowUp\": {\n if (this.root.selection.selectedCell &&\n this.root.selection.selectedCell.row > 0) {\n this.root.selection.selectedCell.row -= 1;\n // this.root.renderSheet();\n }\n break;\n }\n case \"ArrowDown\": {\n if (this.root.selection.selectedCell &&\n this.root.selection.selectedCell.row <\n this.root.config.rows.length - 1) {\n this.root.selection.selectedCell.row += 1;\n // this.root.renderSheet();\n }\n break;\n }\n }\n this.root.events.dispatch({\n type: EventTypes.SELECTION_CHANGE,\n selection: this.root.selection,\n enableCallback: true,\n });\n }\n //* Start typings\n const keysRegex = /^([a-z]|[а-я])$/;\n if (!event.metaKey && !event.ctrlKey) {\n //* Prevent handle shortcutrs\n const isPressedLetterKey = keysRegex.test(event.key.toLowerCase());\n if (event.key === \"F2\" || isPressedLetterKey) {\n //* English and Russian keyboard. Or F2 button\n event.preventDefault();\n if (!this.root.selection.selectedCell)\n return;\n this.root.showEditor(this.root.selection.selectedCell, isPressedLetterKey ? event.key : undefined);\n }\n }\n if (event.key === \"Delete\") {\n event.preventDefault();\n this.root.deleteSelectedCellsValues();\n this.root.renderSheet();\n }\n };\n handleClick = (event) => {\n this.root.events.dispatch({\n type: EventTypes.CELL_CLICK,\n event,\n scroller: this,\n });\n };\n handleScroll = () => {\n const rect = this.getViewportBoundlingRect();\n this.root.viewport.updateValues(rect);\n this.root.renderSheet();\n this.root.renderColumnsBar();\n this.root.renderRowsBar();\n };\n getViewportBoundlingRect() {\n const { scrollTop, scrollLeft } = this.element;\n const { height, width } = this.element.getBoundingClientRect();\n const bottom = scrollTop + height;\n const right = scrollLeft + width;\n return {\n top: scrollTop,\n left: scrollLeft,\n bottom,\n right,\n };\n }\n buildComponent() {\n const scroller = document.createElement(\"div\");\n const verticalScroller = document.createElement(\"div\");\n const horizontalScroller = document.createElement(\"div\");\n const groupScrollers = document.createElement(\"div\");\n const stack = document.createElement(\"div\");\n verticalScroller.style.width = \"0px\";\n verticalScroller.style.pointerEvents = \"none\";\n horizontalScroller.style.pointerEvents = \"none\";\n groupScrollers.style.display = \"flex\";\n stack.appendChild(verticalScroller);\n stack.appendChild(horizontalScroller);\n groupScrollers.appendChild(stack);\n this.verticalScroller = verticalScroller;\n this.horizontalScroller = horizontalScroller;\n scroller.appendChild(groupScrollers);\n scroller.classList.add(CSS_PREFIX + \"scroller\");\n return { scroller, verticalScroller, horizontalScroller };\n }\n getActualHeight() {\n return this.root.config.rows.reduce((acc, curr) => {\n acc += curr.height;\n return acc;\n }, 0);\n }\n getActualWidth() {\n return this.root.config.columns.reduce((acc, curr) => {\n acc += curr.width;\n return acc;\n }, 0);\n }\n updateScrollerSize() {\n const totalHeight = this.getActualHeight();\n const totalWidth = this.getActualWidth();\n this.setScrollerHeight(totalHeight);\n this.setScrollerWidth(totalWidth);\n }\n setScrollerHeight(height) {\n this.verticalScroller.style.height = height + \"px\";\n }\n setScrollerWidth(width) {\n this.horizontalScroller.style.width = width + \"px\";\n }\n}\n","import { RenderBox } from \"./renderBox\";\nexport class CellStyles {\n fontSize = 16;\n fontColor = \"black\";\n background = \"white\";\n borderColor = \"black\";\n selectedBackground = \"#4287f5\";\n selectedFontColor = \"#ffffff\";\n constructor(props) {\n if (props) {\n Object.assign(this, props); // Override default styles\n }\n }\n}\nexport class Position {\n row;\n column;\n constructor(row, column) {\n this.row = row;\n this.column = column;\n }\n}\nexport class SerializableCell {\n value;\n displayValue;\n resultValue;\n position;\n style;\n constructor(props) {\n this.value = props.value;\n this.displayValue = props.displayValue;\n this.resultValue = props.resultValue;\n this.position = props.position;\n this.style = props.style;\n }\n}\nexport class Cell {\n /** True value (data) */\n value;\n /** Value to render */\n displayValue;\n /** This refers to the values that were obtained by calculations, for example, after calculating the formula */\n resultValue;\n position;\n style = null;\n constructor(props) {\n this.value = props.value;\n this.displayValue = props.displayValue;\n this.resultValue = props.resultValue;\n this.position = props.position;\n this.style = props.style;\n }\n getSerializableCell() {\n const cell = new SerializableCell({\n displayValue: this.displayValue,\n position: this.position,\n resultValue: this.resultValue,\n style: this.style,\n value: this.value,\n });\n return cell;\n }\n changeStyles(styles) {\n this.style = styles;\n }\n changeValues(values) {\n Object.assign(this, values);\n }\n isCellInRange(root) {\n const { column, row } = this.position;\n const { selectedRange } = root.selection;\n if (!selectedRange)\n return false;\n const isCellInRow = row >= Math.min(selectedRange.from.row, selectedRange.to.row) &&\n row <= Math.max(selectedRange.to.row, selectedRange.from.row);\n const isCellInCol = column >= Math.min(selectedRange.from.column, selectedRange.to.column) &&\n column <= Math.max(selectedRange.to.column, selectedRange.from.column);\n return isCellInCol && isCellInRow;\n }\n render(root) {\n const renderBox = new RenderBox(root.config, this.position);\n let { x, y } = renderBox;\n const { height, width } = renderBox;\n const { ctx } = root;\n const isCellSelected = root.selection.selectedCell?.row === this.position.row &&\n root.selection.selectedCell.column === this.position.column;\n const isCellInRange = this.isCellInRange(root);\n y -= root.viewport.top;\n x -= root.viewport.left;\n const styles = this.style ?? root.styles.cells;\n ctx.clearRect(x, y, width, height);\n ctx.fillStyle =\n isCellSelected || isCellInRange\n ? styles.selectedBackground\n : styles.background;\n ctx.strokeStyle = \"black\";\n ctx.fillRect(x, y, width - 1, height - 1);\n ctx.strokeRect(x, y, width, height);\n ctx.fillStyle =\n isCellSelected || isCellInRange\n ? styles.selectedFontColor\n : styles.fontColor;\n ctx.textAlign = \"left\";\n ctx.font = `${styles.fontSize}px Arial`;\n ctx.textBaseline = \"middle\";\n ctx.fillText(this.displayValue, x + 2, y + height / 2);\n }\n}\n","import { CSS_PREFIX } from \"../main\";\nimport { Position } from \"../modules/cell\";\n/**\n * Display (CANVAS) element where cells render\n */\nexport class Sheet {\n element;\n ctx;\n root;\n constructor(root) {\n this.root = root;\n const canvas = document.createElement(\"canvas\");\n canvas.classList.add(CSS_PREFIX + \"sheet\");\n //* Set up canvas sizes based on provided root config\n canvas.height = this.root.config.view.height;\n canvas.width = this.root.config.view.width;\n canvas.style.width = this.root.config.view.width + \"px\";\n canvas.style.height = this.root.config.view.height + \"px\";\n canvas.style.left = \"0px\";\n this.element = canvas;\n const ctx = this.element.getContext(\"2d\");\n if (!ctx)\n throw new Error(\"Enable hardware acceleration\");\n this.ctx = ctx;\n }\n getCellByCoords(x, y) {\n let row = 0;\n let height = 0;\n while (height <= y) {\n height += this.root.config.rows[row].height;\n if (height >= y)\n break;\n row++;\n }\n let col = 0;\n let width = 0;\n while (width <= x) {\n width += this.root.config.columns[col].width;\n if (width >= x)\n break;\n col++;\n }\n return new Position(row, col);\n }\n renderCell(position) {\n const { column, row } = position;\n this.root.data[row][column].render(this.root);\n }\n renderSheet() {\n const firstRowIdx = this.root.viewport.firstRow;\n const lastColIdx = this.root.viewport.lastCol + 3;\n const lastRowIdx = this.root.viewport.lastRow + 3;\n const firstColIdx = this.root.viewport.firstCol;\n for (let row = firstRowIdx; row <= lastRowIdx; row++) {\n for (let col = firstColIdx; col <= lastColIdx; col++) {\n if (!this.root.config.columns[col] || !this.root.config.rows[row])\n break; //* Prevent read undefined\n this.renderCell({ column: col, row });\n }\n }\n }\n}\n","import { CSS_PREFIX } from \"../main\";\n/** Base (root) component */\nexport class Table {\n element;\n root;\n constructor(root) {\n this.root = root;\n const container = document.createElement(\"div\");\n container.classList.add(CSS_PREFIX + \"spreadsheet_container\");\n this.element = container;\n this.changeElementSizes(this.root.viewProps);\n }\n changeElementSizes(sizes) {\n const { height, width } = sizes;\n this.element.style.width = width + this.root.rowsBarWidth + \"px\";\n this.element.style.height = height + this.root.columnsBarHeight + \"px\";\n }\n}\n","import { CSS_PREFIX } from \"../main\";\nexport class Toolbar {\n element;\n root;\n height = 0;\n constructor(root) {\n this.root = root;\n const toolbarElement = document.createElement(\"div\");\n toolbarElement.classList.add(CSS_PREFIX + \"toolbar\");\n this.element = toolbarElement;\n }\n}\n","export class Config {\n rows;\n columns;\n view = {\n width: 800,\n height: 600,\n };\n onCellClick = null;\n onSelectonChange = null;\n onCellChange = null;\n constructor(props) {\n this.columns = props.columns;\n this.rows = props.rows;\n this.view = props.view;\n this.onCellClick = props.onCellClick ?? null;\n this.onSelectonChange = props.onSelectionChange ?? null;\n this.onCellChange = props.onCellChange ?? null;\n }\n}\n","export class Selection {\n selectedCell = null;\n selectedRange = null;\n}\n","import { CellStyles } from \"./cell\";\nexport class Styles {\n cells;\n constructor() {\n this.cells = new CellStyles();\n }\n}\n","export class Viewport {\n root;\n top;\n left;\n right;\n bottom;\n firstRow;\n lastRow;\n firstCol;\n lastCol;\n constructor(root, props) {\n this.root = root;\n this.top = props.top;\n this.left = props.left;\n this.right = props.right;\n this.bottom = props.bottom;\n this.firstRow = this.getFirstRow();\n this.lastCol = this.getFirstRow(); //!Temp\n this.firstCol = this.getFirstRow(); //!Temp\n this.lastRow = this.getLastRow();\n this.updateValues({\n top: 0,\n left: 0,\n right: this.root.viewProps.width,\n bottom: this.root.viewProps.height,\n });\n }\n updateValues(props) {\n this.top = props.top;\n this.left = props.left;\n this.right = props.right;\n this.bottom = props.bottom;\n this.firstRow = this.getFirstRow();\n this.lastRow = this.getLastRow();\n this.firstCol = this.getFirstCol();\n this.lastCol = this.getLastCol();\n }\n /** Get index of first row in viewport */\n getFirstRow() {\n const rowIdx = this.root.cache.getRowByYCoord(this.top);\n return rowIdx;\n }\n getLastRow() {\n const rowIdx = this.root.cache.getRowByYCoord(this.bottom);\n return rowIdx;\n }\n getFirstCol() {\n const colIdx = this.root.cache.getColumnByXCoord(this.left);\n return colIdx;\n }\n getLastCol() {\n const colIdx = this.root.cache.getColumnByXCoord(this.right);\n return colIdx;\n }\n}\n","export class Column {\n width;\n title;\n constructor(props) {\n this.width = props.width;\n this.title = props.title;\n }\n}\n","export class Row {\n height;\n title;\n constructor(props) {\n this.height = props.height;\n this.title = props.title;\n }\n}\n","import { Cell } from \"../modules/cell\";\nimport { Column } from \"../modules/column\";\nimport { Config } from \"../modules/config\";\nimport { Row } from \"../modules/row\";\nexport function createSampleData(rows, columns, fillCellsByCoords = false) {\n const data = [];\n for (let row = 0; row <= rows; row++) {\n const innerRow = [];\n for (let col = 0; col <= columns; col++) {\n const value = fillCellsByCoords ? `${row}:${col}` : \"\";\n const cell = new Cell({\n displayValue: value,\n resultValue: value,\n value,\n position: {\n column: col,\n row: row,\n },\n style: null,\n });\n innerRow.push(cell);\n }\n data.push(innerRow);\n }\n return data;\n}\nexport function createSampleConfig(rows, columns) {\n const rowsArr = [];\n for (let i = 0; i <= rows; i++) {\n const rowItem = new Row({\n height: 40,\n title: String(i),\n });\n rowsArr.push(rowItem);\n }\n const colsArr = [];\n for (let i = 0; i <= columns; i++) {\n const colItem = new Column({\n title: String(i),\n width: 150,\n });\n colsArr.push(colItem);\n }\n const config = new Config({\n columns: colsArr,\n rows: rowsArr,\n view: {\n height: 600,\n width: 800,\n },\n });\n return config;\n}\nexport function makeSpreadsheetConfigAndData(rows, columns) {\n const data = createSampleData(rows, columns);\n const config = createSampleConfig(rows, columns);\n return { data, config };\n}\n","export class CachedColumn {\n xPos;\n colIdx;\n constructor(props) {\n this.xPos = props.xPos;\n this.colIdx = props.colIdx;\n }\n}\nexport class CachedRow {\n yPos;\n rowIdx;\n constructor(props) {\n this.yPos = props.yPos;\n this.rowIdx = props.rowIdx;\n }\n}\nexport class Cache {\n columns;\n rows;\n constructor(initial) {\n this.columns = initial.columns;\n this.rows = initial.rows;\n }\n getRowByYCoord(y) {\n let rowIdx = 0;\n for (let i = 0; i < this.rows.length; i++) {\n if (y <= this.rows[i].yPos) {\n //* Intersection detect\n rowIdx = i;\n break;\n }\n }\n return rowIdx;\n }\n getColumnByXCoord(x) {\n let colIdx = 0;\n for (let i = 0; i < this.columns.length; i++) {\n if (x <= this.columns[i].xPos) {\n //* Intersection detect\n colIdx = i;\n break;\n }\n }\n return colIdx;\n }\n}\n","import { RenderBox } from \"../main\";\nexport class ColumnsBar {\n element;\n root;\n height = 35;\n width;\n // private resizerWidth = 1;\n ctx;\n constructor(root) {\n this.root = root;\n this.element = this.createElement();\n const ctx = this.element.getContext(\"2d\");\n if (!ctx)\n throw new Error(\"Enable hardware acceleration\");\n this.ctx = ctx;\n this.width = this.root.viewProps.width;\n }\n createElement() {\n const element = document.createElement(\"canvas\");\n element.style.position = \"absolute\";\n element.style.height = this.height + \"px\";\n element.style.width = this.root.viewProps.width + \"px\";\n element.style.display = \"block\";\n element.style.borderLeft = \"1px solid black\";\n // element.style.boxSizing = 'border-box'\n element.width = this.root.viewProps.width;\n element.height = this.height;\n return element;\n }\n setElementPosition(top, left) {\n this.element.style.top = top + \"px\";\n this.element.style.left = left + \"px\";\n }\n isColumnSelected(column) {\n const { selectedCell, selectedRange } = this.root.selection;\n if (selectedCell && selectedCell.column === column)\n return true;\n if (selectedRange) {\n const inRange = column >=\n Math.min(selectedRange.from.column, selectedRange.to.column) &&\n column <= Math.max(selectedRange.from.column, selectedRange.to.column);\n return inRange;\n }\n return false;\n }\n // private getYCoordWithOffset(renderBox: RenderBox): number {\n // const {y} = renderBox\n // return y + this.root.toolbarHeight\n // }\n // private getXCoordWithOffset(renderBox: RenderBox): number {\n // const {x} = renderBox\n // return x\n // }\n renderText(column, renderBox) {\n const { width, x } = renderBox;\n this.ctx.fillStyle = \"black\";\n this.ctx.textAlign = \"center\";\n this.ctx.textBaseline = \"middle\";\n this.ctx.font = \"12px Arial\";\n this.ctx.fillText(this.root.config.columns[column].title, x + width / 2 - this.root.viewport.left, 0 + this.height / 2);\n }\n renderRect(column, renderBox) {\n const { width, x } = renderBox;\n const isColSelected = this.isColumnSelected(column);\n this.ctx.fillStyle = isColSelected\n ? this.root.styles.cells.selectedBackground\n : \"white\";\n this.ctx.strokeStyle = \"black\";\n this.ctx.lineWidth = 1;\n const specialX = x - this.root.viewport.left;\n this.ctx.fillRect(specialX - 1, 0, width, this.height);\n this.ctx.strokeRect(specialX - 1, 0, width, this.height);\n }\n renderSingleColumn(column) {\n const renderBox = new RenderBox(this.root.config, {\n row: 0,\n column: column,\n });\n this.renderRect(column, renderBox);\n this.renderText(column, renderBox);\n }\n renderBar() {\n const lastColIdx = this.root.viewport.lastCol + 3;\n const firstColIdx = this.root.viewport.firstCol;\n this.ctx.beginPath();\n this.ctx.strokeStyle = \"black\";\n this.ctx.lineWidth = 1;\n this.ctx.moveTo(0, 0);\n this.ctx.lineTo(0, this.height);\n this.ctx.closePath();\n this.ctx.stroke();\n for (let col = firstColIdx; col <= lastColIdx; col++) {\n if (!this.root.config.columns[col])\n break;\n this.renderSingleColumn(col);\n }\n }\n}\n","import { RenderBox } from \"../main\";\nexport class RowsBar {\n element;\n ctx;\n root;\n width = 35;\n height;\n resizerHeight = 1;\n constructor(root) {\n this.root = root;\n this.element = this.createElement();\n const ctx = this.element.getContext(\"2d\");\n if (!ctx)\n throw new Error(\"Enable hardware acceleration\");\n this.ctx = ctx;\n this.height = this.root.viewProps.height;\n }\n createElement() {\n const element = document.createElement(\"canvas\");\n element.style.position = \"absolute\";\n element.style.height = this.root.viewProps.height + \"px\";\n element.style.width = this.width + \"px\";\n element.style.display = \"block\";\n element.style.borderTop = \"1px solid black\";\n // element.style.boxSizing = 'border-box'\n element.width = this.width;\n element.height = this.root.viewProps.height;\n return element;\n }\n setElementPosition(top, left) {\n this.element.style.top = top + \"px\";\n this.element.style.left = left + \"px\";\n }\n isRowSelected(row) {\n const { selectedCell, selectedRange } = this.root.selection;\n if (selectedCell && selectedCell.row === row)\n return true;\n if (selectedRange) {\n const inRange = row >= Math.min(selectedRange.from.row, selectedRange.to.row) &&\n row <= Math.max(selectedRange.from.row, selectedRange.to.row);\n return inRange;\n }\n return false;\n }\n renderText(row, renderBox) {\n const { y, height } = renderBox;\n this.ctx.fillStyle = \"black\";\n this.ctx.textAlign = \"center\";\n this.ctx.textBaseline = \"middle\";\n this.ctx.font = \"12px Arial\";\n this.ctx.fillText(this.root.config.rows[row].title, this.width / 2, y - this.root.viewport.top + height / 2);\n }\n renderRect(column, renderBox) {\n const { y, height } = renderBox;\n const isRowSeleted = this.isRowSelected(column);\n this.ctx.fillStyle = isRowSeleted\n ? this.root.styles.cells.selectedBackground\n : \"white\";\n this.ctx.strokeStyle = \"black\";\n this.ctx.lineWidth = this.resizerHeight;\n const specialY = y - this.root.viewport.top;\n this.ctx.fillRect(0, specialY - 1, this.width, height);\n this.ctx.strokeRect(0, specialY - 1, this.width, height);\n }\n renderSingleRow(row) {\n const renderBox = new RenderBox(this.root.config, {\n column: 0,\n row: row,\n });\n this.renderRect(row, renderBox);\n this.renderText(row, renderBox);\n }\n renderBar() {\n const lastRowIdx = this.root.viewport.lastRow + 3;\n const firstRowIdx = this.root.viewport.firstRow;\n this.ctx.beginPath();\n this.ctx.moveTo(0, 0);\n this.ctx.strokeStyle = \"black\";\n this.ctx.lineWidth = 16;\n this.ctx.lineTo(35, 0);\n this.ctx.closePath();\n this.ctx.stroke();\n for (let row = firstRowIdx; row <= lastRowIdx; row++) {\n if (!this.root.config.rows[row])\n break;\n this.renderSingleRow(row);\n }\n }\n}\n","import { Editor } from \"./components/editor\";\nimport { Scroller } from \"./components/scroller\";\nimport { Sheet } from \"./components/sheet\";\nimport { Table } from \"./components/table\";\nimport { Toolbar } from \"./components/toolbar\";\nimport { Cell, } from \"./modules/cell\";\nimport { Config, } from \"./modules/config\";\nimport { Selection } from \"./modules/selection\";\nimport { Styles } from \"./modules/styles\";\nimport { Viewport } from \"./modules/viewport\";\nimport \"./scss/main.scss\";\nimport { createSampleData } from \"./utils/createData\";\nimport { Cache, CachedColumn, CachedRow } from \"./modules/cache\";\nimport { Row } from \"./modules/row\";\nimport { Column } from \"./modules/column\";\nimport { ColumnsBar } from \"./components/columnsBar\";\nimport { RowsBar } from \"./components/rowsBar\";\nimport { Events } from \"./modules/events\";\nexport const CSS_PREFIX = \"modern_sc_\";\nexport default class Spreadsheet {\n table;\n scroller;\n toolbar;\n rowsBar;\n columnsBar;\n sheet;\n editor;\n styles;\n config;\n data;\n viewport;\n selection;\n cache;\n events;\n constructor(target, props) {\n const data = createSampleData(40, 40);\n const config = this.makeConfigFromData(data, props?.view ?? { height: 600, width: 800 });\n if (props?.view) {\n config.view = props.view;\n }\n this.config = new Config(config);\n this.config.onCellClick = props?.onCellClick ?? null;\n this.config.onSelectonChange = props?.onSelectionChange ?? null;\n this.config.onCellChange = props?.onCellChange ?? null;\n this.rowsBar = new RowsBar(this);\n this.columnsBar = new ColumnsBar(this);\n this.sheet = new Sheet(this);\n this.table = new Table(this);\n this.scroller = new Scroller(this);\n this.toolbar = new Toolbar(this);\n this.editor = new Editor(this);\n this.cache = this.getInitialCache();\n this.viewport = new Viewport(this, this.scroller.getViewportBoundlingRect());\n this.selection = new Selection();\n this.events = new Events(this);\n this.data = data;\n this.styles = new Styles();\n this.buildComponent();\n this.setElementsPositions();\n this.appendTableToTarget(target);\n this.renderSheet();\n this.renderColumnsBar();\n this.renderRowsBar();\n }\n setRowsBarPosition() {\n const top = this.columnsBar.height + this.toolbar.height;\n const left = 0;\n this.rowsBar.setElementPosition(top, left);\n }\n setColumnsBarPosition() {\n const top = this.toolbar.height;\n const left = this.rowsBar.width;\n console.log(top, left);\n this.columnsBar.setElementPosition(top, left);\n }\n setElementsPositions() {\n this.setRowsBarPosition();\n this.setColumnsBarPosition();\n }\n getInitialCache() {\n const cachedCols = [];\n let currentWidth = 0;\n for (let i = 0; i <= this.config.columns.length - 1; i++) {\n const col = this.config.columns[i];\n currentWidth += col.width;\n const cacheCol = new CachedColumn({\n xPos: currentWidth,\n colIdx: i,\n });\n cachedCols.push(cacheCol);\n }\n const cachedRows = [];\n let currentHeight = 0;\n for (let i = 0; i <= this.config.rows.length - 1; i++) {\n const row = this.config.rows[i];\n currentHeight += row.height;\n const cacheRow = new CachedRow({\n yPos: currentHeight,\n rowIdx: i,\n });\n cachedRows.push(cacheRow);\n }\n const cache = new Cache({\n columns: cachedCols,\n rows: cachedRows,\n });\n console.log(\"CACHE: \", cache);\n console.log(\"CONFIG: \", this.config);\n return cache;\n }\n buildComponent() {\n const content = document.createElement(\"div\"); //* Abstract\n content.style.top = this.columnsBarHeight + \"px\";\n content.style.left = this.rowsBarWidth + \"px\";\n content.appendChild(this.sheet.element);\n content.classList.add(CSS_PREFIX + \"content\");\n this.table.element.appendChild(this.toolbar.element);\n this.table.element.appendChild(this.rowsBar.element);\n this.table.element.appendChild(this.columnsBar.element);\n this.table.element.appendChild(content);\n this.table.element.appendChild(this.scroller.element);\n this.table.element.append(this.editor.element);\n }\n /**Destroy spreadsheet DOM element.\n *\n * May be usefull when need to rerender component.\n */\n destroy() {\n this.table.element.remove();\n }\n appendTableToTarget(target) {\n if (typeof target === \"string\") {\n const element = document.querySelector(target);\n if (!element)\n throw new Error(`Element with selector ${target} is not finded in DOM.\\n Make sure it exists.`);\n element?.appendChild(this.table.element);\n }\n if (target instanceof HTMLElement) {\n target.append(this.table.element);\n }\n }\n /** Canvas rendering context 2D.\n *\n * Abble to draw on canvas with default CanvasAPI methods\n */\n get ctx() {\n return this.sheet.ctx;\n }\n get viewProps() {\n return this.config.view;\n }\n get columnsBarHeight() {\n return this.columnsBar.height;\n }\n get rowsBarWidth() {\n return this.rowsBar.width;\n }\n get toolbarHeight() {\n return this.toolbar.height;\n }\n /** Focusing on interactive part of spreadsheet */\n focusTable() {\n this.scroller.element.focus();\n }\n getCellByCoords(x, y) {\n return this.sheet.getCellByCoords(x, y);\n }\n getCell(position) {\n const { column, row } = position;\n return this.data[row][column];\n }\n changeCellValues(position, values) {\n const { column, row } = position;\n this.data[row][column].changeValues(values);\n this.renderCell(row, column);\n }\n changeCellStyles(position, styles) {\n const { column, row } = position;\n this.data[row][column].changeStyles(styles);\n this.renderCell(row, column);\n }\n applyActionToRange(range, callback) {\n const fromRow = Math.min(range.from.row, range.to.row);\n const toRow = Math.max(range.from.row, range.to.row);\n const fromCol = Math.min(range.from.column, range.to.column);\n const toCol = Math.max(range.from.column, range.to.column);\n for (let row = fromRow; row <= toRow; row++) {\n for (let col = fromCol; col <= toCol; col++) {\n const cell = this.data[row][col];\n callback(cell);\n }\n }\n }\n deleteSelectedCellsValues() {\n if (this.selection.selectedRange !== null) {\n this.applyActionToRange(this.selection.selectedRange, (cell) => {\n this.changeCellValues(cell.position, {\n displayValue: \"\",\n resultValue: \"\",\n value: \"\",\n });\n });\n }\n else {\n if (!this.selection.selectedCell)\n return;\n this.changeCellValues(this.selection.selectedCell, {\n displayValue: \"\",\n resultValue: \"\",\n value: \"\",\n });\n }\n }\n showEditor(position, initialString) {\n this.editor.show(position, initialString);\n }\n renderSheet() {\n this.sheet.renderSheet();\n }\n renderColumnsBar() {\n this.columnsBar.renderBar();\n }\n renderRowsBar() {\n this.rowsBar.renderBar();\n }\n renderCell(row, col) {\n this.data[row][col].render(this);\n }\n loadData(data) {\n const rowsLength = data.length;\n const colsLength = data[0] ? this.data[0].length : 0;\n this.data = [];\n const formattedData = [];\n for (let row = 0; row < rowsLength; row++) {\n const innerRow = [];\n for (let col = 0; col < colsLength; col++) {\n const cell = data[row][col];\n innerRow.push(new Cell({\n displayValue: cell.displayValue,\n position: cell.position,\n resultValue: cell.resultValue,\n value: cell.value,\n style: cell.style,\n }));\n }\n formattedData.push(innerRow);\n }\n this.data = formattedData;\n this.selection.selectedCell = null;\n this.selection.selectedRange = null;\n this.config = this.makeConfigFromData(formattedData, this.config.view);\n this.cache = this.getInitialCache();\n this.scroller.updateScrollerSize();\n this.viewport = new Viewport(this, this.scroller.getViewportBoundlingRect());\n this.renderSheet();\n return this;\n }\n makeConfigFromData(data, view) {\n const lastRowIdx = data.length - 1;\n const lastColIdx = data[0] ? data[0].length : 0;\n const rows = [];\n for (let row = 0; row < lastRowIdx; row++) {\n rows.push(new Row({\n height: 40,\n title: String(row),\n }));\n }\n const columns = [];\n for (let col = 0; col < lastColIdx; col++) {\n columns.push(new Column({\n width: 150,\n title: String(col),\n }));\n }\n const config = new Config({\n view,\n rows,\n columns,\n onCellClick: null,\n });\n return config;\n }\n serializeData() {\n const rowsLength = this.data.length;\n const colsLength = this.data[0] ? this.data[0].length : 0;\n const cellsArray = [];\n for (let row = 0; row < rowsLength; row++) {\n const innerRow = [];\n for (let col = 0; col < colsLength; col++) {\n innerRow.push(this.data[row][col].getSerializableCell());\n }\n cellsArray.push(innerRow);\n }\n return cellsArray;\n }\n}\nexport * from \"./modules/cache\";\nexport * from \"./modules/cell\";\nexport * from \"./modules/column\";\nexport * from \"./modules/config\";\nexport * from \"./modules/renderBox\";\nexport * from \"./modules/row\";\nexport * from \"./modules/selection\";\nexport * from \"./modules/styles\";\nexport * from \"./modules/viewport\";\nexport * from \"./utils/createData\";\n"],"names":["EventTypes","Events","root","__publicField","event","scroller","_a","_b","offsetX","offsetY","clickedCell","cell","selection","Selection","enableCallback","action","values","RenderBox","config","cellPosition","column","x","i","row","y","Editor","key","target","element","CSS_PREFIX","position","initialString","height","width","checkEqualCellSelections","selection1","selection2","Scroller","lastSelectedCell","isRangeChanged","newSelection","keysRegex","isPressedLetterKey","rect","horizontalScroller","verticalScroller","mode","scrollTop","scrollLeft","bottom","right","groupScrollers","stack","acc","curr","totalHeight","totalWidth","CellStyles","props","Position","SerializableCell","Cell","styles","selectedRange","isCellInRow","renderBox","ctx","isCellSelected","isCellInRange","Sheet","canvas","col","firstRowIdx","lastColIdx","lastRowIdx","firstColIdx","Table","container","sizes","Toolbar","toolbarElement","Config","Styles","Viewport","Column","Row","createSampleData","rows","columns","fillCellsByCoords","data","innerRow","value","createSampleConfig","rowsArr","rowItem","colsArr","colItem","makeSpreadsheetConfigAndData","CachedColumn","CachedRow","Cache","initial","rowIdx","colIdx","ColumnsBar","top","left","selectedCell","isColSelected","specialX","RowsBar","isRowSeleted","specialY","Spreadsheet","cachedCols","currentWidth","cacheCol","cachedRows","currentHeight","cacheRow","cache","content","range","callback","fromRow","toRow","fromCol","toCol","rowsLength","colsLength","formattedData","view","cellsArray"],"mappings":";;;AACW,IAAAA;AAAA,CACV,SAAUA,GAAY;AACnBA,EAAAA,EAAW,aAAgB,cAC3BA,EAAW,mBAAsB,oBACjCA,EAAW,cAAiB;AAChC,GAAGA,MAAeA,IAAa,CAAG,EAAA;AAC3B,MAAMC,EAAO;AAAA,EAEhB,YAAYC,GAAM;AADlB,IAAAC,EAAA;AAmCA,IAAAA,EAAA,mBAAY,CAACC,GAAOC,MAAa;AA1C1B,UAAAC,GAAAC;AA2CH,UAAIH,EAAM,WAAW;AACjB;AACE,YAAA,EAAE,SAAAI,GAAS,SAAAC,EAAY,IAAAL,GACvBM,IAAc,KAAK,KAAK,gBAAgBF,GAASC,CAAO,GACxDE,IAAO,KAAK,KAAK,QAAQD,CAAW,GACpCE,IAAY,IAAIC;AACtB,MAAAD,EAAU,eAAeF,GACzBE,EAAU,gBAAgB;AAAA,QACtB,MAAMF;AAAA,QACN,IAAIA;AAAA,MAAA,GAERL,EAAS,iBAAiB,EAAI,GACzB,KAAA,gBAAgBO,GAAW,EAAI,IACpCL,KAAAD,IAAA,KAAK,KAAK,QAAO,gBAAjB,QAAAC,EAAA,KAAAD,GAA+BF,GAAOO;AAAA,IAAI;AAE9C,IAAAR,EAAA,yBAAkB,CAACS,GAAWE,IAAiB,OAAU;AA1DlD,UAAAR,GAAAC;AA2DH,WAAK,KAAK,YAAYK,GAClBE,OACKP,KAAAD,IAAA,KAAA,KAAK,QAAO,qBAAZ,QAAAC,EAAA,KAAAD,GAA+BM,KACxC,KAAK,KAAK,eACV,KAAK,KAAK,oBACV,KAAK,KAAK;IAAc;AAvDxB,SAAK,OAAOV;AAAA,EAChB;AAAA,EACA,SAASa,GAAQ;AACb,YAAQA,EAAO,MAAM;AAAA,MACjB,KAAKf,EAAW,YAAY;AAClB,cAAA,EAAE,OAAAI,GAAO,UAAAC,EAAa,IAAAU;AAIvB,aAAA,UAAUX,GAAOC,CAAQ;AAC9B;AAAA,MACJ;AAAA,MACA,KAAKL,EAAW,kBAAkB;AACxB,cAAA,EAAE,WAAAY,GAAW,gBAAAE,EAAmB,IAAAC;AAIjC,aAAA,gBAAgBH,GAAWE,CAAc;AAC9C;AAAA,MACJ;AAAA,MACA,KAAKd,EAAW,aAAa;AACnB,cAAA,EAAE,MAAAW,GAAM,QAAAK,EAAW,IAAAD;AAIpB,aAAA,iBAAiBJ,GAAMK,CAAM;AAClC;AAAA,MACJ;AAAA,IAIJ;AAAA,EACJ;AAAA,EAyBA,iBAAiBL,GAAMK,GAAQ;AAlExB,QAAAV,GAAAC;AAmEH,SAAK,KAAK,iBAAiBI,EAAK,UAAUK,CAAM,IAC3CT,KAAAD,IAAA,KAAA,KAAK,QAAO,iBAAZ,QAAAC,EAAA,KAAAD,GAA2BK;AAAA,EACpC;AACJ;ACvEO,MAAMM,EAAU;AAAA,EAKnB,YAAYC,GAAQC,GAAc;AAJlC,IAAAhB,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEI,SAAK,IAAI,KAAK,UAAUgB,EAAa,QAAQD,CAAM,GACnD,KAAK,IAAI,KAAK,UAAUC,EAAa,KAAKD,CAAM,GAChD,KAAK,QAAQA,EAAO,QAAQC,EAAa,MAAM,EAAE,OACjD,KAAK,SAASD,EAAO,KAAKC,EAAa,GAAG,EAAE;AAAA,EAChD;AAAA,EACA,UAAUC,GAAQF,GAAQ;AACtB,QAAIG,IAAI;AACR,aAASC,IAAI,GAAGA,IAAIF,GAAQE;AACnB,MAAAD,KAAAH,EAAO,QAAQI,CAAC,EAAE;AAEpB,WAAAD;AAAA,EACX;AAAA,EACA,UAAUE,GAAKL,GAAQ;AACnB,QAAIM,IAAI;AACR,aAASF,IAAI,GAAGA,IAAIC,GAAKD;AAChB,MAAAE,KAAAN,EAAO,KAAKI,CAAC,EAAE;AAEjB,WAAAE;AAAA,EACX;AACJ;ACtBO,MAAMC,EAAO;AAAA,EAGhB,YAAYvB,GAAM;AAFlB,IAAAC,EAAA;AACA,IAAAA,EAAA;AAkCA,IAAAA,EAAA,uBAAgB,CAACC,MAAU;AACjB,YAAA,EAAE,KAAAsB,EAAQ,IAAAtB;AAChB,cAAQsB,GAAK;AAAA,QACT,KAAK,UAAU;AACX,eAAK,KAAK;AACV;AAAA,QACJ;AAAA,QACA,KAAK,SAAS;AACN,cAAA,CAAC,KAAK,KAAK,UAAU;AACrB;AACC,eAAA,KAAK,OAAO,SAAS;AAAA,YACtB,MAAM1B,EAAW;AAAA,YACjB,MAAM,KAAK,KAAK,QAAQ,KAAK,KAAK,UAAU,YAAY;AAAA,YACxD,QAAQ;AAAA,cACJ,OAAO,KAAK,QAAQ;AAAA,cACpB,cAAc,KAAK,QAAQ;AAAA,YAC/B;AAAA,UAAA,CACH,GACD,KAAK,KAAK;AAAA,QACd;AAAA,MACJ;AAAA,IAAA;AAEJ,IAAAG,EAAA,4BAAqB,CAACC,MAAU;AAC5B,YAAMuB,IAASvB,EAAM;AACrB,MAAK,KAAK,QAAQ,SAASuB,CAAM,KAC7B,KAAK,KAAK;AAAA,IACd;AA1DA,SAAK,OAAOzB;AACN,UAAA0B,IAAU,SAAS,cAAc,OAAO;AACtC,IAAAA,EAAA,UAAU,IAAIC,IAAa,QAAQ,GAC3C,KAAK,UAAUD,GACf,KAAK,KAAK;AAAA,EACd;AAAA,EACA,OAAO;AACE,SAAA,QAAQ,MAAM,UAAU,QACxB,KAAA,QAAQ,UAAU,IAAI,MAAM,GACjC,KAAK,QAAQ,QACN,OAAA,oBAAoB,SAAS,KAAK,kBAAkB,GAC3D,KAAK,QAAQ,oBAAoB,WAAW,KAAK,aAAa,GAC9D,KAAK,KAAK;EACd;AAAA,EACA,KAAKE,GAAUC,GAAe;AACpB,UAAA,EAAE,QAAAC,GAAQ,OAAAC,GAAO,GAAAZ,GAAG,GAAAG,EAAM,IAAA,IAAIP,EAAU,KAAK,KAAK,QAAQa,CAAQ,GAClEnB,IAAO,KAAK,KAAK,QAAQmB,CAAQ;AAClC,SAAA,QAAQ,UAAU,OAAO,MAAM,GAC/B,KAAA,QAAQ,MAAM,MACfN,IAAI,KAAK,KAAK,SAAS,MAAM,KAAK,KAAK,mBAAmB,MACzD,KAAA,QAAQ,MAAM,OACfH,IAAI,KAAK,KAAK,SAAS,OAAO,KAAK,KAAK,eAAe,MACtD,KAAA,QAAQ,MAAM,QAAQY,IAAQ,MAC9B,KAAA,QAAQ,MAAM,SAASD,IAAS,MAChC,KAAA,QAAQ,MAAM,UAAU,SACtB,OAAA,iBAAiB,SAAS,KAAK,kBAAkB,GACxD,KAAK,QAAQ,iBAAiB,WAAW,KAAK,aAAa,GAC3D,KAAK,QAAQ,QAAQD,KAAgCpB,EAAK,OAC1D,KAAK,QAAQ,SACRoB,KACD,KAAK,QAAQ;EACrB;AA6BJ;AC9DgB,SAAAG,EAAyBC,GAAYC,GAAY;AAC7D,SAAQD,EAAW,WAAWC,EAAW,UAAUD,EAAW,QAAQC,EAAW;AACrF;ACJO,MAAMC,EAAS;AAAA,EAMlB,YAAYnC,GAAM;AALlB,IAAAC,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,qBAAc;AAuBd,IAAAA,EAAA,yBAAkB,CAACC,MAAU;AACzB,UAAI,CAAC,KAAK;AACN;AACE,YAAA,EAAE,SAAAI,GAAS,SAAAC,EAAY,IAAAL,GACvBkC,IAAmB,KAAK,KAAK,gBAAgB9B,GAASC,CAAO;AACnE,UAAI8B,IAAiB;AACjB,MAAA,KAAK,KAAK,UAAU,kBACpBA,IAAiB,CAACL,EAAyB,KAAK,KAAK,UAAU,cAAc,IAAII,CAAgB,GAC7FC,MACK,KAAA,KAAK,UAAU,cAAc,KAAKD,GAClC,KAAA,KAAK,OAAO,SAAS;AAAA,QACtB,MAAMtC,EAAW;AAAA,QACjB,WAAW,KAAK,KAAK;AAAA,QACrB,gBAAgB;AAAA,MAAA,CACnB;AAAA,IAET;AAEJ,IAAAG,EAAA,uBAAgB,MAAM;AAClB,WAAK,cAAc;AACnB,YAAMqC,IAAe,EAAE,GAAG,KAAK,KAAK,UAAU;AAC1C,MAAA,KAAK,KAAK,UAAU,iBAChBN,EAAyB,KAAK,KAAK,UAAU,cAAc,MAAM,KAAK,KAAK,UAAU,cAAc,EAAE,MACrGM,EAAa,gBAAgB,MACxB,KAAA,KAAK,OAAO,SAAS;AAAA,QACtB,MAAMxC,EAAW;AAAA,QACjB,WAAWwC;AAAA,QACX,gBAAgB;AAAA,MAAA,CACnB,IAGT,KAAK,KAAK,eACV,KAAK,KAAK,oBACV,KAAK,KAAK;IAAc;AAE5B,IAAArC,EAAA,2BAAoB,CAACC,MAAU;AAC3B,MAAAA,EAAM,eAAe;AACrB,YAAM0B,IAAW,KAAK,KAAK,gBAAgB1B,EAAM,SAASA,EAAM,OAAO;AAClE,WAAA,KAAK,WAAW0B,CAAQ;AAAA,IAAA;AAEjC,IAAA3B,EAAA,uBAAgB,CAACC,MAAU;AAEnB,UAAA,CAAC,aAAa,cAAc,WAAW,WAAW,EAAE,SAASA,EAAM,GAAG,GAAG;AAGzE,gBAFAA,EAAM,eAAe,GAChB,KAAA,KAAK,UAAU,gBAAgB,MAC5BA,EAAM,KAAK;AAAA,UACf,KAAK,aAAa;AACV,YAAA,KAAK,KAAK,UAAU,gBACpB,KAAK,KAAK,UAAU,aAAa,SAAS,MACrC,KAAA,KAAK,UAAU,aAAa,UAAU;AAG/C;AAAA,UACJ;AAAA,UACA,KAAK,cAAc;AACf,YAAI,KAAK,KAAK,UAAU,gBACpB,KAAK,KAAK,UAAU,aAAa,SAC7B,KAAK,KAAK,OAAO,QAAQ,SAAS,MACjC,KAAA,KAAK,UAAU,aAAa,UAAU;AAG/C;AAAA,UACJ;AAAA,UACA,KAAK,WAAW;AACR,YAAA,KAAK,KAAK,UAAU,gBACpB,KAAK,KAAK,UAAU,aAAa,MAAM,MAClC,KAAA,KAAK,UAAU,aAAa,OAAO;AAG5C;AAAA,UACJ;AAAA,UACA,KAAK,aAAa;AACd,YAAI,KAAK,KAAK,UAAU,gBACpB,KAAK,KAAK,UAAU,aAAa,MAC7B,KAAK,KAAK,OAAO,KAAK,SAAS,MAC9B,KAAA,KAAK,UAAU,aAAa,OAAO;AAG5C;AAAA,UACJ;AAAA,QACJ;AACK,aAAA,KAAK,OAAO,SAAS;AAAA,UACtB,MAAMJ,EAAW;AAAA,UACjB,WAAW,KAAK,KAAK;AAAA,UACrB,gBAAgB;AAAA,QAAA,CACnB;AAAA,MACL;AAEA,YAAMyC,IAAY;AAClB,UAAI,CAACrC,EAAM,WAAW,CAACA,EAAM,SAAS;AAElC,cAAMsC,IAAqBD,EAAU,KAAKrC,EAAM,IAAI,aAAa;AAC7D,YAAAA,EAAM,QAAQ,QAAQsC,GAAoB;AAGtC,cADJtC,EAAM,eAAe,GACjB,CAAC,KAAK,KAAK,UAAU;AACrB;AACC,eAAA,KAAK,WAAW,KAAK,KAAK,UAAU,cAAcsC,IAAqBtC,EAAM,MAAM,MAAS;AAAA,QACrG;AAAA,MACJ;AACI,MAAAA,EAAM,QAAQ,aACdA,EAAM,eAAe,GACrB,KAAK,KAAK,6BACV,KAAK,KAAK;IACd;AAEJ,IAAAD,EAAA,qBAAc,CAACC,MAAU;AAChB,WAAA,KAAK,OAAO,SAAS;AAAA,QACtB,MAAMJ,EAAW;AAAA,QACjB,OAAAI;AAAA,QACA,UAAU;AAAA,MAAA,CACb;AAAA,IAAA;AAEL,IAAAD,EAAA,sBAAe,MAAM;AACX,YAAAwC,IAAO,KAAK;AACb,WAAA,KAAK,SAAS,aAAaA,CAAI,GACpC,KAAK,KAAK,eACV,KAAK,KAAK,oBACV,KAAK,KAAK;IAAc;AA3IxB,SAAK,OAAOzC;AACZ,UAAM,EAAE,oBAAA0C,GAAoB,UAAAvC,GAAU,kBAAAwC,EAAiB,IAAI,KAAK;AAChE,SAAK,UAAUxC,GACf,KAAK,mBAAmBwC,GACxB,KAAK,qBAAqBD,GAC1B,KAAK,QAAQ,MAAM,SAAS,KAAK,KAAK,OAAO,KAAK,SAAS,MAC3D,KAAK,QAAQ,MAAM,QAAQ,KAAK,KAAK,OAAO,KAAK,QAAQ,MACzD,KAAK,QAAQ,MAAM,MAAM,KAAK,KAAK,mBAAmB,MACtD,KAAK,QAAQ,MAAM,OAAO,KAAK,KAAK,eAAe,MACnD,KAAK,QAAQ,WAAW,IACxB,KAAK,mBAAmB,GACxB,KAAK,QAAQ,iBAAiB,UAAU,KAAK,YAAY,GACzD,KAAK,QAAQ,iBAAiB,aAAa,KAAK,WAAW,GAC3D,KAAK,QAAQ,iBAAiB,aAAa,KAAK,eAAe,GAC/D,KAAK,QAAQ,iBAAiB,WAAW,KAAK,aAAa,GAC3D,KAAK,QAAQ,iBAAiB,YAAY,KAAK,iBAAiB,GAChE,KAAK,QAAQ,iBAAiB,WAAW,KAAK,aAAa;AAAA,EAC/D;AAAA,EACA,iBAAiBE,GAAM;AACnB,SAAK,cAAcA;AAAA,EACvB;AAAA,EAyHA,2BAA2B;AACvB,UAAM,EAAE,WAAAC,GAAW,YAAAC,MAAe,KAAK,SACjC,EAAE,QAAAhB,GAAQ,OAAAC,EAAA,IAAU,KAAK,QAAQ,yBACjCgB,IAASF,IAAYf,GACrBkB,IAAQF,IAAaf;AACpB,WAAA;AAAA,MACH,KAAKc;AAAA,MACL,MAAMC;AAAA,MACN,QAAAC;AAAA,MACA,OAAAC;AAAA,IAAA;AAAA,EAER;AAAA,EACA,iBAAiB;AACP,UAAA7C,IAAW,SAAS,cAAc,KAAK,GACvCwC,IAAmB,SAAS,cAAc,KAAK,GAC/CD,IAAqB,SAAS,cAAc,KAAK,GACjDO,IAAiB,SAAS,cAAc,KAAK,GAC7CC,IAAQ,SAAS,cAAc,KAAK;AAC1C,WAAAP,EAAiB,MAAM,QAAQ,OAC/BA,EAAiB,MAAM,gBAAgB,QACvCD,EAAmB,MAAM,gBAAgB,QACzCO,EAAe,MAAM,UAAU,QAC/BC,EAAM,YAAYP,CAAgB,GAClCO,EAAM,YAAYR,CAAkB,GACpCO,EAAe,YAAYC,CAAK,GAChC,KAAK,mBAAmBP,GACxB,KAAK,qBAAqBD,GAC1BvC,EAAS,YAAY8C,CAAc,GAC1B9C,EAAA,UAAU,IAAIwB,IAAa,UAAU,GACvC,EAAE,UAAAxB,GAAU,kBAAAwC,GAAkB,oBAAAD;EACzC;AAAA,EACA,kBAAkB;AACd,WAAO,KAAK,KAAK,OAAO,KAAK,OAAO,CAACS,GAAKC,OACtCD,KAAOC,EAAK,QACLD,IACR,CAAC;AAAA,EACR;AAAA,EACA,iBAAiB;AACb,WAAO,KAAK,KAAK,OAAO,QAAQ,OAAO,CAACA,GAAKC,OACzCD,KAAOC,EAAK,OACLD,IACR,CAAC;AAAA,EACR;AAAA,EACA,qBAAqB;AACX,UAAAE,IAAc,KAAK,mBACnBC,IAAa,KAAK;AACxB,SAAK,kBAAkBD,CAAW,GAClC,KAAK,iBAAiBC,CAAU;AAAA,EACpC;AAAA,EACA,kBAAkBxB,GAAQ;AACjB,SAAA,iBAAiB,MAAM,SAASA,IAAS;AAAA,EAClD;AAAA,EACA,iBAAiBC,GAAO;AACf,SAAA,mBAAmB,MAAM,QAAQA,IAAQ;AAAA,EAClD;AACJ;AC7MO,MAAMwB,EAAW;AAAA,EAOpB,YAAYC,GAAO;AANnB,IAAAvD,EAAA,kBAAW;AACX,IAAAA,EAAA,mBAAY;AACZ,IAAAA,EAAA,oBAAa;AACb,IAAAA,EAAA,qBAAc;AACd,IAAAA,EAAA,4BAAqB;AACrB,IAAAA,EAAA,2BAAoB;AAEhB,IAAIuD,KACO,OAAA,OAAO,MAAMA,CAAK;AAAA,EAEjC;AACJ;AACO,MAAMC,EAAS;AAAA,EAGlB,YAAYpC,GAAKH,GAAQ;AAFzB,IAAAjB,EAAA;AACA,IAAAA,EAAA;AAEI,SAAK,MAAMoB,GACX,KAAK,SAASH;AAAA,EAClB;AACJ;AACO,MAAMwC,EAAiB;AAAA,EAM1B,YAAYF,GAAO;AALnB,IAAAvD,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEI,SAAK,QAAQuD,EAAM,OACnB,KAAK,eAAeA,EAAM,cAC1B,KAAK,cAAcA,EAAM,aACzB,KAAK,WAAWA,EAAM,UACtB,KAAK,QAAQA,EAAM;AAAA,EACvB;AACJ;AACO,MAAMG,EAAK;AAAA,EASd,YAAYH,GAAO;AAPnB;AAAA,IAAAvD,EAAA;AAEA;AAAA,IAAAA,EAAA;AAEA;AAAA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,eAAQ;AAEJ,SAAK,QAAQuD,EAAM,OACnB,KAAK,eAAeA,EAAM,cAC1B,KAAK,cAAcA,EAAM,aACzB,KAAK,WAAWA,EAAM,UACtB,KAAK,QAAQA,EAAM;AAAA,EACvB;AAAA,EACA,sBAAsB;AAQX,WAPM,IAAIE,EAAiB;AAAA,MAC9B,cAAc,KAAK;AAAA,MACnB,UAAU,KAAK;AAAA,MACf,aAAa,KAAK;AAAA,MAClB,OAAO,KAAK;AAAA,MACZ,OAAO,KAAK;AAAA,IAAA,CACf;AAAA,EAEL;AAAA,EACA,aAAaE,GAAQ;AACjB,SAAK,QAAQA;AAAA,EACjB;AAAA,EACA,aAAa9C,GAAQ;AACV,WAAA,OAAO,MAAMA,CAAM;AAAA,EAC9B;AAAA,EACA,cAAcd,GAAM;AAChB,UAAM,EAAE,QAAAkB,GAAQ,KAAAG,MAAQ,KAAK,UACvB,EAAE,eAAAwC,EAAc,IAAI7D,EAAK;AAC/B,QAAI,CAAC6D;AACM,aAAA;AACX,UAAMC,IAAczC,KAAO,KAAK,IAAIwC,EAAc,KAAK,KAAKA,EAAc,GAAG,GAAG,KAC5ExC,KAAO,KAAK,IAAIwC,EAAc,GAAG,KAAKA,EAAc,KAAK,GAAG;AAGhE,WAFoB3C,KAAU,KAAK,IAAI2C,EAAc,KAAK,QAAQA,EAAc,GAAG,MAAM,KACrF3C,KAAU,KAAK,IAAI2C,EAAc,GAAG,QAAQA,EAAc,KAAK,MAAM,KACnDC;AAAA,EAC1B;AAAA,EACA,OAAO9D,GAAM;AL9EN,QAAAI;AK+EH,UAAM2D,IAAY,IAAIhD,EAAUf,EAAK,QAAQ,KAAK,QAAQ;AACtD,QAAA,EAAE,GAAAmB,GAAG,GAAAG,EAAM,IAAAyC;AACT,UAAA,EAAE,QAAAjC,GAAQ,OAAAC,EAAU,IAAAgC,GACpB,EAAE,KAAAC,EAAQ,IAAAhE,GACViE,MAAiB7D,IAAAJ,EAAK,UAAU,iBAAf,gBAAAI,EAA6B,SAAQ,KAAK,SAAS,OACtEJ,EAAK,UAAU,aAAa,WAAW,KAAK,SAAS,QACnDkE,IAAgB,KAAK,cAAclE,CAAI;AAC7C,IAAAsB,KAAKtB,EAAK,SAAS,KACnBmB,KAAKnB,EAAK,SAAS;AACnB,UAAM4D,IAAS,KAAK,SAAS5D,EAAK,OAAO;AACzC,IAAAgE,EAAI,UAAU7C,GAAGG,GAAGS,GAAOD,CAAM,GACjCkC,EAAI,YACAC,KAAkBC,IACZN,EAAO,qBACPA,EAAO,YACjBI,EAAI,cAAc,SAClBA,EAAI,SAAS7C,GAAGG,GAAGS,IAAQ,GAAGD,IAAS,CAAC,GACxCkC,EAAI,WAAW7C,GAAGG,GAAGS,GAAOD,CAAM,GAClCkC,EAAI,YACAC,KAAkBC,IACZN,EAAO,oBACPA,EAAO,WACjBI,EAAI,YAAY,QACZA,EAAA,OAAO,GAAGJ,EAAO,QAAQ,YAC7BI,EAAI,eAAe,UACnBA,EAAI,SAAS,KAAK,cAAc7C,IAAI,GAAGG,IAAIQ,IAAS,CAAC;AAAA,EACzD;AACJ;ACtGO,MAAMqC,EAAM;AAAA,EAIf,YAAYnE,GAAM;AAHlB,IAAAC,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEI,SAAK,OAAOD;AACN,UAAAoE,IAAS,SAAS,cAAc,QAAQ;AACvC,IAAAA,EAAA,UAAU,IAAIzC,IAAa,OAAO,GAEzCyC,EAAO,SAAS,KAAK,KAAK,OAAO,KAAK,QACtCA,EAAO,QAAQ,KAAK,KAAK,OAAO,KAAK,OACrCA,EAAO,MAAM,QAAQ,KAAK,KAAK,OAAO,KAAK,QAAQ,MACnDA,EAAO,MAAM,SAAS,KAAK,KAAK,OAAO,KAAK,SAAS,MACrDA,EAAO,MAAM,OAAO,OACpB,KAAK,UAAUA;AACf,UAAMJ,IAAM,KAAK,QAAQ,WAAW,IAAI;AACxC,QAAI,CAACA;AACK,YAAA,IAAI,MAAM,8BAA8B;AAClD,SAAK,MAAMA;AAAA,EACf;AAAA,EACA,gBAAgB7C,GAAGG,GAAG;AAClB,QAAID,IAAM,GACNS,IAAS;AACb,WAAOA,KAAUR,MACbQ,KAAU,KAAK,KAAK,OAAO,KAAKT,CAAG,EAAE,QACjC,EAAAS,KAAUR;AAEd,MAAAD;AAEJ,QAAIgD,IAAM,GACNtC,IAAQ;AACZ,WAAOA,KAASZ,MACZY,KAAS,KAAK,KAAK,OAAO,QAAQsC,CAAG,EAAE,OACnC,EAAAtC,KAASZ;AAEb,MAAAkD;AAEG,WAAA,IAAIZ,EAASpC,GAAKgD,CAAG;AAAA,EAChC;AAAA,EACA,WAAWzC,GAAU;AACX,UAAA,EAAE,QAAAV,GAAQ,KAAAG,EAAQ,IAAAO;AACnB,SAAA,KAAK,KAAKP,CAAG,EAAEH,CAAM,EAAE,OAAO,KAAK,IAAI;AAAA,EAChD;AAAA,EACA,cAAc;AACJ,UAAAoD,IAAc,KAAK,KAAK,SAAS,UACjCC,IAAa,KAAK,KAAK,SAAS,UAAU,GAC1CC,IAAa,KAAK,KAAK,SAAS,UAAU,GAC1CC,IAAc,KAAK,KAAK,SAAS;AACvC,aAASpD,IAAMiD,GAAajD,KAAOmD,GAAYnD;AAC3C,eAASgD,IAAMI,GAAaJ,KAAOE,KAC3B,GAAC,KAAK,KAAK,OAAO,QAAQF,CAAG,KAAK,CAAC,KAAK,KAAK,OAAO,KAAKhD,CAAG,IADrBgD;AAG3C,aAAK,WAAW,EAAE,QAAQA,GAAK,KAAAhD,EAAK,CAAA;AAAA,EAGhD;AACJ;AC3DO,MAAMqD,EAAM;AAAA,EAGf,YAAY1E,GAAM;AAFlB,IAAAC,EAAA;AACA,IAAAA,EAAA;AAEI,SAAK,OAAOD;AACN,UAAA2E,IAAY,SAAS,cAAc,KAAK;AACpC,IAAAA,EAAA,UAAU,IAAIhD,IAAa,uBAAuB,GAC5D,KAAK,UAAUgD,GACV,KAAA,mBAAmB,KAAK,KAAK,SAAS;AAAA,EAC/C;AAAA,EACA,mBAAmBC,GAAO;AAChB,UAAA,EAAE,QAAA9C,GAAQ,OAAAC,EAAU,IAAA6C;AAC1B,SAAK,QAAQ,MAAM,QAAQ7C,IAAQ,KAAK,KAAK,eAAe,MAC5D,KAAK,QAAQ,MAAM,SAASD,IAAS,KAAK,KAAK,mBAAmB;AAAA,EACtE;AACJ;AChBO,MAAM+C,EAAQ;AAAA,EAIjB,YAAY7E,GAAM;AAHlB,IAAAC,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,gBAAS;AAEL,SAAK,OAAOD;AACN,UAAA8E,IAAiB,SAAS,cAAc,KAAK;AACpC,IAAAA,EAAA,UAAU,IAAInD,IAAa,SAAS,GACnD,KAAK,UAAUmD;AAAA,EACnB;AACJ;ACXO,MAAMC,EAAO;AAAA,EAUhB,YAAYvB,GAAO;AATnB,IAAAvD,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,cAAO;AAAA,MACH,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA;AAEZ,IAAAA,EAAA,qBAAc;AACd,IAAAA,EAAA,0BAAmB;AACnB,IAAAA,EAAA,sBAAe;AAEX,SAAK,UAAUuD,EAAM,SACrB,KAAK,OAAOA,EAAM,MAClB,KAAK,OAAOA,EAAM,MACb,KAAA,cAAcA,EAAM,eAAe,MACnC,KAAA,mBAAmBA,EAAM,qBAAqB,MAC9C,KAAA,eAAeA,EAAM,gBAAgB;AAAA,EAC9C;AACJ;AClBO,MAAM7C,EAAU;AAAA,EAAhB;AACH,IAAAV,EAAA,sBAAe;AACf,IAAAA,EAAA,uBAAgB;AAAA;AACpB;ACFO,MAAM+E,EAAO;AAAA,EAEhB,cAAc;AADd,IAAA/E,EAAA;AAES,SAAA,QAAQ,IAAIsD;EACrB;AACJ;ACNO,MAAM0B,EAAS;AAAA,EAUlB,YAAYjF,GAAMwD,GAAO;AATzB,IAAAvD,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEI,SAAK,OAAOD,GACZ,KAAK,MAAMwD,EAAM,KACjB,KAAK,OAAOA,EAAM,MAClB,KAAK,QAAQA,EAAM,OACnB,KAAK,SAASA,EAAM,QACf,KAAA,WAAW,KAAK,eAChB,KAAA,UAAU,KAAK;IAAY;AAC3B,SAAA,WAAW,KAAK;IAAY;AAC5B,SAAA,UAAU,KAAK,cACpB,KAAK,aAAa;AAAA,MACd,KAAK;AAAA,MACL,MAAM;AAAA,MACN,OAAO,KAAK,KAAK,UAAU;AAAA,MAC3B,QAAQ,KAAK,KAAK,UAAU;AAAA,IAAA,CAC/B;AAAA,EACL;AAAA,EACA,aAAaA,GAAO;AAChB,SAAK,MAAMA,EAAM,KACjB,KAAK,OAAOA,EAAM,MAClB,KAAK,QAAQA,EAAM,OACnB,KAAK,SAASA,EAAM,QACf,KAAA,WAAW,KAAK,eAChB,KAAA,UAAU,KAAK,cACf,KAAA,WAAW,KAAK,eAChB,KAAA,UAAU,KAAK;EACxB;AAAA;AAAA,EAEA,cAAc;AAEH,WADQ,KAAK,KAAK,MAAM,eAAe,KAAK,GAAG;AAAA,EAE1D;AAAA,EACA,aAAa;AAEF,WADQ,KAAK,KAAK,MAAM,eAAe,KAAK,MAAM;AAAA,EAE7D;AAAA,EACA,cAAc;AAEH,WADQ,KAAK,KAAK,MAAM,kBAAkB,KAAK,IAAI;AAAA,EAE9D;AAAA,EACA,aAAa;AAEF,WADQ,KAAK,KAAK,MAAM,kBAAkB,KAAK,KAAK;AAAA,EAE/D;AACJ;ACtDO,MAAM0B,EAAO;AAAA,EAGhB,YAAY1B,GAAO;AAFnB,IAAAvD,EAAA;AACA,IAAAA,EAAA;AAEI,SAAK,QAAQuD,EAAM,OACnB,KAAK,QAAQA,EAAM;AAAA,EACvB;AACJ;ACPO,MAAM2B,EAAI;AAAA,EAGb,YAAY3B,GAAO;AAFnB,IAAAvD,EAAA;AACA,IAAAA,EAAA;AAEI,SAAK,SAASuD,EAAM,QACpB,KAAK,QAAQA,EAAM;AAAA,EACvB;AACJ;ACHO,SAAS4B,EAAiBC,GAAMC,GAASC,IAAoB,IAAO;AACvE,QAAMC,IAAO,CAAA;AACb,WAASnE,IAAM,GAAGA,KAAOgE,GAAMhE,KAAO;AAClC,UAAMoE,IAAW,CAAA;AACjB,aAASpB,IAAM,GAAGA,KAAOiB,GAASjB,KAAO;AACrC,YAAMqB,IAAQH,IAAoB,GAAGlE,CAAG,IAAIgD,CAAG,KAAK,IAC9C5D,IAAO,IAAIkD,EAAK;AAAA,QAClB,cAAc+B;AAAA,QACd,aAAaA;AAAA,QACb,OAAAA;AAAA,QACA,UAAU;AAAA,UACN,QAAQrB;AAAA,UACR,KAAAhD;AAAA,QACJ;AAAA,QACA,OAAO;AAAA,MAAA,CACV;AACD,MAAAoE,EAAS,KAAKhF,CAAI;AAAA,IACtB;AACA,IAAA+E,EAAK,KAAKC,CAAQ;AAAA,EACtB;AACO,SAAAD;AACX;AACgB,SAAAG,EAAmBN,GAAMC,GAAS;AAC9C,QAAMM,IAAU,CAAA;AAChB,WAAS,IAAI,GAAG,KAAKP,GAAM,KAAK;AACtB,UAAAQ,IAAU,IAAIV,EAAI;AAAA,MACpB,QAAQ;AAAA,MACR,OAAO,OAAO,CAAC;AAAA,IAAA,CAClB;AACD,IAAAS,EAAQ,KAAKC,CAAO;AAAA,EACxB;AACA,QAAMC,IAAU,CAAA;AAChB,WAAS,IAAI,GAAG,KAAKR,GAAS,KAAK;AACzB,UAAAS,IAAU,IAAIb,EAAO;AAAA,MACvB,OAAO,OAAO,CAAC;AAAA,MACf,OAAO;AAAA,IAAA,CACV;AACD,IAAAY,EAAQ,KAAKC,CAAO;AAAA,EACxB;AASO,SARQ,IAAIhB,EAAO;AAAA,IACtB,SAASe;AAAA,IACT,MAAMF;AAAA,IACN,MAAM;AAAA,MACF,QAAQ;AAAA,MACR,OAAO;AAAA,IACX;AAAA,EAAA,CACH;AAEL;AACgB,SAAAI,EAA6BX,GAAMC,GAAS;AAClD,QAAAE,IAAOJ,EAAiBC,GAAMC,CAAO,GACrCtE,IAAS2E,EAAmBN,GAAMC,CAAO;AACxC,SAAA,EAAE,MAAAE,GAAM,QAAAxE;AACnB;ACzDO,MAAMiF,EAAa;AAAA,EAGtB,YAAYzC,GAAO;AAFnB,IAAAvD,EAAA;AACA,IAAAA,EAAA;AAEI,SAAK,OAAOuD,EAAM,MAClB,KAAK,SAASA,EAAM;AAAA,EACxB;AACJ;AACO,MAAM0C,EAAU;AAAA,EAGnB,YAAY1C,GAAO;AAFnB,IAAAvD,EAAA;AACA,IAAAA,EAAA;AAEI,SAAK,OAAOuD,EAAM,MAClB,KAAK,SAASA,EAAM;AAAA,EACxB;AACJ;AACO,MAAM2C,EAAM;AAAA,EAGf,YAAYC,GAAS;AAFrB,IAAAnG,EAAA;AACA,IAAAA,EAAA;AAEI,SAAK,UAAUmG,EAAQ,SACvB,KAAK,OAAOA,EAAQ;AAAA,EACxB;AAAA,EACA,eAAe9E,GAAG;AACd,QAAI+E,IAAS;AACb,aAASjF,IAAI,GAAGA,IAAI,KAAK,KAAK,QAAQA;AAClC,UAAIE,KAAK,KAAK,KAAKF,CAAC,EAAE,MAAM;AAEf,QAAAiF,IAAAjF;AACT;AAAA,MACJ;AAEG,WAAAiF;AAAA,EACX;AAAA,EACA,kBAAkBlF,GAAG;AACjB,QAAImF,IAAS;AACb,aAASlF,IAAI,GAAGA,IAAI,KAAK,QAAQ,QAAQA;AACrC,UAAID,KAAK,KAAK,QAAQC,CAAC,EAAE,MAAM;AAElB,QAAAkF,IAAAlF;AACT;AAAA,MACJ;AAEG,WAAAkF;AAAA,EACX;AACJ;AC5CO,MAAMC,EAAW;AAAA,EAOpB,YAAYvG,GAAM;AANlB,IAAAC,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,gBAAS;AACT,IAAAA,EAAA;AAEA;AAAA,IAAAA,EAAA;AAEI,SAAK,OAAOD,GACP,KAAA,UAAU,KAAK;AACpB,UAAMgE,IAAM,KAAK,QAAQ,WAAW,IAAI;AACxC,QAAI,CAACA;AACK,YAAA,IAAI,MAAM,8BAA8B;AAClD,SAAK,MAAMA,GACN,KAAA,QAAQ,KAAK,KAAK,UAAU;AAAA,EACrC;AAAA,EACA,gBAAgB;AACN,UAAAtC,IAAU,SAAS,cAAc,QAAQ;AAC/C,WAAAA,EAAQ,MAAM,WAAW,YACjBA,EAAA,MAAM,SAAS,KAAK,SAAS,MACrCA,EAAQ,MAAM,QAAQ,KAAK,KAAK,UAAU,QAAQ,MAClDA,EAAQ,MAAM,UAAU,SACxBA,EAAQ,MAAM,aAAa,mBAEnBA,EAAA,QAAQ,KAAK,KAAK,UAAU,OACpCA,EAAQ,SAAS,KAAK,QACfA;AAAA,EACX;AAAA,EACA,mBAAmB8E,GAAKC,GAAM;AACrB,SAAA,QAAQ,MAAM,MAAMD,IAAM,MAC1B,KAAA,QAAQ,MAAM,OAAOC,IAAO;AAAA,EACrC;AAAA,EACA,iBAAiBvF,GAAQ;AACrB,UAAM,EAAE,cAAAwF,GAAc,eAAA7C,EAAc,IAAI,KAAK,KAAK;AAC9C,WAAA6C,KAAgBA,EAAa,WAAWxF,IACjC,KACP2C,IACgB3C,KACZ,KAAK,IAAI2C,EAAc,KAAK,QAAQA,EAAc,GAAG,MAAM,KAC3D3C,KAAU,KAAK,IAAI2C,EAAc,KAAK,QAAQA,EAAc,GAAG,MAAM,IAGtE;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,WAAW3C,GAAQ6C,GAAW;AACpB,UAAA,EAAE,OAAAhC,GAAO,GAAAZ,EAAM,IAAA4C;AACrB,SAAK,IAAI,YAAY,SACrB,KAAK,IAAI,YAAY,UACrB,KAAK,IAAI,eAAe,UACxB,KAAK,IAAI,OAAO,cAChB,KAAK,IAAI,SAAS,KAAK,KAAK,OAAO,QAAQ7C,CAAM,EAAE,OAAOC,IAAIY,IAAQ,IAAI,KAAK,KAAK,SAAS,MAAM,IAAI,KAAK,SAAS,CAAC;AAAA,EAC1H;AAAA,EACA,WAAWb,GAAQ6C,GAAW;AACpB,UAAA,EAAE,OAAAhC,GAAO,GAAAZ,EAAM,IAAA4C,GACf4C,IAAgB,KAAK,iBAAiBzF,CAAM;AAClD,SAAK,IAAI,YAAYyF,IACf,KAAK,KAAK,OAAO,MAAM,qBACvB,SACN,KAAK,IAAI,cAAc,SACvB,KAAK,IAAI,YAAY;AACrB,UAAMC,IAAWzF,IAAI,KAAK,KAAK,SAAS;AACxC,SAAK,IAAI,SAASyF,IAAW,GAAG,GAAG7E,GAAO,KAAK,MAAM,GACrD,KAAK,IAAI,WAAW6E,IAAW,GAAG,GAAG7E,GAAO,KAAK,MAAM;AAAA,EAC3D;AAAA,EACA,mBAAmBb,GAAQ;AACvB,UAAM6C,IAAY,IAAIhD,EAAU,KAAK,KAAK,QAAQ;AAAA,MAC9C,KAAK;AAAA,MACL,QAAAG;AAAA,IAAA,CACH;AACI,SAAA,WAAWA,GAAQ6C,CAAS,GAC5B,KAAA,WAAW7C,GAAQ6C,CAAS;AAAA,EACrC;AAAA,EACA,YAAY;AACR,UAAMQ,IAAa,KAAK,KAAK,SAAS,UAAU,GAC1CE,IAAc,KAAK,KAAK,SAAS;AACvC,SAAK,IAAI,aACT,KAAK,IAAI,cAAc,SACvB,KAAK,IAAI,YAAY,GAChB,KAAA,IAAI,OAAO,GAAG,CAAC,GACpB,KAAK,IAAI,OAAO,GAAG,KAAK,MAAM,GAC9B,KAAK,IAAI,aACT,KAAK,IAAI;AACT,aAASJ,IAAMI,GAAaJ,KAAOE,KAC1B,KAAK,KAAK,OAAO,QAAQF,CAAG,GADUA;AAG3C,WAAK,mBAAmBA,CAAG;AAAA,EAEnC;AACJ;AChGO,MAAMwC,EAAQ;AAAA,EAOjB,YAAY7G,GAAM;AANlB,IAAAC,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,eAAQ;AACR,IAAAA,EAAA;AACA,IAAAA,EAAA,uBAAgB;AAEZ,SAAK,OAAOD,GACP,KAAA,UAAU,KAAK;AACpB,UAAMgE,IAAM,KAAK,QAAQ,WAAW,IAAI;AACxC,QAAI,CAACA;AACK,YAAA,IAAI,MAAM,8BAA8B;AAClD,SAAK,MAAMA,GACN,KAAA,SAAS,KAAK,KAAK,UAAU;AAAA,EACtC;AAAA,EACA,gBAAgB;AACN,UAAAtC,IAAU,SAAS,cAAc,QAAQ;AAC/C,WAAAA,EAAQ,MAAM,WAAW,YACzBA,EAAQ,MAAM,SAAS,KAAK,KAAK,UAAU,SAAS,MAC5CA,EAAA,MAAM,QAAQ,KAAK,QAAQ,MACnCA,EAAQ,MAAM,UAAU,SACxBA,EAAQ,MAAM,YAAY,mBAE1BA,EAAQ,QAAQ,KAAK,OACbA,EAAA,SAAS,KAAK,KAAK,UAAU,QAC9BA;AAAA,EACX;AAAA,EACA,mBAAmB8E,GAAKC,GAAM;AACrB,SAAA,QAAQ,MAAM,MAAMD,IAAM,MAC1B,KAAA,QAAQ,MAAM,OAAOC,IAAO;AAAA,EACrC;AAAA,EACA,cAAcpF,GAAK;AACf,UAAM,EAAE,cAAAqF,GAAc,eAAA7C,EAAc,IAAI,KAAK,KAAK;AAC9C,WAAA6C,KAAgBA,EAAa,QAAQrF,IAC9B,KACPwC,IACgBxC,KAAO,KAAK,IAAIwC,EAAc,KAAK,KAAKA,EAAc,GAAG,GAAG,KACxExC,KAAO,KAAK,IAAIwC,EAAc,KAAK,KAAKA,EAAc,GAAG,GAAG,IAG7D;AAAA,EACX;AAAA,EACA,WAAWxC,GAAK0C,GAAW;AACjB,UAAA,EAAE,GAAAzC,GAAG,QAAAQ,EAAW,IAAAiC;AACtB,SAAK,IAAI,YAAY,SACrB,KAAK,IAAI,YAAY,UACrB,KAAK,IAAI,eAAe,UACxB,KAAK,IAAI,OAAO,cAChB,KAAK,IAAI,SAAS,KAAK,KAAK,OAAO,KAAK1C,CAAG,EAAE,OAAO,KAAK,QAAQ,GAAGC,IAAI,KAAK,KAAK,SAAS,MAAMQ,IAAS,CAAC;AAAA,EAC/G;AAAA,EACA,WAAWZ,GAAQ6C,GAAW;AACpB,UAAA,EAAE,GAAAzC,GAAG,QAAAQ,EAAW,IAAAiC,GAChB+C,IAAe,KAAK,cAAc5F,CAAM;AAC9C,SAAK,IAAI,YAAY4F,IACf,KAAK,KAAK,OAAO,MAAM,qBACvB,SACN,KAAK,IAAI,cAAc,SAClB,KAAA,IAAI,YAAY,KAAK;AAC1B,UAAMC,IAAWzF,IAAI,KAAK,KAAK,SAAS;AACxC,SAAK,IAAI,SAAS,GAAGyF,IAAW,GAAG,KAAK,OAAOjF,CAAM,GACrD,KAAK,IAAI,WAAW,GAAGiF,IAAW,GAAG,KAAK,OAAOjF,CAAM;AAAA,EAC3D;AAAA,EACA,gBAAgBT,GAAK;AACjB,UAAM0C,IAAY,IAAIhD,EAAU,KAAK,KAAK,QAAQ;AAAA,MAC9C,QAAQ;AAAA,MACR,KAAAM;AAAA,IAAA,CACH;AACI,SAAA,WAAWA,GAAK0C,CAAS,GACzB,KAAA,WAAW1C,GAAK0C,CAAS;AAAA,EAClC;AAAA,EACA,YAAY;AACR,UAAMS,IAAa,KAAK,KAAK,SAAS,UAAU,GAC1CF,IAAc,KAAK,KAAK,SAAS;AACvC,SAAK,IAAI,aACJ,KAAA,IAAI,OAAO,GAAG,CAAC,GACpB,KAAK,IAAI,cAAc,SACvB,KAAK,IAAI,YAAY,IAChB,KAAA,IAAI,OAAO,IAAI,CAAC,GACrB,KAAK,IAAI,aACT,KAAK,IAAI;AACT,aAASjD,IAAMiD,GAAajD,KAAOmD,KAC1B,KAAK,KAAK,OAAO,KAAKnD,CAAG,GADaA;AAG3C,WAAK,gBAAgBA,CAAG;AAAA,EAEhC;AACJ;ACtEO,MAAMM,IAAa;AAC1B,MAAqBqF,EAAY;AAAA,EAe7B,YAAYvF,GAAQ+B,GAAO;AAd3B,IAAAvD,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEU,UAAAuF,IAAOJ,EAAiB,IAAI,EAAE,GAC9BpE,IAAS,KAAK,mBAAmBwE,IAAMhC,KAAA,gBAAAA,EAAO,SAAQ,EAAE,QAAQ,KAAK,OAAO,IAAK,CAAA;AACvF,IAAIA,KAAA,QAAAA,EAAO,SACPxC,EAAO,OAAOwC,EAAM,OAEnB,KAAA,SAAS,IAAIuB,EAAO/D,CAAM,GAC1B,KAAA,OAAO,eAAcwC,KAAA,gBAAAA,EAAO,gBAAe,MAC3C,KAAA,OAAO,oBAAmBA,KAAA,gBAAAA,EAAO,sBAAqB,MACtD,KAAA,OAAO,gBAAeA,KAAA,gBAAAA,EAAO,iBAAgB,MAC7C,KAAA,UAAU,IAAIqD,EAAQ,IAAI,GAC1B,KAAA,aAAa,IAAIN,EAAW,IAAI,GAChC,KAAA,QAAQ,IAAIpC,EAAM,IAAI,GACtB,KAAA,QAAQ,IAAIO,EAAM,IAAI,GACtB,KAAA,WAAW,IAAIvC,EAAS,IAAI,GAC5B,KAAA,UAAU,IAAI0C,EAAQ,IAAI,GAC1B,KAAA,SAAS,IAAItD,EAAO,IAAI,GACxB,KAAA,QAAQ,KAAK,mBAClB,KAAK,WAAW,IAAI0D,EAAS,MAAM,KAAK,SAAS,0BAA0B,GACtE,KAAA,YAAY,IAAItE,KAChB,KAAA,SAAS,IAAIZ,EAAO,IAAI,GAC7B,KAAK,OAAOyF,GACP,KAAA,SAAS,IAAIR,KAClB,KAAK,eAAe,GACpB,KAAK,qBAAqB,GAC1B,KAAK,oBAAoBvD,CAAM,GAC/B,KAAK,YAAY,GACjB,KAAK,iBAAiB,GACtB,KAAK,cAAc;AAAA,EACvB;AAAA,EACA,qBAAqB;AACjB,UAAM+E,IAAM,KAAK,WAAW,SAAS,KAAK,QAAQ,QAC5CC,IAAO;AACR,SAAA,QAAQ,mBAAmBD,GAAKC,CAAI;AAAA,EAC7C;AAAA,EACA,wBAAwB;AACd,UAAAD,IAAM,KAAK,QAAQ,QACnBC,IAAO,KAAK,QAAQ;AAClB,YAAA,IAAID,GAAKC,CAAI,GAChB,KAAA,WAAW,mBAAmBD,GAAKC,CAAI;AAAA,EAChD;AAAA,EACA,uBAAuB;AACnB,SAAK,mBAAmB,GACxB,KAAK,sBAAsB;AAAA,EAC/B;AAAA,EACA,kBAAkB;AACd,UAAMQ,IAAa,CAAA;AACnB,QAAIC,IAAe;AACV,aAAA9F,IAAI,GAAGA,KAAK,KAAK,OAAO,QAAQ,SAAS,GAAGA,KAAK;AACtD,YAAMiD,IAAM,KAAK,OAAO,QAAQjD,CAAC;AACjC,MAAA8F,KAAgB7C,EAAI;AACd,YAAA8C,IAAW,IAAIlB,EAAa;AAAA,QAC9B,MAAMiB;AAAA,QACN,QAAQ9F;AAAA,MAAA,CACX;AACD,MAAA6F,EAAW,KAAKE,CAAQ;AAAA,IAC5B;AACA,UAAMC,IAAa,CAAA;AACnB,QAAIC,IAAgB;AACX,aAAAjG,IAAI,GAAGA,KAAK,KAAK,OAAO,KAAK,SAAS,GAAGA,KAAK;AACnD,YAAMC,IAAM,KAAK,OAAO,KAAKD,CAAC;AAC9B,MAAAiG,KAAiBhG,EAAI;AACf,YAAAiG,IAAW,IAAIpB,EAAU;AAAA,QAC3B,MAAMmB;AAAA,QACN,QAAQjG;AAAA,MAAA,CACX;AACD,MAAAgG,EAAW,KAAKE,CAAQ;AAAA,IAC5B;AACM,UAAAC,IAAQ,IAAIpB,EAAM;AAAA,MACpB,SAASc;AAAA,MACT,MAAMG;AAAA,IAAA,CACT;AACO,mBAAA,IAAI,WAAWG,CAAK,GACpB,QAAA,IAAI,YAAY,KAAK,MAAM,GAC5BA;AAAA,EACX;AAAA,EACA,iBAAiB;AACP,UAAAC,IAAU,SAAS,cAAc,KAAK;AACpC,IAAAA,EAAA,MAAM,MAAM,KAAK,mBAAmB,MACpCA,EAAA,MAAM,OAAO,KAAK,eAAe,MACjCA,EAAA,YAAY,KAAK,MAAM,OAAO,GAC9BA,EAAA,UAAU,IAAI7F,IAAa,SAAS,GAC5C,KAAK,MAAM,QAAQ,YAAY,KAAK,QAAQ,OAAO,GACnD,KAAK,MAAM,QAAQ,YAAY,KAAK,QAAQ,OAAO,GACnD,KAAK,MAAM,QAAQ,YAAY,KAAK,WAAW,OAAO,GACjD,KAAA,MAAM,QAAQ,YAAY6F,CAAO,GACtC,KAAK,MAAM,QAAQ,YAAY,KAAK,SAAS,OAAO,GACpD,KAAK,MAAM,QAAQ,OAAO,KAAK,OAAO,OAAO;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU;AACD,SAAA,MAAM,QAAQ;EACvB;AAAA,EACA,oBAAoB/F,GAAQ;AACpB,QAAA,OAAOA,KAAW,UAAU;AACtB,YAAAC,IAAU,SAAS,cAAcD,CAAM;AAC7C,UAAI,CAACC;AACK,cAAA,IAAI,MAAM,yBAAyBD,CAAM;AAAA,sBAA+C;AACzF,MAAAC,KAAA,QAAAA,EAAA,YAAY,KAAK,MAAM;AAAA,IACpC;AACA,IAAID,aAAkB,eACXA,EAAA,OAAO,KAAK,MAAM,OAAO;AAAA,EAExC;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,MAAM;AACN,WAAO,KAAK,MAAM;AAAA,EACtB;AAAA,EACA,IAAI,YAAY;AACZ,WAAO,KAAK,OAAO;AAAA,EACvB;AAAA,EACA,IAAI,mBAAmB;AACnB,WAAO,KAAK,WAAW;AAAA,EAC3B;AAAA,EACA,IAAI,eAAe;AACf,WAAO,KAAK,QAAQ;AAAA,EACxB;AAAA,EACA,IAAI,gBAAgB;AAChB,WAAO,KAAK,QAAQ;AAAA,EACxB;AAAA;AAAA,EAEA,aAAa;AACJ,SAAA,SAAS,QAAQ;EAC1B;AAAA,EACA,gBAAgBN,GAAGG,GAAG;AAClB,WAAO,KAAK,MAAM,gBAAgBH,GAAGG,CAAC;AAAA,EAC1C;AAAA,EACA,QAAQM,GAAU;AACR,UAAA,EAAE,QAAAV,GAAQ,KAAAG,EAAQ,IAAAO;AACxB,WAAO,KAAK,KAAKP,CAAG,EAAEH,CAAM;AAAA,EAChC;AAAA,EACA,iBAAiBU,GAAUd,GAAQ;AACzB,UAAA,EAAE,QAAAI,GAAQ,KAAAG,EAAQ,IAAAO;AACxB,SAAK,KAAKP,CAAG,EAAEH,CAAM,EAAE,aAAaJ,CAAM,GACrC,KAAA,WAAWO,GAAKH,CAAM;AAAA,EAC/B;AAAA,EACA,iBAAiBU,GAAUgC,GAAQ;AACzB,UAAA,EAAE,QAAA1C,GAAQ,KAAAG,EAAQ,IAAAO;AACxB,SAAK,KAAKP,CAAG,EAAEH,CAAM,EAAE,aAAa0C,CAAM,GACrC,KAAA,WAAWvC,GAAKH,CAAM;AAAA,EAC/B;AAAA,EACA,mBAAmBuG,GAAOC,GAAU;AAC1B,UAAAC,IAAU,KAAK,IAAIF,EAAM,KAAK,KAAKA,EAAM,GAAG,GAAG,GAC/CG,IAAQ,KAAK,IAAIH,EAAM,KAAK,KAAKA,EAAM,GAAG,GAAG,GAC7CI,IAAU,KAAK,IAAIJ,EAAM,KAAK,QAAQA,EAAM,GAAG,MAAM,GACrDK,IAAQ,KAAK,IAAIL,EAAM,KAAK,QAAQA,EAAM,GAAG,MAAM;AACzD,aAASpG,IAAMsG,GAAStG,KAAOuG,GAAOvG;AAClC,eAASgD,IAAMwD,GAASxD,KAAOyD,GAAOzD,KAAO;AACzC,cAAM5D,IAAO,KAAK,KAAKY,CAAG,EAAEgD,CAAG;AAC/B,QAAAqD,EAASjH,CAAI;AAAA,MACjB;AAAA,EAER;AAAA,EACA,4BAA4B;AACpB,QAAA,KAAK,UAAU,kBAAkB;AACjC,WAAK,mBAAmB,KAAK,UAAU,eAAe,CAACA,MAAS;AACvD,aAAA,iBAAiBA,EAAK,UAAU;AAAA,UACjC,cAAc;AAAA,UACd,aAAa;AAAA,UACb,OAAO;AAAA,QAAA,CACV;AAAA,MAAA,CACJ;AAAA,SAEA;AACG,UAAA,CAAC,KAAK,UAAU;AAChB;AACC,WAAA,iBAAiB,KAAK,UAAU,cAAc;AAAA,QAC/C,cAAc;AAAA,QACd,aAAa;AAAA,QACb,OAAO;AAAA,MAAA,CACV;AAAA,IACL;AAAA,EACJ;AAAA,EACA,WAAWmB,GAAUC,GAAe;AAC3B,SAAA,OAAO,KAAKD,GAAUC,CAAa;AAAA,EAC5C;AAAA,EACA,cAAc;AACV,SAAK,MAAM;EACf;AAAA,EACA,mBAAmB;AACf,SAAK,WAAW;EACpB;AAAA,EACA,gBAAgB;AACZ,SAAK,QAAQ;EACjB;AAAA,EACA,WAAWR,GAAKgD,GAAK;AACjB,SAAK,KAAKhD,CAAG,EAAEgD,CAAG,EAAE,OAAO,IAAI;AAAA,EACnC;AAAA,EACA,SAASmB,GAAM;AACX,UAAMuC,IAAavC,EAAK,QAClBwC,IAAaxC,EAAK,CAAC,IAAI,KAAK,KAAK,CAAC,EAAE,SAAS;AACnD,SAAK,OAAO;AACZ,UAAMyC,IAAgB,CAAA;AACtB,aAAS5G,IAAM,GAAGA,IAAM0G,GAAY1G,KAAO;AACvC,YAAMoE,IAAW,CAAA;AACjB,eAASpB,IAAM,GAAGA,IAAM2D,GAAY3D,KAAO;AACvC,cAAM5D,IAAO+E,EAAKnE,CAAG,EAAEgD,CAAG;AACjB,QAAAoB,EAAA,KAAK,IAAI9B,EAAK;AAAA,UACnB,cAAclD,EAAK;AAAA,UACnB,UAAUA,EAAK;AAAA,UACf,aAAaA,EAAK;AAAA,UAClB,OAAOA,EAAK;AAAA,UACZ,OAAOA,EAAK;AAAA,QACf,CAAA,CAAC;AAAA,MACN;AACA,MAAAwH,EAAc,KAAKxC,CAAQ;AAAA,IAC/B;AACA,gBAAK,OAAOwC,GACZ,KAAK,UAAU,eAAe,MAC9B,KAAK,UAAU,gBAAgB,MAC/B,KAAK,SAAS,KAAK,mBAAmBA,GAAe,KAAK,OAAO,IAAI,GAChE,KAAA,QAAQ,KAAK,mBAClB,KAAK,SAAS,sBACd,KAAK,WAAW,IAAIhD,EAAS,MAAM,KAAK,SAAS,0BAA0B,GAC3E,KAAK,YAAY,GACV;AAAA,EACX;AAAA,EACA,mBAAmBO,GAAM0C,GAAM;AACrB,UAAA1D,IAAagB,EAAK,SAAS,GAC3BjB,IAAaiB,EAAK,CAAC,IAAIA,EAAK,CAAC,EAAE,SAAS,GACxCH,IAAO,CAAA;AACb,aAAShE,IAAM,GAAGA,IAAMmD,GAAYnD;AAC3B,MAAAgE,EAAA,KAAK,IAAIF,EAAI;AAAA,QACd,QAAQ;AAAA,QACR,OAAO,OAAO9D,CAAG;AAAA,MACpB,CAAA,CAAC;AAEN,UAAMiE,IAAU,CAAA;AAChB,aAASjB,IAAM,GAAGA,IAAME,GAAYF;AACxB,MAAAiB,EAAA,KAAK,IAAIJ,EAAO;AAAA,QACpB,OAAO;AAAA,QACP,OAAO,OAAOb,CAAG;AAAA,MACpB,CAAA,CAAC;AAQC,WANQ,IAAIU,EAAO;AAAA,MACtB,MAAAmD;AAAA,MACA,MAAA7C;AAAA,MACA,SAAAC;AAAA,MACA,aAAa;AAAA,IAAA,CAChB;AAAA,EAEL;AAAA,EACA,gBAAgB;AACN,UAAAyC,IAAa,KAAK,KAAK,QACvBC,IAAa,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,EAAE,SAAS,GAClDG,IAAa,CAAA;AACnB,aAAS9G,IAAM,GAAGA,IAAM0G,GAAY1G,KAAO;AACvC,YAAMoE,IAAW,CAAA;AACjB,eAASpB,IAAM,GAAGA,IAAM2D,GAAY3D;AACvB,QAAAoB,EAAA,KAAK,KAAK,KAAKpE,CAAG,EAAEgD,CAAG,EAAE,qBAAqB;AAE3D,MAAA8D,EAAW,KAAK1C,CAAQ;AAAA,IAC5B;AACO,WAAA0C;AAAA,EACX;AACJ;"} \ No newline at end of file diff --git a/dist/modules/config.d.ts b/dist/modules/config.d.ts index 0384c7b..217aea6 100644 --- a/dist/modules/config.d.ts +++ b/dist/modules/config.d.ts @@ -1,9 +1,14 @@ +import { Cell } from "./cell"; import { Column } from "./column"; import { Row } from "./row"; +import { Selection } from "./selection"; export interface ViewProperties { width: number; height: number; } +export type CellClickEvent = (event: MouseEvent, cell: Cell) => void; +export type SelectionChangeEvent = (selection: Selection) => void; +export type CellChangeEvent = (cell: Cell) => void; export type ConfigProperties = { /** Please, end it with '_' symbol. * @@ -14,6 +19,9 @@ export type ConfigProperties = { rows: Row[]; columns: Column[]; view: ViewProperties; + onCellClick?: CellClickEvent | null; + onSelectionChange?: SelectionChangeEvent | null; + onCellChange?: CellChangeEvent | null; }; export type SheetConfigConstructorProps = { rows: Row[]; @@ -23,5 +31,8 @@ export declare class Config { rows: Row[]; columns: Column[]; view: ViewProperties; + onCellClick: ((event: MouseEvent, cell: Cell) => void) | null; + onSelectonChange: SelectionChangeEvent | null; + onCellChange: CellChangeEvent | null; constructor(props: ConfigProperties); } diff --git a/dist/modules/events.d.ts b/dist/modules/events.d.ts new file mode 100644 index 0000000..a348142 --- /dev/null +++ b/dist/modules/events.d.ts @@ -0,0 +1,31 @@ +import { Scroller } from "../components/scroller"; +import Spreadsheet, { Cell, CellConstructorProps, Selection } from "../main"; +export declare enum EventTypes { + CELL_CLICK = "CELL_CLICK", + SELECTION_CHANGE = "CHANGE_SELECTION", + CELL_CHANGE = "CELL_CHANGE" +} +export type CellClickEvent = { + type: EventTypes.CELL_CLICK; + event: MouseEvent; + scroller: Scroller; +}; +export type ChangeSelectionEvent = { + type: EventTypes.SELECTION_CHANGE; + selection: Selection; + enableCallback?: boolean; +}; +export type ChangeCellEvent = { + type: EventTypes.CELL_CHANGE; + cell: Cell; + values: Partial>; +}; +export type ActionTypes = CellClickEvent | ChangeSelectionEvent | ChangeCellEvent; +export declare class Events { + root: Spreadsheet; + constructor(root: Spreadsheet); + dispatch(action: ActionTypes): void; + private cellClick; + private changeSelection; + private changeCellValues; +} diff --git a/dist/style.css b/dist/style.css index c705f0b..bfb5db3 100644 --- a/dist/style.css +++ b/dist/style.css @@ -1 +1 @@ -body{padding:0;margin:0}.modern_sc_content{position:absolute}.modern_sc_spreadsheet_container{position:relative;isolation:isolate;border:2px solid black}.modern_sc_sheet{display:block;contain:strict}.modern_sc_scroller{position:absolute;overflow:scroll;box-sizing:border-box;transform:translateZ(0)}.modern_sc_scroller:focus{outline:none}.modern_sc_editor{position:absolute;box-sizing:border-box;font-size:16px;font-family:Arial,Helvetica,sans-serif}.modern_sc_hide{visibility:hidden} +body{padding:0;margin:0}.modern_sc_spreadsheet_container{position:relative;isolation:isolate;border:2px solid black}.modern_sc_content{position:absolute}.modern_sc_sheet{display:block;contain:strict}.modern_sc_scroller{position:absolute;overflow:scroll;box-sizing:border-box;transform:translateZ(0)}.modern_sc_scroller:focus{outline:none}.modern_sc_editor{position:absolute;box-sizing:border-box;font-size:16px;font-family:Arial,Helvetica,sans-serif}.modern_sc_hide{visibility:hidden} diff --git a/dist/utils/position.d.ts b/dist/utils/position.d.ts new file mode 100644 index 0000000..34fba7e --- /dev/null +++ b/dist/utils/position.d.ts @@ -0,0 +1,3 @@ +import { BaseSelectionType, RangeSelectionType } from "../main"; +export declare function checkEqualRanges(range1: RangeSelectionType, range2: RangeSelectionType): boolean; +export declare function checkEqualCellSelections(selection1: BaseSelectionType, selection2: BaseSelectionType): boolean;