@cyberyozh/text-editor 0.1.17 → 0.2.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/dist/editor.js CHANGED
@@ -36,10 +36,10 @@ __export(editor_exports, {
36
36
  module.exports = __toCommonJS(editor_exports);
37
37
 
38
38
  // src/editor/editor.tsx
39
- var import_react36 = require("react");
39
+ var import_react37 = require("react");
40
40
  var import_state6 = require("@tiptap/pm/state");
41
- var import_model = require("@tiptap/pm/model");
42
- var import_react37 = require("@tiptap/react");
41
+ var import_model2 = require("@tiptap/pm/model");
42
+ var import_react38 = require("@tiptap/react");
43
43
  var import_menus = require("@tiptap/react/menus");
44
44
  var import_github_dark = require("highlight.js/styles/github-dark.css");
45
45
  var import_katex_min = require("katex/dist/katex.min.css");
@@ -786,10 +786,16 @@ var BubbleMenuContent = ({ editor, onLinkClick }) => {
786
786
  } = (0, import_react4.useEditorState)({
787
787
  editor,
788
788
  selector: (ctx) => {
789
+ let canAvalable = false;
790
+ try {
791
+ ctx.editor.can().undo();
792
+ canAvalable = true;
793
+ } catch {
794
+ }
789
795
  return {
790
- canUndo: ctx.editor.can().undo(),
791
- canRedo: ctx.editor.can().redo(),
792
- canClearMarks: ctx.editor.can().unsetAllMarks(),
796
+ canUndo: canAvalable ? ctx.editor.can().undo() : false,
797
+ canRedo: canAvalable ? ctx.editor.can().redo() : false,
798
+ canClearMarks: canAvalable ? ctx.editor.can().unsetAllMarks() : false,
793
799
  isHeading2: ctx.editor.isActive("heading", { level: 2 }),
794
800
  isHeading3: ctx.editor.isActive("heading", { level: 3 }),
795
801
  isHeading4: ctx.editor.isActive("heading", { level: 4 }),
@@ -1483,10 +1489,12 @@ var CharacterCount = ({ editor }) => {
1483
1489
  const translations2 = useTiptapTranslations();
1484
1490
  const { charactersCount, wordsCount } = (0, import_react8.useEditorState)({
1485
1491
  editor,
1486
- selector: (context) => ({
1487
- charactersCount: context.editor.storage.characterCount.characters(),
1488
- wordsCount: context.editor.storage.characterCount.words()
1489
- })
1492
+ selector: (context) => {
1493
+ return {
1494
+ charactersCount: context.editor.storage.characterCount?.characters() || 0,
1495
+ wordsCount: context.editor.storage.characterCount?.words() || 0
1496
+ };
1497
+ }
1490
1498
  });
1491
1499
  return /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)("div", { className: "tiptap__character-count", children: [
1492
1500
  /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)("span", { className: "tiptap__character-count-item", children: [
@@ -1917,6 +1925,7 @@ var import_jsx_runtime67 = require("react/jsx-runtime");
1917
1925
  var ImageDialog = ({
1918
1926
  open,
1919
1927
  onClose,
1928
+ defaultFile,
1920
1929
  onImageAdd,
1921
1930
  onImageEdit,
1922
1931
  uploadHandler,
@@ -2000,6 +2009,11 @@ var ImageDialog = ({
2000
2009
  }));
2001
2010
  };
2002
2011
  };
2012
+ (0, import_react13.useEffect)(() => {
2013
+ if (defaultFile) {
2014
+ handleSelectFile(defaultFile);
2015
+ }
2016
+ }, []);
2003
2017
  const handleAreaClick = () => {
2004
2018
  inputRef.current?.click();
2005
2019
  };
@@ -3126,7 +3140,7 @@ var import_extension_link = __toESM(require("@tiptap/extension-link"));
3126
3140
  var import_core4 = require("@tiptap/core");
3127
3141
 
3128
3142
  // node_modules/linkifyjs/dist/linkify.mjs
3129
- var encodedTlds = "aaa1rp3bb0ott3vie4c1le2ogado5udhabi7c0ademy5centure6ountant0s9o1tor4d0s1ult4e0g1ro2tna4f0l1rica5g0akhan5ency5i0g1rbus3force5tel5kdn3l0ibaba4pay4lfinanz6state5y2sace3tom5m0azon4ericanexpress7family11x2fam3ica3sterdam8nalytics7droid5quan4z2o0l2partments8p0le4q0uarelle8r0ab1mco4chi3my2pa2t0e3s0da2ia2sociates9t0hleta5torney7u0ction5di0ble3o3spost5thor3o0s4w0s2x0a2z0ure5ba0by2idu3namex4d1k2r0celona5laycard4s5efoot5gains6seball5ketball8uhaus5yern5b0c1t1va3cg1n2d1e0ats2uty4er2rlin4st0buy5t2f1g1h0arti5i0ble3d1ke2ng0o3o1z2j1lack0friday9ockbuster8g1omberg7ue3m0s1w2n0pparibas9o0ats3ehringer8fa2m1nd2o0k0ing5sch2tik2on4t1utique6x2r0adesco6idgestone9oadway5ker3ther5ussels7s1t1uild0ers6siness6y1zz3v1w1y1z0h3ca0b1fe2l0l1vinklein9m0era3p2non3petown5ital0one8r0avan4ds2e0er0s4s2sa1e1h1ino4t0ering5holic7ba1n1re3c1d1enter4o1rn3f0a1d2g1h0anel2nel4rity4se2t2eap3intai5ristmas6ome4urch5i0priani6rcle4sco3tadel4i0c2y3k1l0aims4eaning6ick2nic1que6othing5ud3ub0med6m1n1o0ach3des3ffee4llege4ogne5m0mbank4unity6pany2re3uter5sec4ndos3struction8ulting7tact3ractors9oking4l1p2rsica5untry4pon0s4rses6pa2r0edit0card4union9icket5own3s1uise0s6u0isinella9v1w1x1y0mru3ou3z2dad1nce3ta1e1ing3sun4y2clk3ds2e0al0er2s3gree4livery5l1oitte5ta3mocrat6ntal2ist5si0gn4v2hl2iamonds6et2gital5rect0ory7scount3ver5h2y2j1k1m1np2o0cs1tor4g1mains5t1wnload7rive4tv2ubai3nlop4pont4rban5vag2r2z2earth3t2c0o2deka3u0cation8e1g1mail3erck5nergy4gineer0ing9terprises10pson4quipment8r0icsson6ni3s0q1tate5t1u0rovision8s2vents5xchange6pert3osed4ress5traspace10fage2il1rwinds6th3mily4n0s2rm0ers5shion4t3edex3edback6rrari3ero6i0delity5o2lm2nal1nce1ial7re0stone6mdale6sh0ing5t0ness6j1k1lickr3ghts4r2orist4wers5y2m1o0o0d1tball6rd1ex2sale4um3undation8x2r0ee1senius7l1ogans4ntier7tr2ujitsu5n0d2rniture7tbol5yi3ga0l0lery3o1up4me0s3p1rden4y2b0iz3d0n2e0a1nt0ing5orge5f1g0ee3h1i0ft0s3ves2ing5l0ass3e1obal2o4m0ail3bh2o1x2n1odaddy5ld0point6f2o0dyear5g0le4p1t1v2p1q1r0ainger5phics5tis4een3ipe3ocery4up4s1t1u0cci3ge2ide2tars5ru3w1y2hair2mburg5ngout5us3bo2dfc0bank7ealth0care8lp1sinki6re1mes5iphop4samitsu7tachi5v2k0t2m1n1ockey4ldings5iday5medepot5goods5s0ense7nda3rse3spital5t0ing5t0els3mail5use3w2r1sbc3t1u0ghes5yatt3undai7ibm2cbc2e1u2d1e0ee3fm2kano4l1m0amat4db2mo0bilien9n0c1dustries8finiti5o2g1k1stitute6urance4e4t0ernational10uit4vestments10o1piranga7q1r0ish4s0maili5t0anbul7t0au2v3jaguar4va3cb2e0ep2tzt3welry6io2ll2m0p2nj2o0bs1urg4t1y2p0morgan6rs3uegos4niper7kaufen5ddi3e0rryhotels6properties14fh2g1h1i0a1ds2m1ndle4tchen5wi3m1n1oeln3matsu5sher5p0mg2n2r0d1ed3uokgroup8w1y0oto4z2la0caixa5mborghini8er3nd0rover6xess5salle5t0ino3robe5w0yer5b1c1ds2ease3clerc5frak4gal2o2xus4gbt3i0dl2fe0insurance9style7ghting6ke2lly3mited4o2ncoln4k2ve1ing5k1lc1p2oan0s3cker3us3l1ndon4tte1o3ve3pl0financial11r1s1t0d0a3u0ndbeck6xe1ury5v1y2ma0drid4if1son4keup4n0agement7go3p1rket0ing3s4riott5shalls7ttel5ba2c0kinsey7d1e0d0ia3et2lbourne7me1orial6n0u2rckmsd7g1h1iami3crosoft7l1ni1t2t0subishi9k1l0b1s2m0a2n1o0bi0le4da2e1i1m1nash3ey2ster5rmon3tgage6scow4to0rcycles9v0ie4p1q1r1s0d2t0n1r2u0seum3ic4v1w1x1y1z2na0b1goya4me2vy3ba2c1e0c1t0bank4flix4work5ustar5w0s2xt0direct7us4f0l2g0o2hk2i0co2ke1on3nja3ssan1y5l1o0kia3rton4w0ruz3tv4p1r0a1w2tt2u1yc2z2obi1server7ffice5kinawa6layan0group9lo3m0ega4ne1g1l0ine5oo2pen3racle3nge4g0anic5igins6saka4tsuka4t2vh3pa0ge2nasonic7ris2s1tners4s1y3y2ccw3e0t2f0izer5g1h0armacy6d1ilips5one2to0graphy6s4ysio5ics1tet2ures6d1n0g1k2oneer5zza4k1l0ace2y0station9umbing5s3m1n0c2ohl2ker3litie5rn2st3r0axi3ess3ime3o0d0uctions8f1gressive8mo2perties3y5tection8u0dential9s1t1ub2w0c2y2qa1pon3uebec3st5racing4dio4e0ad1lestate6tor2y4cipes5d0stone5umbrella9hab3ise0n3t2liance6n0t0als5pair3ort3ublican8st0aurant8view0s5xroth6ich0ardli6oh3l1o1p2o0cks3deo3gers4om3s0vp3u0gby3hr2n2w0e2yukyu6sa0arland6fe0ty4kura4le1on3msclub4ung5ndvik0coromant12ofi4p1rl2s1ve2xo3b0i1s2c0b1haeffler7midt4olarships8ol3ule3warz5ience5ot3d1e0arch3t2cure1ity6ek2lect4ner3rvices6ven3w1x0y3fr2g1h0angrila6rp3ell3ia1ksha5oes2p0ping5uji3w3i0lk2na1gles5te3j1k0i0n2y0pe4l0ing4m0art3ile4n0cf3o0ccer3ial4ftbank4ware6hu2lar2utions7ng1y2y2pa0ce3ort2t3r0l2s1t0ada2ples4r1tebank4farm7c0group6ockholm6rage3e3ream4udio2y3yle4u0cks3pplies3y2ort5rf1gery5zuki5v1watch4iss4x1y0dney4stems6z2tab1ipei4lk2obao4rget4tamotors6r2too4x0i3c0i2d0k2eam2ch0nology8l1masek5nnis4va3f1g1h0d1eater2re6iaa2ckets5enda4ps2res2ol4j0maxx4x2k0maxx5l1m0all4n1o0day3kyo3ols3p1ray3shiba5tal3urs3wn2yota3s3r0ade1ing4ining5vel0ers0insurance16ust3v2t1ube2i1nes3shu4v0s2w1z2ua1bank3s2g1k1nicom3versity8o2ol2ps2s1y1z2va0cations7na1guard7c1e0gas3ntures6risign5m\xF6gensberater2ung14sicherung10t2g1i0ajes4deo3g1king4llas4n1p1rgin4sa1ion4va1o3laanderen9n1odka3lvo3te1ing3o2yage5u2wales2mart4ter4ng0gou5tch0es6eather0channel12bcam3er2site5d0ding5ibo2r3f1hoswho6ien2ki2lliamhill9n0dows4e1ners6me2olterskluwer11odside6rk0s2ld3w2s1tc1f3xbox3erox4ihuan4n2xx2yz3yachts4hoo3maxun5ndex5e1odobashi7ga2kohama6u0tube6t1un3za0ppos4ra3ero3ip2m1one3uerich6w2";
3143
+ var encodedTlds = "aaa1rp3bb0ott3vie4c1le2ogado5udhabi7c0ademy5centure6ountant0s9o1tor4d0s1ult4e0g1ro2tna4f0l1rica5g0akhan5ency5i0g1rbus3force5tel5kdn3l0ibaba4pay4lfinanz6state5y2sace3tom5m0azon4ericanexpress7family11x2fam3ica3sterdam8nalytics7droid5quan4z2o0l2partments8p0le4q0uarelle8r0ab1mco4chi3my2pa2t0e3s0da2ia2sociates9t0hleta5torney7u0ction5di0ble3o3spost5thor3o0s4w0s2x0a2z0ure5ba0by2idu3namex4d1k2r0celona5laycard4s5efoot5gains6seball5ketball8uhaus5yern5b0c1t1va3cg1n2d1e0ats2uty4er2rlin4st0buy5t2f1g1h0arti5i0ble3d1ke2ng0o3o1z2j1lack0friday9ockbuster8g1omberg7ue3m0s1w2n0pparibas9o0ats3ehringer8fa2m1nd2o0k0ing5sch2tik2on4t1utique6x2r0adesco6idgestone9oadway5ker3ther5ussels7s1t1uild0ers6siness6y1zz3v1w1y1z0h3ca0b1fe2l0l1vinklein9m0era3p2non3petown5ital0one8r0avan4ds2e0er0s4s2sa1e1h1ino4t0ering5holic7ba1n1re3c1d1enter4o1rn3f0a1d2g1h0anel2nel4rity4se2t2eap3intai5ristmas6ome4urch5i0priani6rcle4sco3tadel4i0c2y3k1l0aims4eaning6ick2nic1que6othing5ud3ub0med6m1n1o0ach3des3ffee4llege4ogne5m0mbank4unity6pany2re3uter5sec4ndos3struction8ulting7tact3ractors9oking4l1p2rsica5untry4pon0s4rses6pa2r0edit0card4union9icket5own3s1uise0s6u0isinella9v1w1x1y0mru3ou3z2dad1nce3ta1e1ing3sun4y2clk3ds2e0al0er2s3gree4livery5l1oitte5ta3mocrat6ntal2ist5si0gn4v2hl2iamonds6et2gital5rect0ory7scount3ver5h2y2j1k1m1np2o0cs1tor4g1mains5t1wnload7rive4tv2ubai3pont4rban5vag2r2z2earth3t2c0o2deka3u0cation8e1g1mail3erck5nergy4gineer0ing9terprises10pson4quipment8r0icsson6ni3s0q1tate5t1u0rovision8s2vents5xchange6pert3osed4ress5traspace10fage2il1rwinds6th3mily4n0s2rm0ers5shion4t3edex3edback6rrari3ero6i0delity5o2lm2nal1nce1ial7re0stone6mdale6sh0ing5t0ness6j1k1lickr3ghts4r2orist4wers5y2m1o0o0d1tball6rd1ex2sale4um3undation8x2r0ee1senius7l1ogans4ntier7tr2ujitsu5n0d2rniture7tbol5yi3ga0l0lery3o1up4me0s3p1rden4y2b0iz3d0n2e0a1nt0ing5orge5f1g0ee3h1i0ft0s3ves2ing5l0ass3e1obal2o4m0ail3bh2o1x2n1odaddy5ld0point6f2odyear5g0le4p1t1v2p1q1r0ainger5phics5tis4een3ipe3ocery4up4s1t1u0cci3ge2ide2tars5ru3w1y2hair2mburg5ngout5us3bo2dfc0bank7ealth0care8lp1sinki6re1mes5iphop4samitsu7tachi5v2k0t2m1n1ockey4ldings5iday5medepot5goods5s0ense7nda3rse3spital5t0ing5t0els3mail5use3w2r1sbc3t1u0ghes5yatt3undai7ibm2cbc2e1u2d1e0ee3fm2kano4l1m0amat4db2mo0bilien9n0c1dustries8finiti5o2g1k1stitute6urance4e4t0ernational10uit4vestments10o1piranga7q1r0ish4s0maili5t0anbul7t0au2v3jaguar4va3cb2e0ep2tzt3welry6io2ll2m0p2nj2o0bs1urg4t1y2p0morgan6rs3uegos4niper7kaufen5ddi3e0rryhotels6properties14fh2g1h1i0a1ds2m1ndle4tchen5wi3m1n1oeln3matsu5sher5p0mg2n2r0d1ed3uokgroup8w1y0oto4z2la0caixa5mborghini8er3nd0rover6xess5salle5t0ino3robe5w0yer5b1c1ds2ease3clerc5frak4gal2o2xus4gbt3i0dl2fe0insurance9style7ghting6ke2lly3mited4o2ncoln4k2ve1ing5k1lc1p2oan0s3cker3us3l1ndon4tte1o3ve3pl0financial11r1s1t0d0a3u0ndbeck6xe1ury5v1y2ma0drid4if1son4keup4n0agement7go3p1rket0ing3s4riott5shalls7ttel5ba2c0kinsey7d1e0d0ia3et2lbourne7me1orial6n0u2rck0msd7g1h1iami3crosoft7l1ni1t2t0subishi9k1l0b1s2m0a2n1o0bi0le4da2e1i1m1nash3ey2ster5rmon3tgage6scow4to0rcycles9v0ie4p1q1r1s0d2t0n1r2u0seum3ic4v1w1x1y1z2na0b1goya4me2vy3ba2c1e0c1t0bank4flix4work5ustar5w0s2xt0direct7us4f0l2g0o2hk2i0co2ke1on3nja3ssan1y5l1o0kia3rton4w0ruz3tv4p1r0a1w2tt2u1yc2z2obi1server7ffice5kinawa6layan0group9lo3m0ega4ne1g1l0ine5oo2pen3racle3nge4g0anic5igins6saka4tsuka4t2vh3pa0ge2nasonic7ris2s1tners4s1y3y2ccw3e0t2f0izer5g1h0armacy6d1ilips5one2to0graphy6s4ysio5ics1tet2ures6d1n0g1k2oneer5zza4k1l0ace2y0station9umbing5s3m1n0c2ohl2ker3litie5rn2st3r0axi3ess3ime3o0d0uctions8f1gressive8mo2perties3y5tection8u0dential9s1t1ub2w0c2y2qa1pon3uebec3st5racing4dio4e0ad1lestate6tor2y4cipes5d0umbrella9hab3ise0n3t2liance6n0t0als5pair3ort3ublican8st0aurant8view0s5xroth6ich0ardli6oh3l1o1p2o0cks3deo3gers4om3s0vp3u0gby3hr2n2w0e2yukyu6sa0arland6fe0ty4kura4le1on3msclub4ung5ndvik0coromant12ofi4p1rl2s1ve2xo3b0i1s2c0b1haeffler7midt4olarships8ol3ule3warz5ience5ot3d1e0arch3t2cure1ity6ek2lect4ner3rvices6ven3w1x0y3fr2g1h0angrila6rp3ell3ia1ksha5oes2p0ping5uji3w3i0lk2na1gles5te3j1k0i0n2y0pe4l0ing4m0art3ile4n0cf3o0ccer3ial4ftbank4ware6hu2lar2utions7ng1y2y2pa0ce3ort2t3r0l2s1t0ada2ples4r1tebank4farm7c0group6ockholm6rage3e3ream4udio2y3yle4u0cks3pplies3y2ort5rf1gery5zuki5v1watch4iss4x1y0dney4stems6z2tab1ipei4lk2obao4rget4tamotors6r2too4x0i3c0i2d0k2eam2ch0nology8l1masek5nnis4va3f1g1h0d1eater2re6iaa2ckets5enda4ps2res2ol4j0maxx4x2k0maxx5l1m0all4n1o0day3kyo3ols3p1ray3shiba5tal3urs3wn2yota3s3r0ade1ing4ining5vel0ers0insurance16ust3v2t1ube2i1nes3shu4v0s2w1z2ua1bank3s2g1k1nicom3versity8o2ol2ps2s1y1z2va0cations7na1guard7c1e0gas3ntures6risign5m\xF6gensberater2ung14sicherung10t2g1i0ajes4deo3g1king4llas4n1p1rgin4sa1ion4va1o3laanderen9n1odka3lvo3te1ing3o2yage5u2wales2mart4ter4ng0gou5tch0es6eather0channel12bcam3er2site5d0ding5ibo2r3f1hoswho6ien2ki2lliamhill9n0dows4e1ners6me2oodside6rk0s2ld3w2s1tc1f3xbox3erox4ihuan4n2xx2yz3yachts4hoo3maxun5ndex5e1odobashi7ga2kohama6u0tube6t1un3za0ppos4ra3ero3ip2m1one3uerich6w2";
3130
3144
  var encodedUtlds = "\u03B5\u03BB1\u03C52\u0431\u04331\u0435\u043B3\u0434\u0435\u0442\u04384\u0435\u044E2\u043A\u0430\u0442\u043E\u043B\u0438\u043A6\u043E\u043C3\u043C\u043A\u04342\u043E\u043D1\u0441\u043A\u0432\u04306\u043E\u043D\u043B\u0430\u0439\u043D5\u0440\u04333\u0440\u0443\u04412\u04442\u0441\u0430\u0439\u04423\u0440\u04313\u0443\u043A\u04403\u049B\u0430\u04373\u0570\u0561\u05753\u05D9\u05E9\u05E8\u05D0\u05DC5\u05E7\u05D5\u05DD3\u0627\u0628\u0648\u0638\u0628\u064A5\u0631\u0627\u0645\u0643\u06485\u0644\u0627\u0631\u062F\u06464\u0628\u062D\u0631\u064A\u06465\u062C\u0632\u0627\u0626\u06315\u0633\u0639\u0648\u062F\u064A\u06296\u0639\u0644\u064A\u0627\u06465\u0645\u063A\u0631\u06285\u0645\u0627\u0631\u0627\u062A5\u06CC\u0631\u0627\u06465\u0628\u0627\u0631\u062A2\u0632\u0627\u06314\u064A\u062A\u06433\u06BE\u0627\u0631\u062A5\u062A\u0648\u0646\u06334\u0633\u0648\u062F\u0627\u06463\u0631\u064A\u06295\u0634\u0628\u0643\u06294\u0639\u0631\u0627\u06422\u06282\u0645\u0627\u06464\u0641\u0644\u0633\u0637\u064A\u06466\u0642\u0637\u06313\u0643\u0627\u062B\u0648\u0644\u064A\u06436\u0648\u06453\u0645\u0635\u06312\u0644\u064A\u0633\u064A\u06275\u0648\u0631\u064A\u062A\u0627\u0646\u064A\u06277\u0642\u06394\u0647\u0645\u0631\u0627\u06475\u067E\u0627\u06A9\u0633\u062A\u0627\u06467\u0680\u0627\u0631\u062A4\u0915\u0949\u092E3\u0928\u0947\u091F3\u092D\u093E\u0930\u09240\u092E\u094D3\u094B\u09245\u0938\u0902\u0917\u0920\u09285\u09AC\u09BE\u0982\u09B2\u09BE5\u09AD\u09BE\u09B0\u09A42\u09F0\u09A44\u0A2D\u0A3E\u0A30\u0A244\u0AAD\u0ABE\u0AB0\u0AA44\u0B2D\u0B3E\u0B30\u0B244\u0B87\u0BA8\u0BCD\u0BA4\u0BBF\u0BAF\u0BBE6\u0BB2\u0B99\u0BCD\u0B95\u0BC86\u0B9A\u0BBF\u0B99\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0BC2\u0BB0\u0BCD11\u0C2D\u0C3E\u0C30\u0C24\u0C4D5\u0CAD\u0CBE\u0CB0\u0CA44\u0D2D\u0D3E\u0D30\u0D24\u0D025\u0DBD\u0D82\u0D9A\u0DCF4\u0E04\u0E2D\u0E213\u0E44\u0E17\u0E223\u0EA5\u0EB2\u0EA73\u10D2\u10D42\u307F\u3093\u306A3\u30A2\u30DE\u30BE\u30F34\u30AF\u30E9\u30A6\u30C94\u30B0\u30FC\u30B0\u30EB4\u30B3\u30E02\u30B9\u30C8\u30A23\u30BB\u30FC\u30EB3\u30D5\u30A1\u30C3\u30B7\u30E7\u30F36\u30DD\u30A4\u30F3\u30C84\u4E16\u754C2\u4E2D\u4FE11\u56FD1\u570B1\u6587\u7F513\u4E9A\u9A6C\u900A3\u4F01\u4E1A2\u4F5B\u5C712\u4FE1\u606F2\u5065\u5EB72\u516B\u53662\u516C\u53F81\u76CA2\u53F0\u6E7E1\u70632\u5546\u57CE1\u5E971\u68072\u5609\u91CC0\u5927\u9152\u5E975\u5728\u7EBF2\u5927\u62FF2\u5929\u4E3B\u65593\u5A31\u4E502\u5BB6\u96FB2\u5E7F\u4E1C2\u5FAE\u535A2\u6148\u55842\u6211\u7231\u4F603\u624B\u673A2\u62DB\u80582\u653F\u52A11\u5E9C2\u65B0\u52A0\u57612\u95FB2\u65F6\u5C1A2\u66F8\u7C4D2\u673A\u67842\u6DE1\u9A6C\u95213\u6E38\u620F2\u6FB3\u95802\u70B9\u770B2\u79FB\u52A82\u7EC4\u7EC7\u673A\u67844\u7F51\u57401\u5E971\u7AD91\u7EDC2\u8054\u901A2\u8C37\u6B4C2\u8D2D\u72692\u901A\u8CA92\u96C6\u56E22\u96FB\u8A0A\u76C8\u79D14\u98DE\u5229\u6D663\u98DF\u54C12\u9910\u53852\u9999\u683C\u91CC\u62C93\u6E2F2\uB2F7\uB1371\uCEF42\uC0BC\uC1312\uD55C\uAD6D2";
3131
3145
  var numeric = "numeric";
3132
3146
  var ascii = "ascii";
@@ -4057,8 +4071,6 @@ function init$1({
4057
4071
  ta(Email$1, groups.domain, EmailDomain);
4058
4072
  tt(Email$1, DOT, EmailDomainDot);
4059
4073
  tt(Email$1, HYPHEN, EmailDomainHyphen);
4060
- const EmailColon = tt(Email$1, COLON);
4061
- ta(EmailColon, groups.numeric, Email);
4062
4074
  const DomainHyphen = tt(Domain, HYPHEN);
4063
4075
  const DomainDot = tt(Domain, DOT);
4064
4076
  tt(DomainHyphen, HYPHEN, DomainHyphen);
@@ -4122,11 +4134,11 @@ function init$1({
4122
4134
  const [OPEN, CLOSE] = bracketPairs[i];
4123
4135
  const UrlOpen = tt(Url$1, OPEN);
4124
4136
  tt(UrlNonaccept, OPEN, UrlOpen);
4125
- tt(UrlOpen, CLOSE, Url$1);
4126
4137
  const UrlOpenQ = makeState(Url);
4127
4138
  ta(UrlOpen, qsAccepting, UrlOpenQ);
4128
4139
  const UrlOpenSyms = makeState();
4129
- ta(UrlOpen, qsNonAccepting);
4140
+ ta(UrlOpen, qsNonAccepting, UrlOpenSyms);
4141
+ tt(UrlOpen, CLOSE, Url$1);
4130
4142
  ta(UrlOpenQ, qsAccepting, UrlOpenQ);
4131
4143
  ta(UrlOpenQ, qsNonAccepting, UrlOpenSyms);
4132
4144
  ta(UrlOpenSyms, qsAccepting, UrlOpenQ);
@@ -6123,21 +6135,8 @@ var BackgroundColor = import_core12.Extension.create({
6123
6135
  default: null,
6124
6136
  parseHTML: (element) => {
6125
6137
  var _a;
6126
- const styleAttr = element.getAttribute("style");
6127
- if (styleAttr) {
6128
- const decls = styleAttr.split(";").map((s) => s.trim()).filter(Boolean);
6129
- for (let i = decls.length - 1; i >= 0; i -= 1) {
6130
- const parts = decls[i].split(":");
6131
- if (parts.length >= 2) {
6132
- const prop = parts[0].trim().toLowerCase();
6133
- const val = parts.slice(1).join(":").trim();
6134
- if (prop === "background-color") {
6135
- return val.replace(/['"]+/g, "");
6136
- }
6137
- }
6138
- }
6139
- }
6140
- return (_a = element.style.backgroundColor) == null ? void 0 : _a.replace(/['"]+/g, "");
6138
+ const value = (_a = (0, import_core12.getStyleProperty)(element, "background-color")) != null ? _a : element.style.backgroundColor;
6139
+ return value == null ? void 0 : value.replace(/['"]+/g, "");
6141
6140
  },
6142
6141
  renderHTML: (attributes) => {
6143
6142
  if (!attributes.backgroundColor) {
@@ -6179,21 +6178,8 @@ var Color = import_core13.Extension.create({
6179
6178
  default: null,
6180
6179
  parseHTML: (element) => {
6181
6180
  var _a;
6182
- const styleAttr = element.getAttribute("style");
6183
- if (styleAttr) {
6184
- const decls = styleAttr.split(";").map((s) => s.trim()).filter(Boolean);
6185
- for (let i = decls.length - 1; i >= 0; i -= 1) {
6186
- const parts = decls[i].split(":");
6187
- if (parts.length >= 2) {
6188
- const prop = parts[0].trim().toLowerCase();
6189
- const val = parts.slice(1).join(":").trim();
6190
- if (prop === "color") {
6191
- return val.replace(/['"]+/g, "");
6192
- }
6193
- }
6194
- }
6195
- }
6196
- return (_a = element.style.color) == null ? void 0 : _a.replace(/['"]+/g, "");
6181
+ const value = (_a = (0, import_core13.getStyleProperty)(element, "color")) != null ? _a : element.style.color;
6182
+ return value == null ? void 0 : value.replace(/['"]+/g, "");
6197
6183
  },
6198
6184
  renderHTML: (attributes) => {
6199
6185
  if (!attributes.color) {
@@ -6233,7 +6219,14 @@ var FontFamily = import_core14.Extension.create({
6233
6219
  attributes: {
6234
6220
  fontFamily: {
6235
6221
  default: null,
6236
- parseHTML: (element) => element.style.fontFamily,
6222
+ // Prefer the raw inline `style` attribute so unquoted or
6223
+ // single-quoted multi-word names are preserved instead of being
6224
+ // canonicalized by `element.style.fontFamily`, which forces double
6225
+ // quotes that then get HTML-encoded to `"` on serialization.
6226
+ parseHTML: (element) => {
6227
+ var _a;
6228
+ return (_a = (0, import_core14.getStyleProperty)(element, "font-family")) != null ? _a : element.style.fontFamily;
6229
+ },
6237
6230
  renderHTML: (attributes) => {
6238
6231
  if (!attributes.fontFamily) {
6239
6232
  return {};
@@ -6272,7 +6265,13 @@ var FontSize = import_core15.Extension.create({
6272
6265
  attributes: {
6273
6266
  fontSize: {
6274
6267
  default: null,
6275
- parseHTML: (element) => element.style.fontSize,
6268
+ // Prefer the raw inline `style` attribute so the original format
6269
+ // is preserved instead of the canonicalized value returned by
6270
+ // `element.style.fontSize`.
6271
+ parseHTML: (element) => {
6272
+ var _a;
6273
+ return (_a = (0, import_core15.getStyleProperty)(element, "font-size")) != null ? _a : element.style.fontSize;
6274
+ },
6276
6275
  renderHTML: (attributes) => {
6277
6276
  if (!attributes.fontSize) {
6278
6277
  return {};
@@ -6311,7 +6310,13 @@ var LineHeight = import_core16.Extension.create({
6311
6310
  attributes: {
6312
6311
  lineHeight: {
6313
6312
  default: null,
6314
- parseHTML: (element) => element.style.lineHeight,
6313
+ // Prefer the raw inline `style` attribute so the original format
6314
+ // is preserved instead of the canonicalized value returned by
6315
+ // `element.style.lineHeight`.
6316
+ parseHTML: (element) => {
6317
+ var _a;
6318
+ return (_a = (0, import_core16.getStyleProperty)(element, "line-height")) != null ? _a : element.style.lineHeight;
6319
+ },
6315
6320
  renderHTML: (attributes) => {
6316
6321
  if (!attributes.lineHeight) {
6317
6322
  return {};
@@ -6774,10 +6779,110 @@ var createHandleKatexAdd = (editor, closeDialogCommand, savedPos) => {
6774
6779
  };
6775
6780
  };
6776
6781
 
6782
+ // src/editor/handlers/insertion-handlers.ts
6783
+ var import_react35 = require("react");
6784
+
6785
+ // src/utils/prosemirror-iterator.ts
6786
+ var import_model = require("@tiptap/pm/model");
6787
+ function prosemirrorIterator(slice, cb) {
6788
+ const stack = [];
6789
+ if (slice instanceof import_model.Slice) {
6790
+ collectFragmentChildren(slice.content, stack);
6791
+ } else if (slice instanceof import_model.Fragment) {
6792
+ collectFragmentChildren(slice, stack);
6793
+ } else {
6794
+ stack.push(slice);
6795
+ }
6796
+ while (stack.length > 0) {
6797
+ const node = stack.pop();
6798
+ const shouldStop = cb(node);
6799
+ if (shouldStop === true) break;
6800
+ if (node.content.size > 0) {
6801
+ collectFragmentChildren(node.content, stack);
6802
+ }
6803
+ }
6804
+ }
6805
+ function collectFragmentChildren(fragment, stack) {
6806
+ for (let i = fragment.childCount - 1; i >= 0; i--) {
6807
+ stack.push(fragment.child(i));
6808
+ }
6809
+ }
6810
+
6811
+ // src/editor/handlers/insertion-handlers.ts
6812
+ function useInsertionHandlers() {
6813
+ const [insertedImage, setInsertedImage] = (0, import_react35.useState)(null);
6814
+ const { activeDialog, openDialogCommand } = useDialogCommand();
6815
+ (0, import_react35.useEffect)(() => {
6816
+ if (insertedImage && !activeDialog) {
6817
+ setInsertedImage(null);
6818
+ }
6819
+ }, [insertedImage, activeDialog]);
6820
+ function genericInsertionHandler(file, event) {
6821
+ if (!file || !file.type.startsWith("image/")) return;
6822
+ event.preventDefault();
6823
+ event.stopPropagation();
6824
+ setInsertedImage(file);
6825
+ openDialogCommand("image");
6826
+ }
6827
+ function onPaste(_, event) {
6828
+ const file = event.clipboardData?.files?.[0];
6829
+ genericInsertionHandler(file, event);
6830
+ }
6831
+ function onDrop(_, event) {
6832
+ const file = event.dataTransfer?.files?.[0];
6833
+ genericInsertionHandler(file, event);
6834
+ }
6835
+ function onMarkupInsertion(view, event, slice, setDisabled, uploadMultipleByURL) {
6836
+ if (!uploadMultipleByURL) return;
6837
+ let hasMarkupInsertion = false;
6838
+ if ("clipboardData" in event && Array.from(event.clipboardData?.items ?? []).some(
6839
+ (item) => item.type === "text/html"
6840
+ )) {
6841
+ hasMarkupInsertion = true;
6842
+ }
6843
+ if ("dataTransfer" in event && Array.from(event.dataTransfer?.items ?? []).some(
6844
+ (item) => item.type === "text/html"
6845
+ )) {
6846
+ hasMarkupInsertion = true;
6847
+ }
6848
+ if (hasMarkupInsertion) {
6849
+ const imagesToNodes = [];
6850
+ setDisabled(true);
6851
+ prosemirrorIterator(slice, (node) => {
6852
+ if (node.type.name === "image" && !node.attrs.fileId) {
6853
+ try {
6854
+ const url = new URL(node.attrs.src).toString();
6855
+ imagesToNodes.push([url, node]);
6856
+ } catch {
6857
+ }
6858
+ }
6859
+ });
6860
+ uploadMultipleByURL(imagesToNodes.map(([url]) => url)).then((results) => {
6861
+ results.forEach((result, index) => {
6862
+ const node = imagesToNodes[index][1];
6863
+ node.attrs.src = null;
6864
+ node.attrs.fileId = result?.fileId;
6865
+ node.attrs.storageKey = result?.storageKey;
6866
+ });
6867
+ view.dispatch(view.state.tr.replaceSelection(slice));
6868
+ }).finally(() => {
6869
+ setDisabled(false);
6870
+ });
6871
+ return true;
6872
+ }
6873
+ }
6874
+ return {
6875
+ insertedImage,
6876
+ onPaste,
6877
+ onDrop,
6878
+ onMarkupInsertion
6879
+ };
6880
+ }
6881
+
6777
6882
  // src/editor/commands/suggestion.tsx
6778
6883
  var import_dom = require("@floating-ui/dom");
6779
6884
  var import_core19 = require("@tiptap/core");
6780
- var import_react35 = require("@tiptap/react");
6885
+ var import_react36 = require("@tiptap/react");
6781
6886
 
6782
6887
  // src/editor/commands/items.ts
6783
6888
  var getCommandItems = (translations2, hasImageHandlers) => [
@@ -7110,7 +7215,7 @@ var createSuggestions = (translations2, hasImageHandlers) => ({
7110
7215
  render: () => {
7111
7216
  return {
7112
7217
  onStart: async (props) => {
7113
- component = new import_react35.ReactRenderer(CommandsList, {
7218
+ component = new import_react36.ReactRenderer(CommandsList, {
7114
7219
  props,
7115
7220
  editor: props.editor
7116
7221
  });
@@ -7533,27 +7638,35 @@ function TiptapContent({
7533
7638
  lang,
7534
7639
  error
7535
7640
  }) {
7536
- const [linkDialogContext, setLinkDialogContext] = (0, import_react36.useState)(null);
7537
- const [katexDialogContext, setKatexDialogContext] = (0, import_react36.useState)(
7641
+ const [linkDialogContext, setLinkDialogContext] = (0, import_react37.useState)(null);
7642
+ const [katexDialogContext, setKatexDialogContext] = (0, import_react37.useState)(
7538
7643
  null
7539
7644
  );
7540
- const [editFigureContext, setEditFigureContext] = (0, import_react36.useState)(null);
7541
- const [savedDialogCursorPos, setSavedDialogCursorPos] = (0, import_react36.useState)(void 0);
7645
+ const [editFigureContext, setEditFigureContext] = (0, import_react37.useState)(null);
7646
+ const [savedDialogCursorPos, setSavedDialogCursorPos] = (0, import_react37.useState)(void 0);
7542
7647
  const { activeDialog, closeDialogCommand, openDialogCommand } = useDialogCommand();
7543
7648
  const translations2 = useTiptapTranslations();
7649
+ const [isDisabledInternal, setIsDisabledInternal] = (0, import_react37.useState)(isDisabled);
7650
+ const disabled = isDisabled || isDisabledInternal;
7544
7651
  let safeContent;
7545
7652
  try {
7546
7653
  safeContent = JSON.parse(content);
7547
7654
  } catch {
7548
7655
  safeContent = { type: "doc", content: [{ type: "paragraph" }] };
7549
7656
  }
7550
- const editor = (0, import_react37.useEditor)(
7657
+ const {
7658
+ insertedImage,
7659
+ onPaste,
7660
+ onDrop,
7661
+ onMarkupInsertion
7662
+ } = useInsertionHandlers();
7663
+ const editor = (0, import_react38.useEditor)(
7551
7664
  {
7552
- editable: isEditable && !isDisabled,
7665
+ editable: isEditable && !disabled,
7553
7666
  extensions: getEditorExtensions({
7554
7667
  translations: translations2,
7555
7668
  suggestion: createSuggestions(translations2, !!imageHandlers),
7556
- isEditable: isEditable && !isDisabled,
7669
+ isEditable: isEditable && !disabled,
7557
7670
  getImageById: imageHandlers?.getImage,
7558
7671
  onKatexClick: (latex, pos) => {
7559
7672
  setKatexDialogContext({ latex, pos });
@@ -7567,14 +7680,38 @@ function TiptapContent({
7567
7680
  content: safeContent,
7568
7681
  immediatelyRender: false,
7569
7682
  editorProps: {
7570
- handlePaste: (view, event) => {
7683
+ handleDOMEvents: {
7684
+ paste: onPaste,
7685
+ drop: onDrop
7686
+ },
7687
+ handleDrop: (view, event, slice) => {
7688
+ if (view.dragging) return false;
7689
+ const toReturn = onMarkupInsertion(
7690
+ view,
7691
+ event,
7692
+ slice,
7693
+ setIsDisabledInternal,
7694
+ imageHandlers?.uploadMultipleByURL
7695
+ );
7696
+ if (typeof toReturn === "boolean") return toReturn;
7697
+ return false;
7698
+ },
7699
+ handlePaste: (view, event, slice) => {
7700
+ const toReturn = onMarkupInsertion(
7701
+ view,
7702
+ event,
7703
+ slice,
7704
+ setIsDisabledInternal,
7705
+ imageHandlers?.uploadMultipleByURL
7706
+ );
7707
+ if (typeof toReturn === "boolean") return toReturn;
7571
7708
  try {
7572
7709
  const text = event.clipboardData?.getData("text/plain");
7573
7710
  if (!text) return false;
7574
7711
  const json = JSON.parse(text);
7575
7712
  if (json.type === "doc" && json.content) {
7576
7713
  const node = view.state.schema.nodeFromJSON(json);
7577
- const newSlice = new import_model.Slice(node.content, 0, 0);
7714
+ const newSlice = new import_model2.Slice(node.content, 0, 0);
7578
7715
  view.dispatch(view.state.tr.replaceSelection(newSlice));
7579
7716
  return true;
7580
7717
  }
@@ -7589,7 +7726,7 @@ function TiptapContent({
7589
7726
  },
7590
7727
  [lang]
7591
7728
  );
7592
- (0, import_react36.useEffect)(() => {
7729
+ (0, import_react37.useEffect)(() => {
7593
7730
  if (activeDialog && editor && !editor.isDestroyed) {
7594
7731
  const pos = editor.state.selection.from;
7595
7732
  setSavedDialogCursorPos(pos);
@@ -7616,7 +7753,7 @@ function TiptapContent({
7616
7753
  const katexHandler = createHandleKatexAdd(editor, handleCloseDialog, savedDialogCursorPos);
7617
7754
  katexHandler(latex, katexDialogContext?.pos);
7618
7755
  };
7619
- (0, import_react36.useEffect)(() => {
7756
+ (0, import_react37.useEffect)(() => {
7620
7757
  if (!editor || editor.isDestroyed) return;
7621
7758
  editor.commands.setContent(safeContent, {
7622
7759
  emitUpdate: false
@@ -7637,8 +7774,8 @@ function TiptapContent({
7637
7774
  if (!editor) return null;
7638
7775
  return /* @__PURE__ */ (0, import_jsx_runtime92.jsxs)(import_jsx_runtime92.Fragment, { children: [
7639
7776
  /* @__PURE__ */ (0, import_jsx_runtime92.jsx)(DragHandle, { editor }),
7640
- isEditable && !isDisabled && /* @__PURE__ */ (0, import_jsx_runtime92.jsx)(TableMenu, { editor }),
7641
- isEditable && !isDisabled && /* @__PURE__ */ (0, import_jsx_runtime92.jsx)(
7777
+ isEditable && !disabled && /* @__PURE__ */ (0, import_jsx_runtime92.jsx)(TableMenu, { editor }),
7778
+ isEditable && !disabled && /* @__PURE__ */ (0, import_jsx_runtime92.jsx)(
7642
7779
  import_menus.BubbleMenu,
7643
7780
  {
7644
7781
  shouldShow: shouldBubbleMenuShow,
@@ -7656,10 +7793,10 @@ function TiptapContent({
7656
7793
  /* @__PURE__ */ (0, import_jsx_runtime92.jsxs)(
7657
7794
  "div",
7658
7795
  {
7659
- className: `tiptap-content-wrapper ${!!error ? "has-error" : ""} ${isDisabled ? "is-disabled" : ""}`,
7796
+ className: `tiptap-content-wrapper ${!!error ? "has-error" : ""} ${disabled ? "is-disabled" : ""}`,
7660
7797
  children: [
7661
- /* @__PURE__ */ (0, import_jsx_runtime92.jsx)(import_react37.EditorContent, { editor }),
7662
- isEditable && !isDisabled && /* @__PURE__ */ (0, import_jsx_runtime92.jsx)(CharacterCount, { editor })
7798
+ /* @__PURE__ */ (0, import_jsx_runtime92.jsx)(import_react38.EditorContent, { editor }),
7799
+ isEditable && !disabled && /* @__PURE__ */ (0, import_jsx_runtime92.jsx)(CharacterCount, { editor })
7663
7800
  ]
7664
7801
  }
7665
7802
  ),
@@ -7670,6 +7807,7 @@ function TiptapContent({
7670
7807
  {
7671
7808
  open: true,
7672
7809
  onClose: handleCloseDialog,
7810
+ defaultFile: insertedImage,
7673
7811
  onImageAdd: handleImageAdd,
7674
7812
  onImageEdit: handleImageEdit,
7675
7813
  uploadHandler: imageHandlers?.upload,