@frontlit/text-editor 0.1.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +60 -0
- package/dist/index.d.ts +135 -0
- package/dist/index.js +1474 -0
- package/dist/index.js.map +1 -0
- package/dist/prose.css +403 -0
- package/dist/styles.css +1058 -0
- package/dist/tokens.css +58 -0
- package/package.json +91 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/empty-doc.ts","../src/create-id.ts","../src/components/custom-code-mirror.tsx","../src/extensions.ts","../src/components/link-editor-popover.tsx","../src/toolbar.tsx","../src/bubble-menu.tsx","../src/lib/cn.ts","../src/image-picker.tsx","../src/editor.tsx","../src/extract-headings.ts","../src/extract-text-from-node.ts","../src/components/rendered-code-block.tsx","../src/text-renderer.tsx","../src/normalize-text-editor-content.ts","../src/extract-text-from-text-editor-content.ts","../src/truncate-text-editor-content.ts"],"names":["jsx","useState","useRef","useEffect","jsxs","LinkIcon","ListIcon","TableIcon","ImageIcon","Trash2","Bold","Italic","Underline","Code","useCallback","Fragment","json","React","Check","classes"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,IAAM,QAAA,GAAwB;AAAA,EAC1B,IAAA,EAAM,KAAA;AAAA,EACN,SAAS;AACb,CAAA;AAEA,IAAO,iBAAA,GAAQ;;;ACPR,SAAS,SAAS,WAAA,EAAqB;AAC1C,EAAA,OAAO,WAAA,CAAY,OAAA,CAAQ,KAAA,EAAO,GAAG,EAAE,WAAA,EAAY;AACvD;ACEO,IAAM,cAAA,GAAiB,KAAK,MAAA,CAAO;AAAA,EACtC,IAAA,EAAM,YAAA;AAAA,EACN,OAAA,EAAS,QAAA;AAAA,EACT,IAAA,EAAM,IAAA;AAAA,EAEN,UAAA,GAAa;AACT,IAAA,OAAO;AAAA,MACH,gBAAgB;AAAC,KACrB;AAAA,EACJ,CAAA;AAAA,EAEA,SAAA,GAAY;AACR,IAAA,OAAO;AAAA,MACH;AAAA,QACI,GAAA,EAAK;AAAA;AACT,KACJ;AAAA,EACJ,CAAA;AAAA,EAEA,UAAA,CAAW,EAAE,cAAA,EAAe,EAAG;AAC3B,IAAA,OAAO,CAAC,KAAA,EAAO,cAAA,EAAgB,CAAC,CAAA;AAAA,EACpC;AACJ,CAAC,CAAA;;;ACDD,QAAA,CAAS,gBAAA,CAAiB,cAAc,UAAU,CAAA;AAClD,QAAA,CAAS,gBAAA,CAAiB,cAAc,UAAU,CAAA;AAClD,QAAA,CAAS,gBAAA,CAAiB,QAAQ,IAAI,CAAA;AACtC,QAAA,CAAS,gBAAA,CAAiB,OAAO,GAAG,CAAA;AACpC,QAAA,CAAS,gBAAA,CAAiB,QAAQ,GAAG,CAAA;AAM9B,IAAM,mBAAmB,CAAC;AAAA,EAC7B;AACJ,CAAA,GAAsB,EAAC,KAAkB;AAAA,EACrC,WAAW,SAAA,CAAU;AAAA,IACjB,SAAA,EAAW,KAAA;AAAA;AAAA;AAAA;AAAA,IAIX,IAAA,EAAM,KAAA;AAAA,IACN,UAAA,EAAY,KAAA;AAAA,IACZ,SAAA,EAAW,KAAA;AAAA,IACX,OAAA,EAAS;AAAA,GACZ,CAAA;AAAA,EACD,YAAY,SAAA,CAAU;AAAA,IAClB,aAAa,WAAA,IAAe;AAAA,GAC/B,CAAA;AAAA,EACD,KAAK,SAAA,CAAU;AAAA,IACX,WAAA,EAAa,KAAA;AAAA,IACb,QAAA,EAAU,IAAA;AAAA,IACV,WAAA,EAAa;AAAA,GAChB,CAAA;AAAA,EACD,MAAM,SAAA,CAAU;AAAA,IACZ,SAAA,EAAW;AAAA,GACd,CAAA;AAAA,EACD,QAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAM,SAAA,CAAU;AAAA;AAAA;AAAA,IAGZ,WAAA,EAAa,IAAA;AAAA,IACb,cAAA,EAAgB;AAAA,MACZ,KAAA,EAAO;AAAA,KACX;AAAA,IACA,MAAA,EAAQ;AAAA,MACJ,OAAA,EAAS,IAAA;AAAA,MACT,UAAA,EAAY,CAAC,KAAA,EAAO,QAAA,EAAU,QAAQ,OAAO,CAAA;AAAA,MAC7C,yBAAA,EAA2B;AAAA;AAC/B,GACH,CAAA;AAAA,EACD,WAAW,SAAA,CAAU;AAAA,IACjB,KAAA,EAAO,wBAAA;AAAA,IACP,KAAA,EAAO;AAAA,GACV,CAAA;AAAA,EACD,SAAA;AAAA,EACA,kBAAkB,SAAA,CAAU;AAAA,IACxB;AAAA,GACH,CAAA;AAAA,EACD,QAAQ,MAAA,CAAO;AAAA,IACX,UAAA,CAAW,EAAE,IAAA,EAAM,cAAA,EAAe,EAAG;AACjC,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,SAAS,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,GACrD,KAAK,KAAA,CAAM,KAAA,GACX,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAC,CAAA;AAC3B,MAAA,MAAM,EAAA,GACF,OAAO,IAAA,CAAK,WAAA,KAAgB,WACtB,QAAA,CAAS,IAAA,CAAK,WAAW,CAAA,GACzB,MAAA;AAEV,MAAA,OAAO;AAAA,QACH,IAAI,KAAK,CAAA,CAAA;AAAA,QACT;AAAA,UACI,GAAG,cAAA;AAAA,UACH;AAAA,SACJ;AAAA,QACA;AAAA,OACJ;AAAA,IACJ;AAAA,GACH,CAAA;AAAA,EACD,SAAA;AAAA,EACA;AACJ;AC5FA,IAAM,oBAAoB,CAAC;AAAA,EACvB,MAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA,GAAU,OAAA;AAAA,EACV;AACJ,CAAA,KAAiD;AAC7C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,EAAE,CAAA;AAC7C,EAAA,MAAM,QAAA,GAAW,OAAgC,IAAI,CAAA;AACrD,EAAA,MAAM,iBAAA,GAAoB,OAA8B,IAAI,CAAA;AAE5D,EAAA,MAAM,kBAAA,GAAqB,CAAC,IAAA,KAAgC;AACxD,IAAA,iBAAA,CAAkB,OAAA,GAAU,IAAA;AAC5B,IAAA,IAAI,YAAA,EAAc;AACd,MAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AAAA,IAC3B;AAAA,EACJ,CAAA;AAEA,EAAA,SAAA,CAAU,MAAM;AACZ,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,aAAA,CAAc,MAAM,CAAA,CAAE,IAAA;AAC7C,IAAA,YAAA,CAAa,WAAW,EAAE,CAAA;AAAA,EAC9B,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,SAAA,CAAU,MAAM;AACZ,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,UAAA,CAAW,MAAM;AAClC,MAAA,QAAA,CAAS,SAAS,KAAA,EAAM;AAAA,IAC5B,GAAG,EAAE,CAAA;AAEL,IAAA,OAAO,MAAM,MAAA,CAAO,YAAA,CAAa,KAAK,CAAA;AAAA,EAC1C,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAY,MAAM;AACpB,IAAA,MAAM,KAAA,GAAQ,UAAU,IAAA,EAAK;AAC7B,IAAA,IAAI,CAAC,KAAA,EAAO;AACR,MAAA,MAAA,CAAO,KAAA,GAAQ,KAAA,EAAM,CAAE,gBAAgB,MAAM,CAAA,CAAE,SAAA,EAAU,CAAE,GAAA,EAAI;AAAA,IACnE,CAAA,MAAO;AACH,MAAA,MAAA,CACK,KAAA,EAAM,CACN,KAAA,EAAM,CACN,eAAA,CAAgB,MAAM,CAAA,CACtB,OAAA,CAAQ,EAAE,IAAA,EAAM,KAAA,EAAO,EACvB,GAAA,EAAI;AAAA,IACb;AAEA,IAAA,OAAA,EAAQ;AAAA,EACZ,CAAA;AAEA,EAAA,MAAM,aAAa,MAAM;AACrB,IAAA,MAAA,CAAO,KAAA,GAAQ,KAAA,EAAM,CAAE,gBAAgB,MAAM,CAAA,CAAE,SAAA,EAAU,CAAE,GAAA,EAAI;AAC/D,IAAA,OAAA,EAAQ;AAAA,EACZ,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAAiD;AACpE,IAAA,IAAI,KAAA,CAAM,QAAQ,OAAA,EAAS;AACvB,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,SAAA,EAAU;AAAA,IACd;AAEA,IAAA,IAAI,KAAA,CAAM,QAAQ,QAAA,EAAU;AACxB,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,OAAA,EAAQ;AAAA,IACZ;AAAA,EACJ,CAAA;AAEA,EAAA,IAAI,YAAY,QAAA,EAAU;AACtB,IAAA,uBACI,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACG,GAAA,EAAK,kBAAA;AAAA,QACL,SAAA,EAAU,kFAAA;AAAA,QACV,WAAA,EAAa,CAAC,KAAA,KAAU,KAAA,CAAM,eAAA,EAAgB;AAAA,QAE9C,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACG,GAAA,EAAK,QAAA;AAAA,cACL,IAAA,EAAK,KAAA;AAAA,cACL,WAAA,EAAY,qBAAA;AAAA,cACZ,KAAA,EAAO,SAAA;AAAA,cACP,UAAU,CAAC,KAAA,KAAU,YAAA,CAAa,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,cACpD,SAAA,EAAW,aAAA;AAAA,cACX,SAAA,EAAU;AAAA;AAAA,WACd;AAAA,0BACA,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACG,IAAA,EAAK,QAAA;AAAA,cACL,YAAA,EAAW,qBAAA;AAAA,cACX,SAAA,EAAU,+HAAA;AAAA,cACV,OAAA,EAAS,OAAA;AAAA,cAET,QAAA,kBAAA,GAAA,CAAC,CAAA,EAAA,EAAE,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,WAC3B;AAAA,0BACA,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACG,IAAA,EAAK,QAAA;AAAA,cACL,YAAA,EAAW,aAAA;AAAA,cACX,SAAA,EAAU,+HAAA;AAAA,cACV,OAAA,EAAS,UAAA;AAAA,cAET,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,WAChC;AAAA,0BACA,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACG,IAAA,EAAK,QAAA;AAAA,cACL,YAAA,EAAW,YAAA;AAAA,cACX,SAAA,EAAU,kIAAA;AAAA,cACV,OAAA,EAAS,SAAA;AAAA,cAET,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA;AAC/B;AAAA;AAAA,KACJ;AAAA,EAER;AAEA,EAAA,uBACI,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,GAAA,EAAK,kBAAA;AAAA,MACL,SAAA,EAAU,gHAAA;AAAA,MAEV,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACX,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,2CAAA,EAA4C,QAAA,EAAA,UAAA,EAE7D,CAAA;AAAA,wBACA,GAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACG,GAAA,EAAK,QAAA;AAAA,YACL,IAAA,EAAK,KAAA;AAAA,YACL,WAAA,EAAY,qBAAA;AAAA,YACZ,KAAA,EAAO,SAAA;AAAA,YACP,UAAU,CAAC,KAAA,KAAU,YAAA,CAAa,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,YACpD,SAAA,EAAW,aAAA;AAAA,YACX,SAAA,EAAU;AAAA;AAAA,SACd;AAAA,wBACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qCAAA,EACX,QAAA,EAAA;AAAA,0BAAA,IAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACG,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAU,gIAAA;AAAA,cACV,OAAA,EAAS,OAAA;AAAA,cAET,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,CAAA,EAAA,EAAE,WAAU,SAAA,EAAU,CAAA;AAAA,gBAAE;AAAA;AAAA;AAAA,WAE7B;AAAA,0BACA,IAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACG,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAU,gIAAA;AAAA,cACV,OAAA,EAAS,UAAA;AAAA,cAET,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,MAAA,EAAA,EAAO,WAAU,SAAA,EAAU,CAAA;AAAA,gBAAE;AAAA;AAAA;AAAA,WAElC;AAAA,0BACA,IAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACG,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAU,+IAAA;AAAA,cACV,OAAA,EAAS,SAAA;AAAA,cAET,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,KAAA,EAAA,EAAM,WAAU,SAAA,EAAU,CAAA;AAAA,gBAAE;AAAA;AAAA;AAAA;AAEjC,SAAA,EACJ;AAAA,OAAA,EACJ;AAAA;AAAA,GACJ;AAER,CAAA;AAEA,IAAO,2BAAA,GAAQ,iBAAA;AC1If,IAAM,cAAA,GACF,gRAAA;AAEJ,SAAS,UAAA,CAAW;AAAA,EAChB,IAAA,EAAM,IAAA;AAAA,EACN,KAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA;AACJ,CAAA,EAMsB;AAClB,EAAA,uBACIA,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACG,IAAA,EAAK,QAAA;AAAA,MACL,YAAA,EAAY,KAAA;AAAA,MACZ,KAAA,EAAO,KAAA;AAAA,MACP,WAAW,CAAA,EAAG,cAAc,CAAA,CAAA,EACxB,MAAA,GACM,2DACA,+BACV,CAAA,CAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA;AAAA,MAEA,QAAA,kBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,GAC9B;AAER;AAEA,IAAM,cAAA,GAID;AAAA,EACD,EAAE,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,WAAA,EAAY;AAAA,EACzC,EAAE,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,IAAA,EAAM,OAAO,CAAA,EAAE;AAAA,EAC5C,EAAE,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,IAAA,EAAM,OAAO,CAAA,EAAE;AAAA,EAC5C,EAAE,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,IAAA,EAAM,OAAO,CAAA;AAC9C,CAAA;AAEA,SAAS,OAAA,GAA6B;AAClC,EAAA,uBAAOA,GAAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAW,IAAA,EAAC,WAAU,kCAAA,EAAmC,CAAA;AAC1E;AAEA,IAAM,UAAU,CAAC;AAAA,EACb,MAAA;AAAA,EACA,oBAAA;AAAA,EACA;AACJ,CAAA,KAA8C;AAC1C,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIC,SAAsB,IAAI,CAAA;AACpE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,CAAC,CAAA;AAC5C,EAAA,MAAM,UAAA,GAAaC,OAA8B,IAAI,CAAA;AAErD,EAAAC,UAAU,MAAM;AACZ,IAAA,IAAI,CAAC,eAAe,OAAO,MAAA;AAE3B,IAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAAsB;AACvC,MAAA,IACI,UAAA,CAAW,WACX,CAAC,UAAA,CAAW,QAAQ,QAAA,CAAS,KAAA,CAAM,MAAc,CAAA,EACnD;AACE,QAAA,gBAAA,CAAiB,IAAI,CAAA;AAAA,MACzB;AAAA,IACJ,CAAA;AACA,IAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAAyB;AAC5C,MAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,QAAA,EAAU,gBAAA,CAAiB,IAAI,CAAA;AAAA,IACrD,CAAA;AAEA,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,WAAW,CAAA;AAClD,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,aAAa,CAAA;AAClD,IAAA,OAAO,MAAM;AACT,MAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,WAAW,CAAA;AACrD,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,aAAa,CAAA;AAAA,IACzD,CAAA;AAAA,EACJ,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAElB,EAAAA,UAAU,MAAM;AACZ,IAAA,IAAI,CAAC,QAAQ,OAAO,MAAA;AACpB,IAAA,MAAM,cAAc,MAAM;AACtB,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,OAAA,EAAQ,CAAE,IAAA,EAAK;AACnC,MAAA,YAAA,CAAa,OAAO,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,CAAE,SAAS,CAAC,CAAA;AAAA,IACpD,CAAA;AACA,IAAA,WAAA,EAAY;AACZ,IAAA,MAAA,CAAO,EAAA,CAAG,UAAU,WAAW,CAAA;AAC/B,IAAA,OAAO,MAAM;AACT,MAAA,MAAA,CAAO,GAAA,CAAI,UAAU,WAAW,CAAA;AAAA,IACpC,CAAA;AAAA,EACJ,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,EAAA,MAAM,gBACF,cAAA,CAAe,IAAA;AAAA,IAAK,CAAC,MAAA,KACjB,MAAA,CAAO,KAAA,GACD,OAAO,QAAA,CAAS,SAAA,EAAW,EAAE,KAAA,EAAO,OAAO,KAAA,EAAO,CAAA,GAClD,MAAA,CAAO,SAAS,WAAW;AAAA,GACrC,IAAK,eAAe,CAAC,CAAA;AACzB,EAAA,MAAM,QAAA,GACF,SAAA,KAAc,CAAA,GAAI,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,SAAA,GAAY,GAAG,CAAC,CAAA;AAEhE,EAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAAkB;AACrC,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,EAAM,CAAE,KAAA,EAAM;AACnC,IAAA,IAAI,OAAO,KAAA,CAAM,UAAA,CAAW,EAAE,KAAA,EAAO,EAAE,GAAA,EAAI;AAAA,SACtC,KAAA,CAAM,YAAA,EAAa,CAAE,GAAA,EAAI;AAC9B,IAAA,gBAAA,CAAiB,IAAI,CAAA;AAAA,EACzB,CAAA;AAEA,EAAA,MAAM,cAAc,MAAM;AACtB,IAAA,MAAA,CACK,KAAA,EAAM,CACN,KAAA,EAAM,CACN,YAAY,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,aAAA,EAAe,IAAA,EAAM,EACrD,GAAA,EAAI;AACT,IAAA,gBAAA,CAAiB,IAAI,CAAA;AAAA,EACzB,CAAA;AAEA,EAAA,uBACIC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EACX,QAAA,EAAA;AAAA,oBAAAJ,GAAAA,CAAC,SAAI,SAAA,EAAU,iDAAA,EACX,0BAAAI,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,sDAAA,EACX,QAAA,EAAA;AAAA,sBAAAJ,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACG,IAAA,EAAM,KAAA;AAAA,UACN,KAAA,EAAM,MAAA;AAAA,UACN,QAAA,EAAU,CAAC,MAAA,CAAO,GAAA,GAAM,IAAA,EAAK;AAAA,UAC7B,OAAA,EAAS,MAAM,MAAA,CAAO,KAAA,GAAQ,KAAA,EAAM,CAAE,IAAA,EAAK,CAAE,GAAA;AAAI;AAAA,OACrD;AAAA,sBACAA,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACG,IAAA,EAAM,KAAA;AAAA,UACN,KAAA,EAAM,MAAA;AAAA,UACN,QAAA,EAAU,CAAC,MAAA,CAAO,GAAA,GAAM,IAAA,EAAK;AAAA,UAC7B,OAAA,EAAS,MAAM,MAAA,CAAO,KAAA,GAAQ,KAAA,EAAM,CAAE,IAAA,EAAK,CAAE,GAAA;AAAI;AAAA,OACrD;AAAA,sBACAA,IAAC,OAAA,EAAA,EAAQ,CAAA;AAAA,sBAETI,IAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACG,GAAA,EACI,aAAA,KAAkB,SAAA,GAAY,UAAA,GAAa,MAAA;AAAA,UAE/C,SAAA,EAAU,UAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAA,IAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACG,IAAA,EAAK,QAAA;AAAA,gBACL,SAAA,EAAU,kIAAA;AAAA,gBACV,eAAA,EAAc,MAAA;AAAA,gBACd,iBAAe,aAAA,KAAkB,SAAA;AAAA,gBACjC,SAAS,MACL,gBAAA;AAAA,kBAAiB,CAAC,OAAA,KACd,OAAA,KAAY,SAAA,GAAY,IAAA,GAAO;AAAA,iBACnC;AAAA,gBAGH,QAAA,EAAA;AAAA,kBAAA,aAAA,CAAc,KAAA;AAAA,kCACfJ,GAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,8BAAA,EAA+B;AAAA;AAAA;AAAA,aAC1D;AAAA,YACC,aAAA,KAAkB,SAAA,oBACfA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6EAAA,EACV,QAAA,EAAA,cAAA,CAAe,GAAA,CAAI,CAAC,MAAA,qBACjBA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBAEG,IAAA,EAAK,QAAA;AAAA,gBACL,IAAA,EAAK,UAAA;AAAA,gBACL,SAAA,EAAU,kEAAA;AAAA,gBACV,OAAA,EAAS,MACL,aAAA,CAAc,MAAA,CAAO,KAAK,CAAA;AAAA,gBAG7B,QAAA,EAAA,MAAA,CAAO;AAAA,eAAA;AAAA,cARH,MAAA,CAAO;AAAA,aAUnB,CAAA,EACL;AAAA;AAAA;AAAA,OAER;AAAA,sBACAA,IAAC,OAAA,EAAA,EAAQ,CAAA;AAAA,sBAETA,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACG,IAAA,EAAM,IAAA;AAAA,UACN,KAAA,EAAM,MAAA;AAAA,UACN,MAAA,EAAQ,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA;AAAA,UAC9B,OAAA,EAAS,MACL,MAAA,CAAO,KAAA,GAAQ,KAAA,EAAM,CAAE,UAAA,EAAW,CAAE,GAAA;AAAI;AAAA,OAEhD;AAAA,sBACAA,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACG,IAAA,EAAM,MAAA;AAAA,UACN,KAAA,EAAM,QAAA;AAAA,UACN,MAAA,EAAQ,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA;AAAA,UAChC,OAAA,EAAS,MACL,MAAA,CAAO,KAAA,GAAQ,KAAA,EAAM,CAAE,YAAA,EAAa,CAAE,GAAA;AAAI;AAAA,OAElD;AAAA,sBACAA,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACG,IAAA,EAAM,SAAA;AAAA,UACN,KAAA,EAAM,WAAA;AAAA,UACN,MAAA,EAAQ,MAAA,CAAO,QAAA,CAAS,WAAW,CAAA;AAAA,UACnC,OAAA,EAAS,MACL,MAAA,CAAO,KAAA,EAAM,CAAE,OAAM,CAAE,UAAA,CAAW,WAAW,CAAA,CAAE,GAAA;AAAI;AAAA,OAE3D;AAAA,sBACAA,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACG,IAAA,EAAM,IAAA;AAAA,UACN,KAAA,EAAM,aAAA;AAAA,UACN,MAAA,EAAQ,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA;AAAA,UAC9B,OAAA,EAAS,MACL,MAAA,CAAO,KAAA,GAAQ,KAAA,EAAM,CAAE,UAAA,EAAW,CAAE,GAAA;AAAI;AAAA,OAEhD;AAAA,sBACAA,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACG,IAAA,EAAMK,MAAA;AAAA,UACN,KAAA,EAAM,aAAA;AAAA,UACN,MAAA,EAAQ,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA;AAAA,UAC9B,SAAS,MACL,gBAAA;AAAA,YAAiB,CAAC,OAAA,KACd,OAAA,KAAY,MAAA,GAAS,IAAA,GAAO;AAAA;AAChC;AAAA,OAER;AAAA,sBACAL,IAAC,OAAA,EAAA,EAAQ,CAAA;AAAA,sBAETA,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACG,IAAA,EAAMM,IAAA;AAAA,UACN,KAAA,EAAM,aAAA;AAAA,UACN,MAAA,EAAQ,MAAA,CAAO,QAAA,CAAS,YAAY,CAAA;AAAA,UACpC,OAAA,EAAS,MACL,MAAA,CAAO,KAAA,GAAQ,KAAA,EAAM,CAAE,gBAAA,EAAiB,CAAE,GAAA;AAAI;AAAA,OAEtD;AAAA,sBACAN,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACG,IAAA,EAAM,WAAA;AAAA,UACN,KAAA,EAAM,eAAA;AAAA,UACN,MAAA,EAAQ,MAAA,CAAO,QAAA,CAAS,aAAa,CAAA;AAAA,UACrC,OAAA,EAAS,MACL,MAAA,CAAO,KAAA,GAAQ,KAAA,EAAM,CAAE,iBAAA,EAAkB,CAAE,GAAA;AAAI;AAAA,OAEvD;AAAA,sBACAA,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACG,IAAA,EAAM,KAAA;AAAA,UACN,KAAA,EAAM,YAAA;AAAA,UACN,MAAA,EAAQ,MAAA,CAAO,QAAA,CAAS,YAAY,CAAA;AAAA,UACpC,OAAA,EAAS,MACL,MAAA,CAAO,KAAA,GAAQ,KAAA,EAAM,CAAE,gBAAA,EAAiB,CAAE,GAAA;AAAI;AAAA,OAEtD;AAAA,sBACAA,IAAC,OAAA,EAAA,EAAQ,CAAA;AAAA,sBAETI,IAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACG,GAAA,EACI,aAAA,KAAkB,QAAA,GAAW,UAAA,GAAa,MAAA;AAAA,UAE9C,SAAA,EAAU,UAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAA,IAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACG,IAAA,EAAK,QAAA;AAAA,gBACL,SAAA,EAAU,sIAAA;AAAA,gBACV,eAAA,EAAc,MAAA;AAAA,gBACd,iBAAe,aAAA,KAAkB,QAAA;AAAA,gBACjC,SAAS,MACL,gBAAA;AAAA,kBAAiB,CAAC,OAAA,KACd,OAAA,KAAY,QAAA,GAAW,IAAA,GAAO;AAAA,iBAClC;AAAA,gBAGJ,QAAA,EAAA;AAAA,kCAAAJ,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,kBAAE;AAAA;AAAA;AAAA,aAE/B;AAAA,YACC,kBAAkB,QAAA,oBACfI,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8EAAA,EACX,QAAA,EAAA;AAAA,8BAAAA,IAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACG,IAAA,EAAK,QAAA;AAAA,kBACL,SAAA,EAAU,2EAAA;AAAA,kBACV,SAAS,MAAM;AACX,oBAAA,MAAA,CACK,OAAM,CACN,KAAA,EAAM,CACN,iBAAA,GACA,GAAA,EAAI;AACT,oBAAA,gBAAA,CAAiB,IAAI,CAAA;AAAA,kBACzB,CAAA;AAAA,kBAEA,QAAA,EAAA;AAAA,oCAAAJ,GAAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,oBAAE;AAAA;AAAA;AAAA,eAEhC;AAAA,8BACAI,IAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACG,IAAA,EAAK,QAAA;AAAA,kBACL,SAAA,EAAU,2EAAA;AAAA,kBACV,SAAS,MAAM;AACX,oBAAA,MAAA,CACK,OAAM,CACN,KAAA,EAAM,CACN,eAAA,GACA,GAAA,EAAI;AACT,oBAAA,gBAAA,CAAiB,IAAI,CAAA;AAAA,kBACzB,CAAA;AAAA,kBAEA,QAAA,EAAA;AAAA,oCAAAJ,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,oBAAE;AAAA;AAAA;AAAA,eAE/B;AAAA,8BACAI,IAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACG,IAAA,EAAK,QAAA;AAAA,kBACL,SAAA,EAAU,+FAAA;AAAA,kBACV,OAAA,EAAS,WAAA;AAAA,kBACT,QAAA,EACI,CAAC,MAAA,CACI,GAAA,GACA,KAAA,EAAM,CACN,KAAA,EAAM,CACN,WAAA,CAAY;AAAA,oBACT,IAAA,EAAM,CAAA;AAAA,oBACN,IAAA,EAAM,CAAA;AAAA,oBACN,aAAA,EAAe;AAAA,mBAClB,EACA,GAAA,EAAI;AAAA,kBAGb,QAAA,EAAA;AAAA,oCAAAJ,GAAAA,CAACO,OAAA,EAAA,EAAU,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,oBAAE;AAAA;AAAA;AAAA,eAEpC;AAAA,8BACAH,IAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACG,IAAA,EAAK,QAAA;AAAA,kBACL,SAAA,EAAU,+FAAA;AAAA,kBACV,QAAA,EAAU,gBAAA;AAAA,kBACV,SAAS,MAAM;AACX,oBAAA,oBAAA,EAAqB;AACrB,oBAAA,gBAAA,CAAiB,IAAI,CAAA;AAAA,kBACzB,CAAA;AAAA,kBAEA,QAAA,EAAA;AAAA,oCAAAJ,GAAAA,CAACQ,OAAA,EAAA,EAAU,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,oBAC7B,mBACK,uBAAA,GACA;AAAA;AAAA;AAAA,eACV;AAAA,cAEC,OAAO,QAAA,CAAS,OAAO,CAAA,oBACpBJ,KAAA,QAAA,EAAA,EACI,QAAA,EAAA;AAAA,gCAAAJ,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EAAsB,CAAA;AAAA,gCACrCA,GAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACG,IAAA,EAAK,QAAA;AAAA,oBACL,SAAA,EAAU,wDAAA;AAAA,oBACV,SAAS,MAAM;AACX,sBAAA,MAAA,CACK,OAAM,CACN,KAAA,EAAM,CACN,WAAA,GACA,GAAA,EAAI;AACT,sBAAA,gBAAA,CAAiB,IAAI,CAAA;AAAA,oBACzB,CAAA;AAAA,oBACH,QAAA,EAAA;AAAA;AAAA,iBAED;AAAA,gCACAA,GAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACG,IAAA,EAAK,QAAA;AAAA,oBACL,SAAA,EAAU,wDAAA;AAAA,oBACV,SAAS,MAAM;AACX,sBAAA,MAAA,CACK,OAAM,CACN,KAAA,EAAM,CACN,cAAA,GACA,GAAA,EAAI;AACT,sBAAA,gBAAA,CAAiB,IAAI,CAAA;AAAA,oBACzB,CAAA;AAAA,oBACH,QAAA,EAAA;AAAA;AAAA,iBAED;AAAA,gCACAI,IAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACG,IAAA,EAAK,QAAA;AAAA,oBACL,SAAA,EAAU,qGAAA;AAAA,oBACV,SAAS,MAAM;AACX,sBAAA,MAAA,CACK,OAAM,CACN,KAAA,EAAM,CACN,WAAA,GACA,GAAA,EAAI;AACT,sBAAA,gBAAA,CAAiB,IAAI,CAAA;AAAA,oBACzB,CAAA;AAAA,oBAEA,QAAA,EAAA;AAAA,sCAAAJ,GAAAA,CAACS,MAAAA,EAAA,EAAO,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,sBAAE;AAAA;AAAA;AAAA;AAEjC,eAAA,EACJ;AAAA,aAAA,EAER;AAAA;AAAA;AAAA,OAER;AAAA,sBAEAL,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0EAAA,EACX,QAAA,EAAA;AAAA,QAAA,SAAA,CAAU,cAAA,EAAe;AAAA,QAAG,GAAA;AAAA,QAC5B,SAAA,KAAc,IAAI,MAAA,GAAS,OAAA;AAAA,wBAC5BJ,GAAAA,CAAC,MAAA,EAAA,EAAK,eAAW,IAAA,EAAC,SAAA,EAAU,QAAO,QAAA,EAAA,MAAA,EAEnC,CAAA;AAAA,QACC,QAAA;AAAA,QAAS;AAAA,OAAA,EACd;AAAA,KAAA,EACJ,CAAA,EACJ,CAAA;AAAA,IAEC,aAAA,KAAkB,0BACfA,GAAAA;AAAA,MAAC,2BAAA;AAAA,MAAA;AAAA,QACG,MAAA;AAAA,QACA,OAAA,EAAS,MAAM,gBAAA,CAAiB,IAAI,CAAA;AAAA,QACpC,YAAA,EAAc;AAAA;AAAA;AAClB,GAAA,EAER,CAAA;AAER,CAAA;AAEA,IAAO,eAAA,GAAQ,OAAA;ACvaf,IAAM,UAAA,GACF,sMAAA;AASJ,IAAM,mBAAmB,CAAC;AAAA,EACtB,MAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA,GAAY,kBAAA;AAAA,EACZ,WAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,2BAAA;AAAA,EACA;AACJ,CAAA,KAAgD;AAC5C,EAAA,MAAM,OAAA,GAAUE,OAA8B,IAAI,CAAA;AAElD,EAAAC,UAAU,MAAM;AACZ,IAAA,MAAM,UAAU,OAAA,CAAQ,OAAA;AAExB,IAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,WAAA,IAAe,CAAC,OAAA,EAAS;AAC3C,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,SAAS,gBAAA,CAAiB;AAAA,MAC5B,MAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA;AAAA,MACA,WAAA;AAAA,MACA,WAAA;AAAA,MACA,YAAY,UAAA,IAAc,IAAA;AAAA,MAC1B,QAAA;AAAA,MACA,2BAAA;AAAA,MACA;AAAA,KACH,CAAA;AAED,IAAA,MAAA,CAAO,eAAe,MAAM,CAAA;AAE5B,IAAA,OAAO,MAAM;AACT,MAAA,MAAA,CAAO,iBAAiB,SAAS,CAAA;AAAA,IACrC,CAAA;AAAA,EACJ,CAAA,EAAG;AAAA,IACC,MAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA;AAAA,IACA,2BAAA;AAAA,IACA;AAAA,GACH,CAAA;AAED,EAAA,uBACIH,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,GAAA,EAAK,OAAA;AAAA,MACL,SAAA;AAAA,MACA,KAAA,EAAO,EAAE,UAAA,EAAY,QAAA,EAAS;AAAA,MAE7B;AAAA;AAAA,GACL;AAER,CAAA;AAEA,SAAS,YAAA,CAAa;AAAA,EAClB,IAAA,EAAM,IAAA;AAAA,EACN,KAAA;AAAA,EACA,MAAA;AAAA,EACA;AACJ,CAAA,EAKsB;AAClB,EAAA,uBACIA,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACG,IAAA,EAAK,QAAA;AAAA,MACL,YAAA,EAAY,KAAA;AAAA,MACZ,KAAA,EAAO,KAAA;AAAA,MACP,WAAW,CAAA,EAAG,UAAU,CAAA,CAAA,EACpB,MAAA,GACM,2DACA,+BACV,CAAA,CAAA;AAAA,MACA,OAAA;AAAA,MAEA,QAAA,kBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,GAC9B;AAER;AAEA,IAAM,mBAAmB,CAAC;AAAA,EACtB;AACJ,CAAA,KAAiD;AAC7C,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIC,SAAS,KAAK,CAAA;AAExD,EAAA,MAAM,cAAA,GAAiB,YAAY,MAAM;AACrC,IAAA,gBAAA,CAAiB,CAAC,IAAA,KAAS,CAAC,IAAI,CAAA;AAAA,EACpC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAAE,UAAU,MAAM;AACZ,IAAA,MAAM,wBAAwB,MAAM;AAChC,MAAA,gBAAA,CAAiB,KAAK,CAAA;AAAA,IAC1B,CAAA;AAEA,IAAA,MAAA,CAAO,EAAA,CAAG,mBAAmB,qBAAqB,CAAA;AAElD,IAAA,OAAO,MAAM;AACT,MAAA,MAAA,CAAO,GAAA,CAAI,mBAAmB,qBAAqB,CAAA;AAAA,IACvD,CAAA;AAAA,EACJ,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,IAAI,CAAC,MAAA,EAAQ;AACT,IAAA,OAAO,IAAA;AAAA,EACX;AAEA,EAAA,uBACIC,IAAAA;AAAA,IAAC,gBAAA;AAAA,IAAA;AAAA,MACG,MAAA;AAAA,MACA,SAAA,EAAU,kHAAA;AAAA,MAEV,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACX,QAAA,EAAA;AAAA,0BAAAJ,GAAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACG,IAAA,EAAMU,IAAAA;AAAA,cACN,KAAA,EAAM,MAAA;AAAA,cACN,MAAA,EAAQ,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA;AAAA,cAC9B,OAAA,EAAS,MAAM,MAAA,CAAO,KAAA,GAAQ,KAAA,EAAM,CAAE,UAAA,EAAW,CAAE,GAAA;AAAI;AAAA,WAC3D;AAAA,0BACAV,GAAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACG,IAAA,EAAMW,MAAAA;AAAA,cACN,KAAA,EAAM,QAAA;AAAA,cACN,MAAA,EAAQ,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA;AAAA,cAChC,OAAA,EAAS,MAAM,MAAA,CAAO,KAAA,GAAQ,KAAA,EAAM,CAAE,YAAA,EAAa,CAAE,GAAA;AAAI;AAAA,WAC7D;AAAA,0BACAX,GAAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACG,IAAA,EAAMY,SAAAA;AAAA,cACN,KAAA,EAAM,WAAA;AAAA,cACN,MAAA,EAAQ,MAAA,CAAO,QAAA,CAAS,WAAW,CAAA;AAAA,cACnC,OAAA,EAAS,MACL,MAAA,CAAO,KAAA,EAAM,CAAE,OAAM,CAAE,UAAA,CAAW,WAAW,CAAA,CAAE,GAAA;AAAI;AAAA,WAE3D;AAAA,0BACAZ,GAAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACG,IAAA,EAAM,aAAA;AAAA,cACN,KAAA,EAAM,eAAA;AAAA,cACN,MAAA,EAAQ,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA;AAAA,cAChC,OAAA,EAAS,MAAM,MAAA,CAAO,KAAA,GAAQ,KAAA,EAAM,CAAE,YAAA,EAAa,CAAE,GAAA;AAAI;AAAA,WAC7D;AAAA,0BACAA,GAAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACG,IAAA,EAAMa,IAAAA;AAAA,cACN,KAAA,EAAM,aAAA;AAAA,cACN,MAAA,EAAQ,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA;AAAA,cAC9B,OAAA,EAAS,MAAM,MAAA,CAAO,KAAA,GAAQ,KAAA,EAAM,CAAE,UAAA,EAAW,CAAE,GAAA;AAAI;AAAA,WAC3D;AAAA,0BACAb,GAAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACG,IAAA,EAAMK,MAAAA;AAAA,cACN,KAAA,EAAM,aAAA;AAAA,cACN,MAAA,EAAQ,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA;AAAA,cAC9B,OAAA,EAAS;AAAA;AAAA;AACb,SAAA,EACJ,CAAA;AAAA,QACC,iCACGL,GAAAA;AAAA,UAAC,2BAAA;AAAA,UAAA;AAAA,YACG,MAAA;AAAA,YACA,OAAA,EAAS,MAAM,gBAAA,CAAiB,KAAK,CAAA;AAAA,YACrC,OAAA,EAAQ;AAAA;AAAA;AACZ;AAAA;AAAA,GAER;AAER,CAAA;AAEA,IAAO,mBAAA,GAAQ,gBAAA;AClMR,SAAS,MAAM,MAAA,EAAsB;AACxC,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC/B;ACIA,IAAM,kBAAA,GAAqB,cAEzB,IAAI,CAAA;AAEC,SAAS,0BAAA,CAA2B;AAAA,EACvC,SAAA;AAAA,EACA;AACJ,CAAA,EAGG;AACC,EAAA,uBACIA,GAAAA,CAAC,kBAAA,CAAmB,UAAnB,EAA4B,KAAA,EAAO,WAC/B,QAAA,EACL,CAAA;AAER;AAEO,SAAS,cAAA,GAAiB;AAC7B,EAAA,OAAO,WAAW,kBAAkB,CAAA;AACxC;ACeA,IAAM,SAAqB,MAAA,CAAO,MAAA;AAAA,EAC9B,CAAC;AAAA,IACG,cAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA,GAAc,IAAA;AAAA,IACd,QAAA,GAAW,IAAA;AAAA,IACX,OAAA;AAAA,IACA,GAAA;AAAA,IACA,SAAA;AAAA,IACA,cAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,IACA,eAAA;AAAA,IACA,gBAAA;AAAA,IACA;AAAA,GACJ,KAAM;AACF,IAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIC,SAAS,KAAK,CAAA;AACpD,IAAA,MAAM,YAAA,GAAeC,OAAgC,IAAI,CAAA;AACzD,IAAA,MAAM,YAAY,cAAA,EAAe;AACjC,IAAA,MAAM,gBAAA,GAAmBA,OAAO,KAAK,CAAA;AACrC,IAAA,MAAM,wBAAA,GAA2BA,MAAAA;AAAA,MAC7B,IAAA,CAAK,SAAA,CAAU,cAAA,IAAkB,iBAAQ;AAAA,KAC7C;AACA,IAAA,MAAM,UAAA,GAAaA,OAA+B,OAAO,CAAA;AAEzD,IAAA,MAAM,UAAA,GAAa,OAAA;AAAA,MACf,MAAM,gBAAA,CAAiB,EAAE,WAAA,EAAa,CAAA;AAAA,MACtC,CAAC,WAAW;AAAA,KAChB;AAEA,IAAA,MAAM,gBAAA,GAAmBA,MAAAA;AAAA,MACrB;AAAA,KACJ;AAEA,IAAA,MAAM,MAAA,GAAS,SAAA;AAAA,MACX;AAAA,QACI,iBAAA,EAAmB,KAAA;AAAA,QACnB,UAAA;AAAA,QACA,SAAS,cAAA,IAAkB,iBAAA;AAAA,QAC3B,SAAA,EAAW,YAAY,KAAA,GAAQ,KAAA;AAAA,QAC/B,QAAA;AAAA,QACA,WAAA,EAAa;AAAA,UACT,UAAA,EAAY;AAAA,YACR,KAAA,EAAO,CAAA,eAAA,EAAkB,eAAA,IAAmB,EAAE,CAAA,CAAA;AAAA,YAC9C,oBAAoB,WAAA,IAAe;AAAA;AACvC,SACJ;AAAA,QACA,QAAA,EAAU,CAAC,EAAE,MAAA,EAAQ,UAAS,KAAM;AAKhC,UAAA,IAAI,CAAC,iBAAiB,OAAA,EAAS;AAC3B,YAAA;AAAA,UACJ;AACA,UAAA,IAAI,iBAAiB,OAAA,EAAS;AAC1B,YAAA,YAAA,CAAa,iBAAiB,OAAO,CAAA;AAAA,UACzC;AAEA,UAAA,gBAAA,CAAiB,OAAA,GAAU,WAAW,MAAM;AACxC,YAAA,QAAA,CAAS,QAAA,CAAS,SAAS,CAAA;AAC3B,YAAA,gBAAA,CAAiB,OAAA,GAAU,IAAA;AAAA,UAC/B,GAAG,GAAI,CAAA;AAAA,QACX,CAAA;AAAA,QACA,iBAAA,EAAmB,CAAC,EAAE,MAAA,EAAQ,UAAS,KAAM;AACzC,UAAA,gBAAA,CAAiB,OAAA,GAAU,IAAA;AAAA,QAC/B;AAAA,OACJ;AAAA,MACA,CAAC,UAAU;AAAA,KACf;AACA,IAAAC,UAAU,MAAM;AACZ,MAAA,OAAO,MAAM;AACT,QAAA,IAAI,iBAAiB,OAAA,EAAS;AAC1B,UAAA,YAAA,CAAa,iBAAiB,OAAO,CAAA;AAAA,QACzC;AAAA,MACJ,CAAA;AAAA,IACJ,CAAA,EAAG,EAAE,CAAA;AAEL,IAAAA,UAAU,MAAM;AACZ,MAAA,IAAI,CAAC,MAAA,EAAQ;AACT,QAAA;AAAA,MACJ;AAEA,MAAA,MAAA,CAAO,YAAY,QAAQ,CAAA;AAAA,IAC/B,CAAA,EAAG,CAAC,MAAA,EAAQ,QAAQ,CAAC,CAAA;AAErB,IAAAA,UAAU,MAAM;AACZ,MAAA,IAAI,CAAC,MAAA,EAAQ;AACT,QAAA;AAAA,MACJ;AAEA,MAAA,MAAM,cAAc,cAAA,IAAkB,iBAAA;AACtC,MAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,SAAA,CAAU,WAAW,CAAA;AACjD,MAAA,MAAM,cAAA,GAAiB,WAAW,OAAA,KAAY,OAAA;AAE9C,MAAA,IAAI,cAAA,EAAgB;AAChB,QAAA,UAAA,CAAW,OAAA,GAAU,OAAA;AACrB,QAAA,gBAAA,CAAiB,OAAA,GAAU,KAAA;AAC3B,QAAA,wBAAA,CAAyB,OAAA,GAAU,cAAA;AACnC,QAAA,MAAA,CAAO,QAAA,CAAS,WAAW,WAAA,EAAa;AAAA,UACpC,UAAA,EAAY;AAAA,SACf,CAAA;AACD,QAAA;AAAA,MACJ;AAEA,MAAA,IAAI,CAAC,iBAAiB,OAAA,EAAS;AAC3B,QAAA,IAAI,wBAAA,CAAyB,YAAY,cAAA,EAAgB;AACrD,UAAA,wBAAA,CAAyB,OAAA,GAAU,cAAA;AACnC,UAAA,MAAA,CAAO,QAAA,CAAS,WAAW,WAAA,EAAa;AAAA,YACpC,UAAA,EAAY;AAAA,WACf,CAAA;AAAA,QACL;AACA,QAAA;AAAA,MACJ;AAEA,MAAA,wBAAA,CAAyB,OAAA,GAAU,cAAA;AAAA,IACvC,CAAA,EAAG,CAAC,MAAA,EAAQ,cAAA,EAAgB,OAAO,CAAC,CAAA;AAEpC,IAAA,MAAM,iBAAA,GAAoBW,WAAAA;AAAA,MACtB,OAAO,IAAA,KAAe;AAClB,QAAA,MAAM,YAAY,cAAA,IAAkB,OAAA;AACpC,QAAA,IAAI,IAAA,CAAK,OAAO,SAAA,EAAW;AACvB,UAAA,OAAA,GAAU,sCAAsC,CAAA;AAChD,UAAA;AAAA,QACJ;AAEA,QAAA,IAAI;AACA,UAAA,cAAA,CAAe,IAAI,CAAA;AAGnB,UAAA,MAAM,OAAA,GAAU,MAAM,IAAI,OAAA;AAAA,YACtB,CAAC,SAAS,MAAA,KAAW;AACjB,cAAA,MAAM,MAAA,GAAS,IAAI,UAAA,EAAW;AAC9B,cAAA,MAAA,CAAO,MAAA,GAAS,MACZ,OAAA,CAAQ,MAAA,CAAO,MAAgB,CAAA;AACnC,cAAA,MAAA,CAAO,OAAA,GAAU,MAAA;AACjB,cAAA,MAAA,CAAO,cAAc,IAAI,CAAA;AAAA,YAC7B;AAAA,WACJ;AACA,UAAA,MAAA,EACM,KAAA,EAAM,CACP,KAAA,EAAM,CACN,QAAA,CAAS;AAAA,YACN,GAAA,EAAK,OAAA;AAAA,YACL,KAAK,IAAA,CAAK,IAAA;AAAA,YACV,OAAO,IAAA,CAAK;AAAA,WACf,EACA,GAAA,EAAI;AAAA,QACb,SAAS,KAAA,EAAO;AACZ,UAAA,OAAA,CAAQ,KAAA,CAAM,uBAAuB,KAAK,CAAA;AAAA,QAC9C,CAAA,SAAE;AACE,UAAA,cAAA,CAAe,KAAK,CAAA;AAAA,QACxB;AAAA,MACJ,CAAA;AAAA,MACA,CAAC,MAAM;AAAA,KACX;AAEA,IAAA,MAAM,gBAAA,GAAmBA,WAAAA;AAAA,MACrB,CAAC,KAAA,KAA+C;AAC5C,QAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,KAAA;AAC3B,QAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAC9B,UAAA;AAAA,QACJ;AAEA,QAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,QAAA,KAAK,kBAAkB,IAAI,CAAA;AAC3B,QAAA,KAAA,CAAM,OAAO,KAAA,GAAQ,EAAA;AAAA,MACzB,CAAA;AAAA,MACA,CAAC,iBAAiB;AAAA,KACtB;AAEA,IAAA,MAAM,iBAAA,GAAoBA,WAAAA;AAAA,MACtB,CAAC,KAAA,KAAyC;AACtC,QAAA,MAAA,EACM,KAAA,EAAM,CACP,KAAA,EAAM,CACN,QAAA,CAAS;AAAA,UACN,KAAK,KAAA,CAAM,GAAA;AAAA,UACX,KAAK,KAAA,CAAM,GAAA;AAAA,UACX,OAAO,KAAA,CAAM;AAAA,SAChB,EACA,GAAA,EAAI;AAAA,MACb,CAAA;AAAA,MACA,CAAC,MAAM;AAAA,KACX;AAEA,IAAA,MAAM,cAAA,GAAiBA,YAAY,MAAM;AACrC,MAAA,IAAI,SAAA,EAAW;AACX,QAAA,KAAK,SAAA,EAAU,CAAE,IAAA,CAAK,CAAC,KAAA,KAAU;AAC7B,UAAA,IAAI,KAAA,oBAAyB,KAAK,CAAA;AAAA,QACtC,CAAC,CAAA;AACD,QAAA;AAAA,MACJ;AACA,MAAA,YAAA,CAAa,SAAS,KAAA,EAAM;AAAA,IAChC,CAAA,EAAG,CAAC,iBAAA,EAAmB,SAAS,CAAC,CAAA;AAEjC,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAC/B,MAAA,uBAAOd,GAAAA,CAAAe,QAAAA,EAAA,EAAE,CAAA;AAAA,IACb;AAEA,IAAA,uBACIX,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACG,SAAA,EAAW,EAAA;AAAA,UACP,0CAAA;AAAA,UACA;AAAA,SACJ;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,QAAA,IAAY,+BACTJ,GAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACG,SAAA,EAAU,4BAAA;AAAA,cACV,KAAA,EAAO;AAAA,gBACH,MAAA,EAAQ;AAAA,eACZ;AAAA,cAEA,QAAA,kBAAAA,GAAAA;AAAA,gBAAC,eAAA;AAAA,gBAAA;AAAA,kBACG,MAAA;AAAA,kBACA,oBAAA,EAAsB,cAAA;AAAA,kBACtB,gBAAA,EAAkB;AAAA;AAAA;AACtB;AAAA,WACJ;AAAA,0BAEJA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BACX,QAAA,kBAAAI,IAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACG,SAAA,EAAW,EAAA;AAAA,gBACP,gCAAA;AAAA,gBACA;AAAA,eACJ;AAAA,cAEC,QAAA,EAAA;AAAA,gBAAA,aAAA;AAAA,gCACDJ,GAAAA;AAAA,kBAAC,aAAA;AAAA,kBAAA;AAAA,oBACG,MAAA;AAAA,oBACA,SAAA,EAAW,CAAA,EAAG,eAAA,IAAmB,EAAE,CAAA,CAAA,EAAI,iBAAiB,QAAA,CAAS,QAAQ,CAAA,GAAI,EAAA,GAAK,eAAe,CAAA;AAAA;AAAA,iBACrG;AAAA,gBACC,SAAA,GAAY,uBACTA,GAAAA;AAAA,kBAAC,OAAA;AAAA,kBAAA;AAAA,oBACG,GAAA,EAAK,YAAA;AAAA,oBACL,IAAA,EAAK,MAAA;AAAA,oBACL,MAAA,EAAO,SAAA;AAAA,oBACP,SAAA,EAAU,QAAA;AAAA,oBACV,QAAA,EAAU;AAAA;AAAA,iBACd;AAAA,gBAEH,QAAA;AAAA,gBACA,MAAA,oBAAUA,GAAAA,CAAC,mBAAA,EAAA,EAAW,MAAA,EAAgB;AAAA;AAAA;AAAA,WAC3C,EACJ;AAAA;AAAA;AAAA,KACJ;AAAA,EAER,CAAA;AAAA,EACA;AAAA,IACI,cAAc,CAAC,GAAA,KACX,aAAa,GAAA,IAAO,iBAAA,EAAU,kBAAkB,CAAA;AAAA,IACpD,QAAA,EAAA;AAAA;AAER,CAAA;AAEA,IAAO,cAAA,GAAQ;;;ACrSR,SAAS,gBACZgB,KAAAA,EACS;AACT,EAAA,MAAM,WAAsB,EAAC;AAE7B,EAAA,MAAM,eAAA,GAAkB,CAAC,IAAA,KAAuB;AAC5C,IAAA,IAAI,CAAC,IAAA,EAAM;AACP,MAAA;AAAA,IACJ;AAEA,IAAA,IAAI,IAAA,CAAK,SAAS,SAAA,EAAW;AACzB,MAAA,MAAM,KAAA,GACF,OAAO,IAAA,CAAK,KAAA,EAAO,UAAU,QAAA,GAAW,IAAA,CAAK,MAAM,KAAA,GAAQ,CAAA;AAE/D,MAAA,MAAM,WAAA,GAAc,CAAC,OAAA,KAAkC;AACnD,QAAA,IAAI,CAAC,OAAA,EAAS;AACV,UAAA,OAAO,EAAA;AAAA,QACX;AAEA,QAAA,IAAI,OAAO,OAAA,CAAQ,IAAA,KAAS,QAAA,EAAU;AAClC,UAAA,OAAO,OAAA,CAAQ,IAAA;AAAA,QACnB;AAEA,QAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AAClB,UAAA,OAAO,EAAA;AAAA,QACX;AAEA,QAAA,OAAO,QAAQ,OAAA,CAAQ,GAAA,CAAI,WAAW,CAAA,CAAE,KAAK,EAAE,CAAA;AAAA,MACnD,CAAA;AAEA,MAAA,MAAM,WAAA,GAAc,YAAY,IAAI,CAAA;AAEpC,MAAA,QAAA,CAAS,IAAA,CAAK;AAAA,QACV,KAAA;AAAA,QACA,IAAA,EAAM,WAAA;AAAA,QACN,EAAA,EAAI,SAAS,WAAW;AAAA,OAC3B,CAAA;AAAA,IACL;AAEA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,EAAG;AAC7B,MAAA,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,CAAC,KAAA,KAAU;AAC5B,QAAA,eAAA,CAAgB,KAAoB,CAAA;AAAA,MACxC,CAAC,CAAA;AAAA,IACL;AAAA,EACJ,CAAA;AAEA,EAAA,eAAA,CAAgBA,SAAQ,MAAS,CAAA;AAEjC,EAAA,OAAO,QAAA;AACX;;;AC1DO,SAAS,oBAAoB,IAAA,EAAc;AAC9C,EAAA,IAAI,CAAC,IAAA,EAAM;AACP,IAAA,OAAO,EAAA;AAAA,EACX;AAGA,EAAA,IAAI,OAAO,IAAA,CAAK,WAAA,KAAgB,QAAA,EAAU;AACtC,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EAChB;AAGA,EAAA,IACI,IAAA,CAAK,OAAA,IACL,IAAA,CAAK,OAAA,CAAQ,OAAA,IACb,MAAM,OAAA,CAAQ,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA,EACpC;AACE,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,OAAA,CACf,GAAA,CAAI,CAAC,KAAA,KAAe;AAEjB,MAAA,IAAI,MAAM,IAAA,EAAM;AACZ,QAAA,OAAO,KAAA,CAAM,IAAA;AAAA,MACjB;AAEA,MAAA,OAAO,oBAAoB,KAAK,CAAA;AAAA,IACpC,CAAC,CAAA,CACA,IAAA,CAAK,EAAE,CAAA;AAAA,EAChB;AAGA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,EAAG;AAC7B,IAAA,OAAO,IAAA,CAAK,OAAA,CACP,GAAA,CAAI,CAAC,KAAA,KAAe;AACjB,MAAA,IAAI,MAAM,IAAA,EAAM;AACZ,QAAA,OAAO,KAAA,CAAM,IAAA;AAAA,MACjB;AACA,MAAA,OAAO,oBAAoB,KAAK,CAAA;AAAA,IACpC,CAAC,CAAA,CACA,IAAA,CAAK,EAAE,CAAA;AAAA,EAChB;AAEA,EAAA,OAAO,EAAA;AACX;ACnCA,SAAS,iBAAiB,IAAA,EAA+B;AACrD,EAAA,IAAI,IAAA,IAAQ,IAAA,IAAQ,OAAO,IAAA,KAAS,WAAW,OAAO,EAAA;AACtD,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,OAAO,SAAS,QAAA,EAAU;AACtD,IAAA,OAAO,OAAO,IAAI,CAAA;AAAA,EACtB;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG,OAAO,KAAK,GAAA,CAAI,gBAAgB,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AAClE,EAAA,IAAIC,MAAAA,CAAM,cAAA,CAA+C,IAAI,CAAA,EAAG;AAC5D,IAAA,OAAO,gBAAA,CAAiB,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAAA,EAC/C;AACA,EAAA,OAAO,EAAA;AACX;AAEA,eAAe,eAAe,IAAA,EAA6B;AACvD,EAAA,IAAI,SAAA,CAAU,WAAW,SAAA,EAAW;AAChC,IAAA,MAAM,SAAA,CAAU,SAAA,CAAU,SAAA,CAAU,IAAI,CAAA;AACxC,IAAA;AAAA,EACJ;AACA,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,UAAU,CAAA;AAC9C,EAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,EAAA,IAAA,CAAK,YAAA,CAAa,YAAY,EAAE,CAAA;AAChC,EAAA,IAAA,CAAK,MAAM,QAAA,GAAW,OAAA;AACtB,EAAA,IAAA,CAAK,MAAM,IAAA,GAAO,SAAA;AAClB,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,IAAI,CAAA;AAC9B,EAAA,IAAA,CAAK,MAAA,EAAO;AACZ,EAAA,QAAA,CAAS,YAAY,MAAM,CAAA;AAC3B,EAAA,IAAA,CAAK,MAAA,EAAO;AAChB;AAEO,SAAS,iBAAA,CAAkB;AAAA,EAC9B,IAAA;AAAA,EACA,QAAA;AAAA,EACA;AACJ,CAAA,EAIsB;AAClB,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIhB,SAAS,KAAK,CAAA;AAE1C,EAAA,MAAM,MAAA,GACF,mBAAA,CAAoB,IAAI,CAAA,IAAK,iBAAiB,QAAQ,CAAA;AAE1D,EAAAE,UAAU,MAAM;AACZ,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,QAAQ,MAAA,CAAO,UAAA,CAAW,MAAM,SAAA,CAAU,KAAK,GAAG,IAAI,CAAA;AAC5D,IAAA,OAAO,MAAM,MAAA,CAAO,YAAA,CAAa,KAAK,CAAA;AAAA,EAC1C,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,eAAe,UAAA,GAAa;AACxB,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,IAAI;AACA,MAAA,MAAM,eAAe,MAAM,CAAA;AAC3B,MAAA,SAAA,CAAU,IAAI,CAAA;AAAA,IAClB,CAAA,CAAA,MAAQ;AACJ,MAAA,SAAA,CAAU,KAAK,CAAA;AAAA,IACnB;AAAA,EACJ;AAEA,EAAA,uBACIC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EACX,QAAA,EAAA;AAAA,oBAAAJ,GAAAA,CAAC,KAAA,EAAA,EACG,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,QAAA,GAAW,CAAA,SAAA,EAAY,QAAQ,CAAA,CAAA,GAAK,MAAA,EAChD,QAAA,EACL,CAAA,EACJ,CAAA;AAAA,oBACAA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACG,IAAA,EAAK,QAAA;AAAA,QACL,SAAA,EAAU,cAAA;AAAA,QACV,YAAA,EAAY,SAAS,QAAA,GAAW,WAAA;AAAA,QAChC,KAAA,EAAO,SAAS,QAAA,GAAW,MAAA;AAAA,QAC3B,SAAS,MAAM;AACX,UAAA,KAAK,UAAA,EAAW;AAAA,QACpB,CAAA;AAAA,QAEC,mCACGA,GAAAA,CAACkB,KAAAA,EAAA,EAAM,WAAU,oBAAA,EAAqB,aAAA,EAAW,IAAA,EAAC,CAAA,mBAElDlB,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,oBAAA,EAAqB,eAAW,IAAA,EAAC;AAAA;AAAA;AAEzD,GAAA,EACJ,CAAA;AAER;ACvEA,IAAM,iBAAA,GAAoB,CAAC,UAAA,KASrB;AAAA,EACF,UAAA,EAAY,UAAA;AAAA,EACZ,UAAA,EAAY,QAAA;AAAA,EACZ,UAAA,EAAY,UAAA;AAAA,EACZ,UAAA,EAAY,UAAA;AAAA,EACZ,UAAA,EAAY,aAAA;AAAA,EACZ,UAAA,EAAY,aAAA;AAAA,EACZ,UAAA,EAAY,cAAA;AAAA,EACZ,UAAA,EAAY;AAChB,CAAA;AAEA,SAAS,qBAAqB,IAAA,EAAgB;AAC1C,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACnC,IAAA,OAAO,IAAA;AAAA,EACX;AAEA,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,MAAA,IAAU,IAAA,CAAK,SAAS,EAAA,EAAI;AAC1C,IAAA,OAAO,MAAA;AAAA,EACX;AAEA,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,EAAG;AAC9B,IAAA,OAAO,IAAA;AAAA,EACX;AAEA,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,CAChB,GAAA,CAAI,oBAAoB,EACxB,MAAA,CAAO,CAAC,KAAA,KAAe,KAAA,KAAU,MAAS,CAAA;AAE/C,EAAA,OAAO;AAAA,IACH,GAAG,IAAA;AAAA,IACH;AAAA,GACJ;AACJ;AAQO,SAAS,aAAa,EAAE,IAAA,EAAAgB,KAAAA,EAAM,SAAA,EAAW,OAAM,EAAsB;AACxE,EAAA,MAAM,aAAa,gBAAA,EAAiB;AACpC,EAAA,MAAM,OAAA,GAAU,oBAAA;AAAA,IACXA,KAAAA,IAAiB;AAAA,GACtB;AAEA,EAAA,MAAM,WAAW,oBAAA,CAAqB;AAAA,IAClC,UAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA,EAAS;AAAA,MACL,WAAA,EAAa;AAAA,QACT,SAAA,EAAW,CAAC,EAAE,QAAA,EAAS,KAAM;AACzB,UAAA,MAAM,OAAA,GAAU,EAAA;AAAA,YACZ,WAAA;AAAA,YACA,GAAG,iBAAA,CAAkB,KAAA,EAAO,UAAA,EAAY,KAAK;AAAA,WACjD;AACA,UAAA,uBAAOhB,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAW,SAAU,QAAA,EAAS,CAAA;AAAA,QAC5C,CAAA;AAAA,QACA,SAAA,EAAW,sBAAMA,GAAAA,CAAC,IAAA,EAAA,EAAG,CAAA;AAAA,QACrB,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,UAAS,KAAM;AAC7B,UAAA,MAAM,KAAA,GAAQ,IAAA,EAAM,KAAA,EAAO,KAAA,IAAS,CAAA;AAEpC,UAAA,MAAM,WAAA,GAAc,oBAAoB,IAAI,CAAA;AAC5C,UAAA,MAAM,EAAA,GAAK,SAAS,WAAW,CAAA;AAE/B,UAAA,IAAI,CAAC,KAAA,EAAO;AACR,YAAA,MAAM,GAAA,GAAM,IAAI,KAAK,CAAA,CAAA;AACrB,YAAA,uBAAOA,GAAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAS,QAAA,EAAS,CAAA;AAAA,UAClC;AAEA,UAAA,IAAI,UAAU,CAAA,EAAG;AACb,YAAA,MAAMmB,QAAAA,GAAU,EAAA;AAAA,cACZ,+CAAA;AAAA,cACA,GAAG,iBAAA,CAAkB,KAAA,EAAO,UAAA,EAAY,OAAO;AAAA,aACnD;AACA,YAAA,uBACInB,GAAAA,CAAC,IAAA,EAAA,EAAG,EAAA,EAAQ,SAAA,EAAWmB,UAClB,QAAA,EACL,CAAA;AAAA,UAER;AACA,UAAA,IAAI,UAAU,CAAA,EAAG;AACb,YAAA,MAAMA,QAAAA,GAAU,EAAA;AAAA,cACZ,+CAAA;AAAA,cACA,GAAG,iBAAA,CAAkB,KAAA,EAAO,UAAA,EAAY,OAAO;AAAA,aACnD;AACA,YAAA,uBACInB,GAAAA,CAAC,IAAA,EAAA,EAAG,EAAA,EAAQ,SAAA,EAAWmB,UAClB,QAAA,EACL,CAAA;AAAA,UAER;AACA,UAAA,MAAM,OAAA,GAAU,EAAA;AAAA,YACZ,oDAAA;AAAA,YACA,GAAG,iBAAA,CAAkB,KAAA,EAAO,UAAA,EAAY,OAAO;AAAA,WACnD;AACA,UAAA,uBACInB,GAAAA,CAAC,IAAA,EAAA,EAAG,EAAA,EAAQ,SAAA,EAAW,SAClB,QAAA,EACL,CAAA;AAAA,QAER,CAAA;AAAA,QACA,WAAW,CAAC,EAAE,IAAA,EAAM,QAAA,uBAChBA,GAAAA;AAAA,UAAC,iBAAA;AAAA,UAAA;AAAA,YACG,IAAA;AAAA,YACA,QAAA,EAAU,MAAM,KAAA,EAAO,QAAA;AAAA,YAEtB;AAAA;AAAA,SACL;AAAA,QAEJ,UAAA,EAAY,CAAC,EAAE,IAAA,EAAM,QAAA,uBACjBA,GAAAA,CAAC,iBAAA,EAAA,EAAkB,IAAA,EACd,QAAA,EACL;AAAA,OAER;AAAA,MACA,WAAA,EAAa;AAAA,QACT,IAAA,EAAM,CAAC,EAAE,IAAA,EAAM,UAAS,KAAM;AAC1B,UAAA,MAAM,IAAA,GAAO,MAAM,KAAA,EAAO,IAAA;AAC1B,UAAA,MAAM,SAAA,GAAY,OAAO,YAAA,EAAc,IAAA;AACvC,UAAA,MAAM,OAAA,GAAU,EAAA;AAAA,YACZ,4BAAA;AAAA,YACA,GAAG,iBAAA,CAAkB,KAAA,EAAO,UAAA,EAAY,IAAI,CAAA;AAAA,YAC5C,WAAW,OAAA,EAAS,CAAA;AAAA,YACpB,WAAW,OAAA,EAAS,CAAA;AAAA,YACpB,WAAW,MAAA,EAAQ,KAAA;AAAA,YACnB,WAAW,MAAA,EAAQ,MAAA;AAAA,YACnB,WAAW,MAAA,EAAQ,KAAA;AAAA,YACnB,SAAA,EAAW;AAAA,WACf;AACA,UAAA,uBACIA,GAAAA;AAAA,YAAC,GAAA;AAAA,YAAA;AAAA,cACG,IAAA;AAAA,cACA,MAAA,EAAO,QAAA;AAAA,cACP,GAAA,EAAI,qBAAA;AAAA,cACJ,SAAA,EAAW,OAAA;AAAA,cACX,KAAA,EAAO;AAAA,gBACH,UAAA,EAAY,WAAW,UAAA,IAAc;AAAA,eACzC;AAAA,cAEC;AAAA;AAAA,WACL;AAAA,QAER,CAAA;AAAA,QACA,SAAA,EAAW,CAAC,EAAE,QAAA,EAAS,qBACnBA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kCAAA,EACX,QAAA,EACL;AAAA;AAER;AACJ,GACH,CAAA;AAED,EAAA,MAAM,iBAAA,GAAoB,CAAC,iBAAA,EAAmB,SAAS,EAClD,MAAA,CAAO,OAAO,CAAA,CACd,IAAA,CAAK,GAAG,CAAA;AAEb,EAAA,uBACIA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAA,EACX,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,iBAAA,EAAoB,QAAA,EAAA,QAAA,EAAS,CAAA,EACjD,CAAA;AAER;;;AC1LA,SAAS,oBAAoB,IAAA,EAAc;AACvC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC7B,EAAA,MAAM,UAAqC,EAAC;AAE5C,EAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,EAAM,KAAA,KAAU;AAC3B,IAAA,IAAI,IAAA,EAAM;AACN,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACT,IAAA,EAAM,MAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACT,CAAA;AAAA,IACL;AAEA,IAAA,IAAI,KAAA,GAAQ,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAC1B,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACT,IAAA,EAAM;AAAA,OACT,CAAA;AAAA,IACL;AAAA,EACJ,CAAC,CAAA;AAED,EAAA,OAAO;AAAA,IACH,IAAA,EAAM,WAAA;AAAA,IACN,GAAI,OAAA,CAAQ,MAAA,GAAS,EAAE,OAAA,KAAY;AAAC,GACxC;AACJ;AAGO,SAAS,2BACZgB,KAAAA,EACiB;AACjB,EAAA,IACIA,KAAAA,IACA,OAAOA,KAAAA,KAAS,QAAA,IAChB,UAAUA,KAAAA,IACVA,KAAAA,CAAK,SAAS,KAAA,EAChB;AACE,IAAA,OAAOA,KAAAA;AAAA,EACX;AAEA,EAAA,MAAM,IAAA,GAAO,OAAOA,KAAAA,KAAS,QAAA,GAAWA,MAAK,OAAA,CAAQ,QAAA,EAAU,IAAI,CAAA,GAAI,EAAA;AAEvE,EAAA,OAAO;AAAA,IACH,IAAA,EAAM,KAAA;AAAA,IACN,OAAA,EAAS,IAAA,GACH,IAAA,CACK,KAAA,CAAM,QAAQ,CAAA,CACd,GAAA,CAAI,CAAC,SAAA,KAAc,mBAAA,CAAoB,SAAS,CAAC,IACtD;AAAC,GACX;AACJ;;;ACjDO,SAAS,iCAAiC,OAAA,EAA0B;AACvE,EAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC7B,IAAA,OAAO,OAAA;AAAA,EACX;AAEA,EAAA,IAAI,CAAC,OAAA,IAAW,OAAO,OAAA,KAAY,QAAA,EAAU;AACzC,IAAA,OAAO,EAAA;AAAA,EACX;AAEA,EAAA,MAAM,MAAA,GAAS,OAAA;AACf,EAAA,MAAM,UAAU,OAAO,MAAA,CAAO,IAAA,KAAS,QAAA,GAAW,OAAO,IAAA,GAAO,EAAA;AAChE,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA,GACvC,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,gCAAgC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA,GAC5D,EAAA;AAEN,EAAA,OAAO,CAAA,EAAG,OAAO,CAAA,EAAG,QAAQ,CAAA,CAAA;AAChC;;;ACfA,SAAS,6BAA6B,KAAA,EAAqB;AACvD,EAAA,KAAA,IAAS,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACxC,IAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AAEpB,IAAA,IAAI,CAAC,IAAA,EAAM;AACP,MAAA;AAAA,IACJ;AAEA,IAAA,IAAI,KAAK,IAAA,KAAS,MAAA,IAAU,OAAO,IAAA,CAAK,SAAS,QAAA,EAAU;AACvD,MAAA,IAAI,CAAC,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA,EAAG;AAC5B,QAAA,KAAA,CAAM,CAAC,CAAA,GAAI;AAAA,UACP,GAAG,IAAA;AAAA,UACH,IAAA,EAAM,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA,GAAA;AAAA,SAChC;AAAA,MACJ;AACA,MAAA,OAAO,KAAA;AAAA,IACX;AAEA,IAAA,IAAI,MAAM,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,IAAK,IAAA,CAAK,QAAQ,MAAA,EAAQ;AACpD,MAAA,KAAA,CAAM,CAAC,CAAA,GAAI;AAAA,QACP,GAAG,IAAA;AAAA,QACH,SAAS,4BAAA,CAA6B,CAAC,GAAG,IAAA,CAAK,OAAO,CAAC;AAAA,OAC3D;AACA,MAAA,OAAO,KAAA;AAAA,IACX;AAAA,EACJ;AAEA,EAAA,OAAO,KAAA;AACX;AAEA,SAAS,aAAA,CACL,OACA,SAAA,EAKF;AACE,EAAA,MAAM,iBAAwB,EAAC;AAC/B,EAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,EAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,KAAA,CAAM,QAAQ,KAAA,EAAA,EAAS;AAC/C,IAAA,MAAM,IAAA,GAAO,MAAM,KAAK,CAAA;AAExB,IAAA,IAAI,CAAC,IAAA,EAAM;AACP,MAAA;AAAA,IACJ;AAEA,IAAA,IAAI,aAAa,CAAA,EAAG;AAChB,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA;AAAA,IACJ;AAEA,IAAA,IAAI,KAAK,IAAA,KAAS,MAAA,IAAU,OAAO,IAAA,CAAK,SAAS,QAAA,EAAU;AACvD,MAAA,IAAI,IAAA,CAAK,IAAA,CAAK,MAAA,IAAU,SAAA,EAAW;AAC/B,QAAA,cAAA,CAAe,KAAK,IAAI,CAAA;AACxB,QAAA,SAAA,IAAa,KAAK,IAAA,CAAK,MAAA;AAAA,MAC3B,CAAA,MAAO;AACH,QAAA,cAAA,CAAe,IAAA,CAAK;AAAA,UAChB,GAAG,IAAA;AAAA,UACH,MAAM,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA,EAAG,SAAS,EAAE,OAAA;AAAQ,SAC/C,CAAA;AACD,QAAA,SAAA,GAAY,CAAA;AACZ,QAAA,SAAA,GAAY,IAAA;AACZ,QAAA;AAAA,MACJ;AAEA,MAAA;AAAA,IACJ;AAEA,IAAA,IAAI,IAAA,CAAK,SAAS,WAAA,EAAa;AAC3B,MAAA,cAAA,CAAe,KAAK,IAAI,CAAA;AACxB,MAAA,SAAA,IAAa,CAAA;AACb,MAAA;AAAA,IACJ;AAEA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,EAAG;AAC7B,MAAA,MAAM,MAAA,GAAS,aAAA,CAAc,IAAA,CAAK,OAAA,EAAS,SAAS,CAAA;AACpD,MAAA,SAAA,GAAY,MAAA,CAAO,SAAA;AAEnB,MAAA,IAAI,MAAA,CAAO,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AACzB,QAAA,cAAA,CAAe,IAAA,CAAK;AAAA,UAChB,GAAG,IAAA;AAAA,UACH,SAAS,MAAA,CAAO;AAAA,SACnB,CAAA;AAAA,MACL;AAEA,MAAA,IAAI,OAAO,SAAA,EAAW;AAClB,QAAA,SAAA,GAAY,IAAA;AACZ,QAAA;AAAA,MACJ;AAEA,MAAA;AAAA,IACJ;AAEA,IAAA,cAAA,CAAe,KAAK,IAAI,CAAA;AAAA,EAC5B;AAEA,EAAA,IAAI,SAAA,EAAW;AACX,IAAA,OAAO;AAAA,MACH,KAAA,EAAO,6BAA6B,cAAc,CAAA;AAAA,MAClD,SAAA;AAAA,MACA;AAAA,KACJ;AAAA,EACJ;AAEA,EAAA,OAAO;AAAA,IACH,KAAA,EAAO,cAAA;AAAA,IACP,SAAA;AAAA,IACA;AAAA,GACJ;AACJ;AAEO,SAAS,yBAAA,CACZA,OACA,cAAA,EACiB;AACjB,EAAA,IAAI,CAAC,cAAA,IAAkB,cAAA,IAAkB,CAAA,EAAG;AACxC,IAAA,OAAOA,KAAAA;AAAA,EACX;AAEA,EAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAASA,KAAAA,EAAc,OAAO,CAAA,GAC7CA,KAAAA,CAAa,UACd,EAAC;AACP,EAAA,MAAM,MAAA,GAAS,aAAA,CAAc,OAAA,EAAS,cAAc,CAAA;AAEpD,EAAA,OAAO;AAAA,IACH,GAAIA,KAAAA;AAAA,IACJ,SAAS,MAAA,CAAO;AAAA,GACpB;AACJ","file":"index.js","sourcesContent":["import type { JSONContent } from \"@tiptap/core\";\n\nconst emptyDoc: JSONContent = {\n type: \"doc\",\n content: [],\n};\n\nexport default emptyDoc;\n","export function createId(textContent: string) {\n return textContent.replace(/\\s/g, \"-\").toLowerCase();\n}\n","// This is only to maintain backward compatibility for codeMirror node type\n\nimport { Node } from \"@tiptap/core\";\n\nexport const CodeMirrorNode = Node.create({\n name: \"codeMirror\",\n content: \"block+\",\n code: true,\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n parseHTML() {\n return [\n {\n tag: \"pre\",\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\"pre\", HTMLAttributes, 0];\n },\n});\n","import StarterKit from \"@tiptap/starter-kit\";\nimport Placeholder from \"@tiptap/extension-placeholder\";\nimport Link from \"@tiptap/extension-link\";\nimport {\n Table,\n TableCell,\n TableHeader,\n TableRow,\n} from \"@tiptap/extension-table\";\nimport Image from \"@tiptap/extension-image\";\nimport Dropcursor from \"@tiptap/extension-dropcursor\";\nimport Gapcursor from \"@tiptap/extension-gapcursor\";\nimport CodeBlockLowlight from \"@tiptap/extension-code-block-lowlight\";\nimport Heading from \"@tiptap/extension-heading\";\nimport Highlight from \"@tiptap/extension-highlight\";\nimport { lowlight } from \"lowlight\";\nimport javascript from \"highlight.js/lib/languages/javascript\";\nimport typescript from \"highlight.js/lib/languages/typescript\";\nimport json from \"highlight.js/lib/languages/json\";\nimport css from \"highlight.js/lib/languages/css\";\nimport xml from \"highlight.js/lib/languages/xml\";\nimport type { Extensions } from \"@tiptap/core\";\nimport { createId } from \"./create-id\";\nimport { CodeMirrorNode } from \"./components/custom-code-mirror\";\n\nlowlight.registerLanguage(\"javascript\", javascript);\nlowlight.registerLanguage(\"typescript\", typescript);\nlowlight.registerLanguage(\"json\", json);\nlowlight.registerLanguage(\"css\", css);\nlowlight.registerLanguage(\"html\", xml);\n\ninterface ExtensionOptions {\n placeholder?: string;\n}\n\nexport const createExtensions = ({\n placeholder,\n}: ExtensionOptions = {}): Extensions => [\n StarterKit.configure({\n codeBlock: false,\n // Configured/replaced explicitly below (custom options or a\n // `.extend()`) — disabled here to avoid tiptap's duplicate-extension\n // warning and constructing throwaway instances of each.\n link: false,\n dropcursor: false,\n gapcursor: false,\n heading: false,\n }),\n Placeholder.configure({\n placeholder: placeholder || \"Write something…\",\n }),\n Link.configure({\n openOnClick: false,\n autolink: true,\n linkOnPaste: true,\n }),\n Table.configure({\n resizable: true,\n }),\n TableRow,\n TableHeader,\n TableCell,\n Image.configure({\n // We embed uploaded images as data URLs (no backend/media library in\n // this package), so base64 sources must be allowed.\n allowBase64: true,\n HTMLAttributes: {\n class: \"max-w-full h-auto rounded-md\",\n },\n resize: {\n enabled: true,\n directions: [\"top\", \"bottom\", \"left\", \"right\"],\n alwaysPreserveAspectRatio: true,\n },\n }),\n Dropcursor.configure({\n color: \"hsl(var(--foreground))\",\n width: 2,\n }),\n Gapcursor,\n CodeBlockLowlight.configure({\n lowlight,\n }),\n Heading.extend({\n renderHTML({ node, HTMLAttributes }) {\n const level = this.options.levels.includes(node.attrs.level)\n ? node.attrs.level\n : this.options.levels[0];\n const id =\n typeof node.textContent === \"string\"\n ? createId(node.textContent)\n : undefined;\n\n return [\n `h${level}`,\n {\n ...HTMLAttributes,\n id,\n },\n 0,\n ];\n },\n }),\n Highlight,\n CodeMirrorNode,\n];\n","\"use client\";\n\nimport React, { useEffect, useRef, useState } from \"react\";\nimport type { Editor } from \"@tiptap/react\";\nimport { Check, Trash2, X } from \"lucide-react\";\n\ninterface LinkEditorPopoverProps {\n editor: Editor;\n onClose: () => void;\n variant?: \"panel\" | \"inline\";\n containerRef?: React.MutableRefObject<HTMLDivElement | null>;\n}\n\nconst LinkEditorPopover = ({\n editor,\n onClose,\n variant = \"panel\",\n containerRef,\n}: LinkEditorPopoverProps): React.JSX.Element => {\n const [linkValue, setLinkValue] = useState(\"\");\n const inputRef = useRef<HTMLInputElement | null>(null);\n const localContainerRef = useRef<HTMLDivElement | null>(null);\n\n const assignContainerRef = (node: HTMLDivElement | null) => {\n localContainerRef.current = node;\n if (containerRef) {\n containerRef.current = node;\n }\n };\n\n useEffect(() => {\n const current = editor.getAttributes(\"link\").href as string | undefined;\n setLinkValue(current ?? \"\");\n }, [editor]);\n\n useEffect(() => {\n const timer = window.setTimeout(() => {\n inputRef.current?.focus();\n }, 20);\n\n return () => window.clearTimeout(timer);\n }, []);\n\n const applyLink = () => {\n const value = linkValue.trim();\n if (!value) {\n editor.chain().focus().extendMarkRange(\"link\").unsetLink().run();\n } else {\n editor\n .chain()\n .focus()\n .extendMarkRange(\"link\")\n .setLink({ href: value })\n .run();\n }\n\n onClose();\n };\n\n const removeLink = () => {\n editor.chain().focus().extendMarkRange(\"link\").unsetLink().run();\n onClose();\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"Enter\") {\n event.preventDefault();\n applyLink();\n }\n\n if (event.key === \"Escape\") {\n event.preventDefault();\n onClose();\n }\n };\n\n if (variant === \"inline\") {\n return (\n <div\n ref={assignContainerRef}\n className=\"flex items-center gap-2 rounded-md border border-border bg-background p-2 shadow\"\n onMouseDown={(event) => event.stopPropagation()}\n >\n <input\n ref={inputRef}\n type=\"url\"\n placeholder=\"https://example.com\"\n value={linkValue}\n onChange={(event) => setLinkValue(event.target.value)}\n onKeyDown={handleKeyDown}\n className=\"w-48 rounded border border-border bg-background px-2 py-1 text-sm text-foreground focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary\"\n />\n <button\n type=\"button\"\n aria-label=\"Cancel link editing\"\n className=\"inline-flex h-8 w-8 items-center justify-center rounded border border-border text-foreground transition-colors hover:bg-muted\"\n onClick={onClose}\n >\n <X className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n aria-label=\"Remove link\"\n className=\"inline-flex h-8 w-8 items-center justify-center rounded border border-border text-foreground transition-colors hover:bg-muted\"\n onClick={removeLink}\n >\n <Trash2 className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n aria-label=\"Apply link\"\n className=\"inline-flex h-8 w-8 items-center justify-center rounded bg-primary text-primary-foreground transition-colors hover:bg-primary/90\"\n onClick={applyLink}\n >\n <Check className=\"h-4 w-4\" />\n </button>\n </div>\n );\n }\n\n return (\n <div\n ref={assignContainerRef}\n className=\"absolute left-2 top-full z-20 mt-2 w-full max-w-sm rounded-md border border-border bg-background p-3 shadow-lg\"\n >\n <div className=\"flex flex-col gap-2\">\n <label className=\"text-xs font-medium text-muted-foreground\">\n Link URL\n </label>\n <input\n ref={inputRef}\n type=\"url\"\n placeholder=\"https://example.com\"\n value={linkValue}\n onChange={(event) => setLinkValue(event.target.value)}\n onKeyDown={handleKeyDown}\n className=\"w-full rounded border border-border bg-background px-2 py-1 text-sm text-foreground focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary\"\n />\n <div className=\"flex items-center justify-end gap-2\">\n <button\n type=\"button\"\n className=\"inline-flex items-center gap-1 rounded border border-border px-2 py-1 text-sm text-foreground transition-colors hover:bg-muted\"\n onClick={onClose}\n >\n <X className=\"h-4 w-4\" />\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"inline-flex items-center gap-1 rounded border border-border px-2 py-1 text-sm text-foreground transition-colors hover:bg-muted\"\n onClick={removeLink}\n >\n <Trash2 className=\"h-4 w-4\" />\n Remove\n </button>\n <button\n type=\"button\"\n className=\"inline-flex items-center gap-1 rounded bg-primary px-2 py-1 text-sm font-medium text-primary-foreground transition-colors hover:bg-primary/90\"\n onClick={applyLink}\n >\n <Check className=\"h-4 w-4\" />\n Apply\n </button>\n </div>\n </div>\n </div>\n );\n};\n\nexport default LinkEditorPopover;\n","import React, { useEffect, useRef, useState } from \"react\";\nimport type { Editor } from \"@tiptap/core\";\nimport type { Level } from \"@tiptap/extension-heading\";\nimport {\n Bold,\n ChevronDown,\n Code,\n Image as ImageIcon,\n Italic,\n Link as LinkIcon,\n List as ListIcon,\n ListOrdered,\n Minus,\n Plus,\n Quote,\n Redo2,\n Table as TableIcon,\n Trash2,\n Underline,\n Undo2,\n} from \"lucide-react\";\nimport LinkEditorPopover from \"./components/link-editor-popover.js\";\n\ninterface ToolbarProps {\n editor: Editor | null;\n onRequestImageUpload: () => void;\n isUploadingImage?: boolean;\n}\n\ntype PopoverType = \"heading\" | \"insert\" | \"link\" | null;\n\nconst iconButtonBase =\n \"inline-flex h-8 w-8 items-center justify-center rounded border border-transparent text-foreground transition-colors focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary disabled:cursor-not-allowed disabled:opacity-50\";\n\nfunction IconButton({\n icon: Icon,\n label,\n active,\n disabled,\n onClick,\n}: {\n icon: React.ComponentType<{ className?: string }>;\n label: string;\n active?: boolean;\n disabled?: boolean;\n onClick?: () => void;\n}): React.JSX.Element {\n return (\n <button\n type=\"button\"\n aria-label={label}\n title={label}\n className={`${iconButtonBase} ${\n active\n ? \"bg-primary text-primary-foreground hover:bg-primary/90\"\n : \"bg-transparent hover:bg-muted\"\n }`}\n disabled={disabled}\n onClick={onClick}\n >\n <Icon className=\"h-4 w-4\" />\n </button>\n );\n}\n\nconst headingOptions: Array<{\n label: string;\n value: string;\n level?: Level;\n}> = [\n { label: \"Paragraph\", value: \"paragraph\" },\n { label: \"Heading 1\", value: \"h1\", level: 1 },\n { label: \"Heading 2\", value: \"h2\", level: 2 },\n { label: \"Heading 3\", value: \"h3\", level: 3 },\n];\n\nfunction Divider(): React.JSX.Element {\n return <span aria-hidden className=\"mx-1 h-6 w-px shrink-0 bg-border\" />;\n}\n\nconst Toolbar = ({\n editor,\n onRequestImageUpload,\n isUploadingImage,\n}: ToolbarProps): React.JSX.Element | null => {\n const [activePopover, setActivePopover] = useState<PopoverType>(null);\n const [wordCount, setWordCount] = useState(0);\n const popoverRef = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n if (!activePopover) return undefined;\n\n const handleClick = (event: MouseEvent) => {\n if (\n popoverRef.current &&\n !popoverRef.current.contains(event.target as Node)\n ) {\n setActivePopover(null);\n }\n };\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") setActivePopover(null);\n };\n\n document.addEventListener(\"mousedown\", handleClick);\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n document.removeEventListener(\"mousedown\", handleClick);\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [activePopover]);\n\n useEffect(() => {\n if (!editor) return undefined;\n const updateStats = () => {\n const text = editor.getText().trim();\n setWordCount(text ? text.split(/\\s+/).length : 0);\n };\n updateStats();\n editor.on(\"update\", updateStats);\n return () => {\n editor.off(\"update\", updateStats);\n };\n }, [editor]);\n\n if (!editor) return null;\n\n const activeHeading =\n headingOptions.find((option) =>\n option.level\n ? editor.isActive(\"heading\", { level: option.level })\n : editor.isActive(\"paragraph\"),\n ) ?? headingOptions[0];\n const readTime =\n wordCount === 0 ? 0 : Math.max(1, Math.ceil(wordCount / 200));\n\n const selectHeading = (level?: Level) => {\n const chain = editor.chain().focus();\n if (level) chain.setHeading({ level }).run();\n else chain.setParagraph().run();\n setActivePopover(null);\n };\n\n const insertTable = () => {\n editor\n .chain()\n .focus()\n .insertTable({ rows: 3, cols: 3, withHeaderRow: true })\n .run();\n setActivePopover(null);\n };\n\n return (\n <div className=\"relative w-full\">\n <div className=\"overflow-visible border-b border-border bg-card\">\n <div className=\"flex min-h-11 flex-wrap items-center gap-1 px-4 py-1\">\n <IconButton\n icon={Undo2}\n label=\"Undo\"\n disabled={!editor.can().undo()}\n onClick={() => editor.chain().focus().undo().run()}\n />\n <IconButton\n icon={Redo2}\n label=\"Redo\"\n disabled={!editor.can().redo()}\n onClick={() => editor.chain().focus().redo().run()}\n />\n <Divider />\n\n <div\n ref={\n activePopover === \"heading\" ? popoverRef : undefined\n }\n className=\"relative\"\n >\n <button\n type=\"button\"\n className=\"flex h-8 min-w-28 items-center justify-between gap-3 rounded border border-input bg-card px-3 text-sm font-medium hover:bg-muted\"\n aria-haspopup=\"menu\"\n aria-expanded={activePopover === \"heading\"}\n onClick={() =>\n setActivePopover((current) =>\n current === \"heading\" ? null : \"heading\",\n )\n }\n >\n {activeHeading.label}\n <ChevronDown className=\"size-4 text-muted-foreground\" />\n </button>\n {activePopover === \"heading\" && (\n <div className=\"te-popover absolute left-0 top-full z-30 mt-1 w-40 rounded-md p-1 shadow-lg\">\n {headingOptions.map((option) => (\n <button\n key={option.value}\n type=\"button\"\n role=\"menuitem\"\n className=\"flex w-full rounded px-2.5 py-2 text-left text-sm hover:bg-muted\"\n onClick={() =>\n selectHeading(option.level)\n }\n >\n {option.label}\n </button>\n ))}\n </div>\n )}\n </div>\n <Divider />\n\n <IconButton\n icon={Bold}\n label=\"Bold\"\n active={editor.isActive(\"bold\")}\n onClick={() =>\n editor.chain().focus().toggleBold().run()\n }\n />\n <IconButton\n icon={Italic}\n label=\"Italic\"\n active={editor.isActive(\"italic\")}\n onClick={() =>\n editor.chain().focus().toggleItalic().run()\n }\n />\n <IconButton\n icon={Underline}\n label=\"Underline\"\n active={editor.isActive(\"underline\")}\n onClick={() =>\n editor.chain().focus().toggleMark(\"underline\").run()\n }\n />\n <IconButton\n icon={Code}\n label=\"Inline code\"\n active={editor.isActive(\"code\")}\n onClick={() =>\n editor.chain().focus().toggleCode().run()\n }\n />\n <IconButton\n icon={LinkIcon}\n label=\"Insert link\"\n active={editor.isActive(\"link\")}\n onClick={() =>\n setActivePopover((current) =>\n current === \"link\" ? null : \"link\",\n )\n }\n />\n <Divider />\n\n <IconButton\n icon={ListIcon}\n label=\"Bullet list\"\n active={editor.isActive(\"bulletList\")}\n onClick={() =>\n editor.chain().focus().toggleBulletList().run()\n }\n />\n <IconButton\n icon={ListOrdered}\n label=\"Numbered list\"\n active={editor.isActive(\"orderedList\")}\n onClick={() =>\n editor.chain().focus().toggleOrderedList().run()\n }\n />\n <IconButton\n icon={Quote}\n label=\"Blockquote\"\n active={editor.isActive(\"blockquote\")}\n onClick={() =>\n editor.chain().focus().toggleBlockquote().run()\n }\n />\n <Divider />\n\n <div\n ref={\n activePopover === \"insert\" ? popoverRef : undefined\n }\n className=\"relative\"\n >\n <button\n type=\"button\"\n className=\"flex h-8 items-center gap-1.5 rounded border border-primary px-2.5 text-sm font-semibold text-primary hover:bg-[var(--primary-soft)]\"\n aria-haspopup=\"menu\"\n aria-expanded={activePopover === \"insert\"}\n onClick={() =>\n setActivePopover((current) =>\n current === \"insert\" ? null : \"insert\",\n )\n }\n >\n <Plus className=\"size-4\" />\n Insert\n </button>\n {activePopover === \"insert\" && (\n <div className=\"te-popover absolute right-0 top-full z-30 mt-1 w-52 rounded-md p-1 shadow-lg\">\n <button\n type=\"button\"\n className=\"flex w-full items-center gap-2 rounded px-2.5 py-2 text-sm hover:bg-muted\"\n onClick={() => {\n editor\n .chain()\n .focus()\n .setHorizontalRule()\n .run();\n setActivePopover(null);\n }}\n >\n <Minus className=\"size-4\" />\n Horizontal rule\n </button>\n <button\n type=\"button\"\n className=\"flex w-full items-center gap-2 rounded px-2.5 py-2 text-sm hover:bg-muted\"\n onClick={() => {\n editor\n .chain()\n .focus()\n .toggleCodeBlock()\n .run();\n setActivePopover(null);\n }}\n >\n <Code className=\"size-4\" />\n Code block\n </button>\n <button\n type=\"button\"\n className=\"flex w-full items-center gap-2 rounded px-2.5 py-2 text-sm hover:bg-muted disabled:opacity-50\"\n onClick={insertTable}\n disabled={\n !editor\n .can()\n .chain()\n .focus()\n .insertTable({\n rows: 3,\n cols: 3,\n withHeaderRow: true,\n })\n .run()\n }\n >\n <TableIcon className=\"size-4\" />\n Table\n </button>\n <button\n type=\"button\"\n className=\"flex w-full items-center gap-2 rounded px-2.5 py-2 text-sm hover:bg-muted disabled:opacity-50\"\n disabled={isUploadingImage}\n onClick={() => {\n onRequestImageUpload();\n setActivePopover(null);\n }}\n >\n <ImageIcon className=\"size-4\" />\n {isUploadingImage\n ? \"Uploading image…\"\n : \"Image\"}\n </button>\n\n {editor.isActive(\"table\") && (\n <>\n <div className=\"my-1 h-px bg-border\" />\n <button\n type=\"button\"\n className=\"flex w-full rounded px-2.5 py-2 text-sm hover:bg-muted\"\n onClick={() => {\n editor\n .chain()\n .focus()\n .addRowAfter()\n .run();\n setActivePopover(null);\n }}\n >\n Add table row\n </button>\n <button\n type=\"button\"\n className=\"flex w-full rounded px-2.5 py-2 text-sm hover:bg-muted\"\n onClick={() => {\n editor\n .chain()\n .focus()\n .addColumnAfter()\n .run();\n setActivePopover(null);\n }}\n >\n Add table column\n </button>\n <button\n type=\"button\"\n className=\"flex w-full items-center gap-2 rounded px-2.5 py-2 text-sm text-destructive hover:bg-destructive/10\"\n onClick={() => {\n editor\n .chain()\n .focus()\n .deleteTable()\n .run();\n setActivePopover(null);\n }}\n >\n <Trash2 className=\"size-4\" />\n Remove table\n </button>\n </>\n )}\n </div>\n )}\n </div>\n\n <span className=\"ml-auto hidden pl-8 text-xs tabular-nums text-muted-foreground xl:inline\">\n {wordCount.toLocaleString()}{\" \"}\n {wordCount === 1 ? \"word\" : \"words\"}\n <span aria-hidden className=\"mx-2\">\n ·\n </span>\n {readTime} min\n </span>\n </div>\n </div>\n\n {activePopover === \"link\" && (\n <LinkEditorPopover\n editor={editor}\n onClose={() => setActivePopover(null)}\n containerRef={popoverRef}\n />\n )}\n </div>\n );\n};\n\nexport default Toolbar;\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { Editor } from \"@tiptap/core\";\nimport type { BubbleMenuPluginProps } from \"@tiptap/extension-bubble-menu\";\nimport { BubbleMenuPlugin } from \"@tiptap/extension-bubble-menu\";\nimport {\n Bold,\n Code,\n Italic,\n Link as LinkIcon,\n Strikethrough,\n Underline,\n} from \"lucide-react\";\nimport LinkEditorPopover from \"./components/link-editor-popover\";\n\ninterface BubbleMenuProps {\n editor: Editor;\n}\n\nconst buttonBase =\n \"inline-flex h-8 w-8 items-center justify-center rounded text-foreground transition-colors focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary\";\n\ntype TipTapBubbleMenuProps = {\n editor: Editor | null;\n className?: string;\n children: React.ReactNode;\n pluginKey?: string;\n} & Partial<Omit<BubbleMenuPluginProps, \"editor\" | \"element\" | \"pluginKey\">>;\n\nconst TipTapBubbleMenu = ({\n editor,\n className,\n children,\n pluginKey = \"inlineBubbleMenu\",\n updateDelay,\n resizeDelay,\n shouldShow,\n appendTo,\n getReferencedVirtualElement,\n options,\n}: TipTapBubbleMenuProps): React.JSX.Element => {\n const menuRef = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n const element = menuRef.current;\n\n if (!editor || editor.isDestroyed || !element) {\n return;\n }\n\n const plugin = BubbleMenuPlugin({\n editor,\n element,\n pluginKey,\n updateDelay,\n resizeDelay,\n shouldShow: shouldShow ?? null,\n appendTo,\n getReferencedVirtualElement,\n options,\n });\n\n editor.registerPlugin(plugin);\n\n return () => {\n editor.unregisterPlugin(pluginKey);\n };\n }, [\n editor,\n pluginKey,\n updateDelay,\n resizeDelay,\n shouldShow,\n appendTo,\n getReferencedVirtualElement,\n options,\n ]);\n\n return (\n <div\n ref={menuRef}\n className={className}\n style={{ visibility: \"hidden\" }}\n >\n {children}\n </div>\n );\n};\n\nfunction InlineButton({\n icon: Icon,\n label,\n active,\n onClick,\n}: {\n icon: React.ComponentType<{ className?: string }>;\n label: string;\n active?: boolean;\n onClick: () => void;\n}): React.JSX.Element {\n return (\n <button\n type=\"button\"\n aria-label={label}\n title={label}\n className={`${buttonBase} ${\n active\n ? \"bg-primary text-primary-foreground hover:bg-primary/90\"\n : \"bg-transparent hover:bg-muted\"\n }`}\n onClick={onClick}\n >\n <Icon className=\"h-4 w-4\" />\n </button>\n );\n}\n\nconst InlineBubbleMenu = ({\n editor,\n}: BubbleMenuProps): React.JSX.Element | null => {\n const [isLinkEditing, setIsLinkEditing] = useState(false);\n\n const openLinkEditor = useCallback(() => {\n setIsLinkEditing((prev) => !prev);\n }, []);\n\n useEffect(() => {\n const handleSelectionUpdate = () => {\n setIsLinkEditing(false);\n };\n\n editor.on(\"selectionUpdate\", handleSelectionUpdate);\n\n return () => {\n editor.off(\"selectionUpdate\", handleSelectionUpdate);\n };\n }, [editor]);\n\n if (!editor) {\n return null;\n }\n\n return (\n <TipTapBubbleMenu\n editor={editor}\n className=\"bubble-menu flex flex-col gap-1 rounded-md border border-border bg-popover p-2 text-popover-foreground shadow-xl\"\n >\n <div className=\"flex items-center gap-1\">\n <InlineButton\n icon={Bold}\n label=\"Bold\"\n active={editor.isActive(\"bold\")}\n onClick={() => editor.chain().focus().toggleBold().run()}\n />\n <InlineButton\n icon={Italic}\n label=\"Italic\"\n active={editor.isActive(\"italic\")}\n onClick={() => editor.chain().focus().toggleItalic().run()}\n />\n <InlineButton\n icon={Underline}\n label=\"Underline\"\n active={editor.isActive(\"underline\")}\n onClick={() =>\n editor.chain().focus().toggleMark(\"underline\").run()\n }\n />\n <InlineButton\n icon={Strikethrough}\n label=\"Strikethrough\"\n active={editor.isActive(\"strike\")}\n onClick={() => editor.chain().focus().toggleStrike().run()}\n />\n <InlineButton\n icon={Code}\n label=\"Inline code\"\n active={editor.isActive(\"code\")}\n onClick={() => editor.chain().focus().toggleCode().run()}\n />\n <InlineButton\n icon={LinkIcon}\n label=\"Insert link\"\n active={editor.isActive(\"link\")}\n onClick={openLinkEditor}\n />\n </div>\n {isLinkEditing && (\n <LinkEditorPopover\n editor={editor}\n onClose={() => setIsLinkEditing(false)}\n variant=\"inline\"\n />\n )}\n </TipTapBubbleMenu>\n );\n};\n\nexport default InlineBubbleMenu;\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","\"use client\";\n\nimport { createContext, useContext, type ReactNode } from \"react\";\n\nexport type PickedImage = {\n src: string;\n alt?: string;\n};\n\nconst ImagePickerContext = createContext<\n (() => Promise<PickedImage | null>) | null\n>(null);\n\nexport function ImagePickerContextProvider({\n pickImage,\n children,\n}: {\n pickImage: () => Promise<PickedImage | null>;\n children: ReactNode;\n}) {\n return (\n <ImagePickerContext.Provider value={pickImage}>\n {children}\n </ImagePickerContext.Provider>\n );\n}\n\nexport function useImagePicker() {\n return useContext(ImagePickerContext);\n}\n","\"use client\";\n\nimport React, {\n FC,\n PropsWithChildren,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type { JSONContent } from \"@tiptap/core\";\nimport { generateText } from \"@tiptap/core\";\nimport { EditorContent, useEditor } from \"@tiptap/react\";\nimport emptyDoc from \"./empty-doc\";\nimport { createExtensions } from \"./extensions\";\nimport Toolbar from \"./toolbar\";\nimport BubbleMenu from \"./bubble-menu\";\nimport type { ReactEditorProps } from \"./types\";\nimport { cn } from \"./lib/cn\";\nimport { useImagePicker } from \"./image-picker\";\n\nexport interface EditorProps {\n onChange: (json: JSONContent) => void;\n showToolbar?: boolean;\n editable?: boolean;\n refresh?: number;\n url?: string;\n initialContent?: ReactEditorProps[\"initialContent\"];\n placeholder?: string;\n autoFocus?: boolean;\n imageSizeLimit?: number;\n onError?: (...args: any[]) => void;\n className?: string;\n editorClassName?: string;\n contentClassName?: string;\n beforeContent?: React.ReactNode;\n}\n\ninterface EditorType extends FC<PropsWithChildren<EditorProps>> {\n getPlainText: (doc: JSONContent) => string;\n emptyDoc: JSONContent;\n}\n\nconst Editor: EditorType = Object.assign(\n ({\n initialContent,\n onChange,\n placeholder,\n children,\n showToolbar = true,\n editable = true,\n refresh,\n url,\n autoFocus,\n imageSizeLimit,\n onError,\n className,\n editorClassName,\n contentClassName,\n beforeContent,\n }) => {\n const [isUploading, setIsUploading] = useState(false);\n const fileInputRef = useRef<HTMLInputElement | null>(null);\n const pickImage = useImagePicker();\n const hasInteractedRef = useRef(false);\n const lastSerializedContentRef = useRef(\n JSON.stringify(initialContent ?? emptyDoc),\n );\n const refreshRef = useRef<EditorProps[\"refresh\"]>(refresh);\n\n const extensions = useMemo(\n () => createExtensions({ placeholder }),\n [placeholder],\n );\n\n const changeTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(\n null,\n );\n\n const editor = useEditor(\n {\n immediatelyRender: false,\n extensions,\n content: initialContent ?? emptyDoc,\n autofocus: autoFocus ? \"end\" : false,\n editable,\n editorProps: {\n attributes: {\n class: `tiptap-content ${editorClassName ?? \"\"}`,\n \"data-placeholder\": placeholder ?? \"\",\n },\n },\n onUpdate: ({ editor: instance }) => {\n // TipTap may normalize loaded JSON during initialization\n // (notably `{ type: \"doc\", content: [] }` to\n // `{ type: \"doc\" }`). Do not turn that internal mount work\n // into a user-visible autosave.\n if (!hasInteractedRef.current) {\n return;\n }\n if (changeTimeoutRef.current) {\n clearTimeout(changeTimeoutRef.current);\n }\n\n changeTimeoutRef.current = setTimeout(() => {\n onChange(instance.getJSON());\n changeTimeoutRef.current = null;\n }, 1000);\n },\n onSelectionUpdate: ({ editor: instance }) => {\n hasInteractedRef.current = true;\n },\n },\n [extensions],\n );\n useEffect(() => {\n return () => {\n if (changeTimeoutRef.current) {\n clearTimeout(changeTimeoutRef.current);\n }\n };\n }, []);\n\n useEffect(() => {\n if (!editor) {\n return;\n }\n\n editor.setEditable(editable);\n }, [editor, editable]);\n\n useEffect(() => {\n if (!editor) {\n return;\n }\n\n const nextContent = initialContent ?? emptyDoc;\n const nextSerialized = JSON.stringify(nextContent);\n const refreshChanged = refreshRef.current !== refresh;\n\n if (refreshChanged) {\n refreshRef.current = refresh;\n hasInteractedRef.current = false;\n lastSerializedContentRef.current = nextSerialized;\n editor.commands.setContent(nextContent, {\n emitUpdate: false,\n });\n return;\n }\n\n if (!hasInteractedRef.current) {\n if (lastSerializedContentRef.current !== nextSerialized) {\n lastSerializedContentRef.current = nextSerialized;\n editor.commands.setContent(nextContent, {\n emitUpdate: false,\n });\n }\n return;\n }\n\n lastSerializedContentRef.current = nextSerialized;\n }, [editor, initialContent, refresh]);\n\n const handleImageUpload = useCallback(\n async (file: File) => {\n const sizeLimit = imageSizeLimit ?? 2097152; // 2 MB\n if (file.size > sizeLimit) {\n onError?.(\"File is larger than the allowed size\");\n return;\n }\n\n try {\n setIsUploading(true);\n // First-draft implementation: embed the image as a data URL so\n // the editor works without a media/upload backend.\n const dataUrl = await new Promise<string>(\n (resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () =>\n resolve(reader.result as string);\n reader.onerror = reject;\n reader.readAsDataURL(file);\n },\n );\n editor\n ?.chain()\n .focus()\n .setImage({\n src: dataUrl,\n alt: file.name,\n title: file.name,\n })\n .run();\n } catch (error) {\n console.error(\"Image upload failed\", error);\n } finally {\n setIsUploading(false);\n }\n },\n [editor],\n );\n\n const handleSelectFile = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const files = event.target.files;\n if (!files || files.length === 0) {\n return;\n }\n\n const file = files[0];\n void handleImageUpload(file);\n event.target.value = \"\";\n },\n [handleImageUpload],\n );\n\n const insertPickedImage = useCallback(\n (image: { src: string; alt?: string }) => {\n editor\n ?.chain()\n .focus()\n .setImage({\n src: image.src,\n alt: image.alt,\n title: image.alt,\n })\n .run();\n },\n [editor],\n );\n\n const openFileDialog = useCallback(() => {\n if (pickImage) {\n void pickImage().then((image) => {\n if (image) insertPickedImage(image);\n });\n return;\n }\n fileInputRef.current?.click();\n }, [insertPickedImage, pickImage]);\n\n if (typeof window === \"undefined\") {\n return <></>;\n }\n\n return (\n <div\n className={cn(\n \"tiptap-editor flex flex-col gap-4 border\",\n className,\n )}\n >\n {editable && showToolbar && (\n <div\n className=\"sticky top-0 bg-background\"\n style={{\n zIndex: 1,\n }}\n >\n <Toolbar\n editor={editor}\n onRequestImageUpload={openFileDialog}\n isUploadingImage={isUploading}\n />\n </div>\n )}\n <div className=\"flex w-full justify-center\">\n <div\n className={cn(\n \"flex w-full max-w-3xl flex-col\",\n contentClassName,\n )}\n >\n {beforeContent}\n <EditorContent\n editor={editor}\n className={`${editorClassName ?? \"\"} ${editorClassName?.includes(\"min-h-\") ? \"\" : \"min-h-[200px]\"}`}\n />\n {pickImage ? null : (\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/*\"\n className=\"hidden\"\n onChange={handleSelectFile}\n />\n )}\n {children}\n {editor && <BubbleMenu editor={editor} />}\n </div>\n </div>\n </div>\n );\n },\n {\n getPlainText: (doc: JSONContent) =>\n generateText(doc || emptyDoc, createExtensions()),\n emptyDoc,\n },\n) as EditorType;\n\nexport default Editor;\n","import type { JSONContent } from \"@tiptap/core\";\nimport { createId } from \"./create-id\";\n\ninterface Heading {\n level: number;\n text: string;\n id: string;\n}\n\nexport function extractHeadings(\n json: JSONContent | null | undefined,\n): Heading[] {\n const headings: Heading[] = [];\n\n const collectHeadings = (node?: JSONContent) => {\n if (!node) {\n return;\n }\n\n if (node.type === \"heading\") {\n const level =\n typeof node.attrs?.level === \"number\" ? node.attrs.level : 1;\n\n const collectText = (current?: JSONContent): string => {\n if (!current) {\n return \"\";\n }\n\n if (typeof current.text === \"string\") {\n return current.text;\n }\n\n if (!current.content) {\n return \"\";\n }\n\n return current.content.map(collectText).join(\"\");\n };\n\n const textContent = collectText(node);\n\n headings.push({\n level,\n text: textContent,\n id: createId(textContent),\n });\n }\n\n if (Array.isArray(node.content)) {\n node.content.forEach((child) => {\n collectHeadings(child as JSONContent);\n });\n }\n };\n\n collectHeadings(json || undefined);\n\n return headings;\n}\n","export function extractTextFromNode(node): string {\n if (!node) {\n return \"\";\n }\n\n // ProseMirror nodes have a textContent property that contains all text\n if (typeof node.textContent === \"string\") {\n return node.textContent;\n }\n\n // Fallback: if content is a Fragment, access its content array\n if (\n node.content &&\n node.content.content &&\n Array.isArray(node.content.content)\n ) {\n return node.content.content\n .map((child: any) => {\n // Text nodes have a text property\n if (child.text) {\n return child.text;\n }\n // Recursively extract from child nodes\n return extractTextFromNode(child);\n })\n .join(\"\");\n }\n\n // Fallback: if content is directly an array\n if (Array.isArray(node.content)) {\n return node.content\n .map((child: any) => {\n if (child.text) {\n return child.text;\n }\n return extractTextFromNode(child);\n })\n .join(\"\");\n }\n\n return \"\";\n}\n","\"use client\";\n\nimport React, { useEffect, useState } from \"react\";\nimport { Check, Copy } from \"lucide-react\";\nimport { extractTextFromNode } from \"../extract-text-from-node\";\n\nfunction textFromChildren(node: React.ReactNode): string {\n if (node == null || typeof node === \"boolean\") return \"\";\n if (typeof node === \"string\" || typeof node === \"number\") {\n return String(node);\n }\n if (Array.isArray(node)) return node.map(textFromChildren).join(\"\");\n if (React.isValidElement<{ children?: React.ReactNode }>(node)) {\n return textFromChildren(node.props.children);\n }\n return \"\";\n}\n\nasync function writeClipboard(text: string): Promise<void> {\n if (navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n return;\n }\n const area = document.createElement(\"textarea\");\n area.value = text;\n area.setAttribute(\"readonly\", \"\");\n area.style.position = \"fixed\";\n area.style.left = \"-9999px\";\n document.body.appendChild(area);\n area.select();\n document.execCommand(\"copy\");\n area.remove();\n}\n\nexport function RenderedCodeBlock({\n node,\n children,\n language,\n}: {\n node?: { textContent?: string; content?: unknown };\n children?: React.ReactNode;\n language?: string;\n}): React.JSX.Element {\n const [copied, setCopied] = useState(false);\n\n const source =\n extractTextFromNode(node) || textFromChildren(children);\n\n useEffect(() => {\n if (!copied) return;\n const timer = window.setTimeout(() => setCopied(false), 1500);\n return () => window.clearTimeout(timer);\n }, [copied]);\n\n async function handleCopy() {\n if (!source) return;\n try {\n await writeClipboard(source);\n setCopied(true);\n } catch {\n setCopied(false);\n }\n }\n\n return (\n <div className=\"te-code-block\">\n <pre>\n <code className={language ? `language-${language}` : undefined}>\n {children}\n </code>\n </pre>\n <button\n type=\"button\"\n className=\"te-code-copy\"\n aria-label={copied ? \"Copied\" : \"Copy code\"}\n title={copied ? \"Copied\" : \"Copy\"}\n onClick={() => {\n void handleCopy();\n }}\n >\n {copied ? (\n <Check className=\"te-code-copy__icon\" aria-hidden />\n ) : (\n <Copy className=\"te-code-copy__icon\" aria-hidden />\n )}\n </button>\n </div>\n );\n}\n","import React from \"react\";\nimport { renderToReactElement } from \"@tiptap/static-renderer\";\nimport { extractTextFromNode } from \"./extract-text-from-node\";\nimport emptyDoc from \"./empty-doc\";\nimport { createExtensions } from \"./extensions\";\nimport { createId } from \"./create-id\";\nimport type { TextEditorContent } from \"./text-editor-content\";\nimport type { TextRendererTheme } from \"./renderer-theme\";\nimport { cn } from \"./lib/cn\";\nimport { RenderedCodeBlock } from \"./components/rendered-code-block\";\n\ninterface TextRendererProps {\n json: TextEditorContent;\n className?: string;\n theme?: TextRendererTheme;\n}\n\nconst typographyClasses = (typography?: {\n fontFamily?: string;\n fontSize?: string;\n fontWeight?: string;\n lineHeight?: string;\n letterSpacing?: string;\n textTransform?: string;\n textDecoration?: string;\n textOverflow?: string;\n}) => [\n typography?.fontFamily,\n typography?.fontSize,\n typography?.fontWeight,\n typography?.lineHeight,\n typography?.letterSpacing,\n typography?.textTransform,\n typography?.textDecoration,\n typography?.textOverflow,\n];\n\nfunction removeEmptyTextNodes(node: any): any {\n if (!node || typeof node !== \"object\") {\n return node;\n }\n\n if (node.type === \"text\" && node.text === \"\") {\n return undefined;\n }\n\n if (!Array.isArray(node.content)) {\n return node;\n }\n\n const content = node.content\n .map(removeEmptyTextNodes)\n .filter((child: any) => child !== undefined);\n\n return {\n ...node,\n content,\n };\n}\n\n/**\n * Renders TipTap `TextEditorContent` JSON as static React elements — used to\n * display rich text saved by the `Editor` (e.g. inside a block's body). When\n * a `theme` is provided, headings/paragraphs/links pick up its typography;\n * otherwise plain semantic HTML tags are used.\n */\nexport function TextRenderer({ json, className, theme }: TextRendererProps) {\n const extensions = createExtensions();\n const content = removeEmptyTextNodes(\n (json as any) ?? (emptyDoc as any),\n ) as TextEditorContent;\n\n const rendered = renderToReactElement({\n extensions,\n content,\n options: {\n nodeMapping: {\n paragraph: ({ children }) => {\n const classes = cn(\n \"text-base\",\n ...typographyClasses(theme?.typography?.text1),\n );\n return <p className={classes}>{children}</p>;\n },\n hardBreak: () => <br />,\n heading: ({ node, children }) => {\n const level = node?.attrs?.level ?? 1;\n // Extract text from the node structure (same as extractHeadings does)\n const textContent = extractTextFromNode(node);\n const id = createId(textContent);\n\n if (!theme) {\n const Tag = `h${level}` as React.ElementType;\n return <Tag id={id}>{children}</Tag>;\n }\n\n if (level === 1) {\n const classes = cn(\n \"scroll-m-20 text-4xl font-bold tracking-tight\",\n ...typographyClasses(theme?.typography?.header1),\n );\n return (\n <h1 id={id} className={classes}>\n {children}\n </h1>\n );\n }\n if (level === 2) {\n const classes = cn(\n \"scroll-m-20 text-3xl font-bold tracking-tight\",\n ...typographyClasses(theme?.typography?.header2),\n );\n return (\n <h2 id={id} className={classes}>\n {children}\n </h2>\n );\n }\n const classes = cn(\n \"scroll-m-20 text-2xl font-semibold tracking-normal\",\n ...typographyClasses(theme?.typography?.header3),\n );\n return (\n <h3 id={id} className={classes}>\n {children}\n </h3>\n );\n },\n codeBlock: ({ node, children }) => (\n <RenderedCodeBlock\n node={node}\n language={node?.attrs?.language}\n >\n {children}\n </RenderedCodeBlock>\n ),\n codeMirror: ({ node, children }) => (\n <RenderedCodeBlock node={node}>\n {children}\n </RenderedCodeBlock>\n ),\n },\n markMapping: {\n link: ({ mark, children }) => {\n const href = mark?.attrs?.href;\n const linkStyle = theme?.interactives?.link;\n const classes = cn(\n \"font-medium cursor-pointer\",\n ...typographyClasses(theme?.typography?.link),\n linkStyle?.padding?.x,\n linkStyle?.padding?.y,\n linkStyle?.border?.width,\n linkStyle?.border?.radius,\n linkStyle?.border?.style,\n linkStyle?.custom,\n );\n return (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={classes}\n style={{\n textShadow: linkStyle?.textShadow || undefined,\n }}\n >\n {children}\n </a>\n );\n },\n highlight: ({ children }) => (\n <mark className=\"bg-accent text-accent-foreground\">\n {children}\n </mark>\n ),\n },\n },\n });\n\n const combinedClassName = [\"tiptap-renderer\", className]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div className=\"text-editor flex flex-col gap-4\">\n <div className={combinedClassName}>{rendered}</div>\n </div>\n );\n}\n\nexport default TextRenderer;\n","import type { TextEditorContent } from \"./text-editor-content\";\n\nfunction createParagraphNode(text: string) {\n const lines = text.split(\"\\n\");\n const content: Record<string, unknown>[] = [];\n\n lines.forEach((line, index) => {\n if (line) {\n content.push({\n type: \"text\",\n text: line,\n });\n }\n\n if (index < lines.length - 1) {\n content.push({\n type: \"hardBreak\",\n });\n }\n });\n\n return {\n type: \"paragraph\",\n ...(content.length ? { content } : {}),\n };\n}\n\n/** Normalizes a plain string or an already-valid TipTap doc into `TextEditorContent`. */\nexport function normalizeTextEditorContent(\n json: TextEditorContent | string,\n): TextEditorContent {\n if (\n json &&\n typeof json === \"object\" &&\n \"type\" in json &&\n json.type === \"doc\"\n ) {\n return json as TextEditorContent;\n }\n\n const text = typeof json === \"string\" ? json.replace(/\\r\\n?/g, \"\\n\") : \"\";\n\n return {\n type: \"doc\",\n content: text\n ? text\n .split(/\\n{2,}/)\n .map((paragraph) => createParagraphNode(paragraph))\n : [],\n };\n}\n","/** Recursively concatenates all plain text out of a TipTap JSON content tree. */\nexport function extractTextFromTextEditorContent(content: unknown): string {\n if (typeof content === \"string\") {\n return content;\n }\n\n if (!content || typeof content !== \"object\") {\n return \"\";\n }\n\n const record = content as Record<string, unknown>;\n const ownText = typeof record.text === \"string\" ? record.text : \"\";\n const children = Array.isArray(record.content)\n ? record.content.map(extractTextFromTextEditorContent).join(\"\")\n : \"\";\n\n return `${ownText}${children}`;\n}\n","import type { TextEditorContent } from \"./text-editor-content\";\n\nfunction appendEllipsisToLastTextNode(nodes: any[]): any[] {\n for (let i = nodes.length - 1; i >= 0; i--) {\n const node = nodes[i];\n\n if (!node) {\n continue;\n }\n\n if (node.type === \"text\" && typeof node.text === \"string\") {\n if (!node.text.endsWith(\"...\")) {\n nodes[i] = {\n ...node,\n text: `${node.text.trimEnd()}...`,\n };\n }\n return nodes;\n }\n\n if (Array.isArray(node.content) && node.content.length) {\n nodes[i] = {\n ...node,\n content: appendEllipsisToLastTextNode([...node.content]),\n };\n return nodes;\n }\n }\n\n return nodes;\n}\n\nfunction truncateNodes(\n nodes: any[],\n remaining: number,\n): {\n nodes: any[];\n remaining: number;\n truncated: boolean;\n} {\n const truncatedNodes: any[] = [];\n let truncated = false;\n\n for (let index = 0; index < nodes.length; index++) {\n const node = nodes[index];\n\n if (!node) {\n continue;\n }\n\n if (remaining <= 0) {\n truncated = true;\n break;\n }\n\n if (node.type === \"text\" && typeof node.text === \"string\") {\n if (node.text.length <= remaining) {\n truncatedNodes.push(node);\n remaining -= node.text.length;\n } else {\n truncatedNodes.push({\n ...node,\n text: node.text.slice(0, remaining).trimEnd(),\n });\n remaining = 0;\n truncated = true;\n break;\n }\n\n continue;\n }\n\n if (node.type === \"hardBreak\") {\n truncatedNodes.push(node);\n remaining -= 1;\n continue;\n }\n\n if (Array.isArray(node.content)) {\n const result = truncateNodes(node.content, remaining);\n remaining = result.remaining;\n\n if (result.nodes.length > 0) {\n truncatedNodes.push({\n ...node,\n content: result.nodes,\n });\n }\n\n if (result.truncated) {\n truncated = true;\n break;\n }\n\n continue;\n }\n\n truncatedNodes.push(node);\n }\n\n if (truncated) {\n return {\n nodes: appendEllipsisToLastTextNode(truncatedNodes),\n remaining,\n truncated,\n };\n }\n\n return {\n nodes: truncatedNodes,\n remaining,\n truncated,\n };\n}\n\nexport function truncateTextEditorContent(\n json: TextEditorContent,\n characterLimit?: number,\n): TextEditorContent {\n if (!characterLimit || characterLimit <= 0) {\n return json;\n }\n\n const content = Array.isArray((json as any)?.content)\n ? (json as any).content\n : [];\n const result = truncateNodes(content, characterLimit);\n\n return {\n ...(json as any),\n content: result.nodes,\n };\n}\n"]}
|
package/dist/prose.css
ADDED
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
/* Editing surface (Editor / ProseMirror) */
|
|
2
|
+
|
|
3
|
+
.tiptap-editor {
|
|
4
|
+
display: flex;
|
|
5
|
+
flex-direction: column;
|
|
6
|
+
gap: 0.75rem;
|
|
7
|
+
border-color: var(--border);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
.tiptap-editor .ProseMirror:not([class*="min-h-"]) {
|
|
11
|
+
min-height: 12.5rem;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
.tiptap-editor .ProseMirror {
|
|
15
|
+
padding: 1rem;
|
|
16
|
+
border-radius: 0.5rem;
|
|
17
|
+
outline: none;
|
|
18
|
+
word-break: break-word;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.tiptap-editor .ProseMirror.writing-editor-content {
|
|
22
|
+
min-height: 26rem;
|
|
23
|
+
padding: 0 2.5rem 8rem;
|
|
24
|
+
font-size: 1.0625rem;
|
|
25
|
+
line-height: 1.75;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.tiptap-editor .ProseMirror.writing-editor-content p {
|
|
29
|
+
margin: 0 0 1.35rem;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
@media (max-width: 640px) {
|
|
33
|
+
.tiptap-editor .ProseMirror.writing-editor-content {
|
|
34
|
+
padding-right: 1.5rem;
|
|
35
|
+
padding-left: 1.5rem;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.tiptap-editor .ProseMirror p.is-editor-empty:first-child::before {
|
|
40
|
+
color: var(--muted-foreground);
|
|
41
|
+
content: attr(data-placeholder);
|
|
42
|
+
float: left;
|
|
43
|
+
height: 0;
|
|
44
|
+
pointer-events: none;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.tiptap-editor .ProseMirror a {
|
|
48
|
+
color: var(--primary);
|
|
49
|
+
text-decoration: underline;
|
|
50
|
+
text-decoration-thickness: 0.1em;
|
|
51
|
+
text-decoration-color: var(--primary);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.tiptap-editor .ProseMirror ul,
|
|
55
|
+
.tiptap-editor .ProseMirror ol {
|
|
56
|
+
padding-left: 1.5rem;
|
|
57
|
+
margin: 0.75rem 0;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.tiptap-editor .ProseMirror ul li {
|
|
61
|
+
list-style: disc;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.tiptap-editor .ProseMirror ol li {
|
|
65
|
+
list-style: decimal;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.tiptap-editor .ProseMirror blockquote {
|
|
69
|
+
border-left: 3px solid var(--border);
|
|
70
|
+
margin: 0.75rem 0;
|
|
71
|
+
padding-left: 1rem;
|
|
72
|
+
color: var(--muted-foreground);
|
|
73
|
+
font-style: italic;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.tiptap-editor .ProseMirror h1,
|
|
77
|
+
.tiptap-editor .ProseMirror h2,
|
|
78
|
+
.tiptap-editor .ProseMirror h3,
|
|
79
|
+
.tiptap-editor .ProseMirror h4,
|
|
80
|
+
.tiptap-editor .ProseMirror h5,
|
|
81
|
+
.tiptap-editor .ProseMirror h6 {
|
|
82
|
+
font-weight: 600;
|
|
83
|
+
line-height: 1.25;
|
|
84
|
+
margin: 1.5rem 0 0.75rem;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.tiptap-editor .ProseMirror h1 {
|
|
88
|
+
font-size: clamp(2rem, 3vw, 2.5rem);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
.tiptap-editor .ProseMirror h2 {
|
|
92
|
+
font-size: clamp(1.75rem, 2.5vw, 2rem);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
.tiptap-editor .ProseMirror h3 {
|
|
96
|
+
font-size: clamp(1.5rem, 2vw, 1.75rem);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.tiptap-editor .ProseMirror pre {
|
|
100
|
+
background-color: var(--muted, hsl(210 40% 96.1%));
|
|
101
|
+
border: 1px solid var(--border, hsl(214.3 31.8% 91.4%));
|
|
102
|
+
border-radius: 0.5rem;
|
|
103
|
+
color: var(--foreground, hsl(222.2 84% 4.9%));
|
|
104
|
+
font-family:
|
|
105
|
+
ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas,
|
|
106
|
+
"Liberation Mono", monospace;
|
|
107
|
+
font-size: 0.875rem;
|
|
108
|
+
margin: 0.75rem 0;
|
|
109
|
+
padding: 1rem;
|
|
110
|
+
overflow-x: auto;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
.tiptap-editor .ProseMirror pre code {
|
|
114
|
+
background: none;
|
|
115
|
+
color: inherit;
|
|
116
|
+
padding: 0;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
.tiptap-editor .ProseMirror code {
|
|
120
|
+
background-color: var(--muted, hsl(210 40% 96.1%));
|
|
121
|
+
border-radius: 0.375rem;
|
|
122
|
+
padding: 0.125rem 0.375rem;
|
|
123
|
+
font-size: 0.875em;
|
|
124
|
+
font-family:
|
|
125
|
+
ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas,
|
|
126
|
+
"Liberation Mono", monospace;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
.tiptap-editor .ProseMirror hr {
|
|
130
|
+
border: none;
|
|
131
|
+
border-top: 1px solid var(--border);
|
|
132
|
+
margin: 1.5rem 0;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
.tiptap-editor .ProseMirror table {
|
|
136
|
+
border-collapse: collapse;
|
|
137
|
+
border: 1px solid var(--border);
|
|
138
|
+
margin: 1rem 0;
|
|
139
|
+
width: 100%;
|
|
140
|
+
table-layout: fixed;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
.tiptap-editor .ProseMirror table th,
|
|
144
|
+
.tiptap-editor .ProseMirror table td {
|
|
145
|
+
border: 1px solid var(--border);
|
|
146
|
+
padding: 0.5rem;
|
|
147
|
+
vertical-align: top;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
.tiptap-editor .ProseMirror table th {
|
|
151
|
+
background-color: var(--muted);
|
|
152
|
+
font-weight: 600;
|
|
153
|
+
text-align: left;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
.tiptap-editor .ProseMirror img {
|
|
157
|
+
display: block;
|
|
158
|
+
max-width: 100%;
|
|
159
|
+
height: auto;
|
|
160
|
+
border-radius: 0.5rem;
|
|
161
|
+
margin: 1rem auto;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
.tiptap-editor .ProseMirror iframe {
|
|
165
|
+
width: 100%;
|
|
166
|
+
aspect-ratio: 16 / 9;
|
|
167
|
+
border: 0;
|
|
168
|
+
border-radius: 0.75rem;
|
|
169
|
+
background-color: #000;
|
|
170
|
+
margin: 1.5rem 0;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/* Not nested under `.tiptap-editor` — TipTap portals this to <body>. */
|
|
174
|
+
.bubble-menu {
|
|
175
|
+
position: absolute;
|
|
176
|
+
display: flex;
|
|
177
|
+
align-items: center;
|
|
178
|
+
gap: 0.375rem;
|
|
179
|
+
padding: 0.5rem;
|
|
180
|
+
border-radius: 0.5rem;
|
|
181
|
+
border: 1px solid var(--border, hsl(214.3 31.8% 91.4%));
|
|
182
|
+
background-color: var(--popover, hsl(0 0% 100%));
|
|
183
|
+
color: var(--popover-foreground, hsl(222.2 84% 4.9%));
|
|
184
|
+
box-shadow: var(--shadow-popover, 0 10px 15px -3px rgba(15, 23, 42, 0.12));
|
|
185
|
+
z-index: 50;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
.te-popover {
|
|
189
|
+
background-color: var(--popover, hsl(0 0% 100%));
|
|
190
|
+
color: var(--popover-foreground, hsl(222.2 84% 4.9%));
|
|
191
|
+
border: 1px solid var(--border, hsl(214.3 31.8% 91.4%));
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
.tiptap-editor .ProseMirror pre .hljs-comment,
|
|
195
|
+
.tiptap-editor .ProseMirror pre .hljs-quote,
|
|
196
|
+
.tiptap-renderer pre .hljs-comment,
|
|
197
|
+
.tiptap-renderer pre .hljs-quote {
|
|
198
|
+
color: #64748b;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
.tiptap-editor .ProseMirror pre .hljs-keyword,
|
|
202
|
+
.tiptap-editor .ProseMirror pre .hljs-selector-tag,
|
|
203
|
+
.tiptap-renderer pre .hljs-keyword,
|
|
204
|
+
.tiptap-renderer pre .hljs-selector-tag {
|
|
205
|
+
color: #6d28d9;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
.tiptap-editor .ProseMirror pre .hljs-string,
|
|
209
|
+
.tiptap-editor .ProseMirror pre .hljs-attr,
|
|
210
|
+
.tiptap-renderer pre .hljs-string,
|
|
211
|
+
.tiptap-renderer pre .hljs-attr {
|
|
212
|
+
color: #047857;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
.tiptap-editor .ProseMirror pre .hljs-number,
|
|
216
|
+
.tiptap-editor .ProseMirror pre .hljs-literal,
|
|
217
|
+
.tiptap-renderer pre .hljs-number,
|
|
218
|
+
.tiptap-renderer pre .hljs-literal {
|
|
219
|
+
color: #c2410c;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
.tiptap-editor .ProseMirror pre .hljs-title,
|
|
223
|
+
.tiptap-editor .ProseMirror pre .hljs-function,
|
|
224
|
+
.tiptap-renderer pre .hljs-title,
|
|
225
|
+
.tiptap-renderer pre .hljs-function {
|
|
226
|
+
color: #1d4ed8;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
.tiptap-editor .ProseMirror pre .hljs-built_in,
|
|
230
|
+
.tiptap-editor .ProseMirror pre .hljs-type,
|
|
231
|
+
.tiptap-renderer pre .hljs-built_in,
|
|
232
|
+
.tiptap-renderer pre .hljs-type {
|
|
233
|
+
color: #a16207;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
.tiptap-editor .ProseMirror pre .hljs-variable,
|
|
237
|
+
.tiptap-editor .ProseMirror pre .hljs-template-variable,
|
|
238
|
+
.tiptap-renderer pre .hljs-variable,
|
|
239
|
+
.tiptap-renderer pre .hljs-template-variable {
|
|
240
|
+
color: #be185d;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/* Static rendering surface (TextRenderer) */
|
|
244
|
+
|
|
245
|
+
.tiptap-renderer {
|
|
246
|
+
line-height: 1.7;
|
|
247
|
+
color: inherit;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
.tiptap-renderer p {
|
|
251
|
+
margin: 0.75rem 0;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
.tiptap-renderer h1,
|
|
255
|
+
.tiptap-renderer h2,
|
|
256
|
+
.tiptap-renderer h3,
|
|
257
|
+
.tiptap-renderer h4,
|
|
258
|
+
.tiptap-renderer h5,
|
|
259
|
+
.tiptap-renderer h6 {
|
|
260
|
+
line-height: 1.25;
|
|
261
|
+
margin: 1.5rem 0 0.75rem;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
.tiptap-renderer h1:not([class*="text-"]) {
|
|
265
|
+
font-size: clamp(1.75rem, 3vw, 2.25rem);
|
|
266
|
+
font-weight: 700;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
.tiptap-renderer h2:not([class*="text-"]) {
|
|
270
|
+
font-size: clamp(1.35rem, 2.4vw, 1.75rem);
|
|
271
|
+
font-weight: 650;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
.tiptap-renderer h3:not([class*="text-"]) {
|
|
275
|
+
font-size: 1.25rem;
|
|
276
|
+
font-weight: 600;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
.tiptap-renderer ul,
|
|
280
|
+
.tiptap-renderer ol {
|
|
281
|
+
padding-left: 1.5rem;
|
|
282
|
+
margin: 0.75rem 0;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
.tiptap-renderer ul li {
|
|
286
|
+
list-style: disc;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
.tiptap-renderer ol li {
|
|
290
|
+
list-style: decimal;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
.tiptap-renderer blockquote {
|
|
294
|
+
border-left: 3px solid var(--border, hsl(214.3 31.8% 91.4%));
|
|
295
|
+
margin: 0.75rem 0;
|
|
296
|
+
padding-left: 1rem;
|
|
297
|
+
color: var(--muted-foreground, hsl(215.4 16.3% 46.9%));
|
|
298
|
+
font-style: italic;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
.tiptap-renderer .te-code-block {
|
|
302
|
+
position: relative;
|
|
303
|
+
margin: 0.75rem 0;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
.tiptap-renderer pre {
|
|
307
|
+
background-color: var(--muted, hsl(210 40% 96.1%));
|
|
308
|
+
border: 1px solid var(--border, hsl(214.3 31.8% 91.4%));
|
|
309
|
+
border-radius: 0.5rem;
|
|
310
|
+
color: var(--foreground, hsl(222.2 84% 4.9%));
|
|
311
|
+
font-family:
|
|
312
|
+
ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas,
|
|
313
|
+
"Liberation Mono", monospace;
|
|
314
|
+
font-size: 0.875rem;
|
|
315
|
+
margin: 0.75rem 0;
|
|
316
|
+
padding: 1rem;
|
|
317
|
+
overflow-x: auto;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
.tiptap-renderer .te-code-block pre {
|
|
321
|
+
margin: 0;
|
|
322
|
+
padding-right: 2.75rem;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
.tiptap-renderer .te-code-copy {
|
|
326
|
+
appearance: none;
|
|
327
|
+
position: absolute;
|
|
328
|
+
top: 0.45rem;
|
|
329
|
+
right: 0.45rem;
|
|
330
|
+
display: inline-flex;
|
|
331
|
+
align-items: center;
|
|
332
|
+
justify-content: center;
|
|
333
|
+
width: 1.75rem;
|
|
334
|
+
height: 1.75rem;
|
|
335
|
+
padding: 0;
|
|
336
|
+
border: 1px solid var(--border, hsl(214.3 31.8% 91.4%));
|
|
337
|
+
border-radius: 0.375rem;
|
|
338
|
+
background: var(--background, hsl(0 0% 100%));
|
|
339
|
+
color: var(--muted-foreground, hsl(215.4 16.3% 46.9%));
|
|
340
|
+
cursor: pointer;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
.tiptap-renderer .te-code-copy:hover {
|
|
344
|
+
color: var(--foreground, hsl(222.2 84% 4.9%));
|
|
345
|
+
background: var(--card, hsl(0 0% 100%));
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
.tiptap-renderer .te-code-copy__icon {
|
|
349
|
+
width: 0.875rem;
|
|
350
|
+
height: 0.875rem;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
.tiptap-renderer pre code {
|
|
354
|
+
background: none;
|
|
355
|
+
color: inherit;
|
|
356
|
+
padding: 0;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
.tiptap-renderer code {
|
|
360
|
+
background-color: var(--muted, hsl(210 40% 96.1%));
|
|
361
|
+
border-radius: 0.375rem;
|
|
362
|
+
padding: 0.125rem 0.375rem;
|
|
363
|
+
font-size: 0.875em;
|
|
364
|
+
font-family:
|
|
365
|
+
ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas,
|
|
366
|
+
"Liberation Mono", monospace;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
.tiptap-renderer hr {
|
|
370
|
+
border: none;
|
|
371
|
+
border-top: 1px solid var(--border);
|
|
372
|
+
margin: 1.5rem 0;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
.tiptap-renderer table {
|
|
376
|
+
border-collapse: collapse;
|
|
377
|
+
border: 1px solid var(--border);
|
|
378
|
+
margin: 1rem 0;
|
|
379
|
+
width: 100%;
|
|
380
|
+
table-layout: fixed;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
.tiptap-renderer table th,
|
|
384
|
+
.tiptap-renderer table td {
|
|
385
|
+
border: 1px solid var(--border);
|
|
386
|
+
padding: 0.5rem;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
.tiptap-renderer table th {
|
|
390
|
+
background-color: var(--muted);
|
|
391
|
+
font-weight: 600;
|
|
392
|
+
text-align: left;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
.tiptap-renderer img {
|
|
396
|
+
display: block;
|
|
397
|
+
max-width: 100%;
|
|
398
|
+
height: auto;
|
|
399
|
+
border-radius: 0.5rem;
|
|
400
|
+
margin: 1rem auto;
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
|