@mdaemon/html-editor 1.2.0 → 1.3.0

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/index.mjs CHANGED
@@ -17435,6 +17435,26 @@ function canInsertNode(state, nodeType) {
17435
17435
  }
17436
17436
  return false;
17437
17437
  }
17438
+ function getStyleProperty(element, propertyName) {
17439
+ const styleAttr = element.getAttribute("style");
17440
+ if (!styleAttr) {
17441
+ return null;
17442
+ }
17443
+ const decls = styleAttr.split(";").map((decl) => decl.trim()).filter(Boolean);
17444
+ const target = propertyName.toLowerCase();
17445
+ for (let i = decls.length - 1; i >= 0; i -= 1) {
17446
+ const decl = decls[i];
17447
+ const colonIndex = decl.indexOf(":");
17448
+ if (colonIndex === -1) {
17449
+ continue;
17450
+ }
17451
+ const prop = decl.slice(0, colonIndex).trim().toLowerCase();
17452
+ if (prop === target) {
17453
+ return decl.slice(colonIndex + 1).trim();
17454
+ }
17455
+ }
17456
+ return null;
17457
+ }
17438
17458
  var markdown_exports = {};
17439
17459
  __export$1(markdown_exports, {
17440
17460
  createAtomBlockMarkdownSpec: () => createAtomBlockMarkdownSpec,
@@ -18872,7 +18892,7 @@ var Italic = Mark2.create({
18872
18892
  ];
18873
18893
  }
18874
18894
  });
18875
- const encodedTlds = "aaa1rp3bb0ott3vie4c1le2ogado5udhabi7c0ademy5centure6ountant0s9o1tor4d0s1ult4e0g1ro2tna4f0l1rica5g0akhan5ency5i0g1rbus3force5tel5kdn3l0ibaba4pay4lfinanz6state5y2sace3tom5m0azon4ericanexpress7family11x2fam3ica3sterdam8nalytics7droid5quan4z2o0l2partments8p0le4q0uarelle8r0ab1mco4chi3my2pa2t0e3s0da2ia2sociates9t0hleta5torney7u0ction5di0ble3o3spost5thor3o0s4w0s2x0a2z0ure5ba0by2idu3namex4d1k2r0celona5laycard4s5efoot5gains6seball5ketball8uhaus5yern5b0c1t1va3cg1n2d1e0ats2uty4er2rlin4st0buy5t2f1g1h0arti5i0ble3d1ke2ng0o3o1z2j1lack0friday9ockbuster8g1omberg7ue3m0s1w2n0pparibas9o0ats3ehringer8fa2m1nd2o0k0ing5sch2tik2on4t1utique6x2r0adesco6idgestone9oadway5ker3ther5ussels7s1t1uild0ers6siness6y1zz3v1w1y1z0h3ca0b1fe2l0l1vinklein9m0era3p2non3petown5ital0one8r0avan4ds2e0er0s4s2sa1e1h1ino4t0ering5holic7ba1n1re3c1d1enter4o1rn3f0a1d2g1h0anel2nel4rity4se2t2eap3intai5ristmas6ome4urch5i0priani6rcle4sco3tadel4i0c2y3k1l0aims4eaning6ick2nic1que6othing5ud3ub0med6m1n1o0ach3des3ffee4llege4ogne5m0mbank4unity6pany2re3uter5sec4ndos3struction8ulting7tact3ractors9oking4l1p2rsica5untry4pon0s4rses6pa2r0edit0card4union9icket5own3s1uise0s6u0isinella9v1w1x1y0mru3ou3z2dad1nce3ta1e1ing3sun4y2clk3ds2e0al0er2s3gree4livery5l1oitte5ta3mocrat6ntal2ist5si0gn4v2hl2iamonds6et2gital5rect0ory7scount3ver5h2y2j1k1m1np2o0cs1tor4g1mains5t1wnload7rive4tv2ubai3nlop4pont4rban5vag2r2z2earth3t2c0o2deka3u0cation8e1g1mail3erck5nergy4gineer0ing9terprises10pson4quipment8r0icsson6ni3s0q1tate5t1u0rovision8s2vents5xchange6pert3osed4ress5traspace10fage2il1rwinds6th3mily4n0s2rm0ers5shion4t3edex3edback6rrari3ero6i0delity5o2lm2nal1nce1ial7re0stone6mdale6sh0ing5t0ness6j1k1lickr3ghts4r2orist4wers5y2m1o0o0d1tball6rd1ex2sale4um3undation8x2r0ee1senius7l1ogans4ntier7tr2ujitsu5n0d2rniture7tbol5yi3ga0l0lery3o1up4me0s3p1rden4y2b0iz3d0n2e0a1nt0ing5orge5f1g0ee3h1i0ft0s3ves2ing5l0ass3e1obal2o4m0ail3bh2o1x2n1odaddy5ld0point6f2o0dyear5g0le4p1t1v2p1q1r0ainger5phics5tis4een3ipe3ocery4up4s1t1u0cci3ge2ide2tars5ru3w1y2hair2mburg5ngout5us3bo2dfc0bank7ealth0care8lp1sinki6re1mes5iphop4samitsu7tachi5v2k0t2m1n1ockey4ldings5iday5medepot5goods5s0ense7nda3rse3spital5t0ing5t0els3mail5use3w2r1sbc3t1u0ghes5yatt3undai7ibm2cbc2e1u2d1e0ee3fm2kano4l1m0amat4db2mo0bilien9n0c1dustries8finiti5o2g1k1stitute6urance4e4t0ernational10uit4vestments10o1piranga7q1r0ish4s0maili5t0anbul7t0au2v3jaguar4va3cb2e0ep2tzt3welry6io2ll2m0p2nj2o0bs1urg4t1y2p0morgan6rs3uegos4niper7kaufen5ddi3e0rryhotels6properties14fh2g1h1i0a1ds2m1ndle4tchen5wi3m1n1oeln3matsu5sher5p0mg2n2r0d1ed3uokgroup8w1y0oto4z2la0caixa5mborghini8er3nd0rover6xess5salle5t0ino3robe5w0yer5b1c1ds2ease3clerc5frak4gal2o2xus4gbt3i0dl2fe0insurance9style7ghting6ke2lly3mited4o2ncoln4k2ve1ing5k1lc1p2oan0s3cker3us3l1ndon4tte1o3ve3pl0financial11r1s1t0d0a3u0ndbeck6xe1ury5v1y2ma0drid4if1son4keup4n0agement7go3p1rket0ing3s4riott5shalls7ttel5ba2c0kinsey7d1e0d0ia3et2lbourne7me1orial6n0u2rckmsd7g1h1iami3crosoft7l1ni1t2t0subishi9k1l0b1s2m0a2n1o0bi0le4da2e1i1m1nash3ey2ster5rmon3tgage6scow4to0rcycles9v0ie4p1q1r1s0d2t0n1r2u0seum3ic4v1w1x1y1z2na0b1goya4me2vy3ba2c1e0c1t0bank4flix4work5ustar5w0s2xt0direct7us4f0l2g0o2hk2i0co2ke1on3nja3ssan1y5l1o0kia3rton4w0ruz3tv4p1r0a1w2tt2u1yc2z2obi1server7ffice5kinawa6layan0group9lo3m0ega4ne1g1l0ine5oo2pen3racle3nge4g0anic5igins6saka4tsuka4t2vh3pa0ge2nasonic7ris2s1tners4s1y3y2ccw3e0t2f0izer5g1h0armacy6d1ilips5one2to0graphy6s4ysio5ics1tet2ures6d1n0g1k2oneer5zza4k1l0ace2y0station9umbing5s3m1n0c2ohl2ker3litie5rn2st3r0axi3ess3ime3o0d0uctions8f1gressive8mo2perties3y5tection8u0dential9s1t1ub2w0c2y2qa1pon3uebec3st5racing4dio4e0ad1lestate6tor2y4cipes5d0stone5umbrella9hab3ise0n3t2liance6n0t0als5pair3ort3ublican8st0aurant8view0s5xroth6ich0ardli6oh3l1o1p2o0cks3deo3gers4om3s0vp3u0gby3hr2n2w0e2yukyu6sa0arland6fe0ty4kura4le1on3msclub4ung5ndvik0coromant12ofi4p1rl2s1ve2xo3b0i1s2c0b1haeffler7midt4olarships8ol3ule3warz5ience5ot3d1e0arch3t2cure1ity6ek2lect4ner3rvices6ven3w1x0y3fr2g1h0angrila6rp3ell3ia1ksha5oes2p0ping5uji3w3i0lk2na1gles5te3j1k0i0n2y0pe4l0ing4m0art3ile4n0cf3o0ccer3ial4ftbank4ware6hu2lar2utions7ng1y2y2pa0ce3ort2t3r0l2s1t0ada2ples4r1tebank4farm7c0group6ockholm6rage3e3ream4udio2y3yle4u0cks3pplies3y2ort5rf1gery5zuki5v1watch4iss4x1y0dney4stems6z2tab1ipei4lk2obao4rget4tamotors6r2too4x0i3c0i2d0k2eam2ch0nology8l1masek5nnis4va3f1g1h0d1eater2re6iaa2ckets5enda4ps2res2ol4j0maxx4x2k0maxx5l1m0all4n1o0day3kyo3ols3p1ray3shiba5tal3urs3wn2yota3s3r0ade1ing4ining5vel0ers0insurance16ust3v2t1ube2i1nes3shu4v0s2w1z2ua1bank3s2g1k1nicom3versity8o2ol2ps2s1y1z2va0cations7na1guard7c1e0gas3ntures6risign5mögensberater2ung14sicherung10t2g1i0ajes4deo3g1king4llas4n1p1rgin4sa1ion4va1o3laanderen9n1odka3lvo3te1ing3o2yage5u2wales2mart4ter4ng0gou5tch0es6eather0channel12bcam3er2site5d0ding5ibo2r3f1hoswho6ien2ki2lliamhill9n0dows4e1ners6me2olterskluwer11odside6rk0s2ld3w2s1tc1f3xbox3erox4ihuan4n2xx2yz3yachts4hoo3maxun5ndex5e1odobashi7ga2kohama6u0tube6t1un3za0ppos4ra3ero3ip2m1one3uerich6w2";
18895
+ const encodedTlds = "aaa1rp3bb0ott3vie4c1le2ogado5udhabi7c0ademy5centure6ountant0s9o1tor4d0s1ult4e0g1ro2tna4f0l1rica5g0akhan5ency5i0g1rbus3force5tel5kdn3l0ibaba4pay4lfinanz6state5y2sace3tom5m0azon4ericanexpress7family11x2fam3ica3sterdam8nalytics7droid5quan4z2o0l2partments8p0le4q0uarelle8r0ab1mco4chi3my2pa2t0e3s0da2ia2sociates9t0hleta5torney7u0ction5di0ble3o3spost5thor3o0s4w0s2x0a2z0ure5ba0by2idu3namex4d1k2r0celona5laycard4s5efoot5gains6seball5ketball8uhaus5yern5b0c1t1va3cg1n2d1e0ats2uty4er2rlin4st0buy5t2f1g1h0arti5i0ble3d1ke2ng0o3o1z2j1lack0friday9ockbuster8g1omberg7ue3m0s1w2n0pparibas9o0ats3ehringer8fa2m1nd2o0k0ing5sch2tik2on4t1utique6x2r0adesco6idgestone9oadway5ker3ther5ussels7s1t1uild0ers6siness6y1zz3v1w1y1z0h3ca0b1fe2l0l1vinklein9m0era3p2non3petown5ital0one8r0avan4ds2e0er0s4s2sa1e1h1ino4t0ering5holic7ba1n1re3c1d1enter4o1rn3f0a1d2g1h0anel2nel4rity4se2t2eap3intai5ristmas6ome4urch5i0priani6rcle4sco3tadel4i0c2y3k1l0aims4eaning6ick2nic1que6othing5ud3ub0med6m1n1o0ach3des3ffee4llege4ogne5m0mbank4unity6pany2re3uter5sec4ndos3struction8ulting7tact3ractors9oking4l1p2rsica5untry4pon0s4rses6pa2r0edit0card4union9icket5own3s1uise0s6u0isinella9v1w1x1y0mru3ou3z2dad1nce3ta1e1ing3sun4y2clk3ds2e0al0er2s3gree4livery5l1oitte5ta3mocrat6ntal2ist5si0gn4v2hl2iamonds6et2gital5rect0ory7scount3ver5h2y2j1k1m1np2o0cs1tor4g1mains5t1wnload7rive4tv2ubai3pont4rban5vag2r2z2earth3t2c0o2deka3u0cation8e1g1mail3erck5nergy4gineer0ing9terprises10pson4quipment8r0icsson6ni3s0q1tate5t1u0rovision8s2vents5xchange6pert3osed4ress5traspace10fage2il1rwinds6th3mily4n0s2rm0ers5shion4t3edex3edback6rrari3ero6i0delity5o2lm2nal1nce1ial7re0stone6mdale6sh0ing5t0ness6j1k1lickr3ghts4r2orist4wers5y2m1o0o0d1tball6rd1ex2sale4um3undation8x2r0ee1senius7l1ogans4ntier7tr2ujitsu5n0d2rniture7tbol5yi3ga0l0lery3o1up4me0s3p1rden4y2b0iz3d0n2e0a1nt0ing5orge5f1g0ee3h1i0ft0s3ves2ing5l0ass3e1obal2o4m0ail3bh2o1x2n1odaddy5ld0point6f2odyear5g0le4p1t1v2p1q1r0ainger5phics5tis4een3ipe3ocery4up4s1t1u0cci3ge2ide2tars5ru3w1y2hair2mburg5ngout5us3bo2dfc0bank7ealth0care8lp1sinki6re1mes5iphop4samitsu7tachi5v2k0t2m1n1ockey4ldings5iday5medepot5goods5s0ense7nda3rse3spital5t0ing5t0els3mail5use3w2r1sbc3t1u0ghes5yatt3undai7ibm2cbc2e1u2d1e0ee3fm2kano4l1m0amat4db2mo0bilien9n0c1dustries8finiti5o2g1k1stitute6urance4e4t0ernational10uit4vestments10o1piranga7q1r0ish4s0maili5t0anbul7t0au2v3jaguar4va3cb2e0ep2tzt3welry6io2ll2m0p2nj2o0bs1urg4t1y2p0morgan6rs3uegos4niper7kaufen5ddi3e0rryhotels6properties14fh2g1h1i0a1ds2m1ndle4tchen5wi3m1n1oeln3matsu5sher5p0mg2n2r0d1ed3uokgroup8w1y0oto4z2la0caixa5mborghini8er3nd0rover6xess5salle5t0ino3robe5w0yer5b1c1ds2ease3clerc5frak4gal2o2xus4gbt3i0dl2fe0insurance9style7ghting6ke2lly3mited4o2ncoln4k2ve1ing5k1lc1p2oan0s3cker3us3l1ndon4tte1o3ve3pl0financial11r1s1t0d0a3u0ndbeck6xe1ury5v1y2ma0drid4if1son4keup4n0agement7go3p1rket0ing3s4riott5shalls7ttel5ba2c0kinsey7d1e0d0ia3et2lbourne7me1orial6n0u2rck0msd7g1h1iami3crosoft7l1ni1t2t0subishi9k1l0b1s2m0a2n1o0bi0le4da2e1i1m1nash3ey2ster5rmon3tgage6scow4to0rcycles9v0ie4p1q1r1s0d2t0n1r2u0seum3ic4v1w1x1y1z2na0b1goya4me2vy3ba2c1e0c1t0bank4flix4work5ustar5w0s2xt0direct7us4f0l2g0o2hk2i0co2ke1on3nja3ssan1y5l1o0kia3rton4w0ruz3tv4p1r0a1w2tt2u1yc2z2obi1server7ffice5kinawa6layan0group9lo3m0ega4ne1g1l0ine5oo2pen3racle3nge4g0anic5igins6saka4tsuka4t2vh3pa0ge2nasonic7ris2s1tners4s1y3y2ccw3e0t2f0izer5g1h0armacy6d1ilips5one2to0graphy6s4ysio5ics1tet2ures6d1n0g1k2oneer5zza4k1l0ace2y0station9umbing5s3m1n0c2ohl2ker3litie5rn2st3r0axi3ess3ime3o0d0uctions8f1gressive8mo2perties3y5tection8u0dential9s1t1ub2w0c2y2qa1pon3uebec3st5racing4dio4e0ad1lestate6tor2y4cipes5d0umbrella9hab3ise0n3t2liance6n0t0als5pair3ort3ublican8st0aurant8view0s5xroth6ich0ardli6oh3l1o1p2o0cks3deo3gers4om3s0vp3u0gby3hr2n2w0e2yukyu6sa0arland6fe0ty4kura4le1on3msclub4ung5ndvik0coromant12ofi4p1rl2s1ve2xo3b0i1s2c0b1haeffler7midt4olarships8ol3ule3warz5ience5ot3d1e0arch3t2cure1ity6ek2lect4ner3rvices6ven3w1x0y3fr2g1h0angrila6rp3ell3ia1ksha5oes2p0ping5uji3w3i0lk2na1gles5te3j1k0i0n2y0pe4l0ing4m0art3ile4n0cf3o0ccer3ial4ftbank4ware6hu2lar2utions7ng1y2y2pa0ce3ort2t3r0l2s1t0ada2ples4r1tebank4farm7c0group6ockholm6rage3e3ream4udio2y3yle4u0cks3pplies3y2ort5rf1gery5zuki5v1watch4iss4x1y0dney4stems6z2tab1ipei4lk2obao4rget4tamotors6r2too4x0i3c0i2d0k2eam2ch0nology8l1masek5nnis4va3f1g1h0d1eater2re6iaa2ckets5enda4ps2res2ol4j0maxx4x2k0maxx5l1m0all4n1o0day3kyo3ols3p1ray3shiba5tal3urs3wn2yota3s3r0ade1ing4ining5vel0ers0insurance16ust3v2t1ube2i1nes3shu4v0s2w1z2ua1bank3s2g1k1nicom3versity8o2ol2ps2s1y1z2va0cations7na1guard7c1e0gas3ntures6risign5mögensberater2ung14sicherung10t2g1i0ajes4deo3g1king4llas4n1p1rgin4sa1ion4va1o3laanderen9n1odka3lvo3te1ing3o2yage5u2wales2mart4ter4ng0gou5tch0es6eather0channel12bcam3er2site5d0ding5ibo2r3f1hoswho6ien2ki2lliamhill9n0dows4e1ners6me2oodside6rk0s2ld3w2s1tc1f3xbox3erox4ihuan4n2xx2yz3yachts4hoo3maxun5ndex5e1odobashi7ga2kohama6u0tube6t1un3za0ppos4ra3ero3ip2m1one3uerich6w2";
18876
18896
  const encodedUtlds = "ελ1υ2бг1ел3дети4ею2католик6ом3мкд2он1сква6онлайн5рг3рус2ф2сайт3рб3укр3қаз3հայ3ישראל5קום3ابوظبي5رامكو5لاردن4بحرين5جزائر5سعودية6عليان5مغرب5مارات5یران5بارت2زار4يتك3ھارت5تونس4سودان3رية5شبكة4عراق2ب2مان4فلسطين6قطر3كاثوليك6وم3مصر2ليسيا5وريتانيا7قع4همراه5پاکستان7ڀارت4कॉम3नेट3भारत0म्3ोत5संगठन5বাংলা5ভারত2ৰত4ਭਾਰਤ4ભારત4ଭାରତ4இந்தியா6லங்கை6சிங்கப்பூர்11భారత్5ಭಾರತ4ഭാരതം5ලංකා4คอม3ไทย3ລາວ3გე2みんな3アマゾン4クラウド4グーグル4コム2ストア3セール3ファッション6ポイント4世界2中信1国1國1文网3亚马逊3企业2佛山2信息2健康2八卦2公司1益2台湾1灣2商城1店1标2嘉里0大酒店5在线2大拿2天主教3娱乐2家電2广东2微博2慈善2我爱你3手机2招聘2政务1府2新加坡2闻2时尚2書籍2机构2淡马锡3游戏2澳門2点看2移动2组织机构4网址1店1站1络2联通2谷歌2购物2通販2集团2電訊盈科4飞利浦3食品2餐厅2香格里拉3港2닷넷1컴2삼성2한국2";
