UNPKG

@silentsheet/react

Version:
1 lines 24.9 kB
{"version":3,"sources":["../src/SilentSheet.tsx"],"names":["widths","backgrounds","formatTime","seconds","mins","secs","SilentSheet","placeholder","onChange","instance","useRef","CoreSilentSheet","uiState","setUIState","useState","stats","setStats","actions","textareaRef","timeoutRef","updateUIState","useCallback","updateStats","text","trimmedText","words","chars","saveContent","content","handleContentChange","textarea","lines","prevLines","useEffect","unsubscribe","handleContentBlur","jsx","jsxs","cursorPosition","selectionEnd","currentPos","currentLineEnd","line","clickPosition","selectionStart","FiCopy","blob","url","FiDownload","FiTrash2"],"mappings":"uMAKMA,IAAAA,CAAAA,CAA+B,CACnC,KAAO,CAAA,KAAA,CACP,OAAQ,KACR,CAAA,KAAA,CAAO,KACP,CAAA,IAAA,CAAM,MACR,CAAA,CAEMC,EAAqC,CACzC,KAAA,CAAO,SACP,CAAA,KAAA,CAAO,SACP,CAAA,KAAA,CAAO,SACT,CAOMC,CAAAA,CAAAA,CAAcC,CAA4B,EAAA,CAC9C,IAAMC,CAAAA,CAAO,KAAK,KAAMD,CAAAA,CAAAA,CAAU,EAAE,CAC9BE,CAAAA,CAAAA,CAAOF,EAAU,EACvB,CAAA,OAAO,CAAGC,EAAAA,CAAAA,CAAK,QAAS,EAAA,CAAE,SAAS,CAAG,CAAA,GAAG,CAAC,CAAA,CAAA,EAAIC,CAAK,CAAA,QAAA,GAAW,QAAS,CAAA,CAAA,CAAG,GAAG,CAAC,CAChF,CAAA,CAAA,CAEaC,EAA0C,CAAC,CACtD,YAAAC,CAAc,CAAA,0BAAA,CACd,SAAAC,CACF,CAAA,GAAM,CACJ,IAAMC,CAAWC,CAAAA,MAAAA,CAAO,IAAIC,WAAiB,CAAA,CACvC,CAACC,CAAAA,CAASC,CAAU,CAAA,CAAIC,SAASL,CAAS,CAAA,OAAA,CAAQ,QAAS,EAAC,CAC5D,CAAA,CAACM,EAAOC,CAAQ,CAAA,CAAIF,SAAS,CAAE,KAAA,CAAO,EAAG,KAAO,CAAA,CAAE,CAAC,CAAA,CACnDG,CAAUR,CAAAA,CAAAA,CAAS,QAAQ,UAAW,EAAA,CACtCS,CAAcR,CAAAA,MAAAA,CAA4B,IAAI,CAAA,CAC9CS,EAAaT,MAAuB,EAAA,CAEpCU,CAAgBC,CAAAA,WAAAA,CAAY,IAAM,CACtCR,EAAWJ,CAAS,CAAA,OAAA,CAAQ,UAAU,EACxC,EAAG,EAAE,CAECa,CAAAA,CAAAA,CAAcD,WAAaE,CAAAA,CAAAA,EAAiB,CAChD,IAAMC,CAAAA,CAAcD,CAAK,CAAA,IAAA,EACnBE,CAAAA,CAAAA,CAAQD,EAAcA,CAAY,CAAA,KAAA,CAAM,KAAK,CAAA,CAAE,MAAS,CAAA,CAAA,CACxDE,EAAQH,CAAK,CAAA,MAAA,CACnBP,EAAS,CAAE,KAAA,CAAAS,EAAO,KAAAC,CAAAA,CAAM,CAAC,EAC3B,CAAG,CAAA,EAAE,CAECC,CAAAA,CAAAA,CAAcN,WAAaO,CAAAA,CAAAA,EAAoB,CACnDX,CAAAA,CAAQ,WAAWW,CAAO,CAAA,CAC1BX,CAAQ,CAAA,WAAA,GACV,CAAA,CAAG,CAACA,CAAO,CAAC,EAENY,CAAsBR,CAAAA,WAAAA,CAAa,GAA8C,CAKrF,GAJIF,CAAW,CAAA,OAAA,EACb,YAAaA,CAAAA,CAAAA,CAAW,OAAO,CAG7BP,CAAAA,CAAAA,CAAQ,aAAe,CAAA,CACzB,IAAMkB,CAAAA,CAAW,EAAE,MACbC,CAAAA,CAAAA,CAAQD,CAAS,CAAA,KAAA,CAAM,KAAM,CAAA;AAAA,CAAI,CACjCE,CAAAA,CAAAA,CAAYpB,CAAQ,CAAA,OAAA,CAAQ,KAAM,CAAA;AAAA,CAAI,CAAA,CAG5C,IAAS,IAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAIoB,EAAU,MAAS,CAAA,CAAA,CAAG,CACxC,EAAA,CAAA,GAAI,CAAID,CAAAA,CAAAA,CAAM,QAAUA,CAAM,CAAA,CAAC,CAAMC,GAAAA,CAAAA,CAAU,CAAC,CAAA,CAAG,CAEjDF,CAAAA,CAAS,KAAQlB,CAAAA,CAAAA,CAAQ,OACzB,CAAA,MACF,CAEJ,CAEA,IAAMW,CAAO,CAAA,CAAA,CAAE,MAAO,CAAA,KAAA,CACtBD,CAAYC,CAAAA,CAAI,EAChBf,CAAWe,GAAAA,CAAI,CACfJ,CAAAA,CAAAA,CAAW,OAAU,CAAA,UAAA,CAAW,IAAM,CACpCQ,CAAAA,CAAYJ,CAAI,EAClB,CAAG,CAAA,GAAI,EACT,CAAA,CAAG,CAACI,CAAAA,CAAaL,CAAad,CAAAA,CAAAA,CAAUI,CAAQ,CAAA,aAAA,CAAeA,EAAQ,OAAO,CAAC,CAE/EqB,CAAAA,SAAAA,CAAU,IAAM,CACdX,EAAYV,CAAQ,CAAA,OAAO,EAC7B,CAAA,CAAG,CAACA,CAAAA,CAAQ,QAASU,CAAW,CAAC,CAEjCW,CAAAA,SAAAA,CAAU,IACD,IAAM,CACPd,CAAAA,CAAW,OACb,EAAA,YAAA,CAAaA,CAAW,CAAA,OAAO,EAEnC,CAAA,CACC,EAAE,CAAA,CAELc,SAAU,CAAA,IAAM,CACd,IAAMC,CAAczB,CAAAA,CAAAA,CAAS,OAAQ,CAAA,aAAA,CAAcW,CAAa,CAAA,CAChE,OAAO,IAAMc,GACf,CAAA,CAAG,CAACd,CAAa,CAAC,CAAA,CAElB,IAAMe,CAAAA,CAAoBd,WAAY,CAAA,IAAM,CACtCH,CAAAA,CAAY,OACdS,EAAAA,CAAAA,CAAYT,EAAY,OAAQ,CAAA,KAAK,EAEzC,CAAA,CAAG,CAACS,CAAW,CAAC,CAEhB,CAAA,OACES,GAAC,CAAA,KAAA,CAAA,CACC,SAAU,CAAA,kBAAA,CACV,aAAYxB,CAAQ,CAAA,KAAA,CACpB,KAAO,CAAA,CACL,UAAYX,CAAAA,CAAAA,CAAYW,CAAQ,CAAA,KAAK,CACrC,CAAA,KAAA,CAAOA,CAAQ,CAAA,KAAA,GAAU,OAAU,CAAA,SAAA,CAAY,SACjD,CAEA,CAAA,QAAA,CAAAyB,IAAC,CAAA,KAAA,CAAA,CACC,SAAU,CAAA,WAAA,CACV,MAAO,CACL,KAAA,CAAOrC,CAAOY,CAAAA,CAAAA,CAAQ,IAAI,CAC5B,EAEA,QAAAwB,CAAAA,CAAAA,GAAAA,CAAC,GACC,CAAA,CAAA,IAAA,CAAK,6CACL,CAAA,MAAA,CAAO,QACP,CAAA,GAAA,CAAI,qBACJ,CAAA,SAAA,CAAU,aACX,CAAA,QAAA,CAAA,aAAA,CAED,CACAA,CAAAA,GAAAA,CAAC,YACC,GAAKlB,CAAAA,CAAAA,CACL,SAAW,CAAA,CAAA,SAAA,EAAYN,CAAQ,CAAA,aAAA,CAAgB,iBAAmB,EAAE,CAAA,CAAA,CACpE,KAAO,CAAA,CACL,UAAYA,CAAAA,CAAAA,CAAQ,KACpB,QAAU,CAAA,CAAA,EAAGA,CAAQ,CAAA,QAAQ,CAC/B,EAAA,CAAA,CAAA,CACA,YAAcA,CAAAA,CAAAA,CAAQ,OACtB,CAAA,QAAA,CAAUiB,CACV,CAAA,MAAA,CAAQM,CACR,CAAA,SAAA,CAAW,GAAK,CACd,GAAIvB,CAAQ,CAAA,aAAA,CAAe,CACzB,IAAMkB,CAAW,CAAA,CAAA,CAAE,MACbQ,CAAAA,CAAAA,CAAiBR,CAAS,CAAA,cAAA,CAC1BS,CAAeT,CAAAA,CAAAA,CAAS,aAE9B,GAAIQ,CAAAA,GAAmBC,CACrB,CAAA,CAAA,GAAI,CAAE,CAAA,GAAA,GAAQ,WAAa,CAAA,CACzB,IAAMR,CAAAA,CAAQD,CAAS,CAAA,KAAA,CAAM,KAAM,CAAA;AAAA,CAAI,CAAA,CACnCU,CAAa,CAAA,CAAA,CACbC,CAAiB,CAAA,CAAA,CAErB,QAAWC,CAAQX,IAAAA,CAAAA,CAAO,CAExB,GADAU,CAAiBD,CAAAA,CAAAA,CAAaE,EAAK,MAC/BF,CAAAA,CAAAA,EAAcF,CAAkBA,EAAAA,CAAAA,EAAkBG,CAAgB,CAAA,CACpE,GAAIH,CAAAA,CAAiBE,CACnB,CAAA,OAEF,KACF,CACAA,CAAaC,CAAAA,CAAAA,CAAiB,EAChC,CACA,CAAA,CAAE,cAAe,GACnB,CAEA,CAAA,KAAA,CAAA,CAAE,cAAe,GAErB,CACF,CAAA,CACA,WAAa,CAAA,CAAA,EAAK,CAChB,GAAI7B,EAAQ,aAAe,CAAA,CACzB,IAAMkB,CAAAA,CAAW,CAAE,CAAA,MAAA,CACba,CAAgBb,CAAAA,CAAAA,CAAS,cACzBC,CAAAA,CAAAA,CAAQD,CAAS,CAAA,KAAA,CAAM,KAAM,CAAA;AAAA,CAAI,CAAA,CACnCU,CAAa,CAAA,CAAA,CAGjB,IAAS,IAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAIT,CAAM,CAAA,MAAA,CAAS,CAAG,CAAA,CAAA,EAAA,CACpCS,CAAcT,EAAAA,CAAAA,CAAM,CAAC,CAAA,CAAE,MAAS,CAAA,CAAA,CAI9BY,CAAgBH,CAAAA,CAAAA,GAClB,CAAE,CAAA,cAAA,EACF,CAAA,CAAA,CAAE,eAAgB,EAAA,CAElB,UAAW,CAAA,IAAM,CACfV,CAAAA,CAAS,iBAAkBA,CAAAA,CAAAA,CAAS,KAAM,CAAA,MAAA,CAAQA,CAAS,CAAA,KAAA,CAAM,MAAM,EACzE,CAAG,CAAA,CAAC,CAER,EAAA,CACF,CACA,CAAA,OAAA,CAAS,CAAK,EAAA,CACZ,GAAIlB,CAAAA,CAAQ,aAAe,CAAA,CACzB,IAAMkB,CAAAA,CAAW,CAAE,CAAA,MAAA,CACba,CAAgBb,CAAAA,CAAAA,CAAS,cACzBC,CAAAA,CAAAA,CAAQD,CAAS,CAAA,KAAA,CAAM,KAAM,CAAA;AAAA,CAAI,CAAA,CACnCU,CAAa,CAAA,CAAA,CAEjB,IAAS,IAAA,CAAA,CAAI,EAAG,CAAIT,CAAAA,CAAAA,CAAM,MAAS,CAAA,CAAA,CAAG,CACpCS,EAAAA,CAAAA,CAAAA,EAAcT,EAAM,CAAC,CAAA,CAAE,MAAS,CAAA,CAAA,CAG9BY,CAAgBH,CAAAA,CAAAA,GAClB,EAAE,cAAe,EAAA,CACjB,CAAE,CAAA,eAAA,EACFV,CAAAA,CAAAA,CAAS,kBAAkBA,CAAS,CAAA,KAAA,CAAM,MAAQA,CAAAA,CAAAA,CAAS,KAAM,CAAA,MAAM,GAE3E,CACF,CAAA,CACA,QAAU,CAAA,CAAA,EAAK,CACb,GAAIlB,EAAQ,aAAe,CAAA,CACzB,IAAMkB,CAAAA,CAAW,CAAE,CAAA,MAAA,CACbc,CAAiBd,CAAAA,CAAAA,CAAS,cAC1BC,CAAAA,CAAAA,CAAQD,CAAS,CAAA,KAAA,CAAM,KAAM,CAAA;AAAA,CAAI,CAAA,CACnCU,CAAa,CAAA,CAAA,CAEjB,IAAS,IAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAIT,CAAM,CAAA,MAAA,CAAS,CAAG,CAAA,CAAA,EAAA,CACpCS,CAAcT,EAAAA,CAAAA,CAAM,CAAC,CAAA,CAAE,MAAS,CAAA,CAAA,CAG9Ba,CAAiBJ,CAAAA,CAAAA,GACnB,CAAE,CAAA,cAAA,EACF,CAAA,CAAA,CAAE,eAAgB,EAAA,CAClB,qBAAsB,CAAA,IAAM,CAC1BV,CAAAA,CAAS,kBAAkBA,CAAS,CAAA,KAAA,CAAM,MAAQA,CAAAA,CAAAA,CAAS,KAAM,CAAA,MAAM,EACzE,CAAC,CAEL,EAAA,CACF,CACA,CAAA,WAAA,CAAalB,CAAQ,CAAA,aAAA,CAAgB,6CAAgDL,CAAAA,CAAAA,CACrF,UAAY,CAAA,KAAA,CACZ,YAAa,CAAA,KAAA,CACb,WAAY,CAAA,KAAA,CACZ,cAAe,CAAA,KAAA,CACf,YAAW,CAAA,OAAA,CACb,CACA8B,CAAAA,IAAAA,CAAC,KAAI,CAAA,CAAA,SAAA,CAAU,WACb,QAAAA,CAAAA,CAAAA,IAAAA,CAAC,KAAI,CAAA,CAAA,SAAA,CAAU,gBACb,CAAA,QAAA,CAAA,CAAAD,GAAC,CAAA,QAAA,CAAA,CACC,SAAU,CAAA,cAAA,CACV,OAASnB,CAAAA,CAAAA,CAAQ,WACjB,CAAA,KAAA,CAAO,CAAGL,EAAAA,CAAAA,CAAQ,YAAe,CAAA,MAAA,CAAS,OAAO,CAAA,MAAA,CAAA,CAEhD,QAAAV,CAAAA,CAAAA,CAAWU,CAAQ,CAAA,YAAY,CAClC,CAAA,CAAA,CACAyB,IAAC,CAAA,QAAA,CAAA,CACC,SAAU,CAAA,QAAA,CACV,MAAOzB,CAAQ,CAAA,aAAA,CAAgB,WAAc,CAAA,MAAA,CAC7C,QAAU,CAAA,CAAA,EAAK,CACR,CAAA,CAAE,MAAO,CAAA,KAAA,GAAU,WAAiBA,GAAAA,CAAAA,CAAQ,aAC/CK,EAAAA,CAAAA,CAAQ,mBAAoB,GAEhC,CACA,CAAA,KAAA,CAAOL,CAAQ,CAAA,aAAA,CAAgB,gDAAmD,CAAA,yBAAA,CAClF,KAAO,CAAA,CACL,YAAcX,CAAAA,CAAAA,CAAYW,CAAQ,CAAA,KAAK,CACvC,CAAA,cAAA,CAAgBA,EAAQ,KAAU,GAAA,OAAA,CAAU,SAAY,CAAA,SAC1D,CAEA,CAAA,QAAA,CAAA,CAAAwB,GAAC,CAAA,QAAA,CAAA,CAAO,KAAM,CAAA,MAAA,CAAO,QAAI,CAAA,MAAA,CAAA,CAAA,CACzBA,GAAC,CAAA,QAAA,CAAA,CAAO,KAAM,CAAA,WAAA,CAAY,QAAS,CAAA,WAAA,CAAA,CAAA,CAAA,CACrC,CACAC,CAAAA,IAAAA,CAAC,QACC,CAAA,CAAA,SAAA,CAAU,QACV,CAAA,KAAA,CAAOzB,CAAQ,CAAA,IAAA,CACf,QAAU,CAAA,CAAA,EAAK,CACbK,CAAAA,CAAQ,QAAQ,CAAE,CAAA,MAAA,CAAO,KAAa,CAAA,CACtCG,CAAc,GAChB,CACA,CAAA,KAAA,CAAM,aACN,CAAA,KAAA,CAAO,CACL,YAAA,CAAcnB,CAAYW,CAAAA,CAAAA,CAAQ,KAAK,CAAA,CACvC,cAAgBA,CAAAA,CAAAA,CAAQ,KAAU,GAAA,OAAA,CAAU,SAAY,CAAA,SAC1D,CAEA,CAAA,QAAA,CAAA,CAAAwB,GAAC,CAAA,QAAA,CAAA,CAAO,KAAM,CAAA,OAAA,CAAQ,QAAK,CAAA,OAAA,CAAA,CAAA,CAC3BA,IAAC,QAAO,CAAA,CAAA,KAAA,CAAM,YAAa,CAAA,QAAA,CAAA,YAAA,CAAU,CACrCA,CAAAA,GAAAA,CAAC,QAAO,CAAA,CAAA,KAAA,CAAM,WAAY,CAAA,QAAA,CAAA,WAAA,CAAS,CACrC,CAAA,CAAA,CAAA,CACAC,IAAC,CAAA,KAAA,CAAA,CAAI,SAAU,CAAA,mBAAA,CACb,QAAAD,CAAAA,CAAAA,GAAAA,CAAC,OACC,CAAA,CAAA,IAAA,CAAK,OACL,CAAA,SAAA,CAAU,OACV,CAAA,GAAA,CAAI,IACJ,CAAA,GAAA,CAAI,IACJ,CAAA,KAAA,CAAOxB,CAAQ,CAAA,QAAA,CACf,QAAU,CAAA,CAAA,EAAK,CACbK,CAAAA,CAAQ,WAAY,CAAA,MAAA,CAAO,CAAE,CAAA,MAAA,CAAO,KAAK,CAAC,CAC1CG,CAAAA,CAAAA,GACF,CAAA,CACA,KAAM,CAAA,WAAA,CACR,CACAgB,CAAAA,GAAAA,CAAC,MAAK,CAAA,CAAA,SAAA,CAAU,iBAAmB,CAAA,QAAA,CAAAxB,CAAQ,CAAA,QAAA,CAAS,CACtD,CAAA,CAAA,CAAA,CAAA,CACF,CACAyB,CAAAA,IAAAA,CAAC,KAAI,CAAA,CAAA,SAAA,CAAU,gBACb,CAAA,QAAA,CAAA,CAAAA,KAAC,QACC,CAAA,CAAA,SAAA,CAAU,QACV,CAAA,KAAA,CAAOzB,CAAQ,CAAA,KAAA,CACf,QAAU,CAAA,CAAA,EAAK,CACbK,CAAAA,CAAQ,QAAS,CAAA,CAAA,CAAE,MAAO,CAAA,KAAc,CACxCG,CAAAA,CAAAA,GACF,CAAA,CACA,KAAM,CAAA,OAAA,CACN,KAAO,CAAA,CACL,YAAcnB,CAAAA,CAAAA,CAAYW,CAAQ,CAAA,KAAK,CACvC,CAAA,cAAA,CAAgBA,CAAQ,CAAA,KAAA,GAAU,QAAU,SAAY,CAAA,SAC1D,CAEA,CAAA,QAAA,CAAA,CAAAwB,GAAC,CAAA,QAAA,CAAA,CAAO,KAAM,CAAA,OAAA,CAAQ,QAAK,CAAA,OAAA,CAAA,CAAA,CAC3BA,GAAC,CAAA,QAAA,CAAA,CAAO,KAAM,CAAA,OAAA,CAAQ,QAAK,CAAA,OAAA,CAAA,CAAA,CAC3BA,GAAC,CAAA,QAAA,CAAA,CAAO,KAAM,CAAA,OAAA,CAAQ,QAAK,CAAA,OAAA,CAAA,CAAA,CAAA,CAC7B,CACAC,CAAAA,IAAAA,CAAC,QACC,CAAA,CAAA,SAAA,CAAU,QACV,CAAA,KAAA,CAAOzB,CAAQ,CAAA,IAAA,CACf,SAAU,CAAK,EAAA,CACbK,CAAQ,CAAA,OAAA,CAAQ,CAAE,CAAA,MAAA,CAAO,KAAa,CAAA,CACtCG,CAAc,GAChB,CACA,CAAA,KAAA,CAAM,OACN,CAAA,KAAA,CAAO,CACL,YAAA,CAAcnB,CAAYW,CAAAA,CAAAA,CAAQ,KAAK,CAAA,CACvC,cAAgBA,CAAAA,CAAAA,CAAQ,KAAU,GAAA,OAAA,CAAU,SAAY,CAAA,SAC1D,CAEA,CAAA,QAAA,CAAA,CAAAwB,GAAC,CAAA,QAAA,CAAA,CAAO,MAAM,OAAQ,CAAA,QAAA,CAAA,OAAA,CAAK,CAC3BA,CAAAA,GAAAA,CAAC,QAAO,CAAA,CAAA,KAAA,CAAM,QAAS,CAAA,QAAA,CAAA,QAAA,CAAM,CAC7BA,CAAAA,GAAAA,CAAC,QAAO,CAAA,CAAA,KAAA,CAAM,OAAQ,CAAA,QAAA,CAAA,OAAA,CAAK,CAC3BA,CAAAA,GAAAA,CAAC,QAAO,CAAA,CAAA,KAAA,CAAM,MAAO,CAAA,QAAA,CAAA,MAAA,CAAI,CAC3B,CAAA,CAAA,CAAA,CAAA,CACF,CACAC,CAAAA,IAAAA,CAAC,KAAI,CAAA,CAAA,SAAA,CAAU,gBACb,CAAA,QAAA,CAAA,CAAAD,GAAC,CAAA,QAAA,CAAA,CACC,UAAU,aACV,CAAA,OAAA,CAAS,IAAM,CACTlB,CAAY,CAAA,OAAA,EACd,SAAU,CAAA,SAAA,CAAU,SAAUA,CAAAA,CAAAA,CAAY,OAAQ,CAAA,KAAK,EAE3D,CAAA,CACA,KAAM,CAAA,mBAAA,CAEN,QAAAkB,CAAAA,GAAAA,CAACS,MAAA,CAAA,EAAO,CACV,CAAA,CAAA,CACAT,GAAC,CAAA,QAAA,CAAA,CACC,SAAU,CAAA,aAAA,CACV,OAAS,CAAA,IAAM,CACb,GAAIlB,EAAY,OAAS,CAAA,CACvB,IAAM4B,CAAAA,CAAO,IAAI,IAAA,CAAK,CAAC5B,CAAAA,CAAY,OAAQ,CAAA,KAAK,CAAG,CAAA,CAAE,IAAM,CAAA,YAAa,CAAC,CAAA,CACnE6B,CAAM,CAAA,GAAA,CAAI,eAAgBD,CAAAA,CAAI,CAC9B,CAAA,CAAA,CAAI,QAAS,CAAA,aAAA,CAAc,GAAG,CAAA,CACpC,CAAE,CAAA,IAAA,CAAOC,CACT,CAAA,CAAA,CAAE,SAAW,iBACb,CAAA,CAAA,CAAE,KAAM,EAAA,CACR,GAAI,CAAA,eAAA,CAAgBA,CAAG,EACzB,CACF,CAAA,CACA,KAAM,CAAA,kBAAA,CAEN,QAAAX,CAAAA,GAAAA,CAACY,UAAA,CAAA,EAAW,CACd,CAAA,CAAA,CACAZ,GAAC,CAAA,QAAA,CAAA,CACC,SAAU,CAAA,aAAA,CACV,OAAS,CAAA,IAAM,CACTlB,CAAAA,CAAY,OACdA,GAAAA,CAAAA,CAAY,OAAQ,CAAA,KAAA,CAAQ,EAC5BD,CAAAA,CAAAA,CAAQ,YAAa,EAAA,CACrBG,CAAc,EAAA,EAElB,CACA,CAAA,KAAA,CAAM,eAEN,CAAA,QAAA,CAAAgB,GAACa,CAAAA,QAAAA,CAAA,EAAS,CAAA,CACZ,CACF,CAAA,CAAA,CAAA,CAAA,CACF,CACAZ,CAAAA,IAAAA,CAAC,KAAI,CAAA,CAAA,SAAA,CAAU,YACZ,CAAA,QAAA,CAAA,CAAAtB,CAAM,CAAA,KAAA,CAAM,UAASA,CAAAA,CAAAA,CAAM,KAAM,CAAA,aAAA,CAAA,CACpC,CACF,CAAA,CAAA,CAAA,CACF,CAEJ","file":"index.mjs","sourcesContent":["import React, { useState, useCallback, useRef, useEffect } from 'react';\nimport { SilentSheet as CoreSilentSheet, Size, Theme, Font } from '@silentsheet/core';\nimport { FiCopy, FiDownload, FiTrash2 } from 'react-icons/fi';\nimport './styles.css';\n\nconst widths: Record<Size, string> = {\n small: '50%',\n medium: '75%',\n large: '90%',\n full: '100%'\n};\n\nconst backgrounds: Record<Theme, string> = {\n sepia: '#f9f7ee',\n light: '#ffffff',\n night: '#1a1a1a'\n};\n\ninterface SilentSheetProps {\n placeholder?: string;\n onChange?: (text: string) => void;\n}\n\nconst formatTime = (seconds: number): string => {\n const mins = Math.floor(seconds / 60);\n const secs = seconds % 60;\n return `${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;\n};\n\nexport const SilentSheet: React.FC<SilentSheetProps> = ({ \n placeholder = \"Begin your story here...\",\n onChange \n}) => {\n const instance = useRef(new CoreSilentSheet());\n const [uiState, setUIState] = useState(instance.current.getState());\n const [stats, setStats] = useState({ words: 0, chars: 0 });\n const actions = instance.current.getActions();\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const timeoutRef = useRef<NodeJS.Timeout>();\n\n const updateUIState = useCallback(() => {\n setUIState(instance.current.getState());\n }, []);\n\n const updateStats = useCallback((text: string) => {\n const trimmedText = text.trim();\n const words = trimmedText ? trimmedText.split(/\\s+/).length : 0;\n const chars = text.length;\n setStats({ words, chars });\n }, []);\n\n const saveContent = useCallback((content: string) => {\n actions.setContent(content);\n actions.saveContent();\n }, [actions]);\n\n const handleContentChange = useCallback((e: React.ChangeEvent<HTMLTextAreaElement>) => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n \n if (uiState.hemingwayMode) {\n const textarea = e.target;\n const lines = textarea.value.split('\\n');\n const prevLines = uiState.content.split('\\n');\n \n // Check if any previous lines were modified\n for (let i = 0; i < prevLines.length - 1; i++) {\n if (i < lines.length && lines[i] !== prevLines[i]) {\n // Revert the change\n textarea.value = uiState.content;\n return;\n }\n }\n }\n \n const text = e.target.value;\n updateStats(text);\n onChange?.(text);\n timeoutRef.current = setTimeout(() => {\n saveContent(text);\n }, 1000);\n }, [saveContent, updateStats, onChange, uiState.hemingwayMode, uiState.content]);\n\n useEffect(() => {\n updateStats(uiState.content);\n }, [uiState.content, updateStats]);\n\n useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, []);\n\n useEffect(() => {\n const unsubscribe = instance.current.subscribeToUI(updateUIState);\n return () => unsubscribe();\n }, [updateUIState]);\n\n const handleContentBlur = useCallback(() => {\n if (textareaRef.current) {\n saveContent(textareaRef.current.value);\n }\n }, [saveContent]);\n\n return (\n <div \n className=\"silentsheet-root\"\n data-theme={uiState.theme}\n style={{\n background: backgrounds[uiState.theme],\n color: uiState.theme === 'night' ? '#ffffff' : '#000000'\n }}\n >\n <div \n className=\"container\"\n style={{\n width: widths[uiState.size]\n }}\n >\n <a\n href=\"https://github.com/hamzasaleem2/silentsheet\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"github-link\"\n >\n open source\n </a>\n <textarea\n ref={textareaRef}\n className={`textarea ${uiState.hemingwayMode ? 'hemingway-mode' : ''}`}\n style={{\n fontFamily: uiState.font,\n fontSize: `${uiState.fontSize}px`\n }}\n defaultValue={uiState.content}\n onChange={handleContentChange}\n onBlur={handleContentBlur}\n onKeyDown={e => {\n if (uiState.hemingwayMode) {\n const textarea = e.target as HTMLTextAreaElement;\n const cursorPosition = textarea.selectionStart;\n const selectionEnd = textarea.selectionEnd;\n \n if (cursorPosition === selectionEnd) {\n if (e.key === 'Backspace') {\n const lines = textarea.value.split('\\n');\n let currentPos = 0;\n let currentLineEnd = 0;\n \n for (const line of lines) {\n currentLineEnd = currentPos + line.length;\n if (currentPos <= cursorPosition && cursorPosition <= currentLineEnd) {\n if (cursorPosition > currentPos) {\n return;\n }\n break;\n }\n currentPos = currentLineEnd + 1;\n }\n e.preventDefault();\n }\n } else {\n e.preventDefault();\n }\n }\n }}\n onMouseDown={e => {\n if (uiState.hemingwayMode) {\n const textarea = e.target as HTMLTextAreaElement;\n const clickPosition = textarea.selectionStart;\n const lines = textarea.value.split('\\n');\n let currentPos = 0;\n \n // Find the last line's starting position\n for (let i = 0; i < lines.length - 1; i++) {\n currentPos += lines[i].length + 1;\n }\n \n // If click is before the last line, prevent it\n if (clickPosition < currentPos) {\n e.preventDefault();\n e.stopPropagation();\n // Force cursor to the end\n setTimeout(() => {\n textarea.setSelectionRange(textarea.value.length, textarea.value.length);\n }, 0);\n }\n }\n }}\n onClick={e => {\n if (uiState.hemingwayMode) {\n const textarea = e.target as HTMLTextAreaElement;\n const clickPosition = textarea.selectionStart;\n const lines = textarea.value.split('\\n');\n let currentPos = 0;\n \n for (let i = 0; i < lines.length - 1; i++) {\n currentPos += lines[i].length + 1;\n }\n \n if (clickPosition < currentPos) {\n e.preventDefault();\n e.stopPropagation();\n textarea.setSelectionRange(textarea.value.length, textarea.value.length);\n }\n }\n }}\n onSelect={e => {\n if (uiState.hemingwayMode) {\n const textarea = e.target as HTMLTextAreaElement;\n const selectionStart = textarea.selectionStart;\n const lines = textarea.value.split('\\n');\n let currentPos = 0;\n \n for (let i = 0; i < lines.length - 1; i++) {\n currentPos += lines[i].length + 1;\n }\n \n if (selectionStart < currentPos) {\n e.preventDefault();\n e.stopPropagation();\n requestAnimationFrame(() => {\n textarea.setSelectionRange(textarea.value.length, textarea.value.length);\n });\n }\n }\n }}\n placeholder={uiState.hemingwayMode ? \"Write freely. Each line is a fresh start...\" : placeholder}\n spellCheck={false}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n autoCapitalize=\"off\"\n data-gramm=\"false\"\n />\n <div className=\"controls\">\n <div className=\"controls-group\">\n <button\n className=\"timer-button\"\n onClick={actions.toggleTimer}\n title={`${uiState.timerRunning ? 'Stop' : 'Start'} Timer`}\n >\n {formatTime(uiState.timerSeconds)}\n </button>\n <select\n className=\"select\"\n value={uiState.hemingwayMode ? \"hemingway\" : \"edit\"}\n onChange={e => {\n if ((e.target.value === \"hemingway\") !== uiState.hemingwayMode) {\n actions.toggleHemingwayMode();\n }\n }}\n title={uiState.hemingwayMode ? \"Hemingway Mode: Write forward, no looking back\" : \"Edit Mode: Free editing\"}\n style={{\n '--bg-color': backgrounds[uiState.theme],\n '--text-color': uiState.theme === 'night' ? '#ffffff' : '#000000'\n } as React.CSSProperties}\n >\n <option value=\"edit\">Edit</option>\n <option value=\"hemingway\">Hemingway</option>\n </select>\n <select\n className=\"select\"\n value={uiState.font}\n onChange={e => {\n actions.setFont(e.target.value as Font);\n updateUIState();\n }}\n title=\"Font Family\"\n style={{\n '--bg-color': backgrounds[uiState.theme],\n '--text-color': uiState.theme === 'night' ? '#ffffff' : '#000000'\n } as React.CSSProperties}\n >\n <option value=\"serif\">Serif</option>\n <option value=\"sans-serif\">Sans Serif</option>\n <option value=\"monospace\">Monospace</option>\n </select>\n <div className=\"font-size-control\">\n <input\n type=\"range\"\n className=\"range\"\n min=\"14\"\n max=\"28\"\n value={uiState.fontSize}\n onChange={e => {\n actions.setFontSize(Number(e.target.value));\n updateUIState();\n }}\n title=\"Font Size\"\n />\n <span className=\"font-size-value\">{uiState.fontSize}</span>\n </div>\n </div>\n <div className=\"controls-group\">\n <select\n className=\"select\"\n value={uiState.theme}\n onChange={e => {\n actions.setTheme(e.target.value as Theme);\n updateUIState();\n }}\n title=\"Theme\"\n style={{\n '--bg-color': backgrounds[uiState.theme],\n '--text-color': uiState.theme === 'night' ? '#ffffff' : '#000000'\n } as React.CSSProperties}\n >\n <option value=\"light\">Light</option>\n <option value=\"sepia\">Sepia</option>\n <option value=\"night\">Night</option>\n </select>\n <select\n className=\"select\"\n value={uiState.size}\n onChange={e => {\n actions.setSize(e.target.value as Size);\n updateUIState();\n }}\n title=\"Width\"\n style={{\n '--bg-color': backgrounds[uiState.theme],\n '--text-color': uiState.theme === 'night' ? '#ffffff' : '#000000'\n } as React.CSSProperties}\n >\n <option value=\"small\">Small</option>\n <option value=\"medium\">Medium</option>\n <option value=\"large\">Large</option>\n <option value=\"full\">Full</option>\n </select>\n </div>\n <div className=\"controls-group\">\n <button \n className=\"icon-button\"\n onClick={() => {\n if (textareaRef.current) {\n navigator.clipboard.writeText(textareaRef.current.value);\n }\n }}\n title=\"Copy to Clipboard\"\n >\n <FiCopy />\n </button>\n <button \n className=\"icon-button\"\n onClick={() => {\n if (textareaRef.current) {\n const blob = new Blob([textareaRef.current.value], { type: 'text/plain' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = 'silentsheet.txt';\n a.click();\n URL.revokeObjectURL(url);\n }\n }}\n title=\"Download as Text\"\n >\n <FiDownload />\n </button>\n <button \n className=\"icon-button\"\n onClick={() => {\n if (textareaRef.current) {\n textareaRef.current.value = '';\n actions.clearContent();\n updateUIState();\n }\n }}\n title=\"Clear Content\"\n >\n <FiTrash2 />\n </button>\n </div>\n </div>\n <div className=\"word-count\">\n {stats.words} words, {stats.chars} characters\n </div>\n </div>\n </div>\n );\n}; "]}