18877
18897
  const numeric = "numeric";
18878
18898
  const ascii = "ascii";
@@ -19802,8 +19822,6 @@ function init$1({
19802
19822
  ta(Email$1, groups.domain, EmailDomain);
19803
19823
  tt(Email$1, DOT, EmailDomainDot);
19804
19824
  tt(Email$1, HYPHEN, EmailDomainHyphen);
19805
- const EmailColon = tt(Email$1, COLON);
19806
- ta(EmailColon, groups.numeric, Email);
19807
19825
  const DomainHyphen = tt(Domain, HYPHEN);
19808
19826
  const DomainDot = tt(Domain, DOT);
19809
19827
  tt(DomainHyphen, HYPHEN, DomainHyphen);
@@ -19867,11 +19885,11 @@ function init$1({
19867
19885
  const [OPEN, CLOSE] = bracketPairs[i];
19868
19886
  const UrlOpen = tt(Url$1, OPEN);
19869
19887
  tt(UrlNonaccept, OPEN, UrlOpen);
19870
- tt(UrlOpen, CLOSE, Url$1);
19871
19888
  const UrlOpenQ = makeState(Url);
19872
19889
  ta(UrlOpen, qsAccepting, UrlOpenQ);
19873
19890
  const UrlOpenSyms = makeState();
19874
- ta(UrlOpen, qsNonAccepting);
19891
+ ta(UrlOpen, qsNonAccepting, UrlOpenSyms);
19892
+ tt(UrlOpen, CLOSE, Url$1);
19875
19893
  ta(UrlOpenQ, qsAccepting, UrlOpenQ);
19876
19894
  ta(UrlOpenQ, qsNonAccepting, UrlOpenSyms);
19877
19895
  ta(UrlOpenSyms, qsAccepting, UrlOpenQ);
@@ -22606,6 +22624,7 @@ var CharacterCount = Extension.create({
22606
22624
  addOptions() {
22607
22625
  return {
22608
22626
  limit: null,
22627
+ autoTrim: true,
22609
22628
  mode: "textSize",
22610
22629
  textCounter: (text) => text.length,
22611
22630
  wordCounter: (text) => text.split(" ").filter((word) => word !== "").length
@@ -22643,7 +22662,8 @@ var CharacterCount = Extension.create({
22643
22662
  return;
22644
22663
  }
22645
22664
  const limit = this.options.limit;
22646
- if (limit === null || limit === void 0 || limit === 0) {
22665
+ const autoTrim = this.options.autoTrim;
22666
+ if (limit === null || limit === void 0 || limit === 0 || autoTrim === false) {
22647
22667
  initialEvaluationDone = true;
22648
22668
  return;
22649
22669
  }
@@ -23193,21 +23213,8 @@ var BackgroundColor = Extension.create({
23193
23213
  default: null,
23194
23214
  parseHTML: (element) => {
23195
23215
  var _a;
23196
- const styleAttr = element.getAttribute("style");
23197
- if (styleAttr) {
23198
- const decls = styleAttr.split(";").map((s) => s.trim()).filter(Boolean);
23199
- for (let i = decls.length - 1; i >= 0; i -= 1) {
23200
- const parts = decls[i].split(":");
23201
- if (parts.length >= 2) {
23202
- const prop = parts[0].trim().toLowerCase();
23203
- const val = parts.slice(1).join(":").trim();
23204
- if (prop === "background-color") {
23205
- return val.replace(/['"]+/g, "");
23206
- }
23207
- }
23208
- }
23209
- }
23210
- return (_a = element.style.backgroundColor) == null ? void 0 : _a.replace(/['"]+/g, "");
23216
+ const value = (_a = getStyleProperty(element, "background-color")) != null ? _a : element.style.backgroundColor;
23217
+ return value == null ? void 0 : value.replace(/['"]+/g, "");
23211
23218
  },
23212
23219
  renderHTML: (attributes) => {
23213
23220
  if (!attributes.backgroundColor) {
@@ -23249,21 +23256,8 @@ var Color = Extension.create({
23249
23256
  default: null,
23250
23257
  parseHTML: (element) => {
23251
23258
  var _a;
23252
- const styleAttr = element.getAttribute("style");
23253
- if (styleAttr) {
23254
- const decls = styleAttr.split(";").map((s) => s.trim()).filter(Boolean);
23255
- for (let i = decls.length - 1; i >= 0; i -= 1) {
23256
- const parts = decls[i].split(":");
23257
- if (parts.length >= 2) {
23258
- const prop = parts[0].trim().toLowerCase();
23259
- const val = parts.slice(1).join(":").trim();
23260
- if (prop === "color") {
23261
- return val.replace(/['"]+/g, "");
23262
- }
23263
- }
23264
- }
23265
- }
23266
- return (_a = element.style.color) == null ? void 0 : _a.replace(/['"]+/g, "");
23259
+ const value = (_a = getStyleProperty(element, "color")) != null ? _a : element.style.color;
23260
+ return value == null ? void 0 : value.replace(/['"]+/g, "");
23267
23261
  },
23268
23262
  renderHTML: (attributes) => {
23269
23263
  if (!attributes.color) {
@@ -23303,7 +23297,14 @@ var FontFamily = Extension.create({
23303
23297
  attributes: {
23304
23298
  fontFamily: {
23305
23299
  default: null,
23306
- parseHTML: (element) => element.style.fontFamily,
23300
+ // Prefer the raw inline `style` attribute so unquoted or
23301
+ // single-quoted multi-word names are preserved instead of being
23302
+ // canonicalized by `element.style.fontFamily`, which forces double
23303
+ // quotes that then get HTML-encoded to `"` on serialization.
23304
+ parseHTML: (element) => {
23305
+ var _a;
23306
+ return (_a = getStyleProperty(element, "font-family")) != null ? _a : element.style.fontFamily;
23307
+ },
23307
23308
  renderHTML: (attributes) => {
23308
23309
  if (!attributes.fontFamily) {
23309
23310
  return {};
@@ -23342,7 +23343,13 @@ var FontSize$1 = Extension.create({
23342
23343
  attributes: {
23343
23344
  fontSize: {
23344
23345
  default: null,
23345
- parseHTML: (element) => element.style.fontSize,
23346
+ // Prefer the raw inline `style` attribute so the original format
23347
+ // is preserved instead of the canonicalized value returned by
23348
+ // `element.style.fontSize`.
23349
+ parseHTML: (element) => {
23350
+ var _a;
23351
+ return (_a = getStyleProperty(element, "font-size")) != null ? _a : element.style.fontSize;
23352
+ },
23346
23353
  renderHTML: (attributes) => {
23347
23354
  if (!attributes.fontSize) {
23348
23355
  return {};
@@ -23381,7 +23388,13 @@ var LineHeight$1 = Extension.create({
23381
23388
  attributes: {
23382
23389
  lineHeight: {
23383
23390
  default: null,
23384
- parseHTML: (element) => element.style.lineHeight,
23391
+ // Prefer the raw inline `style` attribute so the original format
23392
+ // is preserved instead of the canonicalized value returned by
23393
+ // `element.style.lineHeight`.
23394
+ parseHTML: (element) => {
23395
+ var _a;
23396
+ return (_a = getStyleProperty(element, "line-height")) != null ? _a : element.style.lineHeight;
23397
+ },
23385
23398
  renderHTML: (attributes) => {
23386
23399
  if (!attributes.lineHeight) {
23387
23400
  return {};
@@ -23448,7 +23461,11 @@ var Highlight = Mark2.create({
23448
23461
  return {
23449
23462
  color: {
23450
23463
  default: null,
23451
- parseHTML: (element) => element.getAttribute("data-color") || element.style.backgroundColor,
23464
+ // Prefer `data-color` (set by our own `renderHTML`) for lossless
23465
+ // round-trips. Otherwise parse the raw inline `style` attribute so
23466
+ // the original color format (e.g. `#rrggbb`) is preserved instead of
23467
+ // the canonicalized `rgb(...)` value from `element.style.backgroundColor`.
23468
+ parseHTML: (element) => element.getAttribute("data-color") || getStyleProperty(element, "background-color") || element.style.backgroundColor,
23452
23469
  renderHTML: (attributes) => {
23453
23470
  if (!attributes.color) {
23454
23471
  return {};
@@ -42868,6 +42885,567 @@ class LinkEditor {
42868
42885
  }
42869
42886
  }
42870
42887
  }
42888
+ const SPEECH_LANGUAGES = [
42889
+ { code: "ar-SA", name: "العربية" },
42890
+ { code: "ca-ES", name: "Català" },
42891
+ { code: "cs-CZ", name: "Čeština" },
42892
+ { code: "da-DK", name: "Dansk" },
42893
+ { code: "de-DE", name: "Deutsch" },
42894
+ { code: "el-GR", name: "Ελληνικά" },
42895
+ { code: "en-US", name: "English (US)" },
42896
+ { code: "en-GB", name: "English (UK)" },
42897
+ { code: "es-ES", name: "Español" },
42898
+ { code: "fi-FI", name: "Suomi" },
42899
+ { code: "fr-FR", name: "Français" },
42900
+ { code: "fr-CA", name: "Français (Canada)" },
42901
+ { code: "hu-HU", name: "Magyar" },
42902
+ { code: "id-ID", name: "Bahasa Indonesia" },
42903
+ { code: "it-IT", name: "Italiano" },
42904
+ { code: "ja-JP", name: "日本語" },
42905
+ { code: "ko-KR", name: "한국어" },
42906
+ { code: "nb-NO", name: "Norsk Bokmål" },
42907
+ { code: "nl-NL", name: "Nederlands" },
42908
+ { code: "pl-PL", name: "Polski" },
42909
+ { code: "pt-BR", name: "Português" },
42910
+ { code: "ro-RO", name: "Română" },
42911
+ { code: "ru-RU", name: "Русский" },
42912
+ { code: "sl-SI", name: "Slovenščina" },
42913
+ { code: "sr-RS", name: "Српски" },
42914
+ { code: "sv-SE", name: "Svenska" },
42915
+ { code: "th-TH", name: "ไทย" },
42916
+ { code: "tr-TR", name: "Türkçe" },
42917
+ { code: "vi-VN", name: "Tiếng Việt" },
42918
+ { code: "zh-CN", name: "中文 (简体)" },
42919
+ { code: "zh-TW", name: "中文 (繁體)" }
42920
+ ];
42921
+ const LOCALE_TO_BCP47$1 = {
42922
+ "ar": "ar-SA",
42923
+ "ca": "ca-ES",
42924
+ "cs": "cs-CZ",
42925
+ "da": "da-DK",
42926
+ "de": "de-DE",
42927
+ "el": "el-GR",
42928
+ "en": "en-US",
42929
+ "en-gb": "en-GB",
42930
+ "es": "es-ES",
42931
+ "fi": "fi-FI",
42932
+ "fr": "fr-FR",
42933
+ "fr-ca": "fr-CA",
42934
+ "hu": "hu-HU",
42935
+ "id": "id-ID",
42936
+ "it": "it-IT",
42937
+ "ja": "ja-JP",
42938
+ "ko": "ko-KR",
42939
+ "nb": "nb-NO",
42940
+ "nl": "nl-NL",
42941
+ "pl": "pl-PL",
42942
+ "pt": "pt-BR",
42943
+ "ro": "ro-RO",
42944
+ "ru": "ru-RU",
42945
+ "sl": "sl-SI",
42946
+ "sr": "sr-RS",
42947
+ "sv": "sv-SE",
42948
+ "th": "th-TH",
42949
+ "tr": "tr-TR",
42950
+ "vi": "vi-VN",
42951
+ "zh": "zh-CN",
42952
+ "zh-tw": "zh-TW"
42953
+ };
42954
+ function isSpeechRecognitionSupported() {
42955
+ return !!(window.SpeechRecognition || window.webkitSpeechRecognition);
42956
+ }
42957
+ function getSpeechRecognitionConstructor$1() {
42958
+ return window.SpeechRecognition || window.webkitSpeechRecognition || null;
42959
+ }
42960
+ class SpeechToText {
42961
+ options;
42962
+ overlay = null;
42963
+ dialog = null;
42964
+ recognition = null;
42965
+ isListening = false;
42966
+ finalTranscript = "";
42967
+ interimTranscript = "";
42968
+ lastConfidence = 0;
42969
+ restartTimer = null;
42970
+ // DOM references
42971
+ transcriptArea = null;
42972
+ confidenceEl = null;
42973
+ statusEl = null;
42974
+ startStopBtn = null;
42975
+ insertBtn = null;
42976
+ clearBtn = null;
42977
+ languageSelect = null;
42978
+ constructor(options) {
42979
+ this.options = options;
42980
+ }
42981
+ open() {
42982
+ if (this.overlay) {
42983
+ this.overlay.style.display = "flex";
42984
+ return;
42985
+ }
42986
+ this.createDialog();
42987
+ }
42988
+ close() {
42989
+ if (this.overlay) {
42990
+ this.overlay.style.display = "none";
42991
+ }
42992
+ this.stopRecognition();
42993
+ }
42994
+ destroy() {
42995
+ this.stopRecognition();
42996
+ this.overlay?.remove();
42997
+ this.overlay = null;
42998
+ this.dialog = null;
42999
+ this.transcriptArea = null;
43000
+ this.confidenceEl = null;
43001
+ this.statusEl = null;
43002
+ this.startStopBtn = null;
43003
+ this.insertBtn = null;
43004
+ this.clearBtn = null;
43005
+ this.languageSelect = null;
43006
+ }
43007
+ get editorLanguage() {
43008
+ return this.options.editor.getConfig().language ?? "en";
43009
+ }
43010
+ getDefaultSpeechLang() {
43011
+ return LOCALE_TO_BCP47$1[this.editorLanguage] ?? "en-US";
43012
+ }
43013
+ createDialog() {
43014
+ const trans = this.options.trans;
43015
+ this.overlay = document.createElement("div");
43016
+ this.overlay.className = "md-dialog-overlay";
43017
+ this.overlay.addEventListener("click", (e) => {
43018
+ if (e.target === this.overlay) this.close();
43019
+ });
43020
+ this.dialog = document.createElement("div");
43021
+ this.dialog.className = "md-dialog md-speechtotext-dialog";
43022
+ const header = document.createElement("div");
43023
+ header.className = "md-dialog-header";
43024
+ header.innerHTML = `
43025
+ <h3>${trans("Speech to Text")}</h3>
43026
+ <button type="button" class="md-dialog-close">×</button>
43027
+ `;
43028
+ header.querySelector(".md-dialog-close").addEventListener("click", () => this.close());
43029
+ const body = document.createElement("div");
43030
+ body.className = "md-dialog-body md-speechtotext-body";
43031
+ const langRow = document.createElement("div");
43032
+ langRow.className = "md-speechtotext-lang-row";
43033
+ const langLabel = document.createElement("label");
43034
+ langLabel.className = "md-speechtotext-label";
43035
+ langLabel.textContent = trans("Language");
43036
+ this.languageSelect = document.createElement("select");
43037
+ this.languageSelect.className = "md-speechtotext-language";
43038
+ const defaultLang = this.getDefaultSpeechLang();
43039
+ for (const lang of SPEECH_LANGUAGES) {
43040
+ const opt = document.createElement("option");
43041
+ opt.value = lang.code;
43042
+ opt.textContent = lang.name;
43043
+ if (lang.code === defaultLang) opt.selected = true;
43044
+ this.languageSelect.appendChild(opt);
43045
+ }
43046
+ langRow.appendChild(langLabel);
43047
+ langRow.appendChild(this.languageSelect);
43048
+ this.statusEl = document.createElement("div");
43049
+ this.statusEl.className = "md-speechtotext-status";
43050
+ this.statusEl.textContent = "";
43051
+ this.transcriptArea = document.createElement("div");
43052
+ this.transcriptArea.className = "md-speechtotext-transcript";
43053
+ this.confidenceEl = document.createElement("div");
43054
+ this.confidenceEl.className = "md-speechtotext-confidence";
43055
+ this.confidenceEl.textContent = "";
43056
+ const controls = document.createElement("div");
43057
+ controls.className = "md-speechtotext-controls";
43058
+ this.startStopBtn = document.createElement("button");
43059
+ this.startStopBtn.type = "button";
43060
+ this.startStopBtn.className = "md-speechtotext-btn md-speechtotext-btn-start";
43061
+ this.startStopBtn.textContent = trans("Start");
43062
+ this.startStopBtn.addEventListener("click", () => this.toggleRecognition());
43063
+ this.insertBtn = document.createElement("button");
43064
+ this.insertBtn.type = "button";
43065
+ this.insertBtn.className = "md-speechtotext-btn md-speechtotext-btn-insert";
43066
+ this.insertBtn.textContent = trans("Insert");
43067
+ this.insertBtn.addEventListener("click", () => this.insertTranscript());
43068
+ this.clearBtn = document.createElement("button");
43069
+ this.clearBtn.type = "button";
43070
+ this.clearBtn.className = "md-speechtotext-btn md-speechtotext-btn-clear";
43071
+ this.clearBtn.textContent = trans("Clear");
43072
+ this.clearBtn.addEventListener("click", () => this.clearTranscript());
43073
+ controls.appendChild(this.startStopBtn);
43074
+ controls.appendChild(this.insertBtn);
43075
+ controls.appendChild(this.clearBtn);
43076
+ body.appendChild(langRow);
43077
+ body.appendChild(this.statusEl);
43078
+ body.appendChild(this.transcriptArea);
43079
+ body.appendChild(this.confidenceEl);
43080
+ body.appendChild(controls);
43081
+ this.dialog.appendChild(header);
43082
+ this.dialog.appendChild(body);
43083
+ this.overlay.appendChild(this.dialog);
43084
+ document.body.appendChild(this.overlay);
43085
+ this.dialog.addEventListener("keydown", (e) => {
43086
+ if (e.key === "Escape") {
43087
+ this.close();
43088
+ }
43089
+ });
43090
+ }
43091
+ toggleRecognition() {
43092
+ if (this.isListening) {
43093
+ this.stopRecognition();
43094
+ } else {
43095
+ this.startRecognition();
43096
+ }
43097
+ }
43098
+ startRecognition() {
43099
+ const SpeechRecognitionCtor = getSpeechRecognitionConstructor$1();
43100
+ if (!SpeechRecognitionCtor) return;
43101
+ this.recognition = new SpeechRecognitionCtor();
43102
+ this.recognition.continuous = true;
43103
+ this.recognition.interimResults = true;
43104
+ this.recognition.maxAlternatives = 1;
43105
+ this.recognition.lang = this.languageSelect?.value ?? this.getDefaultSpeechLang();
43106
+ this.recognition.onresult = this.handleResult.bind(this);
43107
+ this.recognition.onerror = this.handleError.bind(this);
43108
+ this.recognition.onend = this.handleEnd.bind(this);
43109
+ try {
43110
+ this.recognition.start();
43111
+ this.isListening = true;
43112
+ this.updateButtonState();
43113
+ this.setStatus(this.options.trans("Listening..."));
43114
+ } catch {
43115
+ }
43116
+ }
43117
+ handleResult(event) {
43118
+ this.interimTranscript = "";
43119
+ for (let i = event.resultIndex; i < event.results.length; i++) {
43120
+ const result = event.results[i];
43121
+ if (result.isFinal) {
43122
+ const text = result[0].transcript;
43123
+ if (this.finalTranscript.length > 0 && !this.finalTranscript.endsWith(" ") && !text.startsWith(" ")) {
43124
+ this.finalTranscript += " ";
43125
+ }
43126
+ this.finalTranscript += text;
43127
+ this.lastConfidence = result[0].confidence;
43128
+ } else {
43129
+ this.interimTranscript += result[0].transcript;
43130
+ }
43131
+ }
43132
+ this.updateTranscriptDisplay();
43133
+ this.updateConfidenceDisplay();
43134
+ }
43135
+ handleError(event) {
43136
+ const trans = this.options.trans;
43137
+ if (event.error === "no-speech") ;
43138
+ else if (event.error === "not-allowed") {
43139
+ this.stopRecognition();
43140
+ this.setStatus(trans("Microphone access denied"));
43141
+ } else if (event.error === "audio-capture") {
43142
+ this.stopRecognition();
43143
+ this.setStatus(trans("No microphone found"));
43144
+ } else if (event.error === "network") {
43145
+ this.stopRecognition();
43146
+ this.setStatus(trans("Network error - speech recognition requires internet"));
43147
+ } else if (event.error !== "aborted") ;
43148
+ }
43149
+ handleEnd() {
43150
+ if (this.isListening) {
43151
+ this.restartTimer = setTimeout(() => {
43152
+ if (!this.isListening) return;
43153
+ try {
43154
+ this.recognition?.start();
43155
+ } catch {
43156
+ const Ctor = getSpeechRecognitionConstructor$1();
43157
+ if (!Ctor) return;
43158
+ this.recognition = new Ctor();
43159
+ this.recognition.continuous = true;
43160
+ this.recognition.interimResults = true;
43161
+ this.recognition.maxAlternatives = 1;
43162
+ this.recognition.lang = this.languageSelect?.value ?? this.getDefaultSpeechLang();
43163
+ this.recognition.onresult = this.handleResult.bind(this);
43164
+ this.recognition.onerror = this.handleError.bind(this);
43165
+ this.recognition.onend = this.handleEnd.bind(this);
43166
+ try {
43167
+ this.recognition.start();
43168
+ } catch {
43169
+ this.stopRecognition();
43170
+ }
43171
+ }
43172
+ }, 300);
43173
+ }
43174
+ }
43175
+ stopRecognition() {
43176
+ this.isListening = false;
43177
+ if (this.restartTimer) {
43178
+ clearTimeout(this.restartTimer);
43179
+ this.restartTimer = null;
43180
+ }
43181
+ if (this.recognition) {
43182
+ try {
43183
+ this.recognition.stop();
43184
+ } catch {
43185
+ }
43186
+ this.recognition = null;
43187
+ }
43188
+ this.updateButtonState();
43189
+ this.setStatus("");
43190
+ }
43191
+ updateButtonState() {
43192
+ const trans = this.options.trans;
43193
+ if (this.startStopBtn) {
43194
+ if (this.isListening) {
43195
+ this.startStopBtn.textContent = trans("Stop");
43196
+ this.startStopBtn.classList.remove("md-speechtotext-btn-start");
43197
+ this.startStopBtn.classList.add("md-speechtotext-btn-stop");
43198
+ } else {
43199
+ this.startStopBtn.textContent = trans("Start");
43200
+ this.startStopBtn.classList.remove("md-speechtotext-btn-stop");
43201
+ this.startStopBtn.classList.add("md-speechtotext-btn-start");
43202
+ }
43203
+ }
43204
+ if (this.statusEl) {
43205
+ this.statusEl.classList.toggle("md-speechtotext-status-active", this.isListening);
43206
+ }
43207
+ }
43208
+ setStatus(text) {
43209
+ if (this.statusEl) {
43210
+ this.statusEl.textContent = text;
43211
+ }
43212
+ }
43213
+ updateTranscriptDisplay() {
43214
+ if (!this.transcriptArea) return;
43215
+ const finalSpan = `<span class="md-speechtotext-final">${this.escapeHtml(this.finalTranscript)}</span>`;
43216
+ const interimSpan = this.interimTranscript ? `<span class="md-speechtotext-interim">${this.escapeHtml(this.interimTranscript)}</span>` : "";
43217
+ this.transcriptArea.innerHTML = finalSpan + interimSpan;
43218
+ this.transcriptArea.scrollTop = this.transcriptArea.scrollHeight;
43219
+ }
43220
+ updateConfidenceDisplay() {
43221
+ if (!this.confidenceEl) return;
43222
+ if (this.lastConfidence > 0) {
43223
+ const pct = Math.round(this.lastConfidence * 100);
43224
+ this.confidenceEl.textContent = `${this.options.trans("Confidence")}: ${pct}%`;
43225
+ }
43226
+ }
43227
+ insertTranscript() {
43228
+ const text = this.finalTranscript.trim();
43229
+ if (!text) return;
43230
+ const tiptap = this.options.editor.getTipTap();
43231
+ if (tiptap) {
43232
+ tiptap.chain().focus().insertContent(text).run();
43233
+ }
43234
+ this.clearTranscript();
43235
+ this.close();
43236
+ }
43237
+ clearTranscript() {
43238
+ this.finalTranscript = "";
43239
+ this.interimTranscript = "";
43240
+ this.lastConfidence = 0;
43241
+ if (this.transcriptArea) {
43242
+ this.transcriptArea.innerHTML = "";
43243
+ }
43244
+ if (this.confidenceEl) {
43245
+ this.confidenceEl.textContent = "";
43246
+ }
43247
+ }
43248
+ escapeHtml(text) {
43249
+ const div = document.createElement("div");
43250
+ div.textContent = text;
43251
+ return div.innerHTML;
43252
+ }
43253
+ }
43254
+ const LOCALE_TO_BCP47 = {
43255
+ "ar": "ar-SA",
43256
+ "ca": "ca-ES",
43257
+ "cs": "cs-CZ",
43258
+ "da": "da-DK",
43259
+ "de": "de-DE",
43260
+ "el": "el-GR",
43261
+ "en": "en-US",
43262
+ "en-gb": "en-GB",
43263
+ "es": "es-ES",
43264
+ "fi": "fi-FI",
43265
+ "fr": "fr-FR",
43266
+ "fr-ca": "fr-CA",
43267
+ "hu": "hu-HU",
43268
+ "id": "id-ID",
43269
+ "it": "it-IT",
43270
+ "ja": "ja-JP",
43271
+ "ko": "ko-KR",
43272
+ "nb": "nb-NO",
43273
+ "nl": "nl-NL",
43274
+ "pl": "pl-PL",
43275
+ "pt": "pt-BR",
43276
+ "ro": "ro-RO",
43277
+ "ru": "ru-RU",
43278
+ "sl": "sl-SI",
43279
+ "sr": "sr-RS",
43280
+ "sv": "sv-SE",
43281
+ "th": "th-TH",
43282
+ "tr": "tr-TR",
43283
+ "vi": "vi-VN",
43284
+ "zh": "zh-CN",
43285
+ "zh-tw": "zh-TW"
43286
+ };
43287
+ function getSpeechRecognitionConstructor() {
43288
+ return window.SpeechRecognition || window.webkitSpeechRecognition || null;
43289
+ }
43290
+ class Dictation {
43291
+ options;
43292
+ recognition = null;
43293
+ _isActive = false;
43294
+ restartTimer = null;
43295
+ // Tracks the start position of current interim text so we can replace it
43296
+ interimStart = null;
43297
+ interimLength = 0;
43298
+ constructor(options) {
43299
+ this.options = options;
43300
+ }
43301
+ get isActive() {
43302
+ return this._isActive;
43303
+ }
43304
+ toggle() {
43305
+ if (this._isActive) {
43306
+ this.stop();
43307
+ } else {
43308
+ this.start();
43309
+ }
43310
+ }
43311
+ start() {
43312
+ const Ctor = getSpeechRecognitionConstructor();
43313
+ if (!Ctor) return;
43314
+ this.recognition = new Ctor();
43315
+ this.recognition.continuous = true;
43316
+ this.recognition.interimResults = true;
43317
+ this.recognition.maxAlternatives = 1;
43318
+ this.recognition.lang = this.getSpeechLang();
43319
+ this.recognition.onresult = this.handleResult.bind(this);
43320
+ this.recognition.onerror = this.handleError.bind(this);
43321
+ this.recognition.onend = this.handleEnd.bind(this);
43322
+ try {
43323
+ this.recognition.start();
43324
+ this._isActive = true;
43325
+ this.interimStart = null;
43326
+ this.interimLength = 0;
43327
+ this.options.onStateChange?.(true);
43328
+ } catch {
43329
+ }
43330
+ }
43331
+ stop() {
43332
+ this._isActive = false;
43333
+ if (this.restartTimer) {
43334
+ clearTimeout(this.restartTimer);
43335
+ this.restartTimer = null;
43336
+ }
43337
+ this.clearInterim();
43338
+ if (this.recognition) {
43339
+ try {
43340
+ this.recognition.stop();
43341
+ } catch {
43342
+ }
43343
+ this.recognition = null;
43344
+ }
43345
+ this.options.onStateChange?.(false);
43346
+ }
43347
+ destroy() {
43348
+ this.stop();
43349
+ }
43350
+ getSpeechLang() {
43351
+ const locale = this.options.editor.getConfig().language ?? "en";
43352
+ return LOCALE_TO_BCP47[locale] ?? "en-US";
43353
+ }
43354
+ handleResult(event) {
43355
+ const tiptap = this.options.editor.getTipTap();
43356
+ if (!tiptap) return;
43357
+ for (let i = event.resultIndex; i < event.results.length; i++) {
43358
+ const result = event.results[i];
43359
+ const transcript = result[0].transcript;
43360
+ if (result.isFinal) {
43361
+ this.clearInterim();
43362
+ let text = transcript;
43363
+ if (this.needsLeadingSpace(text)) {
43364
+ text = " " + text;
43365
+ }
43366
+ tiptap.chain().focus().insertContent(text).run();
43367
+ } else {
43368
+ let text = transcript;
43369
+ if (this.interimStart === null && this.needsLeadingSpace(text)) {
43370
+ text = " " + text;
43371
+ }
43372
+ this.replaceInterim(text);
43373
+ }
43374
+ }
43375
+ }
43376
+ /** Replace the current interim text in the editor with new interim text */
43377
+ replaceInterim(text) {
43378
+ const tiptap = this.options.editor.getTipTap();
43379
+ if (!tiptap) return;
43380
+ if (this.interimStart !== null && this.interimLength > 0) {
43381
+ tiptap.chain().focus().command(({ tr: tr2 }) => {
43382
+ tr2.delete(this.interimStart, this.interimStart + this.interimLength);
43383
+ return true;
43384
+ }).run();
43385
+ }
43386
+ if (this.interimStart === null) {
43387
+ this.interimStart = tiptap.state.selection.from;
43388
+ }
43389
+ tiptap.chain().focus().insertContent(text).run();
43390
+ this.interimLength = text.length;
43391
+ }
43392
+ /** Remove interim text without inserting anything */
43393
+ clearInterim() {
43394
+ if (this.interimStart !== null && this.interimLength > 0) {
43395
+ const tiptap = this.options.editor.getTipTap();
43396
+ if (tiptap) {
43397
+ tiptap.chain().focus().command(({ tr: tr2 }) => {
43398
+ tr2.delete(this.interimStart, this.interimStart + this.interimLength);
43399
+ return true;
43400
+ }).run();
43401
+ }
43402
+ }
43403
+ this.interimStart = null;
43404
+ this.interimLength = 0;
43405
+ }
43406
+ needsLeadingSpace(newText) {
43407
+ if (newText.startsWith(" ")) return false;
43408
+ const tiptap = this.options.editor.getTipTap();
43409
+ if (!tiptap) return false;
43410
+ const { from: from2 } = tiptap.state.selection;
43411
+ if (from2 === 0) return false;
43412
+ const textBefore = tiptap.state.doc.textBetween(Math.max(0, from2 - 1), from2, "");
43413
+ if (!textBefore) return false;
43414
+ return textBefore.trim().length > 0;
43415
+ }
43416
+ handleError(event) {
43417
+ if (event.error === "no-speech") ;
43418
+ else if (event.error === "not-allowed" || event.error === "audio-capture" || event.error === "network") {
43419
+ this.stop();
43420
+ }
43421
+ }
43422
+ handleEnd() {
43423
+ if (this._isActive) {
43424
+ this.restartTimer = setTimeout(() => {
43425
+ if (!this._isActive) return;
43426
+ try {
43427
+ this.recognition?.start();
43428
+ } catch {
43429
+ const Ctor = getSpeechRecognitionConstructor();
43430
+ if (!Ctor) return;
43431
+ this.recognition = new Ctor();
43432
+ this.recognition.continuous = true;
43433
+ this.recognition.interimResults = true;
43434
+ this.recognition.maxAlternatives = 1;
43435
+ this.recognition.lang = this.getSpeechLang();
43436
+ this.recognition.onresult = this.handleResult.bind(this);
43437
+ this.recognition.onerror = this.handleError.bind(this);
43438
+ this.recognition.onend = this.handleEnd.bind(this);
43439
+ try {
43440
+ this.recognition.start();
43441
+ } catch {
43442
+ this.stop();
43443
+ }
43444
+ }
43445
+ }, 300);
43446
+ }
43447
+ }
43448
+ }
42871
43449
  const DEFAULT_BUTTON_PRIORITY = {
42872
43450
  bold: 1,
42873
43451
  italic: 1,
@@ -42930,6 +43508,8 @@ class Toolbar {
42930
43508
  searchReplace = null;
42931
43509
  sourceEditor = null;
42932
43510
  linkEditor = null;
43511
+ speechToText = null;
43512
+ dictation = null;
42933
43513
  updateInterval = null;
42934
43514
  boundClickHandler = null;
42935
43515
  boundKeydownHandler = null;
@@ -43246,6 +43826,32 @@ class Toolbar {
43246
43826
  return this.createActionButton("searchreplace", this.icon("searchreplace"), this.trans("Find and replace"), () => {
43247
43827
  this.openSearchReplace();
43248
43828
  });
43829
+ case "speechtotext": {
43830
+ if (this.options.config.speech_to_text === false) return null;
43831
+ if (!isSpeechRecognitionSupported()) {
43832
+ const btn = this.createActionButton("speechtotext", this.icon("speechtotext"), this.trans("Speech to text is not supported in this browser"), () => {
43833
+ });
43834
+ btn.classList.add("md-toolbar-btn-disabled");
43835
+ btn.setAttribute("aria-disabled", "true");
43836
+ return btn;
43837
+ }
43838
+ return this.createActionButton("speechtotext", this.icon("speechtotext"), this.trans("Speech to Text"), () => {
43839
+ this.openSpeechToText();
43840
+ });
43841
+ }
43842
+ case "dictate": {
43843
+ if (this.options.config.speech_to_text === false) return null;
43844
+ if (!isSpeechRecognitionSupported()) {
43845
+ const btn = this.createActionButton("dictate", this.icon("dictate"), this.trans("Speech to text is not supported in this browser"), () => {
43846
+ });
43847
+ btn.classList.add("md-toolbar-btn-disabled");
43848
+ btn.setAttribute("aria-disabled", "true");
43849
+ return btn;
43850
+ }
43851
+ return this.createActionButton("dictate", this.icon("dictate"), this.trans("Dictate"), () => {
43852
+ this.toggleDictation();
43853
+ });
43854
+ }
43249
43855
  case "template":
43250
43856
  return this.createTemplateDropdown();
43251
43857
  default:
@@ -43678,6 +44284,31 @@ class Toolbar {
43678
44284
  }
43679
44285
  this.searchReplace.open();
43680
44286
  }
44287
+ openSpeechToText() {
44288
+ if (!this.speechToText) {
44289
+ this.speechToText = new SpeechToText({
44290
+ editor: this.options.editor,
44291
+ trans: this.trans
44292
+ });
44293
+ }
44294
+ this.speechToText.open();
44295
+ }
44296
+ toggleDictation() {
44297
+ if (!this.dictation) {
44298
+ this.dictation = new Dictation({
44299
+ editor: this.options.editor,
44300
+ trans: this.trans,
44301
+ onStateChange: (isActive2) => {
44302
+ const btn = this.buttonElements.get("dictate");
44303
+ if (btn) {
44304
+ btn.classList.toggle("md-toolbar-btn-active", isActive2);
44305
+ btn.classList.toggle("md-toolbar-btn-dictating", isActive2);
44306
+ }
44307
+ }
44308
+ });
44309
+ }
44310
+ this.dictation.toggle();
44311
+ }
43681
44312
  openSourceCode() {
43682
44313
  if (!this.sourceEditor) {
43683
44314
  this.sourceEditor = new SourceEditor({
@@ -43726,6 +44357,10 @@ class Toolbar {
43726
44357
  this.imageUpload = null;
43727
44358
  this.searchReplace?.destroy();
43728
44359
  this.searchReplace = null;
44360
+ this.speechToText?.destroy();
44361
+ this.speechToText = null;
44362
+ this.dictation?.destroy();
44363
+ this.dictation = null;
43729
44364
  this.buttonElements.clear();
43730
44365
  this.dropdowns.clear();
43731
44366
  this.removeBodyMenus();
@@ -43748,6 +44383,8 @@ class Toolbar {
43748
44383
  this.emojiPicker?.destroy();
43749
44384
  this.imageUpload?.destroy();
43750
44385
  this.searchReplace?.destroy();
44386
+ this.speechToText?.destroy();
44387
+ this.dictation?.destroy();
43751
44388
  this.buttonElements.clear();
43752
44389
  this.dropdowns.clear();
43753
44390
  this.removeBodyMenus();
@@ -43797,6 +44434,8 @@ const DEFAULT_ICONS = {
43797
44434
  ltr: "⇐",
43798
44435
  rtl: "⇒",
43799
44436
  searchreplace: "🔍",
44437
+ speechtotext: "🎤",
44438
+ dictate: "🎙️",
43800
44439
  togglemore: "…"
43801
44440
  };
43802
44441
  const CONFAB_ICONS = {
@@ -43830,6 +44469,8 @@ const CONFAB_ICONS = {
43830
44469
  ltr: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="12" y1="5" x2="12" y2="19"/><line x1="18" y1="5" x2="18" y2="19"/><path d="M8 5a4 4 0 0 0 0 8h4"/><polyline points="4 17 8 21 12 17"/></svg>',
43831
44470
  rtl: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="12" y1="5" x2="12" y2="19"/><line x1="6" y1="5" x2="6" y2="19"/><path d="M16 5a4 4 0 0 1 0 8h-4"/><polyline points="20 17 16 21 12 17"/></svg>',
43832
44471
  searchreplace: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.6" y2="16.6"/></svg>',
44472
+ speechtotext: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z"/><path d="M19 10v2a7 7 0 0 1-14 0v-2"/><line x1="12" y1="19" x2="12" y2="23"/><line x1="8" y1="23" x2="16" y2="23"/></svg>',
44473
+ dictate: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z"/><path d="M19 10v2a7 7 0 0 1-14 0v-2"/><circle cx="12" cy="12" r="1" fill="currentColor" stroke="none"/><circle cx="12" cy="8" r="1" fill="currentColor" stroke="none"/><circle cx="12" cy="16" r="0.5" fill="currentColor" stroke="none"/></svg>',
43833
44474
  togglemore: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="1" fill="currentColor"/><circle cx="5" cy="12" r="1" fill="currentColor"/><circle cx="19" cy="12" r="1" fill="currentColor"/></svg>'
43834
44475
  };
43835
44476
  const FontSize = Extension.create({
@@ -44479,7 +45120,20 @@ const en = {
44479
45120
  "Title": "Title",
44480
45121
  "Open link in...": "Open link in...",
44481
45122
  "Current window": "Current window",
44482
- "New window": "New window"
45123
+ "New window": "New window",
45124
+ "Speech to Text": "Speech to Text",
45125
+ "Dictate": "Dictate",
45126
+ "Start": "Start",
45127
+ "Stop": "Stop",
45128
+ "Clear": "Clear",
45129
+ "Language": "Language",
45130
+ "Confidence": "Confidence",
45131
+ "Listening...": "Listening...",
45132
+ "Speech to text is not supported in this browser": "Speech to text is not supported in this browser",
45133
+ "No speech detected": "No speech detected",
45134
+ "Microphone access denied": "Microphone access denied",
45135
+ "No microphone found": "No microphone found",
45136
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
44483
45137
  };
44484
45138
  const ar = {
44485
45139
  "Bold": "غامق",
@@ -44537,7 +45191,7 @@ const ar = {
44537
45191
  "Browse...": "استعراض...",
44538
45192
  "Drop image here or click to browse": "أسقط الصورة هنا أو انقر للاستعراض",
44539
45193
  "Alt text": "نص بديل",
44540
- "Insert": "إدراج",
45194
+ "Insert": "?????",
44541
45195
  "Cancel": "إلغاء",
44542
45196
  "Uploading...": "جارٍ الرفع...",
44543
45197
  "Upload failed": "فشل الرفع",
@@ -44551,7 +45205,20 @@ const ar = {
44551
45205
  "Title": "Title",
44552
45206
  "Open link in...": "Open link in...",
44553
45207
  "Current window": "Current window",
44554
- "New window": "New window"
45208
+ "New window": "New window",
45209
+ "Speech to Text": "????? ?????? ??? ??",
45210
+ "Dictate": "إملاء",
45211
+ "Start": "???",
45212
+ "Stop": "?????",
45213
+ "Clear": "???",
45214
+ "Language": "?????",
45215
+ "Confidence": "?????",
45216
+ "Listening...": "???? ????????...",
45217
+ "Speech to text is not supported in this browser": "????? ?????? ??? ?? ??? ????? ?? ??? ???????",
45218
+ "No speech detected": "?? ??? ?????? ????",
45219
+ "Microphone access denied": "?? ??? ?????? ??? ??????????",
45220
+ "No microphone found": "No microphone found",
45221
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
44555
45222
  };
44556
45223
  const ca = {
44557
45224
  "Bold": "Negreta",
@@ -44623,7 +45290,20 @@ const ca = {
44623
45290
  "Title": "Title",
44624
45291
  "Open link in...": "Open link in...",
44625
45292
  "Current window": "Current window",
44626
- "New window": "New window"
45293
+ "New window": "New window",
45294
+ "Speech to Text": "Veu a text",
45295
+ "Dictate": "Dictar",
45296
+ "Start": "Iniciar",
45297
+ "Stop": "Aturar",
45298
+ "Clear": "Esborrar",
45299
+ "Language": "Idioma",
45300
+ "Confidence": "Confian�a",
45301
+ "Listening...": "Escoltant...",
45302
+ "Speech to text is not supported in this browser": "La veu a text no �s compatible amb aquest navegador",
45303
+ "No speech detected": "No s'ha detectat veu",
45304
+ "Microphone access denied": "Acc�s al micr�fon denegat",
45305
+ "No microphone found": "No microphone found",
45306
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
44627
45307
  };
44628
45308
  const zh = {
44629
45309
  "Bold": "粗体",
@@ -44681,7 +45361,7 @@ const zh = {
44681
45361
  "Browse...": "浏览...",
44682
45362
  "Drop image here or click to browse": "将图片拖放到此处或点击浏览",
44683
45363
  "Alt text": "替代文本",
44684
- "Insert": "插入",
45364
+ "Insert": "??",
44685
45365
  "Cancel": "取消",
44686
45366
  "Uploading...": "上传中...",
44687
45367
  "Upload failed": "上传失败",
@@ -44695,7 +45375,20 @@ const zh = {
44695
45375
  "Title": "Title",
44696
45376
  "Open link in...": "Open link in...",
44697
45377
  "Current window": "Current window",
44698
- "New window": "New window"
45378
+ "New window": "New window",
45379
+ "Speech to Text": "?????",
45380
+ "Dictate": "听写",
45381
+ "Start": "??",
45382
+ "Stop": "??",
45383
+ "Clear": "??",
45384
+ "Language": "??",
45385
+ "Confidence": "???",
45386
+ "Listening...": "????...",
45387
+ "Speech to text is not supported in this browser": "????????????",
45388
+ "No speech detected": "??????",
45389
+ "Microphone access denied": "????????",
45390
+ "No microphone found": "No microphone found",
45391
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
44699
45392
  };
44700
45393
  const cs = {
44701
45394
  "Bold": "Tučné",
@@ -44753,7 +45446,7 @@ const cs = {
44753
45446
  "Browse...": "Procházet...",
44754
45447
  "Drop image here or click to browse": "Přetáhněte obrázek sem nebo klikněte pro výběr",
44755
45448
  "Alt text": "Alternativní text",
44756
- "Insert": "Vložit",
45449
+ "Insert": "Vlo�it",
44757
45450
  "Cancel": "Zrušit",
44758
45451
  "Uploading...": "Nahrávání...",
44759
45452
  "Upload failed": "Nahrávání selhalo",
@@ -44767,7 +45460,20 @@ const cs = {
44767
45460
  "Title": "Title",
44768
45461
  "Open link in...": "Open link in...",
44769
45462
  "Current window": "Current window",
44770
- "New window": "New window"
45463
+ "New window": "New window",
45464
+ "Speech to Text": "Rec na text",
45465
+ "Dictate": "Diktovat",
45466
+ "Start": "Spustit",
45467
+ "Stop": "Zastavit",
45468
+ "Clear": "Vymazat",
45469
+ "Language": "Jazyk",
45470
+ "Confidence": "Spolehlivost",
45471
+ "Listening...": "Poslouch�m...",
45472
+ "Speech to text is not supported in this browser": "Rec na text nen� v tomto prohl�eci podporov�na",
45473
+ "No speech detected": "Nebyla detekov�na rec",
45474
+ "Microphone access denied": "Pr�stup k mikrofonu zam�tnut",
45475
+ "No microphone found": "No microphone found",
45476
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
44771
45477
  };
44772
45478
  const da = {
44773
45479
  "Bold": "Fed",
@@ -44825,7 +45531,7 @@ const da = {
44825
45531
  "Browse...": "Gennemse...",
44826
45532
  "Drop image here or click to browse": "Træk billede hertil eller klik for at gennemse",
44827
45533
  "Alt text": "Alternativ tekst",
44828
- "Insert": "Indsæt",
45534
+ "Insert": "Inds�t",
44829
45535
  "Cancel": "Annuller",
44830
45536
  "Uploading...": "Uploader...",
44831
45537
  "Upload failed": "Upload mislykkedes",
@@ -44839,7 +45545,20 @@ const da = {
44839
45545
  "Title": "Title",
44840
45546
  "Open link in...": "Open link in...",
44841
45547
  "Current window": "Current window",
44842
- "New window": "New window"
45548
+ "New window": "New window",
45549
+ "Speech to Text": "Tale til tekst",
45550
+ "Dictate": "Dikter",
45551
+ "Start": "Start",
45552
+ "Stop": "Stop",
45553
+ "Clear": "Ryd",
45554
+ "Language": "Sprog",
45555
+ "Confidence": "Tillid",
45556
+ "Listening...": "Lytter...",
45557
+ "Speech to text is not supported in this browser": "Tale til tekst underst�ttes ikke i denne browser",
45558
+ "No speech detected": "Ingen tale registreret",
45559
+ "Microphone access denied": "Mikrofonadgang n�gtet",
45560
+ "No microphone found": "No microphone found",
45561
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
44843
45562
  };
44844
45563
  const enGb = {
44845
45564
  "Bold": "Bold",
@@ -44911,7 +45630,20 @@ const enGb = {
44911
45630
  "Title": "Title",
44912
45631
  "Open link in...": "Open link in...",
44913
45632
  "Current window": "Current window",
44914
- "New window": "New window"
45633
+ "New window": "New window",
45634
+ "Speech to Text": "Speech to Text",
45635
+ "Dictate": "Dictate",
45636
+ "Start": "Start",
45637
+ "Stop": "Stop",
45638
+ "Clear": "Clear",
45639
+ "Language": "Language",
45640
+ "Confidence": "Confidence",
45641
+ "Listening...": "Listening...",
45642
+ "Speech to text is not supported in this browser": "Speech to text is not supported in this browser",
45643
+ "No speech detected": "No speech detected",
45644
+ "Microphone access denied": "Microphone access denied",
45645
+ "No microphone found": "No microphone found",
45646
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
44915
45647
  };
44916
45648
  const fi = {
44917
45649
  "Bold": "Lihavoitu",
@@ -44969,7 +45701,7 @@ const fi = {
44969
45701
  "Browse...": "Selaa...",
44970
45702
  "Drop image here or click to browse": "Pudota kuva tähän tai napsauta selataksesi",
44971
45703
  "Alt text": "Vaihtoehtoinen teksti",
44972
- "Insert": "Lisää",
45704
+ "Insert": "Lis��",
44973
45705
  "Cancel": "Peruuta",
44974
45706
  "Uploading...": "Ladataan...",
44975
45707
  "Upload failed": "Lataus epäonnistui",
@@ -44983,7 +45715,20 @@ const fi = {
44983
45715
  "Title": "Title",
44984
45716
  "Open link in...": "Open link in...",
44985
45717
  "Current window": "Current window",
44986
- "New window": "New window"
45718
+ "New window": "New window",
45719
+ "Speech to Text": "Puhe tekstiksi",
45720
+ "Dictate": "Sanele",
45721
+ "Start": "Aloita",
45722
+ "Stop": "Lopeta",
45723
+ "Clear": "Tyhjenn�",
45724
+ "Language": "Kieli",
45725
+ "Confidence": "Luotettavuus",
45726
+ "Listening...": "Kuuntelee...",
45727
+ "Speech to text is not supported in this browser": "Puhe tekstiksi ei ole tuettu t�ss� selaimessa",
45728
+ "No speech detected": "Puhetta ei havaittu",
45729
+ "Microphone access denied": "Mikrofonin k�ytt� estetty",
45730
+ "No microphone found": "No microphone found",
45731
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
44987
45732
  };
44988
45733
  const fr = {
44989
45734
  "Bold": "Gras",
@@ -45041,7 +45786,7 @@ const fr = {
45041
45786
  "Browse...": "Parcourir...",
45042
45787
  "Drop image here or click to browse": "Déposez l'image ici ou cliquez pour parcourir",
45043
45788
  "Alt text": "Texte alternatif",
45044
- "Insert": "Insérer",
45789
+ "Insert": "Ins�rer",
45045
45790
  "Cancel": "Annuler",
45046
45791
  "Uploading...": "Téléchargement...",
45047
45792
  "Upload failed": "Échec du téléchargement",
@@ -45055,7 +45800,20 @@ const fr = {
45055
45800
  "Title": "Title",
45056
45801
  "Open link in...": "Open link in...",
45057
45802
  "Current window": "Current window",
45058
- "New window": "New window"
45803
+ "New window": "New window",
45804
+ "Speech to Text": "Reconnaissance vocale",
45805
+ "Dictate": "Dicter",
45806
+ "Start": "D�marrer",
45807
+ "Stop": "Arr�ter",
45808
+ "Clear": "Effacer",
45809
+ "Language": "Langue",
45810
+ "Confidence": "Confiance",
45811
+ "Listening...": "�coute en cours...",
45812
+ "Speech to text is not supported in this browser": "La reconnaissance vocale n'est pas prise en charge dans ce navigateur",
45813
+ "No speech detected": "Aucune parole d�tect�e",
45814
+ "Microphone access denied": "Acc�s au microphone refus�",
45815
+ "No microphone found": "No microphone found",
45816
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
45059
45817
  };
45060
45818
  const frCa = {
45061
45819
  "Bold": "Gras",
@@ -45113,7 +45871,7 @@ const frCa = {
45113
45871
  "Browse...": "Parcourir...",
45114
45872
  "Drop image here or click to browse": "Déposez l'image ici ou cliquez pour parcourir",
45115
45873
  "Alt text": "Texte alternatif",
45116
- "Insert": "Insérer",
45874
+ "Insert": "Ins�rer",
45117
45875
  "Cancel": "Annuler",
45118
45876
  "Uploading...": "Téléversement...",
45119
45877
  "Upload failed": "Échec du téléversement",
@@ -45127,7 +45885,20 @@ const frCa = {
45127
45885
  "Title": "Title",
45128
45886
  "Open link in...": "Open link in...",
45129
45887
  "Current window": "Current window",
45130
- "New window": "New window"
45888
+ "New window": "New window",
45889
+ "Speech to Text": "Reconnaissance vocale",
45890
+ "Dictate": "Dicter",
45891
+ "Start": "D�marrer",
45892
+ "Stop": "Arr�ter",
45893
+ "Clear": "Effacer",
45894
+ "Language": "Langue",
45895
+ "Confidence": "Confiance",
45896
+ "Listening...": "�coute en cours...",
45897
+ "Speech to text is not supported in this browser": "La reconnaissance vocale n'est pas prise en charge dans ce navigateur",
45898
+ "No speech detected": "Aucune parole d�tect�e",
45899
+ "Microphone access denied": "Acc�s au microphone refus�",
45900
+ "No microphone found": "No microphone found",
45901
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
45131
45902
  };
45132
45903
  const de = {
45133
45904
  "Bold": "Fett",
@@ -45185,7 +45956,7 @@ const de = {
45185
45956
  "Browse...": "Durchsuchen...",
45186
45957
  "Drop image here or click to browse": "Bild hierher ziehen oder klicken zum Durchsuchen",
45187
45958
  "Alt text": "Alternativtext",
45188
- "Insert": "Einfügen",
45959
+ "Insert": "Einf�gen",
45189
45960
  "Cancel": "Abbrechen",
45190
45961
  "Uploading...": "Wird hochgeladen...",
45191
45962
  "Upload failed": "Hochladen fehlgeschlagen",
@@ -45199,7 +45970,20 @@ const de = {
45199
45970
  "Title": "Title",
45200
45971
  "Open link in...": "Open link in...",
45201
45972
  "Current window": "Current window",
45202
- "New window": "New window"
45973
+ "New window": "New window",
45974
+ "Speech to Text": "Sprache zu Text",
45975
+ "Dictate": "Diktieren",
45976
+ "Start": "Starten",
45977
+ "Stop": "Stoppen",
45978
+ "Clear": "L�schen",
45979
+ "Language": "Sprache",
45980
+ "Confidence": "Zuverl�ssigkeit",
45981
+ "Listening...": "Zuh�ren...",
45982
+ "Speech to text is not supported in this browser": "Sprache-zu-Text wird in diesem Browser nicht unterst�tzt",
45983
+ "No speech detected": "Keine Sprache erkannt",
45984
+ "Microphone access denied": "Mikrofonzugriff verweigert",
45985
+ "No microphone found": "No microphone found",
45986
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
45203
45987
  };
45204
45988
  const el = {
45205
45989
  "Bold": "Έντονα",
@@ -45257,7 +46041,7 @@ const el = {
45257
46041
  "Browse...": "Αναζήτηση...",
45258
46042
  "Drop image here or click to browse": "Σύρτε την εικόνα εδώ ή κάντε κλικ για αναζήτηση",
45259
46043
  "Alt text": "Εναλλακτικό κείμενο",
45260
- "Insert": "Εισαγωγή",
46044
+ "Insert": "??sa????",
45261
46045
  "Cancel": "Ακύρωση",
45262
46046
  "Uploading...": "Μεταφόρτωση...",
45263
46047
  "Upload failed": "Η μεταφόρτωση απέτυχε",
@@ -45271,7 +46055,20 @@ const el = {
45271
46055
  "Title": "Title",
45272
46056
  "Open link in...": "Open link in...",
45273
46057
  "Current window": "Current window",
45274
- "New window": "New window"
46058
+ "New window": "New window",
46059
+ "Speech to Text": "?�???a se ?e?�e??",
46060
+ "Dictate": "Υπαγόρευση",
46061
+ "Start": "??????s?",
46062
+ "Stop": "??a??p?",
46063
+ "Clear": "???a????s?",
46064
+ "Language": "G??ssa",
46065
+ "Confidence": "????p?st?a",
46066
+ "Listening...": "????e?...",
46067
+ "Speech to text is not supported in this browser": "? ?�???a se ?e?�e?? de? ?p?st????eta? se a?t?? t?? pe?????t?",
46068
+ "No speech detected": "?e? a????e????e ?�???a",
46069
+ "Microphone access denied": "? p??s�as? st? �????f??? ap????f???e",
46070
+ "No microphone found": "No microphone found",
46071
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
45275
46072
  };
45276
46073
  const hu = {
45277
46074
  "Bold": "Félkövér",
@@ -45329,7 +46126,7 @@ const hu = {
45329
46126
  "Browse...": "Tallózás...",
45330
46127
  "Drop image here or click to browse": "Húzza ide a képet, vagy kattintson a tallózáshoz",
45331
46128
  "Alt text": "Alternatív szöveg",
45332
- "Insert": "Beszúrás",
46129
+ "Insert": "Besz�r�s",
45333
46130
  "Cancel": "Mégse",
45334
46131
  "Uploading...": "Feltöltés...",
45335
46132
  "Upload failed": "A feltöltés sikertelen",
@@ -45343,7 +46140,20 @@ const hu = {
45343
46140
  "Title": "Title",
45344
46141
  "Open link in...": "Open link in...",
45345
46142
  "Current window": "Current window",
45346
- "New window": "New window"
46143
+ "New window": "New window",
46144
+ "Speech to Text": "Besz�d sz�vegg�",
46145
+ "Dictate": "Diktálás",
46146
+ "Start": "Ind�t�s",
46147
+ "Stop": "Le�ll�t�s",
46148
+ "Clear": "T�rl�s",
46149
+ "Language": "Nyelv",
46150
+ "Confidence": "Megb�zhat�s�g",
46151
+ "Listening...": "Hallgat�s...",
46152
+ "Speech to text is not supported in this browser": "A besz�d sz�vegg� alak�t�s nem t�mogatott ebben a b�ng�szoben",
46153
+ "No speech detected": "Nem �szlelheto besz�d",
46154
+ "Microphone access denied": "Mikrofon hozz�f�r�s megtagadva",
46155
+ "No microphone found": "No microphone found",
46156
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
45347
46157
  };
45348
46158
  const id = {
45349
46159
  "Bold": "Tebal",
@@ -45415,7 +46225,20 @@ const id = {
45415
46225
  "Title": "Title",
45416
46226
  "Open link in...": "Open link in...",
45417
46227
  "Current window": "Current window",
45418
- "New window": "New window"
46228
+ "New window": "New window",
46229
+ "Speech to Text": "Ucapan ke teks",
46230
+ "Dictate": "Dikte",
46231
+ "Start": "Mulai",
46232
+ "Stop": "Berhenti",
46233
+ "Clear": "Hapus",
46234
+ "Language": "Bahasa",
46235
+ "Confidence": "Kepercayaan",
46236
+ "Listening...": "Mendengarkan...",
46237
+ "Speech to text is not supported in this browser": "Ucapan ke teks tidak didukung di browser ini",
46238
+ "No speech detected": "Tidak ada ucapan terdeteksi",
46239
+ "Microphone access denied": "Akses mikrofon ditolak",
46240
+ "No microphone found": "No microphone found",
46241
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
45419
46242
  };
45420
46243
  const it = {
45421
46244
  "Bold": "Grassetto",
@@ -45487,7 +46310,20 @@ const it = {
45487
46310
  "Title": "Title",
45488
46311
  "Open link in...": "Open link in...",
45489
46312
  "Current window": "Current window",
45490
- "New window": "New window"
46313
+ "New window": "New window",
46314
+ "Speech to Text": "Riconoscimento vocale",
46315
+ "Dictate": "Dettare",
46316
+ "Start": "Avvia",
46317
+ "Stop": "Ferma",
46318
+ "Clear": "Cancella",
46319
+ "Language": "Lingua",
46320
+ "Confidence": "Affidabilit�",
46321
+ "Listening...": "Ascolto in corso...",
46322
+ "Speech to text is not supported in this browser": "Il riconoscimento vocale non � supportato in questo browser",
46323
+ "No speech detected": "Nessun discorso rilevato",
46324
+ "Microphone access denied": "Accesso al microfono negato",
46325
+ "No microphone found": "No microphone found",
46326
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
45491
46327
  };
45492
46328
  const ja = {
45493
46329
  "Bold": "太字",
@@ -45545,7 +46381,7 @@ const ja = {
45545
46381
  "Browse...": "参照...",
45546
46382
  "Drop image here or click to browse": "画像をここにドロップするかクリックして参照",
45547
46383
  "Alt text": "代替テキスト",
45548
- "Insert": "挿入",
46384
+ "Insert": "??",
45549
46385
  "Cancel": "キャンセル",
45550
46386
  "Uploading...": "アップロード中...",
45551
46387
  "Upload failed": "アップロードに失敗しました",
@@ -45559,7 +46395,20 @@ const ja = {
45559
46395
  "Title": "Title",
45560
46396
  "Open link in...": "Open link in...",
45561
46397
  "Current window": "Current window",
45562
- "New window": "New window"
46398
+ "New window": "New window",
46399
+ "Speech to Text": "????",
46400
+ "Dictate": "音声入力",
46401
+ "Start": "??",
46402
+ "Stop": "??",
46403
+ "Clear": "???",
46404
+ "Language": "??",
46405
+ "Confidence": "???",
46406
+ "Listening...": "?????...",
46407
+ "Speech to text is not supported in this browser": "????????????????????????",
46408
+ "No speech detected": "?????????????",
46409
+ "Microphone access denied": "?????????????????",
46410
+ "No microphone found": "No microphone found",
46411
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
45563
46412
  };
45564
46413
  const ko = {
45565
46414
  "Bold": "굵게",
@@ -45617,7 +46466,7 @@ const ko = {
45617
46466
  "Browse...": "찾아보기...",
45618
46467
  "Drop image here or click to browse": "이미지를 여기에 끌어다 놓거나 클릭하여 찾아보기",
45619
46468
  "Alt text": "대체 텍스트",
45620
- "Insert": "삽입",
46469
+ "Insert": "??",
45621
46470
  "Cancel": "취소",
45622
46471
  "Uploading...": "업로드 중...",
45623
46472
  "Upload failed": "업로드 실패",
@@ -45631,7 +46480,20 @@ const ko = {
45631
46480
  "Title": "Title",
45632
46481
  "Open link in...": "Open link in...",
45633
46482
  "Current window": "Current window",
45634
- "New window": "New window"
46483
+ "New window": "New window",
46484
+ "Speech to Text": "?? ??",
46485
+ "Dictate": "받아쓰기",
46486
+ "Start": "??",
46487
+ "Stop": "??",
46488
+ "Clear": "???",
46489
+ "Language": "??",
46490
+ "Confidence": "???",
46491
+ "Listening...": "?? ?...",
46492
+ "Speech to text is not supported in this browser": "? ??????? ?? ??? ???? ????",
46493
+ "No speech detected": "??? ???? ?????",
46494
+ "Microphone access denied": "??? ??? ???????",
46495
+ "No microphone found": "No microphone found",
46496
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
45635
46497
  };
45636
46498
  const nl = {
45637
46499
  "Bold": "Vet",
@@ -45703,7 +46565,20 @@ const nl = {
45703
46565
  "Title": "Title",
45704
46566
  "Open link in...": "Open link in...",
45705
46567
  "Current window": "Current window",
45706
- "New window": "New window"
46568
+ "New window": "New window",
46569
+ "Speech to Text": "Spraak naar tekst",
46570
+ "Dictate": "Dicteren",
46571
+ "Start": "Starten",
46572
+ "Stop": "Stoppen",
46573
+ "Clear": "Wissen",
46574
+ "Language": "Taal",
46575
+ "Confidence": "Betrouwbaarheid",
46576
+ "Listening...": "Luisteren...",
46577
+ "Speech to text is not supported in this browser": "Spraak naar tekst wordt niet ondersteund in deze browser",
46578
+ "No speech detected": "Geen spraak gedetecteerd",
46579
+ "Microphone access denied": "Toegang tot microfoon geweigerd",
46580
+ "No microphone found": "No microphone found",
46581
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
45707
46582
  };
45708
46583
  const nb = {
45709
46584
  "Bold": "Fet",
@@ -45775,7 +46650,20 @@ const nb = {
45775
46650
  "Title": "Title",
45776
46651
  "Open link in...": "Open link in...",
45777
46652
  "Current window": "Current window",
45778
- "New window": "New window"
46653
+ "New window": "New window",
46654
+ "Speech to Text": "Tale til tekst",
46655
+ "Dictate": "Dikter",
46656
+ "Start": "Start",
46657
+ "Stop": "Stopp",
46658
+ "Clear": "T�m",
46659
+ "Language": "Spr�k",
46660
+ "Confidence": "P�litelighet",
46661
+ "Listening...": "Lytter...",
46662
+ "Speech to text is not supported in this browser": "Tale til tekst st�ttes ikke i denne nettleseren",
46663
+ "No speech detected": "Ingen tale oppdaget",
46664
+ "Microphone access denied": "Mikrofontilgang nektet",
46665
+ "No microphone found": "No microphone found",
46666
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
45779
46667
  };
45780
46668
  const pl = {
45781
46669
  "Bold": "Pogrubienie",
@@ -45847,7 +46735,20 @@ const pl = {
45847
46735
  "Title": "Title",
45848
46736
  "Open link in...": "Open link in...",
45849
46737
  "Current window": "Current window",
45850
- "New window": "New window"
46738
+ "New window": "New window",
46739
+ "Speech to Text": "Mowa na tekst",
46740
+ "Dictate": "Dyktuj",
46741
+ "Start": "Rozpocznij",
46742
+ "Stop": "Zatrzymaj",
46743
+ "Clear": "Wyczysc",
46744
+ "Language": "Jezyk",
46745
+ "Confidence": "Pewnosc",
46746
+ "Listening...": "Nasluchiwanie...",
46747
+ "Speech to text is not supported in this browser": "Mowa na tekst nie jest obslugiwana w tej przegladarce",
46748
+ "No speech detected": "Nie wykryto mowy",
46749
+ "Microphone access denied": "Odmowa dostepu do mikrofonu",
46750
+ "No microphone found": "No microphone found",
46751
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
45851
46752
  };
45852
46753
  const pt = {
45853
46754
  "Bold": "Negrito",
@@ -45919,7 +46820,20 @@ const pt = {
45919
46820
  "Title": "Title",
45920
46821
  "Open link in...": "Open link in...",
45921
46822
  "Current window": "Current window",
45922
- "New window": "New window"
46823
+ "New window": "New window",
46824
+ "Speech to Text": "Voz para texto",
46825
+ "Dictate": "Ditar",
46826
+ "Start": "Iniciar",
46827
+ "Stop": "Parar",
46828
+ "Clear": "Limpar",
46829
+ "Language": "Idioma",
46830
+ "Confidence": "Confian�a",
46831
+ "Listening...": "Ouvindo...",
46832
+ "Speech to text is not supported in this browser": "Voz para texto n�o � suportado neste navegador",
46833
+ "No speech detected": "Nenhuma fala detectada",
46834
+ "Microphone access denied": "Acesso ao microfone negado",
46835
+ "No microphone found": "No microphone found",
46836
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
45923
46837
  };
45924
46838
  const ro = {
45925
46839
  "Bold": "Îngroșat",
@@ -45977,7 +46891,7 @@ const ro = {
45977
46891
  "Browse...": "Răsfoiește...",
45978
46892
  "Drop image here or click to browse": "Trage imaginea aici sau dă clic pentru a răsfoi",
45979
46893
  "Alt text": "Text alternativ",
45980
- "Insert": "Inserează",
46894
+ "Insert": "Inserare",
45981
46895
  "Cancel": "Anulează",
45982
46896
  "Uploading...": "Se încarcă...",
45983
46897
  "Upload failed": "Încarcare eșuată",
@@ -45991,7 +46905,20 @@ const ro = {
45991
46905
  "Title": "Title",
45992
46906
  "Open link in...": "Open link in...",
45993
46907
  "Current window": "Current window",
45994
- "New window": "New window"
46908
+ "New window": "New window",
46909
+ "Speech to Text": "Voce �n text",
46910
+ "Dictate": "Dictare",
46911
+ "Start": "Pornire",
46912
+ "Stop": "Oprire",
46913
+ "Clear": "?tergere",
46914
+ "Language": "Limba",
46915
+ "Confidence": "�ncredere",
46916
+ "Listening...": "Ascultare...",
46917
+ "Speech to text is not supported in this browser": "Voce �n text nu este acceptata �n acest browser",
46918
+ "No speech detected": "Nu a fost detectata nicio voce",
46919
+ "Microphone access denied": "Accesul la microfon a fost refuzat",
46920
+ "No microphone found": "No microphone found",
46921
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
45995
46922
  };
45996
46923
  const ru = {
45997
46924
  "Bold": "Полужирный",
@@ -46049,7 +46976,7 @@ const ru = {
46049
46976
  "Browse...": "Обзор...",
46050
46977
  "Drop image here or click to browse": "Перетащите изображение сюда или нажмите для обзора",
46051
46978
  "Alt text": "Альтернативный текст",
46052
- "Insert": "Вставить",
46979
+ "Insert": "????????",
46053
46980
  "Cancel": "Отмена",
46054
46981
  "Uploading...": "Загрузка...",
46055
46982
  "Upload failed": "Ошибка загрузки",
@@ -46063,7 +46990,20 @@ const ru = {
46063
46990
  "Title": "Title",
46064
46991
  "Open link in...": "Open link in...",
46065
46992
  "Current window": "Current window",
46066
- "New window": "New window"
46993
+ "New window": "New window",
46994
+ "Speech to Text": "????? ? ?????",
46995
+ "Dictate": "Диктовать",
46996
+ "Start": "??????",
46997
+ "Stop": "??????????",
46998
+ "Clear": "????????",
46999
+ "Language": "????",
47000
+ "Confidence": "????????",
47001
+ "Listening...": "??????...",
47002
+ "Speech to text is not supported in this browser": "????????? ???? ?? ?????????????? ? ???? ????????",
47003
+ "No speech detected": "???? ?? ??????????",
47004
+ "Microphone access denied": "?????? ? ????????? ????????",
47005
+ "No microphone found": "No microphone found",
47006
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
46067
47007
  };
46068
47008
  const sr = {
46069
47009
  "Bold": "Подебљано",
@@ -46121,7 +47061,7 @@ const sr = {
46121
47061
  "Browse...": "Претражи...",
46122
47062
  "Drop image here or click to browse": "Превуците слику овде или кликните за претрагу",
46123
47063
  "Alt text": "Алтернативни текст",
46124
- "Insert": "Уметни",
47064
+ "Insert": "?????",
46125
47065
  "Cancel": "Откажи",
46126
47066
  "Uploading...": "Отпремање...",
46127
47067
  "Upload failed": "Отпремање није успело",
@@ -46135,7 +47075,20 @@ const sr = {
46135
47075
  "Title": "Title",
46136
47076
  "Open link in...": "Open link in...",
46137
47077
  "Current window": "Current window",
46138
- "New window": "New window"
47078
+ "New window": "New window",
47079
+ "Speech to Text": "????? ? ?????",
47080
+ "Dictate": "Диктирање",
47081
+ "Start": "???????",
47082
+ "Stop": "????????",
47083
+ "Clear": "??????",
47084
+ "Language": "?????",
47085
+ "Confidence": "??????????",
47086
+ "Listening...": "??????...",
47087
+ "Speech to text is not supported in this browser": "????? ? ????? ???? ??????? ? ???? ??????????",
47088
+ "No speech detected": "????? ???? ????????",
47089
+ "Microphone access denied": "??????? ????????? ???????",
47090
+ "No microphone found": "No microphone found",
47091
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
46139
47092
  };
46140
47093
  const sl = {
46141
47094
  "Bold": "Krepko",
@@ -46207,7 +47160,20 @@ const sl = {
46207
47160
  "Title": "Title",
46208
47161
  "Open link in...": "Open link in...",
46209
47162
  "Current window": "Current window",
46210
- "New window": "New window"
47163
+ "New window": "New window",
47164
+ "Speech to Text": "Govor v besedilo",
47165
+ "Dictate": "Narekovanje",
47166
+ "Start": "Zacni",
47167
+ "Stop": "Ustavi",
47168
+ "Clear": "Pocisti",
47169
+ "Language": "Jezik",
47170
+ "Confidence": "Zaupanje",
47171
+ "Listening...": "Poslu�am...",
47172
+ "Speech to text is not supported in this browser": "Govor v besedilo ni podprt v tem brskalniku",
47173
+ "No speech detected": "Govor ni bil zaznan",
47174
+ "Microphone access denied": "Dostop do mikrofona zavrnjen",
47175
+ "No microphone found": "No microphone found",
47176
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
46211
47177
  };
46212
47178
  const es = {
46213
47179
  "Bold": "Negrita",
@@ -46279,7 +47245,20 @@ const es = {
46279
47245
  "Title": "Title",
46280
47246
  "Open link in...": "Open link in...",
46281
47247
  "Current window": "Current window",
46282
- "New window": "New window"
47248
+ "New window": "New window",
47249
+ "Speech to Text": "Voz a texto",
47250
+ "Dictate": "Dictar",
47251
+ "Start": "Iniciar",
47252
+ "Stop": "Detener",
47253
+ "Clear": "Borrar",
47254
+ "Language": "Idioma",
47255
+ "Confidence": "Confianza",
47256
+ "Listening...": "Escuchando...",
47257
+ "Speech to text is not supported in this browser": "La voz a texto no es compatible con este navegador",
47258
+ "No speech detected": "No se detect� voz",
47259
+ "Microphone access denied": "Acceso al micr�fono denegado",
47260
+ "No microphone found": "No microphone found",
47261
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
46283
47262
  };
46284
47263
  const sv = {
46285
47264
  "Bold": "Fet",
@@ -46351,7 +47330,20 @@ const sv = {
46351
47330
  "Title": "Title",
46352
47331
  "Open link in...": "Open link in...",
46353
47332
  "Current window": "Current window",
46354
- "New window": "New window"
47333
+ "New window": "New window",
47334
+ "Speech to Text": "Tal till text",
47335
+ "Dictate": "Diktera",
47336
+ "Start": "Starta",
47337
+ "Stop": "Stoppa",
47338
+ "Clear": "Rensa",
47339
+ "Language": "Spr�k",
47340
+ "Confidence": "Tillf�rlitlighet",
47341
+ "Listening...": "Lyssnar...",
47342
+ "Speech to text is not supported in this browser": "Tal till text st�ds inte i denna webbl�sare",
47343
+ "No speech detected": "Inget tal detekterat",
47344
+ "Microphone access denied": "Mikrofon�tkomst nekad",
47345
+ "No microphone found": "No microphone found",
47346
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
46355
47347
  };
46356
47348
  const zhTw = {
46357
47349
  "Bold": "粗體",
@@ -46409,7 +47401,7 @@ const zhTw = {
46409
47401
  "Browse...": "瀏覽...",
46410
47402
  "Drop image here or click to browse": "將圖片拖放至此處或點擊瀏覽",
46411
47403
  "Alt text": "替代文字",
46412
- "Insert": "插入",
47404
+ "Insert": "??",
46413
47405
  "Cancel": "取消",
46414
47406
  "Uploading...": "上傳中...",
46415
47407
  "Upload failed": "上傳失敗",
@@ -46423,7 +47415,20 @@ const zhTw = {
46423
47415
  "Title": "Title",
46424
47416
  "Open link in...": "Open link in...",
46425
47417
  "Current window": "Current window",
46426
- "New window": "New window"
47418
+ "New window": "New window",
47419
+ "Speech to Text": "?????",
47420
+ "Dictate": "聽寫",
47421
+ "Start": "??",
47422
+ "Stop": "??",
47423
+ "Clear": "??",
47424
+ "Language": "??",
47425
+ "Confidence": "???",
47426
+ "Listening...": "????...",
47427
+ "Speech to text is not supported in this browser": "????????????",
47428
+ "No speech detected": "??????",
47429
+ "Microphone access denied": "????????",
47430
+ "No microphone found": "No microphone found",
47431
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
46427
47432
  };
46428
47433
  const th = {
46429
47434
  "Bold": "ตัวหนา",
@@ -46481,7 +47486,7 @@ const th = {
46481
47486
  "Browse...": "เรียกดู...",
46482
47487
  "Drop image here or click to browse": "ลากรูปภาพมาที่นี่หรือคลิกเพื่อเรียกดู",
46483
47488
  "Alt text": "ข้อความทดแทน",
46484
- "Insert": "แทรก",
47489
+ "Insert": "????",
46485
47490
  "Cancel": "ยกเลิก",
46486
47491
  "Uploading...": "กำลังอัปโหลด...",
46487
47492
  "Upload failed": "อัปโหลดล้มเหลว",
@@ -46495,7 +47500,20 @@ const th = {
46495
47500
  "Title": "Title",
46496
47501
  "Open link in...": "Open link in...",
46497
47502
  "Current window": "Current window",
46498
- "New window": "New window"
47503
+ "New window": "New window",
47504
+ "Speech to Text": "????????????????",
47505
+ "Dictate": "เขียนตามคำบอก",
47506
+ "Start": "?????",
47507
+ "Stop": "????",
47508
+ "Clear": "????",
47509
+ "Language": "????",
47510
+ "Confidence": "?????????????",
47511
+ "Listening...": "????????...",
47512
+ "Speech to text is not supported in this browser": "?????????????????????????????????????????",
47513
+ "No speech detected": "?????????????",
47514
+ "Microphone access denied": "???????????????????????????",
47515
+ "No microphone found": "No microphone found",
47516
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
46499
47517
  };
46500
47518
  const tr = {
46501
47519
  "Bold": "Kalın",
@@ -46567,7 +47585,20 @@ const tr = {
46567
47585
  "Title": "Title",
46568
47586
  "Open link in...": "Open link in...",
46569
47587
  "Current window": "Current window",
46570
- "New window": "New window"
47588
+ "New window": "New window",
47589
+ "Speech to Text": "Konusmayi metne �evir",
47590
+ "Dictate": "Dikte et",
47591
+ "Start": "Baslat",
47592
+ "Stop": "Durdur",
47593
+ "Clear": "Temizle",
47594
+ "Language": "Dil",
47595
+ "Confidence": "G�venilirlik",
47596
+ "Listening...": "Dinliyor...",
47597
+ "Speech to text is not supported in this browser": "Bu tarayicida konusmayi metne �evirme desteklenmiyor",
47598
+ "No speech detected": "Konusma algilanmadi",
47599
+ "Microphone access denied": "Mikrofon erisimi reddedildi",
47600
+ "No microphone found": "No microphone found",
47601
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
46571
47602
  };
46572
47603
  const vi = {
46573
47604
  "Bold": "In đậm",
@@ -46625,7 +47656,7 @@ const vi = {
46625
47656
  "Browse...": "Duyệt...",
46626
47657
  "Drop image here or click to browse": "Kéo thả hình ảnh vào đây hoặc nhấp để duyệt",
46627
47658
  "Alt text": "Văn bản thay thế",
46628
- "Insert": "Chèn",
47659
+ "Insert": "Ch�n",
46629
47660
  "Cancel": "Hủy",
46630
47661
  "Uploading...": "Đang tải lên...",
46631
47662
  "Upload failed": "Tải lên thất bại",
@@ -46639,7 +47670,20 @@ const vi = {
46639
47670
  "Title": "Title",
46640
47671
  "Open link in...": "Open link in...",
46641
47672
  "Current window": "Current window",
46642
- "New window": "New window"
47673
+ "New window": "New window",
47674
+ "Speech to Text": "Gi?ng n�i th�nh van b?n",
47675
+ "Dictate": "Đọc chính tả",
47676
+ "Start": "B?t d?u",
47677
+ "Stop": "D?ng",
47678
+ "Clear": "X�a",
47679
+ "Language": "Ng�n ng?",
47680
+ "Confidence": "�? tin c?y",
47681
+ "Listening...": "�ang nghe...",
47682
+ "Speech to text is not supported in this browser": "Gi?ng n�i th�nh van b?n kh�ng du?c h? tr? trong tr�nh duy?t n�y",
47683
+ "No speech detected": "Kh�ng ph�t hi?n gi?ng n�i",
47684
+ "Microphone access denied": "Quy?n truy c?p micr� b? t? ch?i",
47685
+ "No microphone found": "No microphone found",
47686
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
46643
47687
  };
46644
47688
  const locales = {
46645
47689
  en,
@@ -46780,7 +47824,8 @@ class HTMLEditor {
46780
47824
  format_empty_lines: config.format_empty_lines ?? true,
46781
47825
  toolbar_narrow_breakpoint: config.toolbar_narrow_breakpoint,
46782
47826
  toolbar_priority: config.toolbar_priority,
46783
- paste_from_office: config.paste_from_office ?? true
47827
+ paste_from_office: config.paste_from_office ?? true,
47828
+ speech_to_text: config.speech_to_text ?? true
46784
47829
  };
46785
47830
  }
46786
47831
  createEditor() {
@@ -47204,6 +48249,7 @@ export {
47204
48249
  CONFAB_ICONS,
47205
48250
  CharacterMap,
47206
48251
  DEFAULT_ICONS,
48252
+ Dictation,
47207
48253
  EMOJI_CATEGORIES,
47208
48254
  EmojiPicker,
47209
48255
  FontSize,
@@ -47215,6 +48261,7 @@ export {
47215
48261
  SearchReplace,
47216
48262
  SignatureBlock,
47217
48263
  SourceEditor,
48264
+ SpeechToText,
47218
48265
  TRANSLATION_KEYS,
47219
48266
  TextDirection,
47220
48267
  Toolbar,
@@ -47224,6 +48271,7 @@ export {
47224
48271
  getGetFileSrc,
47225
48272
  getLocale,
47226
48273
  getTranslate,
48274
+ isSpeechRecognitionSupported,
47227
48275
  resetTranslate,
47228
48276
  setGetFileSrc,
47229
48277
  setTranslate