Ye(e,"*:not(.tox-silver-sink)")))),a=(e=>{const t=te(e,"background-color");return void 0!==t&&""!==t?"background-color:"+t+"!important":"background-color:rgb(255,255,255)!important;"})(n);x(i,r("display:none!important;")),x(o,r(Je+Qe+a)),r((!0===Ze?"":Je)+Qe+a)(t)},tt=_e.DOM,nt=qe().fold((()=>({bind:g,unbind:g})),(e=>{const t=(()=>{const e=O(g);return{...e,on:t=>e.get().each(t)}})(),n=k(),r=k(),o=((e,t)=>{let n=null;return{cancel:()=>{a(n)||(clearTimeout(n),n=null)},throttle:(...t)=>{a(n)&&(n=setTimeout((()=>{n=null,e.apply(null,t)}),50))}}})((()=>{document.body.scrollTop=0,document.documentElement.scrollTop=0,window.requestAnimationFrame((()=>{t.on((t=>ee(t,{top:e.offsetTop+"px",left:e.offsetLeft+"px",height:e.height+"px",width:e.width+"px"})))}))}));return{bind:e=>{t.set(e),o.throttle(),n.set(je("resize",o.throttle)),r.set(je("scroll",o.throttle))},unbind:()=>{t.on((()=>{n.clear(),r.clear()})),t.clear()}}})),rt=(e,t)=>{const n=document.body,r=document.documentElement,o=e.getContainer(),s=j(o),i=(l=s,y.from(l.dom.nextSibling).map(j)).filter((e=>(e=>P(e)&&L(e.dom))(e)&&((e,t)=>(e=>void 0!==e.dom.classList)(e)&&e.dom.classList.contains("tox-silver-sink"))(e)));var l;const a=(e=>{const t=j(e.getElement());return Y(t).map(G).getOrThunk((()=>(e=>{const t=e.dom.body;if(null==t)throw new Error("Body is not available yet");return j(t)})(z(t))))})(e),c=t.get(),u=j(e.getBody()),d=ze.deviceType.isTouch(),m=o.style,h=e.iframeElement,g=null==h?void 0:h.style,p=e=>{e(n,"tox-fullscreen"),e(r,"tox-fullscreen"),e(o,"tox-fullscreen"),Y(s).map((e=>G(e).dom)).each((t=>{e(t,"tox-fullscreen"),e(t,"tox-shadowhost")}))},f=()=>{d&&(e=>{const t=((e,t)=>{const n=document;return 1!==(r=n).nodeType&&9!==r.nodeType&&11!==r.nodeType||0===r.childElementCount?[]:S(n.querySelectorAll(e),j);var r})("["+Ge+"]");x(t,(t=>{const n=V(t,Ge);n&&"no-styles"!==n?ee(t,e.parseStyle(n)):W(t,"style"),W(t,Ge)}))})(e.dom),p(tt.removeClass),nt.unbind(),y.from(t.get()).each((e=>e.fullscreenChangeHandler.unbind()))};if(c)c.fullscreenChangeHandler.unbind(),$e(e)&&Ue(a)&&(e=>{const t=e.dom;t.exitFullscreen?t.exitFullscreen():t.msExitFullscreen?t.msExitFullscreen():t.webkitCancelFullScreen&&t.webkitCancelFullScreen()})(z(a)),g.width=c.iframeWidth,g.height=c.iframeHeight,m.width=c.containerWidth,m.height=c.containerHeight,m.top=c.containerTop,m.left=c.containerLeft,w=i,b=c.sinkCssPosition,E=(e,t)=>{Z(e,"position",t)},w.isSome()&&b.isSome()?y.some(E(w.getOrDie(),b.getOrDie())):y.none(),f(),v=c.scrollPos,window.scrollTo(v.x,v.y),t.set(null),Ke(e,!1),e.off("remove",f);else{const n=ie(z(a),void 0!==document.fullscreenElement?"fullscreenchange":void 0!==document.msFullscreenElement?"MSFullscreenChange":void 0!==document.webkitFullscreenElement?"webkitfullscreenchange":"fullscreenchange",(n=>{$e(e)&&(Ue(a)||null===t.get()||rt(e,t))})),r={scrollPos:Ie(window),containerWidth:m.width,containerHeight:m.height,containerTop:m.top,containerLeft:m.left,iframeWidth:g.width,iframeHeight:g.height,fullscreenChangeHandler:n,sinkCssPosition:i.map((e=>te(e,"position")))};d&&et(e.dom,s,u),g.width=g.height="100%",m.width=m.height="",p(tt.addClass),i.each((e=>{Z(e,"position","fixed")})),nt.bind(s),e.on("remove",f),t.set(r),$e(e)&&(e=>{const t=e.dom;t.requestFullscreen?t.requestFullscreen():t.msRequestFullscreen?t.msRequestFullscreen():t.webkitRequestFullScreen&&t.webkitRequestFullScreen()})(a),Ke(e,!0)}var v,w,b,E};var ot=tinymce.util.Tools.resolve("tinymce.util.VK");const st=(e,t)=>n=>{n.setActive(null!==t.get());const r=e=>n.setActive(e.state);return e.on("FullscreenStateChanged",r),()=>e.off("FullscreenStateChanged",r)};t.add("fullscreen",(t=>{const n=e(null);return t.inline||((e=>{(0,e.options.register)("fullscreen_native",{processor:"boolean",default:!1})})(t),((e,t)=>{e.addCommand("mceFullScreen",(()=>{rt(e,t)}))})(t,n),((e,t)=>{const n=()=>e.execCommand("mceFullScreen");e.ui.registry.addToggleMenuItem("fullscreen",{text:"Fullscreen",icon:"fullscreen",shortcut:"Meta+Shift+F",onAction:n,onSetup:st(e,t)}),e.ui.registry.addToggleButton("fullscreen",{tooltip:"Fullscreen",icon:"fullscreen",onAction:n,onSetup:st(e,t),shortcut:"Meta+Shift+F"})})(t,n),((e,t)=>{e.on("init",(()=>{e.on("keydown",(e=>{e.keyCode!==ot.TAB||e.metaKey||e.ctrlKey||!t.get()||e.preventDefault()}))}))})(t,n),t.addShortcut("Meta+Shift+F","","mceFullScreen")),(e=>({isFullscreen:()=>null!==e.get()}))(n)}))}();
\ No newline at end of file
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/ar.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/ar.js
deleted file mode 100644
index e2cf02f..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/ar.js
+++ /dev/null
@@ -1,93 +0,0 @@
-tinymce.Resource.add('tinymce.html-i18n.help-keynav.ar',
-'بدء التنقل بواسطة لوحة المفاتيح \n' +
- '\n' +
- '\n' +
- ' التركيز على شريط القوائم \n' +
- ' نظاما التشغيل Windows أو Linux: Alt + F9 \n' +
- ' نظام التشغيل macOS: ⌥F9 \n' +
- ' التركيز على شريط الأدوات \n' +
- ' نظاما التشغيل Windows أو Linux: Alt + F10 \n' +
- ' نظام التشغيل macOS: ⌥F10 \n' +
- ' التركيز على التذييل \n' +
- ' نظاما التشغيل Windows أو Linux: Alt + F11 \n' +
- ' نظام التشغيل macOS: ⌥F11 \n' +
- ' تركيز الإشعارات \n' +
- ' نظاما التشغيل Windows أو Linux: Alt + F12 \n' +
- ' نظام التشغيل macOS: ⌥F12 \n' +
- ' التركيز على شريط أدوات السياق \n' +
- ' أنظمة التشغيل Windows أو Linux أو macOS: Ctrl+F9 \n' +
- ' \n' +
- '\n' +
- 'سيبدأ التنقل عند عنصر واجهة المستخدم الأول، والذي سيتم تمييزه أو تسطيره في حالة العنصر الأول في\n' +
- ' مسار عنصر التذييل.
\n' +
- '\n' +
- 'التنقل بين أقسام واجهة المستخدم \n' +
- '\n' +
- 'للانتقال من أحد أقسام واجهة المستخدم إلى القسم التالي، اضغط على Tab .
\n' +
- '\n' +
- 'للانتقال من أحد أقسام واجهة المستخدم إلى القسم السابق، اضغط على Shift+Tab .
\n' +
- '\n' +
- 'ترتيب علامات Tab لأقسام واجهة المستخدم هذه هو:
\n' +
- '\n' +
- '\n' +
- ' شريط القوائم \n' +
- ' كل مجموعة شريط الأدوات \n' +
- ' الشريط الجانبي \n' +
- ' مسار العنصر في التذييل \n' +
- ' زر تبديل عدد الكلمات في التذييل \n' +
- ' رابط إدراج العلامة التجارية في التذييل \n' +
- ' مؤشر تغيير حجم المحرر في التذييل \n' +
- ' \n' +
- '\n' +
- 'إذا لم يكن قسم واجهة المستخدم موجودًا، فسيتم تخطيه.
\n' +
- '\n' +
- 'إذا كان التذييل يحتوي على التركيز على التنقل بواسطة لوحة المفاتيح، ولا يوجد شريط جانبي مرئي، فإن الضغط على Shift+Tab \n' +
- ' ينقل التركيز إلى مجموعة شريط الأدوات الأولى، وليس الأخيرة.
\n' +
- '\n' +
- 'التنقل بين أقسام واجهة المستخدم \n' +
- '\n' +
- 'للانتقال من أحد عناصر واجهة المستخدم إلى العنصر التالي، اضغط على مفتاح السهم المناسب.
\n' +
- '\n' +
- 'مفتاحا السهمين اليسار واليمين
\n' +
- '\n' +
- '\n' +
- ' التنقل بين القوائم في شريط القوائم. \n' +
- ' فتح قائمة فرعية في القائمة. \n' +
- ' التنقل بين الأزرار في مجموعة شريط الأدوات. \n' +
- ' التنقل بين العناصر في مسار عنصر التذييل. \n' +
- ' \n' +
- '\n' +
- 'مفتاحا السهمين لأسفل ولأعلى
\n' +
- '\n' +
- '\n' +
- ' التنقل بين عناصر القائمة في القائمة. \n' +
- ' التنقل بين العناصر في قائمة شريط الأدوات المنبثقة. \n' +
- ' \n' +
- '\n' +
- 'دورة مفاتيح الأسهم داخل قسم واجهة المستخدم التي تم التركيز عليها.
\n' +
- '\n' +
- 'لإغلاق قائمة مفتوحة أو قائمة فرعية مفتوحة أو قائمة منبثقة مفتوحة، اضغط على مفتاح Esc .
\n' +
- '\n' +
- 'إذا كان التركيز الحالي على "الجزء العلوي" من قسم معين لواجهة المستخدم، فإن الضغط على مفتاح Esc يؤدي أيضًا إلى الخروج\n' +
- ' من التنقل بواسطة لوحة المفاتيح بالكامل.
\n' +
- '\n' +
- 'تنفيذ عنصر قائمة أو زر شريط أدوات \n' +
- '\n' +
- 'عندما يتم تمييز عنصر القائمة المطلوب أو زر شريط الأدوات، اضغط على زر Return ، أو Enter ،\n' +
- ' أو مفتاح المسافة لتنفيذ العنصر.
\n' +
- '\n' +
- 'التنقل في مربعات الحوار غير المبوبة \n' +
- '\n' +
- 'في مربعات الحوار غير المبوبة، يتم التركيز على المكون التفاعلي الأول عند فتح مربع الحوار.
\n' +
- '\n' +
- 'التنقل بين مكونات الحوار التفاعلي بالضغط على زر Tab أو Shift+Tab .
\n' +
- '\n' +
- 'التنقل في مربعات الحوار المبوبة \n' +
- '\n' +
- 'في مربعات الحوار المبوبة، يتم التركيز على الزر الأول في قائمة علامات التبويب عند فتح مربع الحوار.
\n' +
- '\n' +
- 'التنقل بين المكونات التفاعلية لعلامة التبويب لمربع الحوار هذه بالضغط على زر Tab أو\n' +
- ' Shift+Tab .
\n' +
- '\n' +
- 'التبديل إلى علامة تبويب أخرى لمربع الحوار من خلال التركيز على قائمة علامة التبويب ثم الضغط على زر السهم المناسب\n' +
- ' مفتاح للتنقل بين علامات التبويب المتاحة.
\n');
\ No newline at end of file
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/bg_BG.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/bg_BG.js
deleted file mode 100644
index 09eacf3..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/bg_BG.js
+++ /dev/null
@@ -1,93 +0,0 @@
-tinymce.Resource.add('tinymce.html-i18n.help-keynav.bg_BG',
-'Начало на навигацията с клавиатурата \n' +
- '\n' +
- '\n' +
- ' Фокусиране върху лентата с менюта \n' +
- ' Windows или Linux: Alt+F9 \n' +
- ' macOS: ⌥F9 \n' +
- ' Фокусиране върху лентата с инструменти \n' +
- ' Windows или Linux: Alt+F10 \n' +
- ' macOS: ⌥F10 \n' +
- ' Фокусиране върху долния колонтитул \n' +
- ' Windows или Linux: Alt+F11 \n' +
- ' macOS: ⌥F11 \n' +
- ' Фокусиране на известието \n' +
- ' Windows или Linux: Alt+F12 \n' +
- ' macOS: ⌥F12 \n' +
- ' Фокусиране върху контекстуалната лента с инструменти \n' +
- ' Windows, Linux или macOS: Ctrl+F9 \n' +
- ' \n' +
- '\n' +
- 'Навигацията ще започне с първия елемент на ПИ, който ще бъде маркиран или подчертан в случая на първия елемент в\n' +
- ' пътя до елемента в долния колонтитул.
\n' +
- '\n' +
- 'Навигиране между раздели на ПИ \n' +
- '\n' +
- 'За да преминете от един раздел на ПИ към следващия, натиснете Tab .
\n' +
- '\n' +
- 'За да преминете от един раздел на ПИ към предишния, натиснете Shift+Tab .
\n' +
- '\n' +
- 'Редът за обхождане с табулация на тези раздели на ПИ е:
\n' +
- '\n' +
- '\n' +
- ' Лентата с менюта \n' +
- ' Всяка група на лентата с инструменти \n' +
- ' Страничната лента \n' +
- ' Пътят до елемента в долния колонтитул \n' +
- ' Бутонът за превключване на броя на думите в долния колонтитул \n' +
- ' Връзката за търговска марка в долния колонтитул \n' +
- ' Манипулаторът за преоразмеряване на редактора в долния колонтитул \n' +
- ' \n' +
- '\n' +
- 'Ако някой раздел на ПИ липсва, той се пропуска.
\n' +
- '\n' +
- 'Ако долният колонтитул има фокус за навигация с клавиатурата и няма странична лента, натискането на Shift+Tab \n' +
- ' премества фокуса към първата група на лентата с инструменти, а не към последната.
\n' +
- '\n' +
- 'Навигиране в разделите на ПИ \n' +
- '\n' +
- 'За да преминете от един елемент на ПИ към следващия, натиснете съответния клавиш със стрелка .
\n' +
- '\n' +
- 'С клавишите със стрелка наляво и надясно
\n' +
- '\n' +
- '\n' +
- ' се придвижвате между менютата в лентата с менюто; \n' +
- ' отваряте подменю в меню; \n' +
- ' се придвижвате между бутоните в група на лентата с инструменти; \n' +
- ' се придвижвате между елементи в пътя до елемент в долния колонтитул. \n' +
- ' \n' +
- '\n' +
- 'С клавишите със стрелка надолу и нагоре
\n' +
- '\n' +
- '\n' +
- ' се придвижвате между елементите от менюто в дадено меню; \n' +
- ' се придвижвате между елементите в изскачащо меню на лентата с инструменти. \n' +
- ' \n' +
- '\n' +
- 'Клавишите със стрелки се придвижват в рамките на фокусирания раздел на ПИ.
\n' +
- '\n' +
- 'За да затворите отворено меню, подменю или изскачащо меню, натиснете клавиша Esc .
\n' +
- '\n' +
- 'Ако текущият фокус е върху „горната част“ на конкретен раздел на ПИ, натискането на клавиша Esc също излиза\n' +
- ' напълно от навигацията с клавиатурата.
\n' +
- '\n' +
- 'Изпълнение на елемент от менюто или бутон от лентата с инструменти \n' +
- '\n' +
- 'Когато желаният елемент от менюто или бутон от лентата с инструменти е маркиран, натиснете Return , Enter \n' +
- ' или клавиша за интервал , за да изпълните елемента.
\n' +
- '\n' +
- 'Навигиране в диалогови прозорци без раздели \n' +
- '\n' +
- 'В диалоговите прозорци без раздели първият интерактивен компонент се фокусира, когато се отвори диалоговият прозорец.
\n' +
- '\n' +
- 'Навигирайте между интерактивните компоненти на диалоговия прозорец, като натиснете Tab или Shift+Tab .
\n' +
- '\n' +
- 'Навигиране в диалогови прозорци с раздели \n' +
- '\n' +
- 'В диалоговите прозорци с раздели първият бутон в менюто с раздели се фокусира, когато се отвори диалоговият прозорец.
\n' +
- '\n' +
- 'Навигирайте между интерактивните компоненти на този диалогов раздел, като натиснете Tab или\n' +
- ' Shift+Tab .
\n' +
- '\n' +
- 'Превключете към друг диалогов раздел, като фокусирате върху менюто с раздели и след това натиснете съответния клавиш със стрелка ,\n' +
- ' за да преминете през наличните раздели.
\n');
\ No newline at end of file
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/ca.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/ca.js
deleted file mode 100644
index 996e29c..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/ca.js
+++ /dev/null
@@ -1,93 +0,0 @@
-tinymce.Resource.add('tinymce.html-i18n.help-keynav.ca',
-'Inici de la navegació amb el teclat \n' +
- '\n' +
- '\n' +
- ' Enfocar la barra de menús \n' +
- ' Windows o Linux: Alt+F9 \n' +
- ' macOS: ⌥F9 \n' +
- " Enfocar la barra d'eines \n" +
- ' Windows o Linux: Alt+F10 \n' +
- ' macOS: ⌥F10 \n' +
- ' Enfocar el peu de pàgina \n' +
- ' Windows o Linux: Alt+F11 \n' +
- ' macOS: ⌥F11 \n' +
- ' Enfocar la notificació \n' +
- ' Windows o Linux: Alt+F12 \n' +
- ' macOS: ⌥F12 \n' +
- " Enfocar una barra d'eines contextual \n" +
- ' Windows, Linux o macOS: Ctrl+F9 \n' +
- ' \n' +
- '\n' +
- "La navegació començarà en el primer element de la interfície d'usuari, que es ressaltarà o subratllarà per al primer element a\n" +
- " la ruta de l'element de peu de pàgina.
\n" +
- '\n' +
- "Navegació entre seccions de la interfície d'usuari \n" +
- '\n' +
- "Per desplaçar-vos des d'una secció de la interfície d'usuari a la següent, premeu la tecla Tab .
\n" +
- '\n' +
- "Per desplaçar-vos des d'una secció de la interfície d'usuari a l'anterior, premeu les tecles Maj+Tab .
\n" +
- '\n' +
- "L'ordre en prémer la tecla Tab d'aquestes secciones de la interfície d'usuari és:
\n" +
- '\n' +
- '\n' +
- ' Barra de menús \n' +
- " Cada grup de la barra d'eines \n" +
- ' Barra lateral \n' +
- " Ruta de l'element del peu de pàgina \n" +
- ' Botó de commutació de recompte de paraules al peu de pàgina \n' +
- ' Enllaç de marca del peu de pàgina \n' +
- " Control de canvi de mida de l'editor al peu de pàgina \n" +
- ' \n' +
- '\n' +
- "Si no hi ha una secció de la interfície d'usuari, s'ometrà.
\n" +
- '\n' +
- 'Si el peu de pàgina té el focus de navegació del teclat i no hi ha cap barra lateral visible, en prémer Maj+Tab \n' +
- " el focus es mou al primer grup de la barra d'eines, no l'últim.
\n" +
- '\n' +
- "Navegació dins de les seccions de la interfície d'usuari \n" +
- '\n' +
- "Per desplaçar-vos des d'un element de la interfície d'usuari al següent, premeu la tecla de Fletxa adequada.
\n" +
- '\n' +
- 'Les tecles de fletxa Esquerra i Dreta
\n' +
- '\n' +
- '\n' +
- ' us permeten desplaçar-vos entre menús de la barra de menús. \n' +
- ' obren un submenú en un menú. \n' +
- " us permeten desplaçar-vos entre botons d'un grup de la barra d'eines. \n" +
- " us permeten desplaçar-vos entre elements de la ruta d'elements del peu de pàgina. \n" +
- ' \n' +
- '\n' +
- 'Les tecles de fletxa Avall i Amunt
\n' +
- '\n' +
- '\n' +
- " us permeten desplaçar-vos entre elements de menú d'un menú. \n" +
- " us permeten desplaçar-vos entre elements d'un menú emergent de la barra d'eines. \n" +
- ' \n' +
- '\n' +
- "Les tecles de Fletxa us permeten desplaçar-vos dins de la secció de la interfície d'usuari que té el focus.
\n" +
- '\n' +
- 'Per tancar un menú, un submenú o un menú emergent oberts, premeu la tecla Esc .
\n' +
- '\n' +
- "Si el focus actual es troba a la ‘part superior’ d'una secció específica de la interfície d'usuari, en prémer la tecla Esc també es tanca\n" +
- ' completament la navegació amb el teclat.
\n' +
- '\n' +
- "Execució d'un element de menú o d'un botó de la barra d'eines \n" +
- '\n' +
- "Quan l'element del menú o el botó de la barra d'eines que desitgeu estigui ressaltat, premeu Retorn , Intro \n" +
- " o la barra d'espai per executar l'element.
\n" +
- '\n' +
- 'Navegació per quadres de diàleg sense pestanyes \n' +
- '\n' +
- "En els quadres de diàleg sense pestanyes, el primer component interactiu pren el focus quan s'obre el quadre diàleg.
\n" +
- '\n' +
- 'Premeu la tecla Tab o les tecles Maj+Tab per desplaçar-vos entre components interactius del quadre de diàleg.
\n' +
- '\n' +
- 'Navegació per quadres de diàleg amb pestanyes \n' +
- '\n' +
- "En els quadres de diàleg amb pestanyes, el primer botó del menú de la pestanya pren el focus quan s'obre el quadre diàleg.
\n" +
- '\n' +
- "Per desplaçar-vos entre components interactius d'aquest quadre de diàleg, premeu la tecla Tab o\n" +
- ' les tecles Maj+Tab .
\n' +
- '\n' +
- "Canvieu a la pestanya d'un altre quadre de diàleg, tot enfocant el menú de la pestanya, i després premeu la tecla Fletxa adequada\n" +
- ' per canviar entre les pestanyes disponibles.
\n');
\ No newline at end of file
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/cs.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/cs.js
deleted file mode 100644
index 4a5a902..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/cs.js
+++ /dev/null
@@ -1,93 +0,0 @@
-tinymce.Resource.add('tinymce.html-i18n.help-keynav.cs',
-'Začínáme navigovat pomocí klávesnice \n' +
- '\n' +
- '\n' +
- ' Přejít na řádek nabídek \n' +
- ' Windows nebo Linux: Alt+F9 \n' +
- ' macOS: ⌥F9 \n' +
- ' Přejít na panel nástrojů \n' +
- ' Windows nebo Linux: Alt+F10 \n' +
- ' macOS: ⌥F10 \n' +
- ' Přejít na zápatí \n' +
- ' Windows nebo Linux: Alt+F11 \n' +
- ' macOS: ⌥F11 \n' +
- ' Přejít na oznámení \n' +
- ' Windows nebo Linux: Alt+F12 \n' +
- ' macOS: ⌥F12 \n' +
- ' Přejít na kontextový panel nástrojů \n' +
- ' Windows, Linux nebo macOS: Ctrl+F9 \n' +
- ' \n' +
- '\n' +
- 'Navigace začne u první položky uživatelského rozhraní, která bude zvýrazněna nebo v případě první položky\n' +
- ' cesty k prvku zápatí podtržena.
\n' +
- '\n' +
- 'Navigace mezi oddíly uživatelského rozhraní \n' +
- '\n' +
- 'Stisknutím klávesy Tab se posunete z jednoho oddílu uživatelského rozhraní na další.
\n' +
- '\n' +
- 'Stisknutím kláves Shift+Tab se posunete z jednoho oddílu uživatelského rozhraní na předchozí.
\n' +
- '\n' +
- 'Pořadí přepínání mezi oddíly uživatelského rozhraní pomocí klávesy Tab :
\n' +
- '\n' +
- '\n' +
- ' Řádek nabídek \n' +
- ' Každá skupina panelu nástrojů \n' +
- ' Boční panel \n' +
- ' Cesta k prvku v zápatí. \n' +
- ' Tlačítko přepínače počtu slov v zápatí \n' +
- ' Odkaz na informace o značce v zápatí \n' +
- ' Úchyt pro změnu velikosti editoru v zápatí \n' +
- ' \n' +
- '\n' +
- 'Pokud nějaký oddíl uživatelského rozhraní není přítomen, je přeskočen.
\n' +
- '\n' +
- 'Pokud je zápatí vybrané pro navigaci pomocí klávesnice a není zobrazen žádný boční panel, stisknutím kláves Shift+Tab \n' +
- ' přejdete na první skupinu panelu nástrojů, nikoli na poslední.
\n' +
- '\n' +
- 'Navigace v rámci oddílů uživatelského rozhraní \n' +
- '\n' +
- 'Chcete-li se přesunout z jednoho prvku uživatelského rozhraní na další, stiskněte příslušnou klávesu s šipkou .
\n' +
- '\n' +
- 'Klávesy s šipkou vlevo a vpravo
\n' +
- '\n' +
- '\n' +
- ' umožňují přesun mezi nabídkami na řádku nabídek; \n' +
- ' otevírají podnabídku nabídky; \n' +
- ' umožňují přesun mezi tlačítky ve skupině panelu nástrojů; \n' +
- ' umožňují přesun mezi položkami cesty prvku v zápatí. \n' +
- ' \n' +
- '\n' +
- 'Klávesy se šipkou dolů a nahoru
\n' +
- '\n' +
- '\n' +
- ' umožňují přesun mezi položkami nabídky; \n' +
- ' umožňují přesun mezi položkami místní nabídky panelu nástrojů. \n' +
- ' \n' +
- '\n' +
- 'Šipky provádí přepínání v rámci vybraného oddílu uživatelského rozhraní.
\n' +
- '\n' +
- 'Chcete-li zavřít otevřenou nabídku, podnabídku nebo místní nabídku, stiskněte klávesu Esc .
\n' +
- '\n' +
- 'Pokud je aktuálně vybrána horní část oddílu uživatelského rozhraní, stisknutím klávesy Esc zcela ukončíte také\n' +
- ' navigaci pomocí klávesnice.
\n' +
- '\n' +
- 'Provedení příkazu položky nabídky nebo tlačítka panelu nástrojů \n' +
- '\n' +
- 'Pokud je zvýrazněna požadovaná položka nabídky nebo tlačítko panelu nástrojů, stisknutím klávesy Return , Enter \n' +
- ' nebo mezerníku provedete příslušný příkaz.
\n' +
- '\n' +
- 'Navigace v dialogových oknech bez záložek \n' +
- '\n' +
- 'Při otevření dialogových oken bez záložek přejdete na první interaktivní komponentu.
\n' +
- '\n' +
- 'Přecházet mezi interaktivními komponentami dialogového okna můžete stisknutím klávesy Tab nebo kombinace Shift+Tab .
\n' +
- '\n' +
- 'Navigace v dialogových oknech se záložkami \n' +
- '\n' +
- 'Při otevření dialogových oken se záložkami přejdete na první tlačítko v nabídce záložek.
\n' +
- '\n' +
- 'Přecházet mezi interaktivními komponentami této záložky dialogového okna můžete stisknutím klávesy Tab nebo\n' +
- ' kombinace Shift+Tab .
\n' +
- '\n' +
- 'Chcete-li přepnout na další záložku dialogového okna, přejděte na nabídku záložek a poté můžete stisknutím požadované šipky \n' +
- ' přepínat mezi dostupnými záložkami.
\n');
\ No newline at end of file
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/da.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/da.js
deleted file mode 100644
index 4d1e1d4..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/da.js
+++ /dev/null
@@ -1,93 +0,0 @@
-tinymce.Resource.add('tinymce.html-i18n.help-keynav.da',
-'Start tastaturnavigation \n' +
- '\n' +
- '\n' +
- ' Fokuser på menulinjen \n' +
- ' Windows eller Linux: Alt+F9 \n' +
- ' macOS: ⌥F9 \n' +
- ' Fokuser på værktøjslinjen \n' +
- ' Windows eller Linux: Alt+F10 \n' +
- ' macOS: ⌥F10 \n' +
- ' Fokuser på sidefoden \n' +
- ' Windows eller Linux: Alt+F11 \n' +
- ' macOS: ⌥F11 \n' +
- ' Fokuser på meddelelsen \n' +
- ' Windows eller Linux: Alt+F12 \n' +
- ' macOS: ⌥F12 \n' +
- ' Fokuser på kontekstuel værktøjslinje \n' +
- ' Windows, Linux eller macOS: Ctrl+F9 \n' +
- ' \n' +
- '\n' +
- 'Navigationen starter ved det første UI-element, som fremhæves eller understreges hvad angår det første element i\n' +
- ' sidefodens sti til elementet.
\n' +
- '\n' +
- 'Naviger mellem UI-sektioner \n' +
- '\n' +
- 'Gå fra én UI-sektion til den næste ved at trykke på Tab .
\n' +
- '\n' +
- 'Gå fra én UI-sektion til den forrige ved at trykke på Shift+Tab .
\n' +
- '\n' +
- 'Tab -rækkefølgen af disse UI-sektioner er:
\n' +
- '\n' +
- '\n' +
- ' Menulinje \n' +
- ' Hver værktøjsgruppe \n' +
- ' Sidepanel \n' +
- ' Sti til elementet i sidefoden \n' +
- ' Til/fra-knap for ordoptælling i sidefoden \n' +
- ' Brandinglink i sidefoden \n' +
- ' Tilpasningshåndtag for editor i sidefoden \n' +
- ' \n' +
- '\n' +
- 'Hvis en UI-sektion ikke er til stede, springes den over.
\n' +
- '\n' +
- 'Hvis sidefoden har fokus til tastaturnavigation, og der ikke er noget synligt sidepanel, kan der trykkes på Shift+Tab \n' +
- ' for at flytte fokus til den første værktøjsgruppe, ikke den sidste.
\n' +
- '\n' +
- 'Naviger inden for UI-sektioner \n' +
- '\n' +
- 'Gå fra ét UI-element til det næste ved at trykke på den relevante piletast .
\n' +
- '\n' +
- 'Venstre og højre piletast
\n' +
- '\n' +
- '\n' +
- ' flytter mellem menuerne i menulinjen. \n' +
- ' åbner en undermenu i en menu. \n' +
- ' flytter mellem knapperne i en værktøjsgruppe. \n' +
- ' flytter mellem elementer i sidefodens sti til elementet. \n' +
- ' \n' +
- '\n' +
- 'Pil ned og op
\n' +
- '\n' +
- '\n' +
- ' flytter mellem menupunkterne i en menu. \n' +
- ' flytter mellem punkterne i en genvejsmenu i værktøjslinjen. \n' +
- ' \n' +
- '\n' +
- 'Piletasterne kører rundt inden for UI-sektionen, der fokuseres på.
\n' +
- '\n' +
- 'For at lukke en åben menu, en åben undermenu eller en åben genvejsmenu trykkes der på Esc -tasten.
\n' +
- '\n' +
- "Hvis det aktuelle fokus er i 'toppen' af en bestemt UI-sektion, vil tryk på Esc -tasten også afslutte\n" +
- ' tastaturnavigationen helt.
\n' +
- '\n' +
- 'Udfør et menupunkt eller en værktøjslinjeknap \n' +
- '\n' +
- 'Når det ønskede menupunkt eller den ønskede værktøjslinjeknap er fremhævet, trykkes der på Retur , Enter \n' +
- ' eller mellemrumstasten for at udføre elementet.
\n' +
- '\n' +
- 'Naviger i ikke-faneopdelte dialogbokse \n' +
- '\n' +
- 'I ikke-faneopdelte dialogbokse får den første interaktive komponent fokus, når dialogboksen åbnes.
\n' +
- '\n' +
- 'Naviger mellem interaktive dialogbokskomponenter ved at trykke på Tab eller Shift+Tab .
\n' +
- '\n' +
- 'Naviger i faneopdelte dialogbokse \n' +
- '\n' +
- 'I faneopdelte dialogbokse får den første knap i fanemenuen fokus, når dialogboksen åbnes.
\n' +
- '\n' +
- 'Naviger mellem interaktive komponenter i denne dialogboksfane ved at trykke på Tab eller\n' +
- ' Shift+Tab .
\n' +
- '\n' +
- 'Skift til en anden dialogboksfane ved at fokusere på fanemenuen og derefter trykke på den relevante piletast \n' +
- ' for at køre igennem de tilgængelige faner.
\n');
\ No newline at end of file
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/de.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/de.js
deleted file mode 100644
index b8711ed..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/de.js
+++ /dev/null
@@ -1,93 +0,0 @@
-tinymce.Resource.add('tinymce.html-i18n.help-keynav.de',
-'Grundlagen der Tastaturnavigation \n' +
- '\n' +
- '\n' +
- ' Fokus auf Menüleiste \n' +
- ' Windows oder Linux: ALT+F9 \n' +
- ' macOS: ⌥F9 \n' +
- ' Fokus auf Symbolleiste \n' +
- ' Windows oder Linux: ALT+F10 \n' +
- ' macOS: ⌥F10 \n' +
- ' Fokus auf Fußzeile \n' +
- ' Windows oder Linux: ALT+F11 \n' +
- ' macOS: ⌥F11 \n' +
- ' Benachrichtigung fokussieren \n' +
- ' Windows oder Linux: ALT+F12 \n' +
- ' macOS: ⌥F12 \n' +
- ' Fokus auf kontextbezogene Symbolleiste \n' +
- ' Windows, Linux oder macOS: STRG+F9 \n' +
- ' \n' +
- '\n' +
- 'Die Navigation beginnt beim ersten Benutzeroberflächenelement, welches hervorgehoben ist. Falls sich das erste Element im Pfad der Fußzeile befindet,\n' +
- ' ist es unterstrichen.
\n' +
- '\n' +
- 'Zwischen Abschnitten der Benutzeroberfläche navigieren \n' +
- '\n' +
- 'Um von einem Abschnitt der Benutzeroberfläche zum nächsten zu wechseln, drücken Sie TAB .
\n' +
- '\n' +
- 'Um von einem Abschnitt der Benutzeroberfläche zum vorherigen zu wechseln, drücken Sie UMSCHALT+TAB .
\n' +
- '\n' +
- 'Die Abschnitte der Benutzeroberfläche haben folgende TAB -Reihenfolge:
\n' +
- '\n' +
- '\n' +
- ' Menüleiste \n' +
- ' Einzelne Gruppen der Symbolleiste \n' +
- ' Randleiste \n' +
- ' Elementpfad in der Fußzeile \n' +
- ' Umschaltfläche „Wörter zählen“ in der Fußzeile \n' +
- ' Branding-Link in der Fußzeile \n' +
- ' Editor-Ziehpunkt zur Größenänderung in der Fußzeile \n' +
- ' \n' +
- '\n' +
- 'Falls ein Abschnitt der Benutzeroberflächen nicht vorhanden ist, wird er übersprungen.
\n' +
- '\n' +
- 'Wenn in der Fußzeile die Tastaturnavigation fokussiert ist und keine Randleiste angezeigt wird, wechselt der Fokus durch Drücken von UMSCHALT+TAB \n' +
- ' zur ersten Gruppe der Symbolleiste, nicht zur letzten.
\n' +
- '\n' +
- 'Innerhalb von Abschnitten der Benutzeroberfläche navigieren \n' +
- '\n' +
- 'Um von einem Element der Benutzeroberfläche zum nächsten zu wechseln, drücken Sie die entsprechende Pfeiltaste .
\n' +
- '\n' +
- 'Die Pfeiltasten Links und Rechts
\n' +
- '\n' +
- '\n' +
- ' wechseln zwischen Menüs in der Menüleiste. \n' +
- ' öffnen das Untermenü eines Menüs. \n' +
- ' wechseln zwischen Schaltflächen in einer Gruppe der Symbolleiste. \n' +
- ' wechseln zwischen Elementen im Elementpfad der Fußzeile. \n' +
- ' \n' +
- '\n' +
- 'Die Pfeiltasten Abwärts und Aufwärts
\n' +
- '\n' +
- '\n' +
- ' wechseln zwischen Menüelementen in einem Menü. \n' +
- ' wechseln zwischen Elementen in einem Popupmenü der Symbolleiste. \n' +
- ' \n' +
- '\n' +
- 'Die Pfeiltasten rotieren innerhalb des fokussierten Abschnitts der Benutzeroberfläche.
\n' +
- '\n' +
- 'Um ein geöffnetes Menü, ein geöffnetes Untermenü oder ein geöffnetes Popupmenü zu schließen, drücken Sie die ESC -Taste.
\n' +
- '\n' +
- 'Wenn sich der aktuelle Fokus ganz oben in einem bestimmten Abschnitt der Benutzeroberfläche befindet, wird durch Drücken der ESC -Taste auch\n' +
- ' die Tastaturnavigation beendet.
\n' +
- '\n' +
- 'Ein Menüelement oder eine Symbolleistenschaltfläche ausführen \n' +
- '\n' +
- 'Wenn das gewünschte Menüelement oder die gewünschte Symbolleistenschaltfläche hervorgehoben ist, drücken Sie Zurück , Eingabe \n' +
- ' oder die Leertaste , um das Element auszuführen.
\n' +
- '\n' +
- 'In Dialogfeldern ohne Registerkarten navigieren \n' +
- '\n' +
- 'In Dialogfeldern ohne Registerkarten ist beim Öffnen eines Dialogfelds die erste interaktive Komponente fokussiert.
\n' +
- '\n' +
- 'Navigieren Sie zwischen den interaktiven Komponenten eines Dialogfelds, indem Sie TAB oder UMSCHALT+TAB drücken.
\n' +
- '\n' +
- 'In Dialogfeldern mit Registerkarten navigieren \n' +
- '\n' +
- 'In Dialogfeldern mit Registerkarten ist beim Öffnen eines Dialogfelds die erste Schaltfläche eines Registerkartenmenüs fokussiert.
\n' +
- '\n' +
- 'Navigieren Sie zwischen den interaktiven Komponenten auf dieser Registerkarte des Dialogfelds, indem Sie TAB oder\n' +
- ' UMSCHALT+TAB drücken.
\n' +
- '\n' +
- 'Wechseln Sie zu einer anderen Registerkarte des Dialogfelds, indem Sie den Fokus auf das Registerkartenmenü legen und dann die entsprechende Pfeiltaste \n' +
- ' drücken, um durch die verfügbaren Registerkarten zu rotieren.
\n');
\ No newline at end of file
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/el.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/el.js
deleted file mode 100644
index 98afabe..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/el.js
+++ /dev/null
@@ -1,93 +0,0 @@
-tinymce.Resource.add('tinymce.html-i18n.help-keynav.el',
-'Έναρξη πλοήγησης μέσω πληκτρολογίου \n' +
- '\n' +
- '\n' +
- ' Εστίαση στη γραμμή μενού \n' +
- ' Windows ή Linux: Alt+F9 \n' +
- ' macOS: ⌥F9 \n' +
- ' Εστίαση στη γραμμή εργαλείων \n' +
- ' Windows ή Linux: Alt+F10 \n' +
- ' macOS: ⌥F10 \n' +
- ' Εστίαση στο υποσέλιδο \n' +
- ' Windows ή Linux: Alt+F11 \n' +
- ' macOS: ⌥F11 \n' +
- ' Εστίαση στην ειδοποίηση \n' +
- ' Windows ή Linux: Alt+F12 \n' +
- ' macOS: ⌥F12 \n' +
- ' Εστίαση σε γραμμή εργαλείων βάσει περιεχομένου \n' +
- ' Windows, Linux ή macOS: Ctrl+F9 \n' +
- ' \n' +
- '\n' +
- 'Η πλοήγηση θα ξεκινήσει από το πρώτο στοιχείο περιβάλλοντος χρήστη, που θα επισημαίνεται ή θα είναι υπογραμμισμένο,\n' +
- ' όπως στην περίπτωση της διαδρομής του στοιχείου Υποσέλιδου.
\n' +
- '\n' +
- 'Πλοήγηση μεταξύ ενοτήτων του περιβάλλοντος χρήστη \n' +
- '\n' +
- 'Για να μετακινηθείτε από μια ενότητα περιβάλλοντος χρήστη στην επόμενη, πιέστε το πλήκτρο Tab .
\n' +
- '\n' +
- 'Για να μετακινηθείτε από μια ενότητα περιβάλλοντος χρήστη στην προηγούμενη, πιέστε τα πλήκτρα Shift+Tab .
\n' +
- '\n' +
- 'Η σειρά Tab αυτών των ενοτήτων περιβάλλοντος χρήστη είναι η εξής:
\n' +
- '\n' +
- '\n' +
- ' Γραμμή μενού \n' +
- ' Κάθε ομάδα γραμμής εργαλείων \n' +
- ' Πλαϊνή γραμμή \n' +
- ' Διαδρομή στοιχείου στο υποσέλιδο \n' +
- ' Κουμπί εναλλαγής μέτρησης λέξεων στο υποσέλιδο \n' +
- ' Σύνδεσμος επωνυμίας στο υποσέλιδο \n' +
- ' Λαβή αλλαγής μεγέθους προγράμματος επεξεργασίας στο υποσέλιδο \n' +
- ' \n' +
- '\n' +
- 'Εάν δεν εμφανίζεται ενότητα περιβάλλοντος χρήστη, παραλείπεται.
\n' +
- '\n' +
- 'Εάν η εστίαση πλοήγησης βρίσκεται στο πληκτρολόγιο και δεν υπάρχει εμφανής πλαϊνή γραμμή, εάν πιέσετε Shift+Tab \n' +
- ' η εστίαση μετακινείται στην πρώτη ομάδα γραμμής εργαλείων, όχι στην τελευταία.
\n' +
- '\n' +
- 'Πλοήγηση εντός των ενοτήτων του περιβάλλοντος χρήστη \n' +
- '\n' +
- 'Για να μετακινηθείτε από ένα στοιχείο περιβάλλοντος χρήστη στο επόμενο, πιέστε το αντίστοιχο πλήκτρο βέλους .
\n' +
- '\n' +
- 'Με τα πλήκτρα αριστερού και δεξιού βέλους
\n' +
- '\n' +
- '\n' +
- ' γίνεται μετακίνηση μεταξύ των μενού στη γραμμή μενού. \n' +
- ' ανοίγει ένα υπομενού σε ένα μενού. \n' +
- ' γίνεται μετακίνηση μεταξύ κουμπιών σε μια ομάδα γραμμής εργαλείων. \n' +
- ' γίνεται μετακίνηση μεταξύ στοιχείων στη διαδρομή στοιχείου στο υποσέλιδο. \n' +
- ' \n' +
- '\n' +
- 'Με τα πλήκτρα επάνω και κάτω βέλους
\n' +
- '\n' +
- '\n' +
- ' γίνεται μετακίνηση μεταξύ των στοιχείων μενού σε ένα μενού. \n' +
- ' γίνεται μετακίνηση μεταξύ των στοιχείων μενού σε ένα αναδυόμενο μενού γραμμής εργαλείων. \n' +
- ' \n' +
- '\n' +
- 'Με τα πλήκτρα βέλους γίνεται κυκλική μετακίνηση εντός της εστιασμένης ενότητας περιβάλλοντος χρήστη.
\n' +
- '\n' +
- 'Για να κλείσετε ένα ανοιχτό μενού, ένα ανοιχτό υπομενού ή ένα ανοιχτό αναδυόμενο μενού, πιέστε το πλήκτρο Esc .
\n' +
- '\n' +
- 'Εάν η τρέχουσα εστίαση βρίσκεται στην κορυφή μιας ενότητας περιβάλλοντος χρήστη, πιέζοντας το πλήκτρο Esc ,\n' +
- ' γίνεται επίσης πλήρης έξοδος από την πλοήγηση μέσω πληκτρολογίου.
\n' +
- '\n' +
- 'Εκτέλεση ενός στοιχείου μενού ή κουμπιού γραμμής εργαλείων \n' +
- '\n' +
- 'Όταν το επιθυμητό στοιχείο μενού ή κουμπί γραμμής εργαλείων είναι επισημασμένο, πιέστε τα πλήκτρα Return , Enter ,\n' +
- ' ή το πλήκτρο διαστήματος για να εκτελέσετε το στοιχείο.
\n' +
- '\n' +
- 'Πλοήγηση σε παράθυρα διαλόγου χωρίς καρτέλες \n' +
- '\n' +
- 'Σε παράθυρα διαλόγου χωρίς καρτέλες, το πρώτο αλληλεπιδραστικό στοιχείο λαμβάνει την εστίαση όταν ανοίγει το παράθυρο διαλόγου.
\n' +
- '\n' +
- 'Μπορείτε να πλοηγηθείτε μεταξύ των αλληλεπιδραστικών στοιχείων παραθύρων διαλόγων πιέζοντας τα πλήκτρα Tab ή Shift+Tab .
\n' +
- '\n' +
- 'Πλοήγηση σε παράθυρα διαλόγου με καρτέλες \n' +
- '\n' +
- 'Σε παράθυρα διαλόγου με καρτέλες, το πρώτο κουμπί στο μενού καρτέλας λαμβάνει την εστίαση όταν ανοίγει το παράθυρο διαλόγου.
\n' +
- '\n' +
- 'Μπορείτε να πλοηγηθείτε μεταξύ των αλληλεπιδραστικών στοιχείων αυτής της καρτέλα διαλόγου πιέζοντας τα πλήκτρα Tab ή\n' +
- ' Shift+Tab .
\n' +
- '\n' +
- 'Μπορείτε να κάνετε εναλλαγή σε άλλη καρτέλα του παραθύρου διαλόγου, μεταφέροντας την εστίαση στο μενού καρτέλας και πιέζοντας το κατάλληλο πλήκτρο βέλους \n' +
- ' για να μετακινηθείτε κυκλικά στις διαθέσιμες καρτέλες.
\n');
\ No newline at end of file
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/en.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/en.js
deleted file mode 100644
index 5dd753e..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/en.js
+++ /dev/null
@@ -1,93 +0,0 @@
-tinymce.Resource.add('tinymce.html-i18n.help-keynav.en',
-'Begin keyboard navigation \n' +
- '\n' +
- '\n' +
- ' Focus the Menu bar \n' +
- ' Windows or Linux: Alt+F9 \n' +
- ' macOS: ⌥F9 \n' +
- ' Focus the Toolbar \n' +
- ' Windows or Linux: Alt+F10 \n' +
- ' macOS: ⌥F10 \n' +
- ' Focus the footer \n' +
- ' Windows or Linux: Alt+F11 \n' +
- ' macOS: ⌥F11 \n' +
- ' Focus the notification \n' +
- ' Windows or Linux: Alt+F12 \n' +
- ' macOS: ⌥F12 \n' +
- ' Focus a contextual toolbar \n' +
- ' Windows, Linux or macOS: Ctrl+F9 \n' +
- ' \n' +
- '\n' +
- 'Navigation will start at the first UI item, which will be highlighted, or underlined in the case of the first item in\n' +
- ' the Footer element path.
\n' +
- '\n' +
- 'Navigate between UI sections \n' +
- '\n' +
- 'To move from one UI section to the next, press Tab .
\n' +
- '\n' +
- 'To move from one UI section to the previous, press Shift+Tab .
\n' +
- '\n' +
- 'The Tab order of these UI sections is:
\n' +
- '\n' +
- '\n' +
- ' Menu bar \n' +
- ' Each toolbar group \n' +
- ' Sidebar \n' +
- ' Element path in the footer \n' +
- ' Word count toggle button in the footer \n' +
- ' Branding link in the footer \n' +
- ' Editor resize handle in the footer \n' +
- ' \n' +
- '\n' +
- 'If a UI section is not present, it is skipped.
\n' +
- '\n' +
- 'If the footer has keyboard navigation focus, and there is no visible sidebar, pressing Shift+Tab \n' +
- ' moves focus to the first toolbar group, not the last.
\n' +
- '\n' +
- 'Navigate within UI sections \n' +
- '\n' +
- 'To move from one UI element to the next, press the appropriate Arrow key.
\n' +
- '\n' +
- 'The Left and Right arrow keys
\n' +
- '\n' +
- '\n' +
- ' move between menus in the menu bar. \n' +
- ' open a sub-menu in a menu. \n' +
- ' move between buttons in a toolbar group. \n' +
- ' move between items in the footer’s element path. \n' +
- ' \n' +
- '\n' +
- 'The Down and Up arrow keys
\n' +
- '\n' +
- '\n' +
- ' move between menu items in a menu. \n' +
- ' move between items in a toolbar pop-up menu. \n' +
- ' \n' +
- '\n' +
- 'Arrow keys cycle within the focused UI section.
\n' +
- '\n' +
- 'To close an open menu, an open sub-menu, or an open pop-up menu, press the Esc key.
\n' +
- '\n' +
- 'If the current focus is at the ‘top’ of a particular UI section, pressing the Esc key also exits\n' +
- ' keyboard navigation entirely.
\n' +
- '\n' +
- 'Execute a menu item or toolbar button \n' +
- '\n' +
- 'When the desired menu item or toolbar button is highlighted, press Return , Enter ,\n' +
- ' or the Space bar to execute the item.
\n' +
- '\n' +
- 'Navigate non-tabbed dialogs \n' +
- '\n' +
- 'In non-tabbed dialogs, the first interactive component takes focus when the dialog opens.
\n' +
- '\n' +
- 'Navigate between interactive dialog components by pressing Tab or Shift+Tab .
\n' +
- '\n' +
- 'Navigate tabbed dialogs \n' +
- '\n' +
- 'In tabbed dialogs, the first button in the tab menu takes focus when the dialog opens.
\n' +
- '\n' +
- 'Navigate between interactive components of this dialog tab by pressing Tab or\n' +
- ' Shift+Tab .
\n' +
- '\n' +
- 'Switch to another dialog tab by giving the tab menu focus and then pressing the appropriate Arrow \n' +
- ' key to cycle through the available tabs.
\n');
\ No newline at end of file
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/es.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/es.js
deleted file mode 100644
index e426c2e..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/es.js
+++ /dev/null
@@ -1,93 +0,0 @@
-tinymce.Resource.add('tinymce.html-i18n.help-keynav.es',
-'Iniciar la navegación con el teclado \n' +
- '\n' +
- '\n' +
- ' Enfocar la barra de menús \n' +
- ' Windows o Linux: Alt+F9 \n' +
- ' macOS: ⌥F9 \n' +
- ' Enfocar la barra de herramientas \n' +
- ' Windows o Linux: Alt+F10 \n' +
- ' macOS: ⌥F10 \n' +
- ' Enfocar el pie de página \n' +
- ' Windows o Linux: Alt+F11 \n' +
- ' macOS: ⌥F11 \n' +
- ' Enfocar la notificación \n' +
- ' Windows o Linux: Alt+F12 \n' +
- ' macOS: ⌥F12 \n' +
- ' Enfocar una barra de herramientas contextual \n' +
- ' Windows, Linux o macOS: Ctrl+F9 \n' +
- ' \n' +
- '\n' +
- 'La navegación comenzará por el primer elemento de la interfaz de usuario (IU), de tal manera que se resaltará, o bien se subrayará si se trata del primer elemento de\n' +
- ' la ruta de elemento del pie de página.
\n' +
- '\n' +
- 'Navegar entre las secciones de la IU \n' +
- '\n' +
- 'Para pasar de una sección de la IU a la siguiente, pulse la tecla Tab .
\n' +
- '\n' +
- 'Para pasar de una sección de la IU a la anterior, pulse Mayús+Tab .
\n' +
- '\n' +
- 'El orden de tabulación de estas secciones de la IU es:
\n' +
- '\n' +
- '\n' +
- ' Barra de menús \n' +
- ' Cada grupo de barra de herramientas \n' +
- ' Barra lateral \n' +
- ' Ruta del elemento en el pie de página \n' +
- ' Botón de alternancia de recuento de palabras en el pie de página \n' +
- ' Enlace de personalización de marca en el pie de página \n' +
- ' Controlador de cambio de tamaño en el pie de página \n' +
- ' \n' +
- '\n' +
- 'Si una sección de la IU no está presente, esta se omite.
\n' +
- '\n' +
- 'Si el pie de página tiene un enfoque de navegación con el teclado y no hay ninguna barra lateral visible, al pulsar Mayús+Tab ,\n' +
- ' el enfoque se moverá al primer grupo de barra de herramientas, en lugar de al último.
\n' +
- '\n' +
- 'Navegar dentro de las secciones de la IU \n' +
- '\n' +
- 'Para pasar de un elemento de la IU al siguiente, pulse la tecla de flecha correspondiente.
\n' +
- '\n' +
- 'Las teclas de flecha izquierda y derecha permiten
\n' +
- '\n' +
- '\n' +
- ' desplazarse entre los menús de la barra de menús. \n' +
- ' abrir el submenú de un menú. \n' +
- ' desplazarse entre los botones de un grupo de barra de herramientas. \n' +
- ' desplazarse entre los elementos de la ruta de elemento del pie de página. \n' +
- ' \n' +
- '\n' +
- 'Las teclas de flecha abajo y arriba permiten
\n' +
- '\n' +
- '\n' +
- ' desplazarse entre los elementos de menú de un menú. \n' +
- ' desplazarse entre los elementos de un menú emergente de una barra de herramientas. \n' +
- ' \n' +
- '\n' +
- 'Las teclas de flecha van cambiando dentro de la sección de la IU enfocada.
\n' +
- '\n' +
- 'Para cerrar un menú, un submenú o un menú emergente que estén abiertos, pulse la tecla Esc .
\n' +
- '\n' +
- 'Si el enfoque actual se encuentra en la parte superior de una sección de la IU determinada, al pulsar la tecla Esc saldrá\n' +
- ' de la navegación con el teclado por completo.
\n' +
- '\n' +
- 'Ejecutar un elemento de menú o un botón de barra de herramientas \n' +
- '\n' +
- 'Si el elemento de menú o el botón de barra de herramientas deseado está resaltado, pulse la tecla Retorno o Entrar ,\n' +
- ' o la barra espaciadora para ejecutar el elemento.
\n' +
- '\n' +
- 'Navegar por cuadros de diálogo sin pestañas \n' +
- '\n' +
- 'En los cuadros de diálogo sin pestañas, el primer componente interactivo se enfoca al abrirse el cuadro de diálogo.
\n' +
- '\n' +
- 'Para navegar entre los componentes interactivos del cuadro de diálogo, pulse las teclas Tab o Mayús+Tab .
\n' +
- '\n' +
- 'Navegar por cuadros de diálogo con pestañas \n' +
- '\n' +
- 'En los cuadros de diálogo con pestañas, el primer botón del menú de pestaña se enfoca al abrirse el cuadro de diálogo.
\n' +
- '\n' +
- 'Para navegar entre componentes interactivos de esta pestaña del cuadro de diálogo, pulse las teclas Tab o\n' +
- ' Mayús+Tab .
\n' +
- '\n' +
- 'Si desea cambiar a otra pestaña del cuadro de diálogo, enfoque el menú de pestañas y, a continuación, pulse la tecla de flecha \n' +
- ' correspondiente para moverse por las pestañas disponibles.
\n');
\ No newline at end of file
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/eu.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/eu.js
deleted file mode 100644
index c18b940..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/eu.js
+++ /dev/null
@@ -1,93 +0,0 @@
-tinymce.Resource.add('tinymce.html-i18n.help-keynav.eu',
-'Hasi teklatuaren nabigazioa \n' +
- '\n' +
- '\n' +
- ' Fokuratu menu-barra \n' +
- ' Windows edo Linux: Alt+F9 \n' +
- ' macOS: ⌥F9 \n' +
- ' Fokuratu tresna-barra \n' +
- ' Windows edo Linux: Alt+F10 \n' +
- ' macOS: ⌥F10 \n' +
- ' Fokuratu orri-oina \n' +
- ' Windows edo Linux: Alt+F11 \n' +
- ' macOS: ⌥F11 \n' +
- ' Fokuratu jakinarazpena \n' +
- ' Windows edo Linux: Alt+F12 \n' +
- ' macOS: ⌥F12 \n' +
- ' Fokuratu testuinguruaren tresna-barra \n' +
- ' Windows, Linux edo macOS: Ktrl+F9 \n' +
- ' \n' +
- '\n' +
- 'Nabigazioa EIko lehen elementuan hasiko da: elementu hori nabarmendu egingo da, edo azpimarratu lehen elementua bada\n' +
- ' orri-oineko elementuaren bidea.
\n' +
- '\n' +
- 'Nabigatu EIko atalen artean \n' +
- '\n' +
- 'EIko atal batetik hurrengora mugitzeko, sakatu Tabuladorea .
\n' +
- '\n' +
- 'EIko atal batetik aurrekora mugitzeko, sakatu Maius+Tabuladorea .
\n' +
- '\n' +
- 'EIko atal hauen Tabuladorea da:
\n' +
- '\n' +
- '\n' +
- ' Menu-barra \n' +
- ' Tresna-barraren talde bakoitza \n' +
- ' Alboko barra \n' +
- ' Orri-oineko elementuaren bidea \n' +
- ' Orri-oneko urrats-kontaketa txandakatzeko botoia \n' +
- ' Orri-oineko marken esteka \n' +
- ' Orri-oineko editorearen tamaina aldatzeko heldulekua \n' +
- ' \n' +
- '\n' +
- 'EIko atal bat ez badago, saltatu egin da.
\n' +
- '\n' +
- 'Orri-oinak teklatuaren nabigazioa fokuratuta badago, eta alboko barra ikusgai ez badago, Maius+Tabuladorea sakatuz gero,\n' +
- ' fokua tresna-barrako lehen taldera eramaten da, ez azkenera.
\n' +
- '\n' +
- 'Nabigatu EIko atalen barruan \n' +
- '\n' +
- 'EIko elementu batetik hurrengora mugitzeko, sakatu dagokion Gezia tekla.
\n' +
- '\n' +
- 'Ezkerrera eta Eskuinera gezi-teklak
\n' +
- '\n' +
- '\n' +
- ' menu-barrako menuen artean mugitzen da. \n' +
- ' ireki azpimenu bat menuan. \n' +
- ' mugitu botoi batetik bestera tresna-barren talde batean. \n' +
- ' mugitu orri-oineko elementuaren bideko elementu batetik bestera. \n' +
- ' \n' +
- '\n' +
- 'Gora eta Behera gezi-teklak
\n' +
- '\n' +
- '\n' +
- ' mugitu menu bateko menu-elementuen artean. \n' +
- ' mugitu tresna-barrako menu gainerakor bateko menu-elementuen artean. \n' +
- ' \n' +
- '\n' +
- 'Gezia teklen zikloa nabarmendutako EI atalen barruan.
\n' +
- '\n' +
- 'Irekitako menu bat ixteko, ireki azpimenua, edo ireki menu gainerakorra, sakatu Ihes tekla.
\n' +
- '\n' +
- 'Une horretan fokuratzea EIko atal jakin baten "goialdean" badago, Ihes tekla sakatuz gero\n' +
- ' teklatuaren nabigaziotik irtengo zara.
\n' +
- '\n' +
- 'Exekutatu menuko elementu bat edo tresna-barrako botoi bat \n' +
- '\n' +
- 'Nahi den menuaren elementua edo tresna-barraren botoia nabarmenduta dagoenean, sakatu Itzuli , Sartu \n' +
- ' edo Zuriune-barra elementua exekutatzeko.
\n' +
- '\n' +
- 'Nabigatu fitxarik gabeko elkarrizketak \n' +
- '\n' +
- 'Fitxarik gabeko elkarrizketetan, lehen osagai interaktiboa fokuratzen da elkarrizketa irekitzen denean.
\n' +
- '\n' +
- 'Nabigatu elkarrizketa interaktiboko osagai batetik bestera Tabuladorea edo Maius+Tabuladorea sakatuta.
\n' +
- '\n' +
- 'Nabigatu fitxadun elkarrizketak \n' +
- '\n' +
- 'Fitxadun elkarrizketetan, fitxa-menuko lehen botoia fokuratzen da elkarrizketa irekitzen denean.
\n' +
- '\n' +
- 'Nabigatu elkarrizketa-fitxa honen interaktiboko osagai batetik bestera Tabuladorea edo\n' +
- ' Maius+Tabuladorea sakatuta.
\n' +
- '\n' +
- 'Aldatu beste elkarrizketa-fitxa batera fitxa-menua fokuratu eta dagokion Gezia \n' +
- ' tekla sakatzeko, erabilgarri dauden fitxa batetik bestera txandakatzeko.
\n');
\ No newline at end of file
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/fa.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/fa.js
deleted file mode 100644
index 2a55012..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/fa.js
+++ /dev/null
@@ -1,93 +0,0 @@
-tinymce.Resource.add('tinymce.html-i18n.help-keynav.fa',
-'شروع پیمایش صفحهکلید \n' +
- '\n' +
- '\n' +
- ' تمرکز بر نوار منو \n' +
- ' Windows یا Linux:: Alt+F9 \n' +
- ' macOS: ⌥F9 \n' +
- ' تمرکز بر نوار ابزار \n' +
- ' Windows یا Linux: Alt+F10 \n' +
- ' macOS: ⌥F10 \n' +
- ' تمرکز بر پانویس \n' +
- ' Windows یا Linux: Alt+F11 \n' +
- ' macOS: ⌥F11 \n' +
- ' تمرکز اعلان \n' +
- ' ویندوز یا لینوکس: Alt+F12 \n' +
- ' macOS: ⌥F12 \n' +
- ' تمرکز بر نوار ابزار بافتاری \n' +
- ' Windows ،Linux یا macOS: Ctrl+F9 \n' +
- ' \n' +
- '\n' +
- 'پیمایش در اولین مورد رابط کاربری شروع میشود و درخصوص اولین مورد در\n' +
- ' مسیر عنصر پانویس، برجسته یا زیرخطدار میشود.
\n' +
- '\n' +
- 'پیمایش بین بخشهای رابط کاربری \n' +
- '\n' +
- 'برای جابجایی از یک بخش رابط کاربری به بخش بعدی، Tab را فشار دهید.
\n' +
- '\n' +
- 'برای جابجایی از یک بخش رابط کاربری به بخش قبلی، Shift+Tab را فشار دهید.
\n' +
- '\n' +
- 'ترتیب Tab این بخشهای رابط کاربری عبارتند از:
\n' +
- '\n' +
- '\n' +
- ' نوار منو \n' +
- ' هر گروه نوار ابزار \n' +
- ' نوار کناری \n' +
- ' مسیر عنصر در پانویس \n' +
- ' دکمه تغییر وضعیت تعداد کلمات در پانویس \n' +
- ' پیوند نمانامسازی در پانویس \n' +
- ' دسته تغییر اندازه ویرایشگر در پانویس \n' +
- ' \n' +
- '\n' +
- 'اگر بخشی از رابط کاربری موجود نباشد، رد میشود.
\n' +
- '\n' +
- 'اگر پانویس دارای تمرکز بر پیمایش صفحهکلید باشد، و نوار کناری قابلمشاهده وجود ندارد، فشردن Shift+Tab \n' +
- ' تمرکز را به گروه نوار ابزار اول میبرد، نه آخر.
\n' +
- '\n' +
- 'پیمایش در بخشهای رابط کاربری \n' +
- '\n' +
- 'برای جابجایی از یک عنصر رابط کاربری به بعدی، کلید جهتنمای مناسب را فشار دهید.
\n' +
- '\n' +
- 'کلیدهای جهتنمای چپ و راست
\n' +
- '\n' +
- '\n' +
- ' جابجایی بین منوها در نوار منو. \n' +
- ' باز کردن منوی فرعی در یک منو. \n' +
- ' جابجایی بین دکمهها در یک گروه نوار ابزار. \n' +
- ' جابجایی بین موارد در مسیر عنصر پانویس. \n' +
- ' \n' +
- '\n' +
- 'کلیدهای جهتنمای پایین و بالا
\n' +
- '\n' +
- '\n' +
- ' جابجایی بین موارد منو در یک منو. \n' +
- ' جابجایی بین موارد در یک منوی بازشوی نوار ابزار. \n' +
- ' \n' +
- '\n' +
- 'کلیدهایجهتنما در بخش رابط کاربری متمرکز میچرخند.
\n' +
- '\n' +
- 'برای بستن یک منوی باز، یک منوی فرعی باز، یا یک منوی بازشوی باز، کلید Esc را فشار دهید.
\n' +
- '\n' +
- 'اگر تمرکز فعلی در «بالای» یک بخش رابط کاربری خاص است، فشردن کلید Esc نیز موجب\n' +
- ' خروج کامل از پیمایش صفحهکلید میشود.
\n' +
- '\n' +
- 'اجرای یک مورد منو یا دکمه نوار ابزار \n' +
- '\n' +
- 'وقتی مورد منو یا دکمه نوار ابزار مورد نظر هایلایت شد، دکمه بازگشت ، Enter ،\n' +
- ' یا نوار Space را فشار دهید تا مورد را اجرا کنید.
\n' +
- '\n' +
- 'پیمایش در کادرهای گفتگوی بدون زبانه \n' +
- '\n' +
- 'در کادرهای گفتگوی بدون زبانه، وقتی کادر گفتگو باز میشود، اولین جزء تعاملی متمرکز میشود.
\n' +
- '\n' +
- 'با فشردن Tab یا Shift+Tab ، بین اجزای کادر گفتگوی تعاملی پیمایش کنید.
\n' +
- '\n' +
- 'پیمایش کادرهای گفتگوی زبانهدار \n' +
- '\n' +
- 'در کادرهای گفتگوی زبانهدار، وقتی کادر گفتگو باز میشود، اولین دکمه در منوی زبانه متمرکز میشود.
\n' +
- '\n' +
- 'با فشردن Tab یا\n' +
- ' Shift+Tab ، بین اجزای تعاملی این زبانه کادر گفتگو پیمایش کنید.
\n' +
- '\n' +
- 'با دادن تمرکز به منوی زبانه و سپس فشار دادن کلید جهتنمای \n' +
- ' مناسب برای چرخش میان زبانههای موجود، به زبانه کادر گفتگوی دیگری بروید.
\n');
\ No newline at end of file
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/fi.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/fi.js
deleted file mode 100644
index f01dc91..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/fi.js
+++ /dev/null
@@ -1,93 +0,0 @@
-tinymce.Resource.add('tinymce.html-i18n.help-keynav.fi',
-'Näppäimistönavigoinnin aloittaminen \n' +
- '\n' +
- '\n' +
- ' Siirrä kohdistus valikkopalkkiin \n' +
- ' Windows tai Linux: Alt+F9 \n' +
- ' macOS: ⌥F9 \n' +
- ' Siirrä kohdistus työkalupalkkiin \n' +
- ' Windows tai Linux: Alt+F10 \n' +
- ' macOS: ⌥F10 \n' +
- ' Siirrä kohdistus alatunnisteeseen \n' +
- ' Windows tai Linux: Alt+F11 \n' +
- ' macOS: ⌥F11 \n' +
- ' Keskitä ilmoitukseen \n' +
- ' Windows ja Linux: Alt + F12 \n' +
- ' macOS: ⌥F12 \n' +
- ' Siirrä kohdistus kontekstuaaliseen työkalupalkkiin \n' +
- ' Windows, Linux tai macOS: Ctrl+F9 \n' +
- ' \n' +
- '\n' +
- 'Navigointi aloitetaan ensimmäisestä käyttöliittymän kohteesta, joka joko korostetaan tai alleviivataan, jos\n' +
- ' kyseessä on Alatunniste-elementin polun ensimmäinen kohde.
\n' +
- '\n' +
- 'Käyttöliittymän eri osien välillä navigointi \n' +
- '\n' +
- 'Paina sarkainnäppäintä siirtyäksesi käyttöliittymän osasta seuraavaan.
\n' +
- '\n' +
- 'Jos haluat siirtyä edelliseen käyttöliittymän osaan, paina Shift+sarkainnäppäin .
\n' +
- '\n' +
- 'Sarkainnäppäin siirtää sinua näissä käyttöliittymän osissa tässä järjestyksessä:
\n' +
- '\n' +
- '\n' +
- ' Valikkopalkki \n' +
- ' Työkalupalkin ryhmät \n' +
- ' Sivupalkki \n' +
- ' Elementin polku alatunnisteessa \n' +
- ' Sanalaskurin vaihtopainike alatunnisteessa \n' +
- ' Brändäyslinkki alatunnisteessa \n' +
- ' Editorin koon muuttamisen kahva alatunnisteessa \n' +
- ' \n' +
- '\n' +
- 'Jos jotakin käyttöliittymän osaa ei ole, se ohitetaan.
\n' +
- '\n' +
- 'Jos kohdistus on siirretty alatunnisteeseen näppäimistönavigoinnilla eikä sivupalkkia ole näkyvissä, Shift+sarkainnäppäin \n' +
- ' siirtää kohdistuksen työkalupalkin ensimmäiseen ryhmään, eikä viimeiseen.
\n' +
- '\n' +
- 'Käyttöliittymän eri osien sisällä navigointi \n' +
- '\n' +
- 'Paina nuolinäppäimiä siirtyäksesi käyttöliittymäelementistä seuraavaan.
\n' +
- '\n' +
- 'Vasen - ja Oikea -nuolinäppäimet
\n' +
- '\n' +
- '\n' +
- ' siirtävät sinua valikkopalkin valikoiden välillä. \n' +
- ' avaavat valikon alavalikon. \n' +
- ' siirtävät sinua työkalupalkin ryhmän painikkeiden välillä. \n' +
- ' siirtävät sinua kohteiden välillä alatunnisteen elementin polussa. \n' +
- ' \n' +
- '\n' +
- 'Alas - ja Ylös -nuolinäppäimet
\n' +
- '\n' +
- '\n' +
- ' siirtävät sinua valikon valikkokohteiden välillä. \n' +
- ' siirtävät sinua työkalupalkin ponnahdusvalikon kohteiden välillä. \n' +
- ' \n' +
- '\n' +
- 'Nuolinäppäimet siirtävät sinua käyttöliittymän korostetun osan sisällä syklissä.
\n' +
- '\n' +
- 'Paina Esc -näppäintä sulkeaksesi avoimen valikon, avataksesi alavalikon tai avataksesi ponnahdusvalikon.
\n' +
- '\n' +
- 'Jos kohdistus on käyttöliittymän tietyn osion ylälaidassa, Esc -näppäimen painaminen\n' +
- ' poistuu myös näppäimistönavigoinnista kokonaan.
\n' +
- '\n' +
- 'Suorita valikkokohde tai työkalupalkin painike \n' +
- '\n' +
- 'Kun haluamasi valikkokohde tai työkalupalkin painike on korostettuna, paina Return -, Enter -\n' +
- ' tai välilyöntinäppäintä suorittaaksesi kohteen.
\n' +
- '\n' +
- 'Välilehdittömissä valintaikkunoissa navigointi \n' +
- '\n' +
- 'Kun välilehdetön valintaikkuna avautuu, kohdistus siirtyy sen ensimmäiseen interaktiiviseen komponenttiin.
\n' +
- '\n' +
- 'Voit siirtyä valintaikkunan interaktiivisten komponenttien välillä painamalla sarkainnäppäintä tai Shift+sarkainnäppäin .
\n' +
- '\n' +
- 'Välilehdellisissä valintaikkunoissa navigointi \n' +
- '\n' +
- 'Kun välilehdellinen valintaikkuna avautuu, kohdistus siirtyy välilehtivalikon ensimmäiseen painikkeeseen.
\n' +
- '\n' +
- 'Voit siirtyä valintaikkunan välilehden interaktiivisen komponenttien välillä painamalla sarkainnäppäintä tai\n' +
- ' Shift+sarkainnäppäin .
\n' +
- '\n' +
- 'Voit siirtyä valintaikkunan toiseen välilehteen siirtämällä kohdistuksen välilehtivalikkoon ja painamalla sopivaa nuolinäppäintä \n' +
- ' siirtyäksesi käytettävissä olevien välilehtien välillä syklissä.
\n');
\ No newline at end of file
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/fr_FR.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/fr_FR.js
deleted file mode 100644
index 3f611e8..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/fr_FR.js
+++ /dev/null
@@ -1,93 +0,0 @@
-tinymce.Resource.add('tinymce.html-i18n.help-keynav.fr_FR',
-'Débuter la navigation au clavier \n' +
- '\n' +
- '\n' +
- ' Cibler la barre du menu \n' +
- ' Windows ou Linux : Alt+F9 \n' +
- ' macOS : ⌥F9 \n' +
- " Cibler la barre d'outils \n" +
- ' Windows ou Linux : Alt+F10 \n' +
- ' macOS : ⌥F10 \n' +
- ' Cibler le pied de page \n' +
- ' Windows ou Linux : Alt+F11 \n' +
- ' macOS : ⌥F11 \n' +
- ' Cibler la notification \n' +
- ' Windows ou Linux : Alt+F12 \n' +
- ' macOS : ⌥F12 \n' +
- " Cibler une barre d'outils contextuelle \n" +
- ' Windows, Linux ou macOS : Ctrl+F9 \n' +
- ' \n' +
- '\n' +
- "La navigation débutera sur le premier élément de l'interface utilisateur, qui sera mis en surbrillance ou bien souligné dans le cas du premier élément du\n" +
- " chemin d'éléments du pied de page.
\n" +
- '\n' +
- "Naviguer entre les sections de l'interface utilisateur \n" +
- '\n' +
- "Pour passer d'une section de l'interface utilisateur à la suivante, appuyez sur Tabulation .
\n" +
- '\n' +
- "Pour passer d'une section de l'interface utilisateur à la précédente, appuyez sur Maj+Tabulation .
\n" +
- '\n' +
- "L'ordre de Tabulation de ces sections de l'interface utilisateur est le suivant :
\n" +
- '\n' +
- '\n' +
- ' Barre du menu \n' +
- " Chaque groupe de barres d'outils \n" +
- ' Barre latérale \n' +
- " Chemin d'éléments du pied de page \n" +
- " Bouton d'activation du compteur de mots dans le pied de page \n" +
- ' Lien de marque dans le pied de page \n' +
- " Poignée de redimensionnement de l'éditeur dans le pied de page \n" +
- ' \n' +
- '\n' +
- "Si une section de l'interface utilisateur n'est pas présente, elle sera ignorée.
\n" +
- '\n' +
- "Si le pied de page comporte un ciblage par navigation au clavier et qu'il n'y a aucune barre latérale visible, appuyer sur Maj+Tabulation \n" +
- " déplace le ciblage vers le premier groupe de barres d'outils et non le dernier.
\n" +
- '\n' +
- "Naviguer au sein des sections de l'interface utilisateur \n" +
- '\n' +
- "Pour passer d'un élément de l'interface utilisateur au suivant, appuyez sur la Flèche appropriée.
\n" +
- '\n' +
- 'Les touches fléchées Gauche et Droite
\n' +
- '\n' +
- '\n' +
- ' se déplacent entre les menus de la barre des menus. \n' +
- " ouvrent un sous-menu au sein d'un menu. \n" +
- " se déplacent entre les boutons d'un groupe de barres d'outils. \n" +
- " se déplacent entre les éléments du chemin d'éléments du pied de page. \n" +
- ' \n' +
- '\n' +
- 'Les touches fléchées Bas et Haut
\n' +
- '\n' +
- '\n' +
- " se déplacent entre les éléments de menu au sein d'un menu. \n" +
- " se déplacent entre les éléments au sein d'un menu contextuel de barre d'outils. \n" +
- ' \n' +
- '\n' +
- "Les Flèches parcourent la section de l'interface utilisateur ciblée.
\n" +
- '\n' +
- 'Pour fermer un menu ouvert, un sous-menu ouvert ou un menu contextuel ouvert, appuyez sur Echap .
\n' +
- '\n' +
- "Si l'actuel ciblage se trouve en « haut » d'une section spécifique de l'interface utilisateur, appuyer sur Echap permet également de quitter\n" +
- ' entièrement la navigation au clavier.
\n' +
- '\n' +
- "Exécuter un élément de menu ou un bouton de barre d'outils \n" +
- '\n' +
- "Lorsque l'élément de menu ou le bouton de barre d'outils désiré est mis en surbrillance, appuyez sur la touche Retour arrière , Entrée \n" +
- " ou la Barre d'espace pour exécuter l'élément.
\n" +
- '\n' +
- 'Naviguer au sein de dialogues sans onglets \n' +
- '\n' +
- "Dans les dialogues sans onglets, le premier composant interactif est ciblé lorsque le dialogue s'ouvre.
\n" +
- '\n' +
- 'Naviguez entre les composants du dialogue interactif en appuyant sur Tabulation ou Maj+Tabulation .
\n' +
- '\n' +
- 'Naviguer au sein de dialogues avec onglets \n' +
- '\n' +
- "Dans les dialogues avec onglets, le premier bouton du menu de l'onglet est ciblé lorsque le dialogue s'ouvre.
\n" +
- '\n' +
- 'Naviguez entre les composants interactifs de cet onglet de dialogue en appuyant sur Tabulation ou\n' +
- ' Maj+Tabulation .
\n' +
- '\n' +
- "Passez à un autre onglet de dialogue en ciblant le menu de l'onglet et en appuyant sur la Flèche \n" +
- ' appropriée pour parcourir les onglets disponibles.
\n');
\ No newline at end of file
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/he_IL.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/he_IL.js
deleted file mode 100644
index 7d6513a..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/he_IL.js
+++ /dev/null
@@ -1,93 +0,0 @@
-tinymce.Resource.add('tinymce.html-i18n.help-keynav.he_IL',
-'התחל ניווט במקלדת \n' +
- '\n' +
- '\n' +
- ' התמקד בשורת התפריטים \n' +
- ' Windows או Linux: Alt+F9 \n' +
- ' macOS: ⌥F9 \n' +
- ' העבר מיקוד לסרגל הכלים \n' +
- ' Windows או Linux: Alt+F10 \n' +
- ' macOS: ⌥F10 \n' +
- ' העבר מיקוד לכותרת התחתונה \n' +
- ' Windows או Linux: Alt+F11 \n' +
- ' macOS: ⌥F11 \n' +
- ' העבר מיקוד להודעה \n' +
- ' Windows או Linux: Alt+F12 \n' +
- ' macOS: ⌥F12 \n' +
- ' העבר מיקוד לסרגל כלים הקשרי \n' +
- ' Windows, Linux או macOS: Ctrl+F9 \n' +
- ' \n' +
- '\n' +
- 'הניווט יתחיל ברכיב הראשון במשך, שיודגש או שיהיה מתחתיו קו תחתון במקרה של הפריט הראשון\n' +
- ' הנתיב של רכיב הכותרת התחתונה.
\n' +
- '\n' +
- 'עבור בין מקטעים במסך \n' +
- '\n' +
- 'כדי לעבור בין המקטעים במסך, הקש Tab .
\n' +
- '\n' +
- 'כדי לעבור למקטע הקודם במסך, הקש Shift+Tab .
\n' +
- '\n' +
- 'הסדר מבחינת מקש Tab של הרכיבים במסך:
\n' +
- '\n' +
- '\n' +
- ' שורת התפריטים \n' +
- ' כל קבוצה בסרגל הכלים \n' +
- ' הסרגל הצידי \n' +
- ' נתיב של רכיב בכותרת התחתונה \n' +
- ' לחצן לספירת מילים בכותרת התחתונה \n' +
- ' קישור של המותג בכותרת התחתונה \n' +
- ' ידית לשינוי גודל עבור העורך בכותרת התחתונה \n' +
- ' \n' +
- '\n' +
- 'אם רכיב כלשהו במסך לא מופיע, המערכת תדלג עליו.
\n' +
- '\n' +
- 'אם בכותרת התחתונה יש מיקוד של ניווט במקלדת, ולא מופיע סרגל בצד, יש להקיש Shift+Tab \n' +
- ' מעביר את המיקוד לקבוצה הראשונה בסרגל הכלים, לא האחרונה.
\n' +
- '\n' +
- 'עבור בתוך מקטעים במסך \n' +
- '\n' +
- 'כדי לעבור מרכיב אחד לרכיב אחר במסך, הקש על מקש החץ המתאים.
\n' +
- '\n' +
- 'מקשי החיצים שמאלה וימינה
\n' +
- '\n' +
- '\n' +
- ' עבור בין תפריטים בשורת התפריטים. \n' +
- ' פתח תפריט משני בתפריט. \n' +
- ' עבור בין לחצנים בקבוצה בסרגל הכלים. \n' +
- ' עבור בין פריטים ברכיב בכותרת התחתונה. \n' +
- ' \n' +
- '\n' +
- 'מקשי החיצים למטה ולמעלה
\n' +
- '\n' +
- '\n' +
- ' עבור בין פריטים בתפריט. \n' +
- ' עבור בין פריטים בחלון הקובץ של סרגל הכלים. \n' +
- ' \n' +
- '\n' +
- 'מקשי החצים משתנים בתוך המקטע במסך שעליו נמצא המיקוד.
\n' +
- '\n' +
- 'כדי לסגור תפריט פתוח, תפריט משני פתוח או חלון קופץ, הקש על Esc .
\n' +
- '\n' +
- "אם המיקוד הוא על החלק 'העליון' של מקטע מסוים במסך, הקשה על Esc מביאה גם ליציאה\n" +
- ' מהניווט במקלדת לחלוטין.
\n' +
- '\n' +
- 'הפעל פריט בתפריט או לחצן בסרגל הכלים \n' +
- '\n' +
- 'כאשר הפריט הרצוי בתפריט או הלחצן בסרגל הכלים מודגשים, הקש על Return , Enter ,\n' +
- ' או על מקש הרווח כדי להפעיל את הפריט.
\n' +
- '\n' +
- 'ניווט בחלונות דו-שיח בלי כרטיסיות \n' +
- '\n' +
- 'בחלונות דו-שיח בלי כרטיסיות, הרכיב האינטראקטיבי הראשון מקבל את המיקוד כאשר החלון נפתח.
\n' +
- '\n' +
- 'עבור בין רכיבים אינטראקטיביים בחלון על ידי הקשה על Tab או Shift+Tab .
\n' +
- '\n' +
- 'ניווט בחלונות דו-שיח עם כרטיסיות \n' +
- '\n' +
- 'בחלונות דו-שיח עם כרטיסיות, הלחצן הראשון בתפריט מקבל את המיקוד כאשר החלון נפתח.
\n' +
- '\n' +
- 'עבור בין רכיבים אינטראקטיביים בחלון על ידי הקשה על Tab או\n' +
- ' Shift+Tab .
\n' +
- '\n' +
- 'עבור לכרטיסיה אחרת בחלון על ידי העברת המיקוד לתפריט הכרטיסיות והקשה על החץ המתאים\n' +
- ' כדי לעבור בין הכרטיסיות הזמינות.
\n');
\ No newline at end of file
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/hi.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/hi.js
deleted file mode 100644
index ef59a5c..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/hi.js
+++ /dev/null
@@ -1,93 +0,0 @@
-tinymce.Resource.add('tinymce.html-i18n.help-keynav.hi',
-'कीबोर्ड नेविगेशन शुरू करें \n' +
- '\n' +
- '\n' +
- ' मेन्यू बार पर फ़ोकस करें \n' +
- ' Windows या Linux: Alt+F9 \n' +
- ' macOS: ⌥F9 \n' +
- ' टूलबार पर फ़ोकस करें \n' +
- ' Windows या Linux: Alt+F10 \n' +
- ' macOS: ⌥F10 \n' +
- ' फ़ुटर पर फ़ोकस करें \n' +
- ' Windows या Linux: Alt+F11 \n' +
- ' macOS: ⌥F11 \n' +
- ' नोटिफ़िकेशन फ़ोकस \n' +
- ' Windows या Linux: Alt+F12 \n' +
- ' macOS: ⌥F12 \n' +
- ' प्रासंगिक टूलबार पर फ़ोकस करें \n' +
- ' Windows, Linux या macOS: Ctrl+F9 \n' +
- ' \n' +
- '\n' +
- 'नेविगेशन पहले UI आइटम पर शुरू होगा, जिसे हाइलाइट किया जाएगा या पहले आइटम के मामले में फ़ुटर तत्व पथ में\n' +
- ' रेखांकित किया जाएगा।
\n' +
- '\n' +
- 'UI सेक्शन के बीच नेविगेट करें \n' +
- '\n' +
- 'एक UI सेक्शन से दूसरे सेक्शन में जाने के लिए, Tab दबाएं।
\n' +
- '\n' +
- 'एक UI सेक्शन से पिछले सेक्शन में जाने के लिए, Shift+Tab दबाएं।
\n' +
- '\n' +
- 'इन UI सेक्शन का Tab क्रम नीचे दिया गया है:
\n' +
- '\n' +
- '\n' +
- ' मेन्यू बार \n' +
- ' प्रत्येक टूलबार समूह \n' +
- ' साइडबार \n' +
- ' फ़ुटर में तत्व पथ \n' +
- ' फ़ुटर में शब्द गणना टॉगल बटन \n' +
- ' फ़ुटर में ब्रांडिंग लिंक \n' +
- ' फ़ुटर में संपादक का आकार बदलने का हैंडल \n' +
- ' \n' +
- '\n' +
- 'अगर कोई UI सेक्शन मौजूद नहीं है, तो उसे छोड़ दिया जाता है।
\n' +
- '\n' +
- 'अगर फ़ुटर में कीबोर्ड नेविगेशन फ़ोकस है, और कोई दिखा देने वाला साइडबार नहीं है, तो Shift+Tab दबाने से\n' +
- ' फ़ोकस पहले टूलबार समूह पर चला जाता है, पिछले पर नहीं।
\n' +
- '\n' +
- 'UI सेक्शन के भीतर नेविगेट करें \n' +
- '\n' +
- 'एक UI तत्व से दूसरे में जाने के लिए उपयुक्त ऐरो कुंजी दबाएं।
\n' +
- '\n' +
- 'बाएं और दाएं ऐरो कुंजियां
\n' +
- '\n' +
- '\n' +
- ' मेन्यू बार में मेन्यू के बीच ले जाती हैं। \n' +
- ' मेन्यू में एक सब-मेन्यू खोलें। \n' +
- ' टूलबार समूह में बटनों के बीच ले जाएं। \n' +
- ' फ़ुटर के तत्व पथ में आइटम के बीच ले जाएं। \n' +
- ' \n' +
- '\n' +
- 'नीचे और ऊपर ऐरो कुंजियां
\n' +
- '\n' +
- '\n' +
- ' मेन्यू में मेन्यू आइटम के बीच ले जाती हैं। \n' +
- ' टूलबार पॉप-अप मेन्यू में आइटम के बीच ले जाएं। \n' +
- ' \n' +
- '\n' +
- 'फ़ोकस वाले UI सेक्शन के भीतर ऐरो कुंजियां चलाती रहती हैं।
\n' +
- '\n' +
- 'कोई खुला मेन्यू, कोई खुला सब-मेन्यू या कोई खुला पॉप-अप मेन्यू बंद करने के लिए Esc कुंजी दबाएं।
\n' +
- '\n' +
- "अगर मौजूदा फ़ोकस किसी विशेष UI सेक्शन के 'शीर्ष' पर है, तो Esc कुंजी दबाने से भी\n" +
- ' कीबोर्ड नेविगेशन पूरी तरह से बाहर हो जाता है।
\n' +
- '\n' +
- 'मेन्यू आइटम या टूलबार बटन निष्पादित करें \n' +
- '\n' +
- 'जब वांछित मेन्यू आइटम या टूलबार बटन हाइलाइट किया जाता है, तो आइटम को निष्पादित करने के लिए Return , Enter ,\n' +
- ' या Space bar दबाएं।
\n' +
- '\n' +
- 'गैर-टैब वाले डायलॉग पर नेविगेट करें \n' +
- '\n' +
- 'गैर-टैब वाले डायलॉग में, डायलॉग खुलने पर पहला इंटरैक्टिव घटक फ़ोकस लेता है।
\n' +
- '\n' +
- 'Tab or Shift+Tab दबाकर इंटरैक्टिव डायलॉग घटकों के बीच नेविगेट करें।
\n' +
- '\n' +
- 'टैब किए गए डायलॉग पर नेविगेट करें \n' +
- '\n' +
- 'टैब किए गए डायलॉग में, डायलॉग खुलने पर टैब मेन्यू में पहला बटन फ़ोकस लेता है।
\n' +
- '\n' +
- 'इस डायलॉग टैब के इंटरैक्टिव घटकों के बीच नेविगेट करने के लिए Tab या\n' +
- ' Shift+Tab दबाएं।
\n' +
- '\n' +
- 'टैब मेन्यू को फ़ोकस देकर और फिर उपलब्ध टैब में के बीच जाने के लिए उपयुक्त ऐरो \n' +
- ' कुंजी दबाकर दूसरे डायलॉग टैब पर स्विच करें।
\n');
\ No newline at end of file
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/hr.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/hr.js
deleted file mode 100644
index 1bf35c5..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/hr.js
+++ /dev/null
@@ -1,93 +0,0 @@
-tinymce.Resource.add('tinymce.html-i18n.help-keynav.hr',
-'Početak navigacije na tipkovnici \n' +
- '\n' +
- '\n' +
- ' Fokusiranje trake izbornika \n' +
- ' Windows ili Linux: Alt+F9 \n' +
- ' macOS: ⌥F9 \n' +
- ' Fokusiranje alatne trake \n' +
- ' Windows ili Linux: Alt+F10 \n' +
- ' macOS: ⌥F10 \n' +
- ' Fokusiranje podnožja \n' +
- ' Windows ili Linux: Alt+F11 \n' +
- ' macOS: ⌥F11 \n' +
- ' Fokusiranje obavijesti \n' +
- ' Windows ili Linux: Alt + F12 \n' +
- ' macOS: ⌥F12 \n' +
- ' Fokusiranje kontekstne alatne trake \n' +
- ' Windows, Linux ili macOS: Ctrl+F9 \n' +
- ' \n' +
- '\n' +
- 'Navigacija će započeti kod prve stavke na korisničkom sučelju, koja će biti istaknuta ili podcrtana ako se radi o prvoj stavci u\n' +
- ' putu elementa u podnožju.
\n' +
- '\n' +
- 'Navigacija između dijelova korisničkog sučelja \n' +
- '\n' +
- 'Za pomicanje s jednog dijela korisničkog sučelja na drugi pritisnite tabulator .
\n' +
- '\n' +
- 'Za pomicanje s jednog dijela korisničkog sučelja na prethodni pritisnite Shift + tabulator .
\n' +
- '\n' +
- 'Ovo je redoslijed pomicanja tabulatora po dijelovima korisničkog sučelja:
\n' +
- '\n' +
- '\n' +
- ' Traka izbornika \n' +
- ' Pojedinačne grupe na alatnoj traci \n' +
- ' Bočna traka \n' +
- ' Put elemenata u podnožju \n' +
- ' Gumb za pomicanje po broju riječi u podnožju \n' +
- ' Veza na brand u podnožju \n' +
- ' Značajka za promjenu veličine alata za uređivanje u podnožju \n' +
- ' \n' +
- '\n' +
- 'Ako neki dio korisničkog sučelja nije naveden, on se preskače.
\n' +
- '\n' +
- 'Ako u podnožju postoji fokus za navigaciju na tipkovnici, a nema vidljive bočne trake, pritiskom na Shift + tabulator \n' +
- ' fokus se prebacuje na prvu skupinu na alatnoj traci, ne na zadnju.
\n' +
- '\n' +
- 'Navigacija unutar dijelova korisničkog sučelja \n' +
- '\n' +
- 'Za pomicanje s jednog elementa korisničkog sučelja na drugi pritisnite tipku s odgovarajućom strelicom .
\n' +
- '\n' +
- 'Tipke s lijevom i desnom strelicom
\n' +
- '\n' +
- '\n' +
- ' služe za pomicanje između izbornika na alatnoj traci. \n' +
- ' otvaraju podizbornik unutar izbornika. \n' +
- ' služe za pomicanje između gumba unutar skupina na alatnoj traci. \n' +
- ' služe za pomicanje između stavki na elementu puta u podnožju. \n' +
- ' \n' +
- '\n' +
- 'Tipke s donjom i gornjom strelicom
\n' +
- '\n' +
- '\n' +
- ' služe za pomicanje između stavki unutar izbornika. \n' +
- ' služe za pomicanje između stavki na alatnoj traci skočnog izbornika. \n' +
- ' \n' +
- '\n' +
- 'Tipkama strelica kružno se pomičete unutar dijela korisničkog sučelja koji je u fokusu.
\n' +
- '\n' +
- 'Za zatvaranje otvorenog izbornika, otvorenog podizbornika ili otvorenog skočnog izbornika pritisnite tipku Esc .
\n' +
- '\n' +
- 'Ako je fokus trenutačno postavljen na vrh pojedinačnog dijela korisničkog sučelja, pritiskom na tipku Esc također\n' +
- ' u potpunosti zatvarate navigaciju na tipkovnici.
\n' +
- '\n' +
- 'Izvršavanje radnji putem stavki izbornika ili gumba na alatnoj traci \n' +
- '\n' +
- 'Nakon što se istakne stavka izbornika ili gumb na alatnoj traci s radnjom koju želite izvršiti, pritisnite tipku Return , Enter \n' +
- ' ili razmak da biste pokrenuli željenu radnju.
\n' +
- '\n' +
- 'Navigacija dijaloškim okvirima izvan kartica \n' +
- '\n' +
- 'Prilikom otvaranja dijaloških okvira izvan kartica fokus se nalazi na prvoj interaktivnoj komponenti.
\n' +
- '\n' +
- 'Navigaciju između interaktivnih dijaloških komponenata vršite pritiskom na tabulator ili Shift + tabulator .
\n' +
- '\n' +
- 'Navigacija dijaloškim okvirima u karticama \n' +
- '\n' +
- 'Prilikom otvaranja dijaloških okvira u karticama fokus se nalazi na prvom gumbu u izborniku unutar kartice.
\n' +
- '\n' +
- 'Navigaciju između interaktivnih komponenata dijaloškog okvira u kartici vršite pritiskom na tabulator ili\n' +
- ' Shift + tabulator .
\n' +
- '\n' +
- 'Na karticu s drugim dijaloškim okvirom možete se prebaciti tako da stavite fokus na izbornik kartice pa pritisnete tipku s odgovarajućom strelicom \n' +
- ' za kružno pomicanje između dostupnih kartica.
\n');
\ No newline at end of file
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/hu_HU.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/hu_HU.js
deleted file mode 100644
index 5c984bb..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/hu_HU.js
+++ /dev/null
@@ -1,93 +0,0 @@
-tinymce.Resource.add('tinymce.html-i18n.help-keynav.hu_HU',
-'Billentyűzetes navigáció indítása \n' +
- '\n' +
- '\n' +
- ' Fókusz a menüsávra \n' +
- ' Windows és Linux: Alt+F9 \n' +
- ' macOS: ⌥F9 \n' +
- ' Fókusz az eszköztárra \n' +
- ' Windows és Linux: Alt+F10 \n' +
- ' macOS: ⌥F10 \n' +
- ' Fókusz a láblécre \n' +
- ' Windows és Linux: Alt+F11 \n' +
- ' macOS: ⌥F11 \n' +
- ' Ráközelítés az értesítésre \n' +
- ' Windows vagy Linux: Alt+F12 \n' +
- ' macOS: ⌥F12 \n' +
- ' Fókusz egy környezetfüggő eszköztárra \n' +
- ' Windows, Linux és macOS: Ctrl+F9 \n' +
- ' \n' +
- '\n' +
- 'A navigáció az első felhasználói felületi elemnél kezdődik, amelyet a rendszer kiemel, illetve aláhúz, amennyiben az az első elem\n' +
- ' a lábléc elemútvonalán.
\n' +
- '\n' +
- 'Navigálás a felhasználói felület szakaszai között \n' +
- '\n' +
- 'A felhasználói felület következő szakaszára váltáshoz nyomja meg a Tab billentyűt.
\n' +
- '\n' +
- 'A felhasználói felület előző szakaszára váltáshoz nyomja meg a Shift+Tab billentyűt.
\n' +
- '\n' +
- 'A Tab billentyűvel a felhasználói felület szakaszai között a következő sorrendben vált:
\n' +
- '\n' +
- '\n' +
- ' Menüsáv \n' +
- ' Az egyes eszköztárcsoportok \n' +
- ' Oldalsáv \n' +
- ' Elemútvonal a láblécen \n' +
- ' Szószámátkapcsoló gomb a láblécen \n' +
- ' Márkalink a láblécen \n' +
- ' Szerkesztő átméretezési fogópontja a láblécen \n' +
- ' \n' +
- '\n' +
- 'Ha a felhasználói felület valamelyik eleme nincs jelen, a rendszer kihagyja.
\n' +
- '\n' +
- 'Ha a billentyűzetes navigáció fókusza a láblécen van, és nincs látható oldalsáv, a Shift+Tab \n' +
- ' billentyűkombináció lenyomásakor az első eszköztárcsoportra ugrik a fókusz, nem az utolsóra.
\n' +
- '\n' +
- 'Navigálás a felhasználói felület szakaszain belül \n' +
- '\n' +
- 'A felhasználói felület következő elemére váltáshoz nyomja meg a megfelelő nyílbillentyűt .
\n' +
- '\n' +
- 'A bal és a jobb nyílgomb
\n' +
- '\n' +
- '\n' +
- ' a menüsávban a menük között vált. \n' +
- ' a menükben megnyit egy almenüt. \n' +
- ' az eszköztárcsoportban a gombok között vált. \n' +
- ' a lábléc elemútvonalán az elemek között vált. \n' +
- ' \n' +
- '\n' +
- 'A le és a fel nyílgomb
\n' +
- '\n' +
- '\n' +
- ' a menükben a menüpontok között vált. \n' +
- ' az eszköztár előugró menüjében az elemek között vált. \n' +
- ' \n' +
- '\n' +
- 'A nyílbillentyűk lenyomásával körkörösen lépkedhet a fókuszban lévő felhasználói felületi szakasz elemei között.
\n' +
- '\n' +
- 'A megnyitott menüket, almenüket és előugró menüket az Esc billentyűvel zárhatja be.
\n' +
- '\n' +
- 'Ha a fókusz az aktuális felületi elem „felső” részén van, az Esc billentyűvel az egész\n' +
- ' billentyűzetes navigációból kilép.
\n' +
- '\n' +
- 'Menüpont vagy eszköztárgomb aktiválása \n' +
- '\n' +
- 'Amikor a kívánt menüelem vagy eszköztárgomb van kijelölve, nyomja meg a Return , az Enter \n' +
- ' vagy a Szóköz billentyűt az adott elem vagy gomb aktiválásához.
\n' +
- '\n' +
- 'Navigálás a lapokkal nem rendelkező párbeszédablakokban \n' +
- '\n' +
- 'A lapokkal nem rendelkező párbeszédablakokban az első interaktív összetevő kapja a fókuszt, amikor a párbeszédpanel megnyílik.
\n' +
- '\n' +
- 'A párbeszédpanelek interaktív összetevői között a Tab vagy a Shift+Tab billentyűvel navigálhat.
\n' +
- '\n' +
- 'Navigálás a lapokkal rendelkező párbeszédablakokban \n' +
- '\n' +
- 'A lapokkal rendelkező párbeszédablakokban a lapmenü első gombja kapja a fókuszt, amikor a párbeszédpanel megnyílik.
\n' +
- '\n' +
- 'A párbeszédpanel e lapjának interaktív összetevői között a Tab vagy\n' +
- ' Shift+Tab billentyűvel navigálhat.
\n' +
- '\n' +
- 'A párbeszédablak másik lapjára úgy léphet, hogy a fókuszt a lapmenüre állítja, majd lenyomja a megfelelő nyílbillentyűt \n' +
- ' a rendelkezésre álló lapok közötti lépkedéshez.
\n');
\ No newline at end of file
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/id.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/id.js
deleted file mode 100644
index d607dd1..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/id.js
+++ /dev/null
@@ -1,93 +0,0 @@
-tinymce.Resource.add('tinymce.html-i18n.help-keynav.id',
-'Memulai navigasi keyboard \n' +
- '\n' +
- '\n' +
- ' Fokus pada bilah Menu \n' +
- ' Windows atau Linux: Alt+F9 \n' +
- ' macOS: ⌥F9 \n' +
- ' Fokus pada Bilah Alat \n' +
- ' Windows atau Linux: Alt+F10 \n' +
- ' macOS: ⌥F10 \n' +
- ' Fokus pada footer \n' +
- ' Windows atau Linux: Alt+F11 \n' +
- ' macOS: ⌥F11 \n' +
- ' Fokuskan pemberitahuan \n' +
- ' Windows atau Linux: Alt+F12 \n' +
- ' macOS: ⌥F12 \n' +
- ' Fokus pada bilah alat kontekstual \n' +
- ' Windows, Linux, atau macOS: Ctrl+F9 \n' +
- ' \n' +
- '\n' +
- 'Navigasi akan dimulai dari item pertama UI, yang akan disorot atau digarisbawahi di\n' +
- ' alur elemen Footer.
\n' +
- '\n' +
- 'Berpindah antar-bagian UI \n' +
- '\n' +
- 'Untuk berpindah dari satu bagian UI ke bagian berikutnya, tekan Tab .
\n' +
- '\n' +
- 'Untuk berpindah dari satu bagian UI ke bagian sebelumnya, tekan Shift+Tab .
\n' +
- '\n' +
- 'Urutan Tab bagian-bagian UI ini adalah:
\n' +
- '\n' +
- '\n' +
- ' Bilah menu \n' +
- ' Tiap grup bilah alat \n' +
- ' Bilah sisi \n' +
- ' Alur elemen di footer \n' +
- ' Tombol aktifkan/nonaktifkan jumlah kata di footer \n' +
- ' Tautan merek di footer \n' +
- ' Pengatur pengubahan ukuran editor di footer \n' +
- ' \n' +
- '\n' +
- 'Jika suatu bagian UI tidak ada, bagian tersebut dilewati.
\n' +
- '\n' +
- 'Jika fokus navigasi keyboard ada pada footer, tetapi tidak ada bilah sisi yang terlihat, menekan Shift+Tab \n' +
- ' akan memindahkan fokus ke grup bilah alat pertama, bukan yang terakhir.
\n' +
- '\n' +
- 'Berpindah di dalam bagian-bagian UI \n' +
- '\n' +
- 'Untuk berpindah dari satu elemen UI ke elemen berikutnya, tekan tombol Panah yang sesuai.
\n' +
- '\n' +
- 'Tombol panah Kiri dan Kanan untuk
\n' +
- '\n' +
- '\n' +
- ' berpindah-pindah antar-menu di dalam bilah menu. \n' +
- ' membuka sub-menu di dalam menu. \n' +
- ' berpindah-pindah antar-tombol di dalam grup bilah alat. \n' +
- ' berpindah-pindah antar-item di dalam alur elemen footer. \n' +
- ' \n' +
- '\n' +
- 'Tombol panah Bawah dan Atas untuk
\n' +
- '\n' +
- '\n' +
- ' berpindah-pindah antar-item menu di dalam menu. \n' +
- ' berpindah-pindah antar-item di dalam menu pop-up bilah alat. \n' +
- ' \n' +
- '\n' +
- 'Tombol Panah hanya bergerak di dalam bagian UI yang difokuskan.
\n' +
- '\n' +
- 'Untuk menutup menu, sub-menu, atau menu pop-up yang terbuka, tekan tombol Esc .
\n' +
- '\n' +
- 'Jika fokus sedang berada di ‘atas’ bagian UI tertentu, menekan tombol Esc juga dapat mengeluarkan fokus\n' +
- ' dari seluruh navigasi keyboard.
\n' +
- '\n' +
- 'Menjalankan item menu atau tombol bilah alat \n' +
- '\n' +
- 'Jika item menu atau tombol bilah alat yang diinginkan tersorot, tekan Return , Enter ,\n' +
- ' atau Spasi untuk menjalankan item.
\n' +
- '\n' +
- 'Berpindah dalam dialog tanpa tab \n' +
- '\n' +
- 'Dalam dialog tanpa tab, fokus diarahkan pada komponen interaktif pertama saat dialog terbuka.
\n' +
- '\n' +
- 'Berpindah di antara komponen dalam dialog interaktif dengan menekan Tab atau Shift+Tab .
\n' +
- '\n' +
- 'Berpindah dalam dialog dengan tab \n' +
- '\n' +
- 'Dalam dialog yang memiliki tab, fokus diarahkan pada tombol pertama di dalam menu saat dialog terbuka.
\n' +
- '\n' +
- 'Berpindah di antara komponen-komponen interaktif pada tab dialog ini dengan menekan Tab atau\n' +
- ' Shift+Tab .
\n' +
- '\n' +
- 'Beralih ke tab dialog lain dengan mengarahkan fokus pada menu tab lalu tekan tombol Panah \n' +
- ' yang sesuai untuk berpindah ke berbagai tab yang tersedia.
\n');
\ No newline at end of file
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/it.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/it.js
deleted file mode 100644
index 3a791c9..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/it.js
+++ /dev/null
@@ -1,93 +0,0 @@
-tinymce.Resource.add('tinymce.html-i18n.help-keynav.it',
-'Iniziare la navigazione tramite tastiera \n' +
- '\n' +
- '\n' +
- ' Impostare lo stato attivo per la barra dei menu \n' +
- ' Windows o Linux: ALT+F9 \n' +
- ' macOS: ⌥F9 \n' +
- ' Impostare lo stato attivo per la barra degli strumenti \n' +
- ' Windows o Linux: ALT+F10 \n' +
- ' macOS: ⌥F10 \n' +
- ' Impostare lo stato attivo per il piè di pagina \n' +
- ' Windows o Linux: ALT+F11 \n' +
- ' macOS: ⌥F11 \n' +
- ' Metti a fuoco la notifica \n' +
- ' Windows o Linux: ALT+F12 \n' +
- ' macOS: ⌥F12 \n' +
- ' Impostare lo stato attivo per la barra degli strumenti contestuale \n' +
- ' Windows, Linux o macOS: CTRL+F9 \n' +
- ' \n' +
- '\n' +
- "La navigazione inizierà dalla prima voce dell'interfaccia utente, che sarà evidenziata o sottolineata nel caso della prima voce\n" +
- " nel percorso dell'elemento del piè di pagina.
\n" +
- '\n' +
- "Navigare tra le sezioni dell'interfaccia utente \n" +
- '\n' +
- "Per passare da una sezione dell'interfaccia utente alla successiva, premere TAB .
\n" +
- '\n' +
- "Per passare da una sezione dell'interfaccia utente alla precedente, premere MAIUSC+TAB .
\n" +
- '\n' +
- "L'ordine di tabulazione di queste sezioni dell'interfaccia utente è:
\n" +
- '\n' +
- '\n' +
- ' Barra dei menu \n' +
- ' Ogni gruppo di barre degli strumenti \n' +
- ' Barra laterale \n' +
- " Percorso dell'elemento nel piè di pagina \n" +
- ' Pulsante di attivazione/disattivazione del conteggio delle parole nel piè di pagina \n' +
- ' Collegamento al marchio nel piè di pagina \n' +
- " Quadratino di ridimensionamento dell'editor nel piè di pagina \n" +
- ' \n' +
- '\n' +
- "Se una sezione dell'interfaccia utente non è presente, viene saltata.
\n" +
- '\n' +
- 'Se il piè di pagina ha lo stato attivo per la navigazione tramite tastiera e non è presente alcuna barra laterale visibile, premendo MAIUSC+TAB \n' +
- " si sposta lo stato attivo sul primo gruppo di barre degli strumenti, non sull'ultimo.
\n" +
- '\n' +
- "Navigare all'interno delle sezioni dell'interfaccia utente \n" +
- '\n' +
- "Per passare da un elemento dell'interfaccia utente al successivo, premere il tasto freccia appropriato.
\n" +
- '\n' +
- 'I tasti freccia Sinistra e Destra
\n' +
- '\n' +
- '\n' +
- ' consentono di spostarsi tra i menu della barra dei menu. \n' +
- ' aprono un sottomenu in un menu. \n' +
- ' consentono di spostarsi tra i pulsanti di un gruppo di barre degli strumenti. \n' +
- " consentono di spostarsi tra le voci nel percorso dell'elemento del piè di pagina. \n" +
- ' \n' +
- '\n' +
- 'I tasti freccia Giù e Su
\n' +
- '\n' +
- '\n' +
- ' consentono di spostarsi tra le voci di un menu. \n' +
- ' consentono di spostarsi tra le voci di un menu a comparsa della barra degli strumenti. \n' +
- ' \n' +
- '\n' +
- "I tasti freccia consentono di spostarsi all'interno della sezione dell'interfaccia utente con stato attivo.
\n" +
- '\n' +
- 'Per chiudere un menu aperto, un sottomenu aperto o un menu a comparsa aperto, premere il tasto ESC .
\n' +
- '\n' +
- "Se lo stato attivo corrente si trova nella parte superiore di una particolare sezione dell'interfaccia utente, premendo il tasto ESC si esce\n" +
- ' completamente dalla navigazione tramite tastiera.
\n' +
- '\n' +
- 'Eseguire una voce di menu o un pulsante della barra degli strumenti \n' +
- '\n' +
- 'Quando la voce di menu o il pulsante della barra degli strumenti desiderati sono evidenziati, premere il tasto diritorno a capo , il tasto Invio \n' +
- ' o la barra spaziatrice per eseguirli.
\n' +
- '\n' +
- 'Navigare nelle finestre di dialogo non a schede \n' +
- '\n' +
- "Nelle finestre di dialogo non a schede, all'apertura della finestra di dialogo diventa attivo il primo componente interattivo.
\n" +
- '\n' +
- 'Per spostarsi tra i componenti interattivi della finestra di dialogo, premere TAB o MAIUSC+TAB .
\n' +
- '\n' +
- 'Navigare nelle finestre di dialogo a schede \n' +
- '\n' +
- "Nelle finestre di dialogo a schede, all'apertura della finestra di dialogo diventa attivo il primo pulsante del menu della scheda.
\n" +
- '\n' +
- 'Per spostarsi tra i componenti interattivi di questa scheda della finestra di dialogo, premere TAB o\n' +
- ' MAIUSC+TAB .
\n' +
- '\n' +
- "Per passare a un'altra scheda della finestra di dialogo, attivare il menu della scheda e premere il tasto freccia \n" +
- ' appropriato per scorrere le schede disponibili.
\n');
\ No newline at end of file
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/ja.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/ja.js
deleted file mode 100644
index 26872db..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/ja.js
+++ /dev/null
@@ -1,93 +0,0 @@
-tinymce.Resource.add('tinymce.html-i18n.help-keynav.ja',
-'キーボード ナビゲーションの開始 \n' +
- '\n' +
- '\n' +
- ' メニュー バーをフォーカス \n' +
- ' Windows または Linux: Alt+F9 \n' +
- ' macOS: ⌥F9 \n' +
- ' ツール バーをフォーカス \n' +
- ' Windows または Linux: Alt+F10 \n' +
- ' macOS: ⌥F10 \n' +
- ' フッターをフォーカス \n' +
- ' Windows または Linux: Alt+F11 \n' +
- ' macOS: ⌥F11 \n' +
- ' 通知にフォーカス \n' +
- ' Windows または Linux: Alt+F12 \n' +
- ' macOS: ⌥F12 \n' +
- ' コンテキスト ツール バーをフォーカス \n' +
- ' Windows、Linux または macOS: Ctrl+F9 \n' +
- ' \n' +
- '\n' +
- 'ナビゲーションは最初の UI 項目から開始され、強調表示されるか、フッターの要素パスにある最初の項目の場合は\n' +
- ' 下線が引かれます。
\n' +
- '\n' +
- 'UI セクション間の移動 \n' +
- '\n' +
- '次の UI セクションに移動するには、Tab を押します。
\n' +
- '\n' +
- '前の UI セクションに移動するには、Shift+Tab を押します。
\n' +
- '\n' +
- 'これらの UI セクションの Tab の順序:
\n' +
- '\n' +
- '\n' +
- ' メニュー バー \n' +
- ' 各ツール バー グループ \n' +
- ' サイド バー \n' +
- ' フッターの要素パス \n' +
- ' フッターの単語数切り替えボタン \n' +
- ' フッターのブランド リンク \n' +
- ' フッターのエディター サイズ変更ハンドル \n' +
- ' \n' +
- '\n' +
- 'UI セクションが存在しない場合は、スキップされます。
\n' +
- '\n' +
- 'フッターにキーボード ナビゲーション フォーカスがあり、表示可能なサイド バーがない場合、Shift+Tab を押すと、\n' +
- ' フォーカスが最後ではなく最初のツール バー グループに移動します。
\n' +
- '\n' +
- 'UI セクション内の移動 \n' +
- '\n' +
- '次の UI 要素に移動するには、適切な矢印 キーを押します。
\n' +
- '\n' +
- '左矢印 と右矢印 のキー
\n' +
- '\n' +
- '\n' +
- ' メニュー バーのメニュー間で移動します。 \n' +
- ' メニュー内のサブメニューを開きます。 \n' +
- ' ツール バー グループのボタン間で移動します。 \n' +
- ' フッターの要素パスの項目間で移動します。 \n' +
- ' \n' +
- '\n' +
- '下矢印 と上矢印 のキー
\n' +
- '\n' +
- '\n' +
- ' メニュー内のメニュー項目間で移動します。 \n' +
- ' ツール バー ポップアップ メニュー内のメニュー項目間で移動します。 \n' +
- ' \n' +
- '\n' +
- '矢印 キーで、フォーカスされた UI セクション内で循環します。
\n' +
- '\n' +
- '開いたメニュー、開いたサブメニュー、開いたポップアップ メニューを閉じるには、Esc キーを押します。
\n' +
- '\n' +
- '現在のフォーカスが特定の UI セクションの「一番上」にある場合、Esc キーを押すと\n' +
- ' キーボード ナビゲーションも完全に閉じられます。
\n' +
- '\n' +
- 'メニュー項目またはツール バー ボタンの実行 \n' +
- '\n' +
- '目的のメニュー項目やツール バー ボタンが強調表示されている場合、リターン 、Enter 、\n' +
- ' またはスペース キー を押して項目を実行します。
\n' +
- '\n' +
- 'タブのないダイアログの移動 \n' +
- '\n' +
- 'タブのないダイアログでは、ダイアログが開くと最初の対話型コンポーネントがフォーカスされます。
\n' +
- '\n' +
- 'Tab または Shift+Tab を押して、対話型ダイアログ コンポーネント間で移動します。
\n' +
- '\n' +
- 'タブ付きダイアログの移動 \n' +
- '\n' +
- 'タブ付きダイアログでは、ダイアログが開くとタブ メニューの最初のボタンがフォーカスされます。
\n' +
- '\n' +
- 'Tab または\n' +
- ' Shift+Tab を押して、このダイアログ タブの対話型コンポーネント間で移動します。
\n' +
- '\n' +
- 'タブ メニューをフォーカスしてから適切な矢印 キーを押して表示可能なタブを循環して、\n' +
- ' 別のダイアログに切り替えます。
\n');
\ No newline at end of file
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/kk.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/kk.js
deleted file mode 100644
index e31532f..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/kk.js
+++ /dev/null
@@ -1,93 +0,0 @@
-tinymce.Resource.add('tinymce.html-i18n.help-keynav.kk',
-'Пернетақта навигациясын бастау \n' +
- '\n' +
- '\n' +
- ' Мәзір жолағын фокустау \n' +
- ' Windows немесе Linux: Alt+F9 \n' +
- ' macOS: ⌥F9 \n' +
- ' Құралдар тақтасын фокустау \n' +
- ' Windows немесе Linux: Alt+F10 \n' +
- ' macOS: ⌥F10 \n' +
- ' Төменгі деректемені фокустау \n' +
- ' Windows немесе Linux: Alt+F11 \n' +
- ' macOS: ⌥F11 \n' +
- ' Хабарландыруды белгілеу \n' +
- ' Windows немесе Linux: Alt+F12 \n' +
- ' macOS: ⌥F12 \n' +
- ' Мәтінмәндік құралдар тақтасын фокустау \n' +
- ' Windows, Linux немесе macOS: Ctrl+F9 \n' +
- ' \n' +
- '\n' +
- 'Навигация бөлектелетін немесе Төменгі деректеме элементінің жолындағы бірінші элемент жағдайында асты сызылатын\n' +
- ' бірінші ПИ элементінен басталады.
\n' +
- '\n' +
- 'ПИ бөлімдері арасында навигациялау \n' +
- '\n' +
- 'Бір ПИ бөлімінен келесісіне өту үшін Tab пернесін басыңыз.
\n' +
- '\n' +
- 'Бір ПИ бөлімінен алдыңғысына өту үшін Shift+Tab пернесін басыңыз.
\n' +
- '\n' +
- 'Осы ПИ бөлімдерінің Tab реті:
\n' +
- '\n' +
- '\n' +
- ' Мәзір жолағы \n' +
- ' Әрбір құралдар тақтасы тобы \n' +
- ' Бүйірлік жолақ \n' +
- ' Төменгі деректемедегі элемент жолы \n' +
- ' Төменгі деректемедегі сөздер санын ауыстыру түймесі \n' +
- ' Төменгі деректемедегі брендингтік сілтеме \n' +
- ' Төменгі деректемедегі редактор өлшемін өзгерту тұтқасы \n' +
- ' \n' +
- '\n' +
- 'ПИ бөлімі көрсетілмесе, ол өткізіп жіберіледі.
\n' +
- '\n' +
- 'Төменгі деректемеде пернетақта навигациясының фокусы болса және бүйірлік жолақ көрінбесе, Shift+Tab тіркесімін басу әрекеті\n' +
- ' фокусты соңғысы емес, бірінші құралдар тақтасы тобына жылжытады.
\n' +
- '\n' +
- 'ПИ бөлімдерінде навигациялау \n' +
- '\n' +
- 'Бір ПИ элементінен келесісіне өту үшін Arrow (Көрсеткі) пернесін басыңыз.
\n' +
- '\n' +
- 'Left (Сол жақ) және Right (Оң жақ) көрсеткі пернелері
\n' +
- '\n' +
- '\n' +
- ' мәзір жолағындағы мәзірлер арасында жылжыту. \n' +
- ' мәзірде ішкі мәзірді ашу. \n' +
- ' құралдар тақтасы тобындағы түймелер арасында жылжыту. \n' +
- ' төменгі деректеме элементінің жолындағы элементтер арасында жылжыту. \n' +
- ' \n' +
- '\n' +
- 'Down (Төмен) және Up (Жоғары) көрсеткі пернелері
\n' +
- '\n' +
- '\n' +
- ' мәзірдегі мәзір элементтері арасында жылжыту. \n' +
- ' құралдар тақтасының ашылмалы мәзіріндегі мәзір элементтері арасында жылжыту. \n' +
- ' \n' +
- '\n' +
- 'Фокусталған ПИ бөліміндегі Arrow (Көрсеткі) пернелерінің циклі.
\n' +
- '\n' +
- 'Ашық мәзірді жабу үшін ішкі мәзірді ашып немесе ашылмалы мәзірді ашып, Esc пернесін басыңыз.
\n' +
- '\n' +
- 'Ағымдағы фокус белгілі бір ПИ бөлімінің «үстінде» болса, Esc пернесін басу әрекеті пернетақта\n' +
- ' навигациясын толығымен жабады.
\n' +
- '\n' +
- 'Мәзір элементін немесе құралдар тақтасы түймесін орындау \n' +
- '\n' +
- 'Қажетті мәзір элементі немесе құралдар тақтасы түймесі бөлектелген кезде, элементті орындау үшін Return (Қайтару), Enter (Енгізу)\n' +
- ' немесе Space bar (Бос орын) пернесін басыңыз.
\n' +
- '\n' +
- 'Белгіленбеген диалог терезелерін навигациялау \n' +
- '\n' +
- 'Белгіленбеген диалог терезелерінде диалог терезесі ашылған кезде бірінші интерактивті құрамдас фокусталады.
\n' +
- '\n' +
- 'Tab немесе Shift+Tab пернесін басу арқылы интерактивті диалог терезесінің құрамдастары арасында навигациялаңыз.
\n' +
- '\n' +
- 'Белгіленген диалог терезелерін навигациялау \n' +
- '\n' +
- 'Белгіленген диалог терезелерінде диалог терезесі ашылған кезде қойынды мәзіріндегі бірінші түйме фокусталады.
\n' +
- '\n' +
- 'Tab немесе\n' +
- ' Shift+Tab пернесін басу арқылы осы диалог терезесі қойындысының интерактивті құрамдастары арасында навигациялаңыз.
\n' +
- '\n' +
- 'Қойынды мәзірінің фокусын беру арқылы басқа диалог терезесінің қойындысына ауысып, тиісті Arrow (Көрсеткі)\n' +
- ' пернесін басу арқылы қолжетімді қойындылар арасында айналдыруға болады.
\n');
\ No newline at end of file
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/ko_KR.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/ko_KR.js
deleted file mode 100644
index e7c8e7f..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/ko_KR.js
+++ /dev/null
@@ -1,93 +0,0 @@
-tinymce.Resource.add('tinymce.html-i18n.help-keynav.ko_KR',
-'키보드 탐색 시작 \n' +
- '\n' +
- '\n' +
- ' 메뉴 모음 포커스 표시 \n' +
- ' Windows 또는 Linux: Alt+F9 \n' +
- ' macOS: ⌥F9 \n' +
- ' 도구 모음 포커스 표시 \n' +
- ' Windows 또는 Linux: Alt+F10 \n' +
- ' macOS: ⌥F10 \n' +
- ' 푸터 포커스 표시 \n' +
- ' Windows 또는 Linux: Alt+F11 \n' +
- ' macOS: ⌥F11 \n' +
- ' 알림 포커스 \n' +
- ' Windows 또는 Linux: Alt+F12 \n' +
- ' macOS: ⌥F12 \n' +
- ' 컨텍스트 도구 모음에 포커스 표시 \n' +
- ' Windows, Linux 또는 macOS: Ctrl+F9 \n' +
- ' \n' +
- '\n' +
- '첫 번째 UI 항목에서 탐색이 시작되며, 이때 첫 번째 항목이 강조 표시되거나 푸터 요소 경로에 있는\n' +
- ' 경우 밑줄 표시됩니다.
\n' +
- '\n' +
- 'UI 섹션 간 탐색 \n' +
- '\n' +
- '한 UI 섹션에서 다음 UI 섹션으로 이동하려면 Tab(탭) 을 누릅니다.
\n' +
- '\n' +
- '한 UI 섹션에서 이전 UI 섹션으로 돌아가려면 Shift+Tab(시프트+탭) 을 누릅니다.
\n' +
- '\n' +
- '이 UI 섹션의 Tab(탭) 순서는 다음과 같습니다.
\n' +
- '\n' +
- '\n' +
- ' 메뉴 바 \n' +
- ' 각 도구 모음 그룹 \n' +
- ' 사이드바 \n' +
- ' 푸터의 요소 경로 \n' +
- ' 푸터의 단어 수 토글 버튼 \n' +
- ' 푸터의 브랜딩 링크 \n' +
- ' 푸터의 에디터 크기 변경 핸들 \n' +
- ' \n' +
- '\n' +
- 'UI 섹션이 없는 경우 건너뛰기합니다.
\n' +
- '\n' +
- '푸터에 키보드 탐색 포커스가 있고 사이드바는 보이지 않는 경우 Shift+Tab(시프트+탭) 을 누르면\n' +
- ' 포커스 표시가 마지막이 아닌 첫 번째 도구 모음 그룹으로 이동합니다.
\n' +
- '\n' +
- 'UI 섹션 내 탐색 \n' +
- '\n' +
- '한 UI 요소에서 다음 UI 요소로 이동하려면 적절한 화살표 키를 누릅니다.
\n' +
- '\n' +
- '왼쪽 과 오른쪽 화살표 키의 용도:
\n' +
- '\n' +
- '\n' +
- ' 메뉴 모음에서 메뉴 항목 사이를 이동합니다. \n' +
- ' 메뉴에서 하위 메뉴를 엽니다. \n' +
- ' 도구 모음 그룹에서 버튼 사이를 이동합니다. \n' +
- ' 푸터의 요소 경로에서 항목 간에 이동합니다. \n' +
- ' \n' +
- '\n' +
- '아래 와 위 화살표 키의 용도:
\n' +
- '\n' +
- '\n' +
- ' 메뉴에서 메뉴 항목 사이를 이동합니다. \n' +
- ' 도구 모음 팝업 메뉴에서 메뉴 항목 사이를 이동합니다. \n' +
- ' \n' +
- '\n' +
- '화살표 키는 포커스 표시 UI 섹션 내에서 순환됩니다.
\n' +
- '\n' +
- '열려 있는 메뉴, 열려 있는 하위 메뉴 또는 열려 있는 팝업 메뉴를 닫으려면 Esc 키를 누릅니다.
\n' +
- '\n' +
- "현재 포커스 표시가 특정 UI 섹션 '상단'에 있는 경우 이때도 Esc 키를 누르면\n" +
- ' 키보드 탐색이 완전히 종료됩니다.
\n' +
- '\n' +
- '메뉴 항목 또는 도구 모음 버튼 실행 \n' +
- '\n' +
- '원하는 메뉴 항목 또는 도구 모음 버튼이 강조 표시되어 있을 때 Return(리턴) , Enter(엔터) ,\n' +
- ' 또는 Space bar(스페이스바) 를 눌러 해당 항목을 실행합니다.
\n' +
- '\n' +
- '탭이 없는 대화 탐색 \n' +
- '\n' +
- '탭이 없는 대화의 경우, 첫 번째 대화형 요소가 포커스 표시된 상태로 대화가 열립니다.
\n' +
- '\n' +
- '대화형 요소들 사이를 이동할 때는 Tab(탭) 또는 Shift+Tab(시프트+탭) 을 누릅니다.
\n' +
- '\n' +
- '탭이 있는 대화 탐색 \n' +
- '\n' +
- '탭이 있는 대화의 경우, 탭 메뉴에서 첫 번째 버튼이 포커스 표시된 상태로 대화가 열립니다.
\n' +
- '\n' +
- '이 대화 탭의 대화형 요소들 사이를 이동할 때는 Tab(탭) 또는\n' +
- ' Shift+Tab(시프트+탭) 을 누릅니다.
\n' +
- '\n' +
- '다른 대화 탭으로 이동하려면 탭 메뉴를 포커스 표시한 다음 적절한 화살표 \n' +
- ' 키를 눌러 사용 가능한 탭들을 지나 원하는 탭으로 이동합니다.
\n');
\ No newline at end of file
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/ms.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/ms.js
deleted file mode 100644
index 2c047bb..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/ms.js
+++ /dev/null
@@ -1,93 +0,0 @@
-tinymce.Resource.add('tinymce.html-i18n.help-keynav.ms',
-'Mulakan navigasi papan kekunci \n' +
- '\n' +
- '\n' +
- ' Fokus bar Menu \n' +
- ' Windows atau Linux: Alt+F9 \n' +
- ' macOS: ⌥F9 \n' +
- ' Fokus Bar Alat \n' +
- ' Windows atau Linux: Alt+F10 \n' +
- ' macOS: ⌥F10 \n' +
- ' Fokus pengaki \n' +
- ' Windows atau Linux: Alt+F11 \n' +
- ' macOS: ⌥F11 \n' +
- ' Tumpu kepada pemberitahuan \n' +
- ' Windows atau Linux: Alt+F12 \n' +
- ' macOS: ⌥F12 \n' +
- ' Fokus bar alat kontekstual \n' +
- ' Windows, Linux atau macOS: Ctrl+F9 \n' +
- ' \n' +
- '\n' +
- 'Navigasi akan bermula pada item UI pertama, yang akan diserlahkan atau digaris bawah dalam saiz item pertama dalam\n' +
- ' laluan elemen Pengaki.
\n' +
- '\n' +
- 'Navigasi antara bahagian UI \n' +
- '\n' +
- 'Untuk bergerak dari satu bahagian UI ke yang seterusnya, tekan Tab .
\n' +
- '\n' +
- 'Untuk bergerak dari satu bahagian UI ke yang sebelumnya, tekan Shift+Tab .
\n' +
- '\n' +
- 'Tertib Tab bahagian UI ini ialah:
\n' +
- '\n' +
- '\n' +
- ' Bar menu \n' +
- ' Setiap kumpulan bar alat \n' +
- ' Bar sisi \n' +
- ' Laluan elemen dalam pengaki \n' +
- ' Butang togol kiraan perkataan dalam pengaki \n' +
- ' Pautan penjenamaan dalam pengaki \n' +
- ' Pemegang saiz semula editor dalam pengaki \n' +
- ' \n' +
- '\n' +
- 'Jika bahagian UI tidak wujud, ia dilangkau.
\n' +
- '\n' +
- 'Jika pengaki mempunyai fokus navigasi papan kekunci dan tiada bar sisi kelihatan, menekan Shift+Tab \n' +
- ' akan mengalihkan fokus ke kumpulan bar alat pertama, bukannya yang terakhir.
\n' +
- '\n' +
- 'Navigasi dalam bahagian UI \n' +
- '\n' +
- 'Untuk bergerak dari satu elemen UI ke yang seterusnya, tekan kekunci Anak Panah yang bersesuaian.
\n' +
- '\n' +
- 'Kekunci anak panah Kiri dan Kanan
\n' +
- '\n' +
- '\n' +
- ' bergerak antara menu dalam bar menu. \n' +
- ' membukan submenu dalam menu. \n' +
- ' bergerak antara butang dalam kumpulan bar alat. \n' +
- ' Laluan elemen dalam pengaki. \n' +
- ' \n' +
- '\n' +
- 'Kekunci anak panah Bawah dan Atas
\n' +
- '\n' +
- '\n' +
- ' bergerak antara item menu dalam menu. \n' +
- ' bergerak antara item dalam menu timbul bar alat. \n' +
- ' \n' +
- '\n' +
- 'Kekunci Anak Panah berkitar dalam bahagian UI difokuskan.
\n' +
- '\n' +
- 'Untuk menutup menu buka, submenu terbuka atau menu timbul terbuka, tekan kekunci Esc .
\n' +
- '\n' +
- "Jika fokus semasa berada di bahagian 'atas' bahagian UI tertentu, menekan kekunci Esc juga akan keluar daripada\n" +
- ' navigasi papan kekunci sepenuhnya.
\n' +
- '\n' +
- 'Laksanakan item menu atau butang bar alat \n' +
- '\n' +
- 'Apabila item menu atau butang bar alat yang diinginkan diserlahkan, tekan Return , Enter ,\n' +
- ' atau bar Space untuk melaksanakan item.
\n' +
- '\n' +
- 'Navigasi ke dialog tidak bertab \n' +
- '\n' +
- 'Dalam dialog tidak bertab, komponen interaksi pertama difokuskan apabila dialog dibuka.
\n' +
- '\n' +
- 'Navigasi antara komponen dialog interaktif dengan menekan Tab atau Shift+Tab .
\n' +
- '\n' +
- 'Navigasi ke dialog bertab \n' +
- '\n' +
- 'Dalam dialog bertab, butang pertama dalam menu tab difokuskan apabila dialog dibuka.
\n' +
- '\n' +
- 'Navigasi antara komponen interaktif tab dialog ini dengan menekan Tab atau\n' +
- ' Shift+Tab .
\n' +
- '\n' +
- 'Tukar kepada tab dialog lain dengan memfokuskan menu tab, kemudian menekan kekunci Anak Panah yang bersesuaian\n' +
- ' untuk berkitar menerusi tab yang tersedia.
\n');
\ No newline at end of file
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/nb_NO.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/nb_NO.js
deleted file mode 100644
index 071e3f5..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/nb_NO.js
+++ /dev/null
@@ -1,93 +0,0 @@
-tinymce.Resource.add('tinymce.html-i18n.help-keynav.nb_NO',
-'Starte tastaturnavigering \n' +
- '\n' +
- '\n' +
- ' Utheve menylinjen \n' +
- ' Windows eller Linux: Alt + F9 \n' +
- ' macOS: ⌥F9 \n' +
- ' Utheve verktøylinjen \n' +
- ' Windows eller Linux: Alt + F10 \n' +
- ' macOS: ⌥F10 \n' +
- ' Utheve bunnteksten \n' +
- ' Windows eller Linux: Alt + F11 \n' +
- ' macOS: ⌥F11 \n' +
- ' Fokuser på varselet \n' +
- ' Windows eller Linux: Alt+F12 \n' +
- ' macOS: ⌥F12 \n' +
- ' Utheve en kontekstuell verktøylinje \n' +
- ' Windows, Linux eller macOS: Ctrl + F9 \n' +
- ' \n' +
- '\n' +
- 'Navigeringen starter ved det første grensesnittelementet, som utheves, eller understrekes når det gjelder det første elementet i\n' +
- ' elementstien i bunnteksten.
\n' +
- '\n' +
- 'Navigere mellom grensesnittdeler \n' +
- '\n' +
- 'Du kan bevege deg fra én grensesnittdel til den neste ved å trykke på tabulatortasten .
\n' +
- '\n' +
- 'Du kan bevege deg fra én grensesnittdel til den forrige ved å trykke på Shift + tabulatortasten .
\n' +
- '\n' +
- 'Rekkefølgen til tabulatortasten gjennom grensesnittdelene er:
\n' +
- '\n' +
- '\n' +
- ' Menylinjen \n' +
- ' Hver gruppe på verktøylinjen \n' +
- ' Sidestolpen \n' +
- ' Elementstien i bunnteksten \n' +
- ' Veksleknappen for ordantall i bunnteksten \n' +
- ' Merkelenken i bunnteksten \n' +
- ' Skaleringshåndtaket for redigeringsprogrammet i bunnteksten \n' +
- ' \n' +
- '\n' +
- 'Hvis en grensesnittdel ikke er til stede, blir den hoppet over.
\n' +
- '\n' +
- 'Hvis tastaturnavigeringen har uthevet bunnteksten og det ikke finnes en synlig sidestolpe, kan du trykke på Shift + tabulatortasten \n' +
- ' for å flytte fokuset til den første gruppen på verktøylinjen i stedet for den siste.
\n' +
- '\n' +
- 'Navigere innenfor grensesnittdeler \n' +
- '\n' +
- 'Du kan bevege deg fra ett grensesnittelement til det neste ved å trykke på den aktuelle piltasten .
\n' +
- '\n' +
- 'De venstre og høyre piltastene
\n' +
- '\n' +
- '\n' +
- ' beveger deg mellom menyer på menylinjen. \n' +
- ' åpner en undermeny i en meny. \n' +
- ' beveger deg mellom knapper i en gruppe på verktøylinjen. \n' +
- ' beveger deg mellom elementer i elementstien i bunnteksten. \n' +
- ' \n' +
- '\n' +
- 'Ned - og opp -piltastene
\n' +
- '\n' +
- '\n' +
- ' beveger deg mellom menyelementer i en meny. \n' +
- ' beveger deg mellom elementer i en hurtigmeny på verktøylinjen. \n' +
- ' \n' +
- '\n' +
- 'Med piltastene kan du bevege deg innenfor den uthevede grensesnittdelen.
\n' +
- '\n' +
- 'Du kan lukke en åpen meny, en åpen undermeny eller en åpen hurtigmeny ved å klikke på Esc -tasten.
\n' +
- '\n' +
- 'Hvis det øverste nivået i en grensesnittdel er uthevet, kan du ved å trykke på Esc også avslutte\n' +
- ' tastaturnavigeringen helt.
\n' +
- '\n' +
- 'Utføre et menyelement eller en knapp på en verktøylinje \n' +
- '\n' +
- 'Når det ønskede menyelementet eller verktøylinjeknappen er uthevet, trykker du på Retur , Enter ,\n' +
- ' eller mellomromstasten for å utføre elementet.
\n' +
- '\n' +
- 'Navigere i dialogbokser uten faner \n' +
- '\n' +
- 'I dialogbokser uten faner blir den første interaktive komponenten uthevet når dialogboksen åpnes.
\n' +
- '\n' +
- 'Naviger mellom interaktive komponenter i dialogboksen ved å trykke på tabulatortasten eller Shift + tabulatortasten .
\n' +
- '\n' +
- 'Navigere i fanebaserte dialogbokser \n' +
- '\n' +
- 'I fanebaserte dialogbokser blir den første knappen i fanemenyen uthevet når dialogboksen åpnes.
\n' +
- '\n' +
- 'Naviger mellom interaktive komponenter i fanen ved å trykke på tabulatortasten eller\n' +
- ' Shift + tabulatortasten .
\n' +
- '\n' +
- 'Veksle til en annen fane i dialogboksen ved å utheve fanemenyen, og trykk deretter på den aktuelle piltasten \n' +
- ' for å bevege deg mellom de tilgjengelige fanene.
\n');
\ No newline at end of file
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/nl.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/nl.js
deleted file mode 100644
index 05c07ae..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/nl.js
+++ /dev/null
@@ -1,93 +0,0 @@
-tinymce.Resource.add('tinymce.html-i18n.help-keynav.nl',
-'Toetsenbordnavigatie starten \n' +
- '\n' +
- '\n' +
- ' Focus op de menubalk instellen \n' +
- ' Windows of Linux: Alt+F9 \n' +
- ' macOS: ⌥F9 \n' +
- ' Focus op de werkbalk instellen \n' +
- ' Windows of Linux: Alt+F10 \n' +
- ' macOS: ⌥F10 \n' +
- ' Focus op de voettekst instellen \n' +
- ' Windows of Linux: Alt+F11 \n' +
- ' macOS: ⌥F11 \n' +
- ' Focus op de melding instellen \n' +
- ' Windows of Linux: Alt+F12 \n' +
- ' macOS: ⌥F12 \n' +
- ' Focus op een contextuele werkbalk instellen \n' +
- ' Windows, Linux of macOS: Ctrl+F9 \n' +
- ' \n' +
- '\n' +
- 'De navigatie start bij het eerste UI-item, dat wordt gemarkeerd of onderstreept als het eerste item zich in\n' +
- ' in het elementenpad van de voettekst bevindt.
\n' +
- '\n' +
- 'Navigeren tussen UI-secties \n' +
- '\n' +
- 'Druk op Tab om naar de volgende UI-sectie te gaan.
\n' +
- '\n' +
- 'Druk op Shift+Tab om naar de vorige UI-sectie te gaan.
\n' +
- '\n' +
- 'De Tab -volgorde van deze UI-secties is:
\n' +
- '\n' +
- '\n' +
- ' Menubalk \n' +
- ' Elke werkbalkgroep \n' +
- ' Zijbalk \n' +
- ' Elementenpad in de voettekst \n' +
- ' Wisselknop voor aantal woorden in de voettekst \n' +
- ' Merkkoppeling in de voettekst \n' +
- ' Greep voor het wijzigen van het formaat van de editor in de voettekst \n' +
- ' \n' +
- '\n' +
- 'Als een UI-sectie niet aanwezig is, wordt deze overgeslagen.
\n' +
- '\n' +
- 'Als de focus van de toetsenbordnavigatie is ingesteld op de voettekst en er geen zichtbare zijbalk is, kun je op Shift+Tab drukken\n' +
- ' om de focus naar de eerste werkbalkgroep in plaats van de laatste te verplaatsen.
\n' +
- '\n' +
- 'Navigeren binnen UI-secties \n' +
- '\n' +
- 'Druk op de pijltjestoets om naar het betreffende UI-element te gaan.
\n' +
- '\n' +
- 'Met de pijltjestoetsen Links en Rechts
\n' +
- '\n' +
- '\n' +
- " wissel je tussen menu's in de menubalk. \n" +
- ' open je een submenu in een menu. \n' +
- ' wissel je tussen knoppen in een werkbalkgroep. \n' +
- ' wissel je tussen items in het elementenpad in de voettekst. \n' +
- ' \n' +
- '\n' +
- 'Met de pijltjestoetsen Omlaag en Omhoog
\n' +
- '\n' +
- '\n' +
- ' wissel je tussen menu-items in een menu. \n' +
- ' wissel je tussen items in een werkbalkpop-upmenu. \n' +
- ' \n' +
- '\n' +
- 'Met de pijltjestoetsen wissel je binnen de UI-sectie waarop de focus is ingesteld.
\n' +
- '\n' +
- 'Druk op de toets Esc om een geopend menu, submenu of pop-upmenu te sluiten.
\n' +
- '\n' +
- "Als de huidige focus is ingesteld 'bovenaan' een bepaalde UI-sectie, kun je op de toets Esc drukken\n" +
- ' om de toetsenbordnavigatie af te sluiten.
\n' +
- '\n' +
- 'Een menu-item of werkbalkknop uitvoeren \n' +
- '\n' +
- 'Als het gewenste menu-item of de gewenste werkbalkknop is gemarkeerd, kun je op Return , Enter \n' +
- ' of de spatiebalk drukken om het item uit te voeren.
\n' +
- '\n' +
- 'Navigeren in dialoogvensters zonder tabblad \n' +
- '\n' +
- 'Als een dialoogvenster zonder tabblad wordt geopend, wordt de focus ingesteld op het eerste interactieve onderdeel.
\n' +
- '\n' +
- 'Je kunt navigeren tussen interactieve onderdelen van een dialoogvenster door op Tab of Shift+Tab te drukken.
\n' +
- '\n' +
- 'Navigeren in dialoogvensters met tabblad \n' +
- '\n' +
- 'Als een dialoogvenster met tabblad wordt geopend, wordt de focus ingesteld op de eerste knop in het tabbladmenu.
\n' +
- '\n' +
- 'Je kunt navigeren tussen interactieve onderdelen van dit tabblad van het dialoogvenster door op Tab of\n' +
- ' Shift+Tab te drukken.
\n' +
- '\n' +
- 'Je kunt overschakelen naar een ander tabblad van het dialoogvenster door de focus in te stellen op het tabbladmenu en vervolgens op de juiste pijltjestoets \n' +
- ' te drukken om tussen de beschikbare tabbladen te wisselen.
\n');
\ No newline at end of file
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/pl.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/pl.js
deleted file mode 100644
index e89f808..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/pl.js
+++ /dev/null
@@ -1,93 +0,0 @@
-tinymce.Resource.add('tinymce.html-i18n.help-keynav.pl',
-'Początek nawigacji przy użyciu klawiatury \n' +
- '\n' +
- '\n' +
- ' Ustaw fokus na pasek menu \n' +
- ' Windows lub Linux: Alt+F9 \n' +
- ' macOS: ⌥F9 \n' +
- ' Ustaw fokus na pasek narzędzi \n' +
- ' Windows lub Linux: Alt+F10 \n' +
- ' macOS: ⌥F10 \n' +
- ' Ustaw fokus na sekcję Footer \n' +
- ' Windows lub Linux: Alt+F11 \n' +
- ' macOS: ⌥F11 \n' +
- ' Skup się na powiadomieniu \n' +
- ' Windows lub Linux: Alt+F12 \n' +
- ' macOS: ⌥F12 \n' +
- ' Ustaw fokus na kontekstowy pasek narzędzi \n' +
- ' Windows, Linux lub macOS: Ctrl+F9 \n' +
- ' \n' +
- '\n' +
- 'Nawigacja zostanie rozpoczęta od pierwszego elementu interfejsu użytkownika, który jest podświetlony lub — w przypadku pierwszego elementu\n' +
- ' w ścieżce elementów w sekcji Footer — podkreślony.
\n' +
- '\n' +
- 'Nawigacja pomiędzy sekcjami interfejsu użytkownika \n' +
- '\n' +
- 'Aby przenieść się z danej sekcji interfejsu użytkownika do następnej, naciśnij Tab .
\n' +
- '\n' +
- 'Aby przenieść się z danej sekcji interfejsu użytkownika do poprzedniej, naciśnij Shift+Tab .
\n' +
- '\n' +
- 'Kolejność klawisza Tab w takich sekcjach interfejsu użytkownika jest następująca:
\n' +
- '\n' +
- '\n' +
- ' Pasek menu \n' +
- ' Każda grupa na pasku narzędzi \n' +
- ' Pasek boczny \n' +
- ' Ścieżka elementów w sekcji Footer \n' +
- ' Przycisk przełączania liczby słów w sekcji Footer \n' +
- ' Łącze brandujące w sekcji Footer \n' +
- ' Uchwyt zmiany rozmiaru edytora w sekcji Footer \n' +
- ' \n' +
- '\n' +
- 'Jeżeli nie ma sekcji interfejsu użytkownika, jest to pomijane.
\n' +
- '\n' +
- 'Jeżeli na sekcji Footer jest ustawiony fokus nawigacji przy użyciu klawiatury i nie ma widocznego paska bocznego, naciśnięcie Shift+Tab \n' +
- ' przenosi fokus na pierwszą grupę paska narzędzi, a nie na ostatnią.
\n' +
- '\n' +
- 'Nawigacja wewnątrz sekcji interfejsu użytkownika \n' +
- '\n' +
- 'Aby przenieść się z danego elementu interfejsu użytkownika do następnego, naciśnij odpowiedni klawisz strzałki .
\n' +
- '\n' +
- 'Klawisze strzałek w prawo i w lewo służą do
\n' +
- '\n' +
- '\n' +
- ' przenoszenia się pomiędzy menu na pasku menu, \n' +
- ' otwarcia podmenu w menu, \n' +
- ' przenoszenia się pomiędzy przyciskami w grupie paska narzędzi, \n' +
- ' przenoszenia się pomiędzy elementami w ścieżce elementów w sekcji Footer. \n' +
- ' \n' +
- '\n' +
- 'Klawisze strzałek w dół i w górę służą do
\n' +
- '\n' +
- '\n' +
- ' przenoszenia się pomiędzy elementami menu w menu, \n' +
- ' przenoszenia się pomiędzy elementami w wyskakującym menu paska narzędzi. \n' +
- ' \n' +
- '\n' +
- 'Klawisze strzałek służą do przemieszczania się w sekcji interfejsu użytkownika z ustawionym fokusem.
\n' +
- '\n' +
- 'Aby zamknąć otwarte menu, otwarte podmenu lub otwarte menu wyskakujące, naciśnij klawisz Esc .
\n' +
- '\n' +
- 'Jeżeli fokus jest ustawiony na górze konkretnej sekcji interfejsu użytkownika, naciśnięcie klawisza Esc powoduje wyjście\n' +
- ' z nawigacji przy użyciu klawiatury.
\n' +
- '\n' +
- 'Wykonanie elementu menu lub przycisku paska narzędzi \n' +
- '\n' +
- 'Gdy podświetlony jest żądany element menu lub przycisk paska narzędzi, naciśnij klawisz Return , Enter \n' +
- ' lub Spacja , aby go wykonać.
\n' +
- '\n' +
- 'Nawigacja po oknie dialogowym bez kart \n' +
- '\n' +
- 'Gdy otwiera się okno dialogowe bez kart, fokus ustawiany jest na pierwszą interaktywną część okna.
\n' +
- '\n' +
- 'Pomiędzy interaktywnymi częściami okna dialogowego nawiguj, naciskając klawisze Tab lub Shift+Tab .
\n' +
- '\n' +
- 'Nawigacja po oknie dialogowym z kartami \n' +
- '\n' +
- 'W przypadku okna dialogowego z kartami po otwarciu okna dialogowego fokus ustawiany jest na pierwszy przycisk w menu karty.
\n' +
- '\n' +
- 'Nawigację pomiędzy interaktywnymi częściami karty okna dialogowego prowadzi się poprzez naciskanie klawiszy Tab lub\n' +
- ' Shift+Tab .
\n' +
- '\n' +
- 'Przełączenie się na inną kartę okna dialogowego wykonuje się poprzez ustawienie fokusu na menu karty i naciśnięcie odpowiedniego klawisza strzałki \n' +
- ' w celu przemieszczenia się pomiędzy dostępnymi kartami.
\n');
\ No newline at end of file
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/pt_BR.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/pt_BR.js
deleted file mode 100644
index 2938fcf..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/pt_BR.js
+++ /dev/null
@@ -1,93 +0,0 @@
-tinymce.Resource.add('tinymce.html-i18n.help-keynav.pt_BR',
-'Iniciar navegação pelo teclado \n' +
- '\n' +
- '\n' +
- ' Foco na barra de menus \n' +
- ' Windows ou Linux: Alt+F9 \n' +
- ' macOS: ⌥F9 \n' +
- ' Foco na barra de ferramentas \n' +
- ' Windows ou Linux: Alt+F10 \n' +
- ' macOS: ⌥F10 \n' +
- ' Foco no rodapé \n' +
- ' Windows ou Linux: Alt+F11 \n' +
- ' macOS: ⌥F11 \n' +
- ' Foco na notificação \n' +
- ' Windows ou Linux: Alt+F12 \n' +
- ' macOS: ⌥F12 \n' +
- ' Foco na barra de ferramentas contextual \n' +
- ' Windows, Linux ou macOS: Ctrl+F9 \n' +
- ' \n' +
- '\n' +
- 'A navegação inicia no primeiro item da IU, que será destacado ou sublinhado no caso do primeiro item no\n' +
- ' caminho do elemento Rodapé.
\n' +
- '\n' +
- 'Navegar entre seções da IU \n' +
- '\n' +
- 'Para ir de uma seção da IU para a seguinte, pressione Tab .
\n' +
- '\n' +
- 'Para ir de uma seção da IU para a anterior, pressione Shift+Tab .
\n' +
- '\n' +
- 'A ordem de Tab destas seções da IU é:
\n' +
- '\n' +
- '\n' +
- ' Barra de menus \n' +
- ' Cada grupo da barra de ferramentas \n' +
- ' Barra lateral \n' +
- ' Caminho do elemento no rodapé \n' +
- ' Botão de alternar contagem de palavras no rodapé \n' +
- ' Link da marca no rodapé \n' +
- ' Alça de redimensionamento do editor no rodapé \n' +
- ' \n' +
- '\n' +
- 'Se não houver uma seção da IU, ela será pulada.
\n' +
- '\n' +
- 'Se o rodapé tiver o foco da navegação pelo teclado e não houver uma barra lateral visível, pressionar Shift+Tab \n' +
- ' move o foco para o primeiro grupo da barra de ferramentas, não para o último.
\n' +
- '\n' +
- 'Navegar dentro das seções da IU \n' +
- '\n' +
- 'Para ir de um elemento da IU para o seguinte, pressione a Seta correspondente.
\n' +
- '\n' +
- 'As teclas de seta Esquerda e Direita
\n' +
- '\n' +
- '\n' +
- ' movem entre menus na barra de menus. \n' +
- ' abrem um submenu em um menu. \n' +
- ' movem entre botões em um grupo da barra de ferramentas. \n' +
- ' movem entre itens no caminho do elemento do rodapé. \n' +
- ' \n' +
- '\n' +
- 'As teclas de seta Abaixo e Acima
\n' +
- '\n' +
- '\n' +
- ' movem entre itens de menu em um menu. \n' +
- ' movem entre itens em um menu suspenso da barra de ferramentas. \n' +
- ' \n' +
- '\n' +
- 'As teclas de Seta alternam dentre a seção da IU em foco.
\n' +
- '\n' +
- 'Para fechar um menu aberto, um submenu aberto ou um menu suspenso aberto, pressione Esc .
\n' +
- '\n' +
- 'Se o foco atual estiver no ‘alto’ de determinada seção da IU, pressionar Esc também sai\n' +
- ' totalmente da navegação pelo teclado.
\n' +
- '\n' +
- 'Executar um item de menu ou botão da barra de ferramentas \n' +
- '\n' +
- 'Com o item de menu ou botão da barra de ferramentas desejado destacado, pressione Return , Enter ,\n' +
- ' ou a Barra de espaço para executar o item.
\n' +
- '\n' +
- 'Navegar por caixas de diálogo sem guias \n' +
- '\n' +
- 'Em caixas de diálogo sem guias, o primeiro componente interativo recebe o foco quando a caixa de diálogo abre.
\n' +
- '\n' +
- 'Navegue entre componentes interativos de caixa de diálogo pressionando Tab ou Shift+Tab .
\n' +
- '\n' +
- 'Navegar por caixas de diálogo com guias \n' +
- '\n' +
- 'Em caixas de diálogo com guias, o primeiro botão no menu da guia recebe o foco quando a caixa de diálogo abre.
\n' +
- '\n' +
- 'Navegue entre componentes interativos dessa guia da caixa de diálogo pressionando Tab ou\n' +
- ' Shift+Tab .
\n' +
- '\n' +
- 'Alterne para outra guia da caixa de diálogo colocando o foco no menu da guia e pressionando a Seta \n' +
- ' adequada para percorrer as guias disponíveis.
\n');
\ No newline at end of file
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/pt_PT.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/pt_PT.js
deleted file mode 100644
index 03da3d6..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/pt_PT.js
+++ /dev/null
@@ -1,93 +0,0 @@
-tinymce.Resource.add('tinymce.html-i18n.help-keynav.pt_PT',
-'Iniciar navegação com teclado \n' +
- '\n' +
- '\n' +
- ' Foco na barra de menu \n' +
- ' Windows ou Linux: Alt+F9 \n' +
- ' macOS: ⌥F9 \n' +
- ' Foco na barra de ferramentas \n' +
- ' Windows ou Linux: Alt+F10 \n' +
- ' macOS: ⌥F10 \n' +
- ' Foco no rodapé \n' +
- ' Windows ou Linux: Alt+F11 \n' +
- ' macOS: ⌥F11 \n' +
- ' Focar a notificação \n' +
- ' Windows ou Linux: Alt+F12 \n' +
- ' macOS: ⌥F12 \n' +
- ' Foco numa barra de ferramentas contextual \n' +
- ' Windows, Linux ou macOS: Ctrl+F9 \n' +
- ' \n' +
- '\n' +
- 'A navegação começará no primeiro item de IU, que estará realçado ou sublinhado, no caso do primeiro item no\n' +
- ' caminho do elemento do rodapé.
\n' +
- '\n' +
- 'Navegar entre secções de IU \n' +
- '\n' +
- 'Para se mover de uma secção de IU para a seguinte, prima Tab .
\n' +
- '\n' +
- 'Para se mover de uma secção de IU para a anterior, prima Shift+Tab .
\n' +
- '\n' +
- 'A ordem de tabulação destas secções de IU é:
\n' +
- '\n' +
- '\n' +
- ' Barra de menu \n' +
- ' Cada grupo da barra de ferramentas \n' +
- ' Barra lateral \n' +
- ' Caminho do elemento no rodapé \n' +
- ' Botão de alternar da contagem de palavras no rodapé \n' +
- ' Ligação da marca no rodapé \n' +
- ' Alça de redimensionamento do editor no rodapé \n' +
- ' \n' +
- '\n' +
- 'Se uma secção de IU não estiver presente, é ignorada.
\n' +
- '\n' +
- 'Se o rodapé tiver foco de navegação com teclado e não existir uma barra lateral visível, premir Shift+Tab \n' +
- ' move o foco para o primeiro grupo da barra de ferramentas e não para o último.
\n' +
- '\n' +
- 'Navegar nas secções de IU \n' +
- '\n' +
- 'Para se mover de um elemento de IU para o seguinte, prima a tecla de seta adequada.
\n' +
- '\n' +
- 'As teclas de seta Para a esquerda e Para a direita
\n' +
- '\n' +
- '\n' +
- ' movem-se entre menus na barra de menu. \n' +
- ' abrem um submenu num menu. \n' +
- ' movem-se entre botões num grupo da barra de ferramentas. \n' +
- ' movem-se entre itens no caminho do elemento do rodapé. \n' +
- ' \n' +
- '\n' +
- 'As teclas de seta Para cima e Para baixo
\n' +
- '\n' +
- '\n' +
- ' movem-se entre itens de menu num menu. \n' +
- ' movem-se entre itens num menu de pop-up da barra de ferramentas. \n' +
- ' \n' +
- '\n' +
- 'As teclas de seta deslocam-se ciclicamente na secção de IU em foco.
\n' +
- '\n' +
- 'Para fechar um menu aberto, um submenu aberto ou um menu de pop-up aberto, prima a tecla Esc .
\n' +
- '\n' +
- 'Se o foco atual estiver no "topo" de determinada secção de IU, premir a tecla Esc também fecha\n' +
- ' completamente a navegação com teclado.
\n' +
- '\n' +
- 'Executar um item de menu ou botão da barra de ferramentas \n' +
- '\n' +
- 'Quando o item de menu ou o botão da barra de ferramentas pretendido estiver realçado, prima Retrocesso , Enter \n' +
- ' ou a Barra de espaço para executar o item.
\n' +
- '\n' +
- 'Navegar em diálogos sem separadores \n' +
- '\n' +
- 'Nos diálogos sem separadores, o primeiro componente interativo fica em foco quando o diálogo abre.
\n' +
- '\n' +
- 'Navegue entre componentes interativos do diálogo, premindo Tab ou Shift+Tab .
\n' +
- '\n' +
- 'Navegar em diálogos com separadores \n' +
- '\n' +
- 'Nos diálogos com separadores, o primeiro botão no menu do separador fica em foco quando o diálogo abre.
\n' +
- '\n' +
- 'Navegue entre os componentes interativos deste separador do diálogo, premindo Tab ou\n' +
- ' Shift+Tab .
\n' +
- '\n' +
- 'Mude para outro separador do diálogo colocando o menu do separador em foco e, em seguida, premindo a tecla de seta \n' +
- ' adequada para se deslocar ciclicamente pelos separadores disponíveis.
\n');
\ No newline at end of file
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/ro.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/ro.js
deleted file mode 100644
index 38d3441..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/ro.js
+++ /dev/null
@@ -1,93 +0,0 @@
-tinymce.Resource.add('tinymce.html-i18n.help-keynav.ro',
-'Începeți navigarea de la tastatură \n' +
- '\n' +
- '\n' +
- ' Focalizare pe bara de meniu \n' +
- ' Windows sau Linux: Alt+F9 \n' +
- ' macOS: ⌥F9 \n' +
- ' Focalizare pe bara de instrumente \n' +
- ' Windows sau Linux: Alt+F10 \n' +
- ' macOS: ⌥F10 \n' +
- ' Focalizare pe subsol \n' +
- ' Windows sau Linux: Alt+F11 \n' +
- ' macOS: ⌥F11 \n' +
- ' Focalizare pe notificare \n' +
- ' Windows sau Linux: Alt+F12 \n' +
- ' macOS: ⌥F12 \n' +
- ' Focalizare pe o bară de instrumente contextuală \n' +
- ' Windows, Linux sau macOS: Ctrl+F9 \n' +
- ' \n' +
- '\n' +
- 'Navigarea va începe de la primul element al interfeței cu utilizatorul, care va fi evidențiat sau subliniat în cazul primului element din\n' +
- ' calea elementului Subsol.
\n' +
- '\n' +
- 'Navigați între secțiunile interfeței cu utilizatorul \n' +
- '\n' +
- 'Pentru a trece de la o secțiune a interfeței cu utilizatorul la alta, apăsați Tab .
\n' +
- '\n' +
- 'Pentru a trece de la o secțiune a interfeței cu utilizatorul la cea anterioară, apăsați Shift+Tab .
\n' +
- '\n' +
- 'Ordinea cu Tab a acestor secțiuni ale interfeței cu utilizatorul este următoarea:
\n' +
- '\n' +
- '\n' +
- ' Bara de meniu \n' +
- ' Fiecare grup de bare de instrumente \n' +
- ' Bara laterală \n' +
- ' Calea elementului în subsol \n' +
- ' Buton de comutare a numărului de cuvinte în subsol \n' +
- ' Link de branding în subsol \n' +
- ' Mâner de redimensionare a editorului în subsol \n' +
- ' \n' +
- '\n' +
- 'În cazul în care o secțiune a interfeței cu utilizatorul nu este prezentă, aceasta este omisă.
\n' +
- '\n' +
- 'În cazul în care subsolul are focalizarea navigației asupra tastaturii și nu există o bară laterală vizibilă, apăsarea butonului Shift+Tab \n' +
- ' mută focalizarea pe primul grup de bare de instrumente, nu pe ultimul.
\n' +
- '\n' +
- 'Navigați în secțiunile interfeței cu utilizatorul \n' +
- '\n' +
- 'Pentru a trece de la un element de interfață cu utilizatorul la următorul, apăsați tasta cu săgeata corespunzătoare.
\n' +
- '\n' +
- 'Tastele cu săgeți către stânga și dreapta
\n' +
- '\n' +
- '\n' +
- ' navighează între meniurile din bara de meniuri. \n' +
- ' deschid un sub-meniu dintr-un meniu. \n' +
- ' navighează între butoanele dintr-un grup de bare de instrumente. \n' +
- ' navighează între elementele din calea elementelor subsolului. \n' +
- ' \n' +
- '\n' +
- 'Tastele cu săgeți în sus și în jos
\n' +
- '\n' +
- '\n' +
- ' navighează între elementele de meniu dintr-un meniu. \n' +
- ' navighează între elementele unui meniu pop-up din bara de instrumente. \n' +
- ' \n' +
- '\n' +
- 'Tastele cu săgeți navighează în cadrul secțiunii interfeței cu utilizatorul asupra căreia se focalizează.
\n' +
- '\n' +
- 'Pentru a închide un meniu deschis, un sub-meniu deschis sau un meniu pop-up deschis, apăsați tasta Esc .
\n' +
- '\n' +
- 'Dacă focalizarea curentă este asupra „părții superioare” a unei anumite secțiuni a interfeței cu utilizatorul, prin apăsarea tastei Esc se iese, de asemenea,\n' +
- ' în întregime din navigarea de la tastatură.
\n' +
- '\n' +
- 'Executarea unui element de meniu sau a unui buton din bara de instrumente \n' +
- '\n' +
- 'Atunci când elementul de meniu dorit sau butonul dorit din bara de instrumente este evidențiat, apăsați Return , Enter ,\n' +
- ' sau bara de spațiu pentru a executa elementul.
\n' +
- '\n' +
- 'Navigarea de dialoguri fără file \n' +
- '\n' +
- 'În dialogurile fără file, prima componentă interactivă beneficiază de focalizare la deschiderea dialogului.
\n' +
- '\n' +
- 'Navigați între componentele dialogului interactiv apăsând Tab sau Shift+Tab .
\n' +
- '\n' +
- 'Navigarea de dialoguri cu file \n' +
- '\n' +
- 'În dialogurile cu file, primul buton din meniul cu file beneficiază de focalizare la deschiderea dialogului.
\n' +
- '\n' +
- 'Navigați între componentele interactive ale acestei file de dialog apăsând Tab sau\n' +
- ' Shift+Tab .
\n' +
- '\n' +
- 'Treceți la o altă filă de dialog focalizând asupra meniului cu file și apoi apăsând săgeata corespunzătoare\n' +
- ' pentru a parcurge filele disponibile.
\n');
\ No newline at end of file
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/ru.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/ru.js
deleted file mode 100644
index d310f54..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/ru.js
+++ /dev/null
@@ -1,93 +0,0 @@
-tinymce.Resource.add('tinymce.html-i18n.help-keynav.ru',
-'Начните управление с помощью клавиатуры \n' +
- '\n' +
- '\n' +
- ' Фокус на панели меню \n' +
- ' Windows или Linux: Alt+F9 \n' +
- ' macOS: ⌥F9 \n' +
- ' Фокус на панели инструментов \n' +
- ' Windows или Linux: Alt+F10 \n' +
- ' macOS: ⌥F10 \n' +
- ' Фокус на нижнем колонтитуле \n' +
- ' Windows или Linux: Alt+F11 \n' +
- ' macOS: ⌥F11 \n' +
- ' Фокус на уведомлении \n' +
- ' Windows или Linux: Alt+12 \n' +
- ' macOS: ⌥F12 \n' +
- ' Фокус на контекстной панели инструментов \n' +
- ' Windows, Linux или macOS: Ctrl+F9 \n' +
- ' \n' +
- '\n' +
- 'Первый доступный для управления элемент интерфейса будет выделен цветом или подчеркнут (если он находится\n' +
- ' в пути элементов нижнего колонтитула).
\n' +
- '\n' +
- 'Переход между разделами пользовательского интерфейса \n' +
- '\n' +
- 'Чтобы перейти из текущего раздела интерфейса в следующий, нажмите Tab .
\n' +
- '\n' +
- 'Чтобы перейти из текущего раздела интерфейса в предыдущий, нажмите Shift+Tab .
\n' +
- '\n' +
- 'Вкладки разделов интерфейса расположены в следующем порядке:
\n' +
- '\n' +
- '\n' +
- ' Панель меню \n' +
- ' Группы панели инструментов \n' +
- ' Боковая панель \n' +
- ' Путь элементов нижнего колонтитула \n' +
- ' Подсчет слов/символов в нижнем колонтитуле \n' +
- ' Брендовая ссылка в нижнем колонтитуле \n' +
- ' Угол для изменения размера окна редактора \n' +
- ' \n' +
- '\n' +
- 'Если раздел интерфейса отсутствует, он пропускается.
\n' +
- '\n' +
- 'Если при управлении с клавиатуры фокус находится на нижнем колонтитуле, а видимая боковая панель отсутствует, то при нажатии сочетания клавиш Shift+Tab \n' +
- ' фокус переносится на первую группу панели инструментов, а не на последнюю.
\n' +
- '\n' +
- 'Переход между элементами внутри разделов пользовательского интерфейса \n' +
- '\n' +
- 'Чтобы перейти от текущего элемента интерфейса к следующему, нажмите соответствующую клавишу со стрелкой .
\n' +
- '\n' +
- 'Клавиши со стрелками влево и вправо позволяют
\n' +
- '\n' +
- '\n' +
- ' перемещаться между разными меню в панели меню. \n' +
- ' открывать разделы меню. \n' +
- ' перемещаться между кнопками в группе панели инструментов. \n' +
- ' перемещаться между элементами в пути элементов нижнего колонтитула. \n' +
- ' \n' +
- '\n' +
- 'Клавиши со стрелками вниз и вверх позволяют
\n' +
- '\n' +
- '\n' +
- ' перемещаться между элементами одного меню. \n' +
- ' перемещаться между элементами всплывающего меню в панели инструментов. \n' +
- ' \n' +
- '\n' +
- 'При использовании клавиш со стрелками вы будете циклически перемещаться по элементам в пределах выбранного раздела интерфейса.
\n' +
- '\n' +
- 'Чтобы закрыть открытое меню, его раздел или всплывающее меню, нажмите клавишу Esc .
\n' +
- '\n' +
- 'Если фокус находится наверху какого-либо раздела интерфейса, нажатие клавиши Esc также приведет\n' +
- ' к выходу из режима управления с помощью клавиатуры.
\n' +
- '\n' +
- 'Использование элемента меню или кнопки на панели инструментов \n' +
- '\n' +
- 'Когда элемент меню или кнопка панели инструментов будут выделены, нажмите Return , Enter \n' +
- ' или Space , чтобы их активировать.
\n' +
- '\n' +
- 'Управление в диалоговом окне без вкладок \n' +
- '\n' +
- 'При открытии диалогового окна без вкладок фокус переносится на первый интерактивный компонент.
\n' +
- '\n' +
- 'Для перехода между интерактивными компонентами диалогового окна нажимайте Tab или Shift+Tab .
\n' +
- '\n' +
- 'Управление в диалоговом окне с вкладками \n' +
- '\n' +
- 'При открытии диалогового окна с вкладками фокус переносится на первую кнопку в меню вкладок.
\n' +
- '\n' +
- 'Для перехода между интерактивными компонентами этой вкладки диалогового окна нажимайте Tab или\n' +
- ' Shift+Tab .
\n' +
- '\n' +
- 'Для перехода на другую вкладку диалогового окна переместите фокус на меню вкладок, а затем используйте клавиши со стрелками \n' +
- ' для циклического переключения между доступными вкладками.
\n');
\ No newline at end of file
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/sk.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/sk.js
deleted file mode 100644
index 60cc628..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/sk.js
+++ /dev/null
@@ -1,93 +0,0 @@
-tinymce.Resource.add('tinymce.html-i18n.help-keynav.sk',
-'Začíname s navigáciou pomocou klávesnice \n' +
- '\n' +
- '\n' +
- ' Prejsť na panel s ponukami \n' +
- ' Windows alebo Linux: Alt+F9 \n' +
- ' macOS: ⌥F9 \n' +
- ' Prejsť na panel nástrojov \n' +
- ' Windows alebo Linux: Alt+F10 \n' +
- ' macOS: ⌥F10 \n' +
- ' Prejsť na pätičku \n' +
- ' Windows alebo Linux: Alt+F11 \n' +
- ' macOS: ⌥F11 \n' +
- ' Zaostriť na oznámenie \n' +
- ' Windows alebo Linux: Alt+F12 \n' +
- ' macOS: ⌥F12 \n' +
- ' Prejsť na kontextový panel nástrojov \n' +
- ' Windows, Linux alebo macOS: Ctrl+F9 \n' +
- ' \n' +
- '\n' +
- 'Navigácia začne pri prvej položke používateľského rozhrania, ktorá bude zvýraznená alebo v prípade prvej položky\n' +
- ' cesty k pätičke podčiarknutá.
\n' +
- '\n' +
- 'Navigácia medzi časťami používateľského rozhrania \n' +
- '\n' +
- 'Ak sa chcete posunúť z jednej časti používateľského rozhrania do druhej, stlačte tlačidlo Tab .
\n' +
- '\n' +
- 'Ak sa chcete posunúť z jednej časti používateľského rozhrania do predchádzajúcej, stlačte tlačidlá Shift + Tab .
\n' +
- '\n' +
- 'Poradie prepínania medzi týmito časťami používateľského rozhrania pri stláčaní tlačidla Tab :
\n' +
- '\n' +
- '\n' +
- ' Panel s ponukou \n' +
- ' Každá skupina panela nástrojov \n' +
- ' Bočný panel \n' +
- ' Cesta k prvku v pätičke \n' +
- ' Prepínač počtu slov v pätičke \n' +
- ' Odkaz na informácie o značke v pätičke \n' +
- ' Úchyt na zmenu veľkosti editora v pätičke \n' +
- ' \n' +
- '\n' +
- 'Ak nejaká časť používateľského rozhrania nie je prítomná, preskočí sa.
\n' +
- '\n' +
- 'Ak je pätička vybratá na navigáciu pomocou klávesnice a nie je viditeľný bočný panel, stlačením klávesov Shift+Tab \n' +
- ' prejdete na prvú skupinu panela nástrojov, nie na poslednú.
\n' +
- '\n' +
- 'Navigácia v rámci častí používateľského rozhrania \n' +
- '\n' +
- 'Ak sa chcete posunúť z jedného prvku používateľského rozhrania na ďalší, stlačte príslušný kláves so šípkou .
\n' +
- '\n' +
- 'Klávesy so šípkami doľava a doprava
\n' +
- '\n' +
- '\n' +
- ' umožňujú presun medzi ponukami na paneli ponúk, \n' +
- ' otvárajú podponuku v rámci ponuky, \n' +
- ' umožňujú presun medzi tlačidlami v skupine panelov nástrojov, \n' +
- ' umožňujú presun medzi položkami cesty prvku v pätičke. \n' +
- ' \n' +
- '\n' +
- 'Klávesy so šípkami dole a hore
\n' +
- '\n' +
- '\n' +
- ' umožňujú presun medzi položkami ponuky, \n' +
- ' umožňujú presun medzi položkami v kontextovej ponuke panela nástrojov. \n' +
- ' \n' +
- '\n' +
- 'Klávesy so šípkami vykonávajú prepínanie v rámci vybranej časti používateľského rozhrania.
\n' +
- '\n' +
- 'Ak chcete zatvoriť otvorenú ponuku, otvorenú podponuku alebo otvorenú kontextovú ponuku, stlačte kláves Esc .
\n' +
- '\n' +
- 'Ak je aktuálne vybratá horná časť konkrétneho používateľského rozhrania, stlačením klávesu Esc úplne ukončíte tiež\n' +
- ' navigáciu pomocou klávesnice.
\n' +
- '\n' +
- 'Vykonanie príkazu položky ponuky alebo tlačidla panela nástrojov \n' +
- '\n' +
- 'Keď je zvýraznená požadovaná položka ponuky alebo tlačidlo panela nástrojov, stlačením klávesov Return , Enter \n' +
- ' alebo medzerníka vykonáte príslušný príkaz položky.
\n' +
- '\n' +
- 'Navigácia v dialógových oknách bez záložiek \n' +
- '\n' +
- 'Pri otvorení dialógových okien bez záložiek prejdete na prvý interaktívny komponent.
\n' +
- '\n' +
- 'Medzi interaktívnymi dialógovými komponentmi môžete prechádzať stlačením klávesov Tab alebo Shift+Tab .
\n' +
- '\n' +
- 'Navigácia v dialógových oknách so záložkami \n' +
- '\n' +
- 'Pri otvorení dialógových okien so záložkami prejdete na prvé tlačidlo v ponuke záložiek.
\n' +
- '\n' +
- 'Medzi interaktívnymi komponentmi tejto dialógovej záložky môžete prechádzať stlačením klávesov Tab alebo\n' +
- ' Shift+Tab .
\n' +
- '\n' +
- 'Ak chcete prepnúť na ďalšiu záložku dialógového okna, prejdite do ponuky záložiek a potom môžete stlačením príslušného klávesu so šípkou \n' +
- ' prepínať medzi dostupnými záložkami.
\n');
\ No newline at end of file
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/sl_SI.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/sl_SI.js
deleted file mode 100644
index 2b25f5a..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/sl_SI.js
+++ /dev/null
@@ -1,93 +0,0 @@
-tinymce.Resource.add('tinymce.html-i18n.help-keynav.sl_SI',
-'Začetek krmarjenja s tipkovnico \n' +
- '\n' +
- '\n' +
- ' Fokus na menijsko vrstico \n' +
- ' Windows ali Linux: Alt + F9 \n' +
- ' macOS: ⌥F9 \n' +
- ' Fokus na orodno vrstico \n' +
- ' Windows ali Linux: Alt + F10 \n' +
- ' macOS: ⌥F10 \n' +
- ' Fokus na nogo \n' +
- ' Windows ali Linux: Alt + F11 \n' +
- ' macOS: ⌥F11 \n' +
- ' Označitev obvestila \n' +
- ' Windows ali Linux: Alt + F12 \n' +
- ' macOS: ⌥F12 \n' +
- ' Fokus na kontekstualno orodno vrstico \n' +
- ' Windows, Linux ali macOS: Ctrl + F9 \n' +
- ' \n' +
- '\n' +
- 'Krmarjenje se bo začelo s prvim elementom uporabniškega vmesnika, ki bo izpostavljena ali podčrtan, če gre za prvi element na\n' +
- ' poti do elementa noge.
\n' +
- '\n' +
- 'Krmarjenje med razdelki uporabniškega vmesnika \n' +
- '\n' +
- 'Če se želite pomakniti z enega dela uporabniškega vmesnika na naslednjega, pritisnite tabulatorko .
\n' +
- '\n' +
- 'Če se želite pomakniti z enega dela uporabniškega vmesnika na prejšnjega, pritisnite shift + tabulatorko .
\n' +
- '\n' +
- 'Zaporedje teh razdelkov uporabniškega vmesnika, ko pritiskate tabulatorko , je:
\n' +
- '\n' +
- '\n' +
- ' Menijska vrstica \n' +
- ' Posamezne skupine orodne vrstice \n' +
- ' Stranska vrstica \n' +
- ' Pod do elementa v nogi \n' +
- ' Gumb za preklop štetja besed v nogi \n' +
- ' Povezava do blagovne znamke v nogi \n' +
- ' Ročaj za spreminjanje velikosti urejevalnika v nogi \n' +
- ' \n' +
- '\n' +
- 'Če razdelek uporabniškega vmesnika ni prisoten, je preskočen.
\n' +
- '\n' +
- 'Če ima noga fokus za krmarjenje s tipkovnico in ni vidne stranske vrstice, s pritiskom na shift + tabulatorko \n' +
- ' fokus premaknete na prvo skupino orodne vrstice, ne zadnjo.
\n' +
- '\n' +
- 'Krmarjenje v razdelkih uporabniškega vmesnika \n' +
- '\n' +
- 'Če se želite premakniti z enega elementa uporabniškega vmesnika na naslednjega, pritisnite ustrezno puščično tipko.
\n' +
- '\n' +
- 'Leva in desna puščična tipka
\n' +
- '\n' +
- '\n' +
- ' omogočata premikanje med meniji v menijski vrstici. \n' +
- ' odpreta podmeni v meniju. \n' +
- ' omogočata premikanje med gumbi v skupini orodne vrstice. \n' +
- ' omogočata premikanje med elementi na poti do elementov noge. \n' +
- ' \n' +
- '\n' +
- 'Spodnja in zgornja puščična tipka
\n' +
- '\n' +
- '\n' +
- ' omogočata premikanje med elementi menija. \n' +
- ' omogočata premikanje med elementi v pojavnem meniju orodne vrstice. \n' +
- ' \n' +
- '\n' +
- 'Puščične tipke omogočajo kroženje znotraj razdelka uporabniškega vmesnika, na katerem je fokus.
\n' +
- '\n' +
- 'Če želite zapreti odprt meni, podmeni ali pojavni meni, pritisnite tipko Esc .
\n' +
- '\n' +
- 'Če je trenutni fokus na »vrhu« določenega razdelka uporabniškega vmesnika, s pritiskom tipke Esc zaprete\n' +
- ' tudi celotno krmarjenje s tipkovnico.
\n' +
- '\n' +
- 'Izvajanje menijskega elementa ali gumba orodne vrstice \n' +
- '\n' +
- 'Ko je označen želeni menijski element ali orodja vrstica, pritisnite vračalko , Enter \n' +
- ' ali preslednico , da izvedete element.
\n' +
- '\n' +
- 'Krmarjenje po pogovornih oknih brez zavihkov \n' +
- '\n' +
- 'Ko odprete pogovorno okno brez zavihkov, ima fokus prva interaktivna komponenta.
\n' +
- '\n' +
- 'Med interaktivnimi komponentami pogovornega okna se premikate s pritiskom tabulatorke ali kombinacije tipke shift + tabulatorke .
\n' +
- '\n' +
- 'Krmarjenje po pogovornih oknih z zavihki \n' +
- '\n' +
- 'Ko odprete pogovorno okno z zavihki, ima fokus prvi gumb v meniju zavihka.
\n' +
- '\n' +
- 'Med interaktivnimi komponentami tega zavihka pogovornega okna se premikate s pritiskom tabulatorke ali\n' +
- ' kombinacije tipke shift + tabulatorke .
\n' +
- '\n' +
- 'Na drug zavihek pogovornega okna preklopite tako, da fokus prestavite na meni zavihka in nato pritisnete ustrezno puščično \n' +
- ' tipko, da se pomaknete med razpoložljivimi zavihki.
\n');
\ No newline at end of file
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/sv_SE.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/sv_SE.js
deleted file mode 100644
index c30f2f2..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/sv_SE.js
+++ /dev/null
@@ -1,93 +0,0 @@
-tinymce.Resource.add('tinymce.html-i18n.help-keynav.sv_SE',
-'Påbörja tangentbordsnavigering \n' +
- '\n' +
- '\n' +
- ' Fokusera på menyraden \n' +
- ' Windows eller Linux: Alt+F9 \n' +
- ' macOS: ⌥F9 \n' +
- ' Fokusera på verktygsraden \n' +
- ' Windows eller Linux: Alt+F10 \n' +
- ' macOS: ⌥F10 \n' +
- ' Fokusera på verktygsraden \n' +
- ' Windows eller Linux: Alt+F11 \n' +
- ' macOS: ⌥F11 \n' +
- ' Fokusera aviseringen \n' +
- ' Windows eller Linux: Alt+F12 \n' +
- ' macOS: ⌥F12 \n' +
- ' Fokusera på en snabbverktygsrad \n' +
- ' Windows, Linux eller macOS: Ctrl+F9 \n' +
- ' \n' +
- '\n' +
- 'Navigeringen börjar vid det första gränssnittsobjektet, vilket är markerat eller understruket om det gäller det första objektet i\n' +
- ' sidfotens elementsökväg.
\n' +
- '\n' +
- 'Navigera mellan UI-avsnitt \n' +
- '\n' +
- 'Flytta från ett UI-avsnitt till nästa genom att trycka på Tabb .
\n' +
- '\n' +
- 'Flytta från ett UI-avsnitt till det föregående genom att trycka på Skift+Tabb .
\n' +
- '\n' +
- 'Tabb -ordningen för dessa UI-avsnitt är:
\n' +
- '\n' +
- '\n' +
- ' Menyrad \n' +
- ' Varje verktygsradsgrupp \n' +
- ' Sidoruta \n' +
- ' Elementsökväg i sidfoten \n' +
- ' Växlingsknapp för ordantal i sidfoten \n' +
- ' Varumärkeslänk i sidfoten \n' +
- ' Storlekshandtag för redigeraren i sidfoten \n' +
- ' \n' +
- '\n' +
- 'Om ett UI-avsnitt inte finns hoppas det över.
\n' +
- '\n' +
- 'Om sidfoten har fokus på tangentbordsnavigering, och det inte finns någon synlig sidoruta, flyttas fokus till den första verktygsradsgruppen\n' +
- ' när du trycker på Skift+Tabb , inte till den sista.
\n' +
- '\n' +
- 'Navigera i UI-avsnitt \n' +
- '\n' +
- 'Flytta från ett UI-element till nästa genom att trycka på motsvarande piltangent .
\n' +
- '\n' +
- 'Vänsterpil och högerpil
\n' +
- '\n' +
- '\n' +
- ' flytta mellan menyer på menyraden. \n' +
- ' öppna en undermeny på en meny. \n' +
- ' flytta mellan knappar i en verktygsradgrupp. \n' +
- ' flytta mellan objekt i sidfotens elementsökväg. \n' +
- ' \n' +
- '\n' +
- 'Nedpil och uppil
\n' +
- '\n' +
- '\n' +
- ' flytta mellan menyalternativ på en meny. \n' +
- ' flytta mellan alternativ på en popup-meny på verktygsraden. \n' +
- ' \n' +
- '\n' +
- 'Piltangenterna cirkulerar inom det fokuserade UI-avsnittet.
\n' +
- '\n' +
- 'Tryck på Esc -tangenten om du vill stänga en öppen meny, undermeny eller popup-meny.
\n' +
- '\n' +
- 'Om det aktuella fokuset är högst upp i ett UI-avsnitt avlutas även tangentbordsnavigeringen helt när\n' +
- ' du trycker på Esc -tangenten.
\n' +
- '\n' +
- 'Köra ett menyalternativ eller en verktygfältsknapp \n' +
- '\n' +
- 'När menyalternativet eller verktygsradsknappen är markerad trycker du på Retur , Enter \n' +
- ' eller blanksteg för att köra alternativet.
\n' +
- '\n' +
- 'Navigera i dialogrutor utan flikar \n' +
- '\n' +
- 'I dialogrutor utan flikar är den första interaktiva komponenten i fokus när dialogrutan öppnas.
\n' +
- '\n' +
- 'Navigera mellan interaktiva dialogkomponenter genom att trycka på Tabb eller Skift+Tabb .
\n' +
- '\n' +
- 'Navigera i dialogrutor med flikar \n' +
- '\n' +
- 'I dialogrutor utan flikar är den första knappen på flikmenyn i fokus när dialogrutan öppnas.
\n' +
- '\n' +
- 'Navigera mellan interaktiva komponenter på dialogrutefliken genom att trycka på Tabb eller\n' +
- ' Skift+Tabb .
\n' +
- '\n' +
- 'Växla till en annan dialogruta genom att fokusera på flikmenyn och sedan trycka på motsvarande piltangent \n' +
- ' för att cirkulera mellan de tillgängliga flikarna.
\n');
\ No newline at end of file
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/th_TH.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/th_TH.js
deleted file mode 100644
index 562fe7a..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/th_TH.js
+++ /dev/null
@@ -1,93 +0,0 @@
-tinymce.Resource.add('tinymce.html-i18n.help-keynav.th_TH',
-'เริ่มต้นการนำทางด้วยแป้นพิมพ์ \n' +
- '\n' +
- '\n' +
- ' โฟกัสที่แถบเมนู \n' +
- ' Windows หรือ Linux: Alt+F9 \n' +
- ' macOS: ⌥F9 \n' +
- ' โฟกัสที่แถบเครื่องมือ \n' +
- ' Windows หรือ Linux: Alt+F10 \n' +
- ' macOS: ⌥F10 \n' +
- ' โฟกัสที่ส่วนท้าย \n' +
- ' Windows หรือ Linux: Alt+F11 \n' +
- ' macOS: ⌥F11 \n' +
- ' โฟกัสไปที่การแจ้งเตือน \n' +
- ' Windows หรือ Linux: Alt+F12 \n' +
- ' macOS: ⌥F12 \n' +
- ' โฟกัสที่แถบเครื่องมือตามบริบท \n' +
- ' Windows, Linux หรือ macOS: Ctrl+F9 \n' +
- ' \n' +
- '\n' +
- 'การนำทางจะเริ่มที่รายการ UI แรก ซึ่งจะมีการไฮไลต์หรือขีดเส้นใต้ไว้ในกรณีที่รายการแรกอยู่ใน\n' +
- ' พาธองค์ประกอบส่วนท้าย
\n' +
- '\n' +
- 'การนำทางระหว่างส่วนต่างๆ ของ UI \n' +
- '\n' +
- 'ในการย้ายจากส่วน UI หนึ่งไปยังส่วนถัดไป ให้กด Tab
\n' +
- '\n' +
- 'ในการย้ายจากส่วน UI หนึ่งไปยังส่วนก่อนหน้า ให้กด Shift+Tab
\n' +
- '\n' +
- 'ลำดับแท็บ ของส่วนต่างๆ ของ UI คือ:
\n' +
- '\n' +
- '\n' +
- ' แถบเมนู \n' +
- ' แต่ละกลุ่มแถบเครื่องมือ \n' +
- ' แถบข้าง \n' +
- ' พาธองค์ประกอบในส่วนท้าย \n' +
- ' ปุ่มสลับเปิด/ปิดจำนวนคำในส่วนท้าย \n' +
- ' ลิงก์ชื่อแบรนด์ในส่วนท้าย \n' +
- ' จุดจับปรับขนาดของตัวแก้ไขในส่วนท้าย \n' +
- ' \n' +
- '\n' +
- 'หากส่วน UI ไม่ปรากฏ แสดงว่าถูกข้ามไป
\n' +
- '\n' +
- 'หากส่วนท้ายมีการโฟกัสการนำทางแป้นพิมพ์และไม่มีแถบข้างปรากฏ การกด Shift+Tab \n' +
- ' จะย้ายการโฟกัสไปที่กลุ่มแถบเครื่องมือแรก ไม่ใช่สุดท้าย
\n' +
- '\n' +
- 'การนำทางภายในส่วนต่างๆ ของ UI \n' +
- '\n' +
- 'ในการย้ายจากองค์ประกอบ UI หนึ่งไปยังองค์ประกอบส่วนถัดไป ให้กดปุ่มลูกศร ที่เหมาะสม
\n' +
- '\n' +
- 'ปุ่มลูกศรซ้าย และขวา
\n' +
- '\n' +
- '\n' +
- ' ย้ายไปมาระหว่างเมนูต่างๆ ในแถบเมนู \n' +
- ' เปิดเมนูย่อยในเมนู \n' +
- ' ย้ายไปมาระหว่างปุ่มต่างๆ ในกลุ่มแถบเครื่องมือ \n' +
- ' ย้ายไปมาระหว่างรายการต่างๆ ในพาธองค์ประกอบของส่วนท้าย \n' +
- ' \n' +
- '\n' +
- 'ปุ่มลูกศรลง และขึ้น
\n' +
- '\n' +
- '\n' +
- ' ย้ายไปมาระหว่างรายการเมนูต่างๆ ในเมนู \n' +
- ' ย้ายไปมาระหว่างรายการต่างๆ ในเมนูป๊อบอัพแถบเครื่องมือ \n' +
- ' \n' +
- '\n' +
- 'ปุ่มลูกศร จะเลื่อนไปมาภายในส่วน UI ที่โฟกัส
\n' +
- '\n' +
- 'ในการปิดเมนูที่เปิดอยู่ เมนูย่อยที่เปิดอยู่ หรือเมนูป๊อบอัพที่เปิดอยู่ ให้กดปุ่ม Esc
\n' +
- '\n' +
- 'หากโฟกัสปัจจุบันอยู่ที่ ‘ด้านบนสุด’ ของส่วน UI เฉพาะ การกดปุ่ม Esc จะทำให้ออกจาก\n' +
- ' การนำทางด้วยแป้นพิมพ์ทั้งหมดเช่นกัน
\n' +
- '\n' +
- 'การดำเนินการรายการเมนูหรือปุ่มในแถบเครื่องมือ \n' +
- '\n' +
- 'เมื่อไฮไลต์รายการเมนูหรือปุ่มในแถบเครื่องมือที่ต้องการ ให้กด Return , Enter \n' +
- ' หรือ Space bar เพื่อดำเนินการรายการดังกล่าว
\n' +
- '\n' +
- 'การนำทางสำหรับกล่องโต้ตอบที่ไม่อยู่ในแท็บ \n' +
- '\n' +
- 'ในกล่องโต้ตอบที่ไม่อยู่ในแท็บ จะโฟกัสที่ส่วนประกอบเชิงโต้ตอบแรกเมื่อกล่องโต้ตอบเปิด
\n' +
- '\n' +
- 'นำทางระหว่างส่วนประกอบเชิงโต้ตอบต่างๆ ของกล่องโต้ตอบ โดยการกด Tab หรือ Shift+Tab
\n' +
- '\n' +
- 'การนำทางสำหรับกล่องโต้ตอบที่อยู่ในแท็บ \n' +
- '\n' +
- 'ในกล่องโต้ตอบที่อยู่ในแท็บ จะโฟกัสที่ปุ่มแรกในเมนูแท็บเมื่อกล่องโต้ตอบเปิด
\n' +
- '\n' +
- 'นำทางระหว่างส่วนประกอบเชิงโต้ตอบต่างๆ ของแท็บกล่องโต้ตอบนี้โดยการกด Tab หรือ\n' +
- ' Shift+Tab
\n' +
- '\n' +
- 'สลับไปยังแท็บกล่องโต้ตอบอื่นโดยการเลือกโฟกัสที่เมนูแท็บ แล้วกดปุ่มลูกศร ที่เหมาะสม\n' +
- ' เพื่อเลือกแท็บที่ใช้ได้
\n');
\ No newline at end of file
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/tr.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/tr.js
deleted file mode 100644
index 37f39b0..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/tr.js
+++ /dev/null
@@ -1,93 +0,0 @@
-tinymce.Resource.add('tinymce.html-i18n.help-keynav.tr',
-'Klavyeyle gezintiyi başlatma \n' +
- '\n' +
- '\n' +
- ' Menü çubuğuna odaklan \n' +
- ' Windows veya Linux: Alt+F9 \n' +
- ' macOS: ⌥F9 \n' +
- ' Araç çubuğuna odaklan \n' +
- ' Windows veya Linux: Alt+F10 \n' +
- ' macOS: ⌥F10 \n' +
- ' Alt bilgiye odaklan \n' +
- ' Windows veya Linux: Alt+F11 \n' +
- ' macOS: ⌥F11 \n' +
- ' Bildirime odakla \n' +
- ' Windows veya Linux: Alt+F12 \n' +
- ' macOS: ⌥F12 \n' +
- ' Bağlamsal araç çubuğuna odaklan \n' +
- ' Windows, Linux veya macOS: Ctrl+F9 \n' +
- ' \n' +
- '\n' +
- 'Gezinti ilk kullanıcı arabirimi öğesinden başlar, bu öğe vurgulanır ya da ilk öğe, Alt bilgi elemanı\n' +
- ' yolundaysa altı çizilir.
\n' +
- '\n' +
- 'Kullanıcı arabirimi bölümleri arasında gezinme \n' +
- '\n' +
- 'Sonraki kullanıcı arabirimi bölümüne gitmek için Sekme tuşuna basın.
\n' +
- '\n' +
- 'Önceki kullanıcı arabirimi bölümüne gitmek için Shift+Sekme tuşlarına basın.
\n' +
- '\n' +
- 'Bu kullanıcı arabirimi bölümlerinin Sekme sırası:
\n' +
- '\n' +
- '\n' +
- ' Menü çubuğu \n' +
- ' Her araç çubuğu grubu \n' +
- ' Kenar çubuğu \n' +
- ' Alt bilgide öğe yolu \n' +
- ' Alt bilgide sözcük sayısı geçiş düğmesi \n' +
- ' Alt bilgide marka bağlantısı \n' +
- ' Alt bilgide düzenleyiciyi yeniden boyutlandırma tutamacı \n' +
- ' \n' +
- '\n' +
- 'Kullanıcı arabirimi bölümü yoksa atlanır.
\n' +
- '\n' +
- 'Alt bilgide klavyeyle gezinti odağı yoksa ve görünür bir kenar çubuğu mevcut değilse Shift+Sekme tuşlarına basıldığında\n' +
- ' odak son araç çubuğu yerine ilk araç çubuğu grubuna taşınır.
\n' +
- '\n' +
- 'Kullanıcı arabirimi bölümleri içinde gezinme \n' +
- '\n' +
- 'Sonraki kullanıcı arabirimi elemanına gitmek için uygun Ok tuşuna basın.
\n' +
- '\n' +
- 'Sol ve Sağ ok tuşları
\n' +
- '\n' +
- '\n' +
- ' menü çubuğundaki menüler arasında hareket eder. \n' +
- ' menüde bir alt menü açar. \n' +
- ' araç çubuğu grubundaki düğmeler arasında hareket eder. \n' +
- ' alt bilginin öğe yolundaki öğeler arasında hareket eder. \n' +
- ' \n' +
- '\n' +
- 'Aşağı ve Yukarı ok tuşları
\n' +
- '\n' +
- '\n' +
- ' menüdeki menü öğeleri arasında hareket eder. \n' +
- ' araç çubuğu açılır menüsündeki öğeler arasında hareket eder. \n' +
- ' \n' +
- '\n' +
- 'Ok tuşları, odaklanılan kullanıcı arabirimi bölümü içinde döngüsel olarak hareket eder.
\n' +
- '\n' +
- 'Açık bir menüyü, açık bir alt menüyü veya açık bir açılır menüyü kapatmak için Esc tuşuna basın.
\n' +
- '\n' +
- 'Geçerli odak belirli bir kullanıcı arabirimi bölümünün "üst" kısmındaysa Esc tuşuna basıldığında\n' +
- ' klavyeyle gezintiden de tamamen çıkılır.
\n' +
- '\n' +
- 'Menü öğesini veya araç çubuğu düğmesini yürütme \n' +
- '\n' +
- 'İstediğiniz menü öğesi veya araç çubuğu düğmesi vurgulandığında Return , Enter \n' +
- ' veya Ara çubuğu tuşuna basın.
\n' +
- '\n' +
- 'Sekme bulunmayan iletişim kutularında gezinme \n' +
- '\n' +
- 'Sekme bulunmayan iletişim kutularında, iletişim kutusu açıldığında ilk etkileşimli bileşene odaklanılır.
\n' +
- '\n' +
- 'Etkileşimli iletişim kutusu bileşenleri arasında gezinmek için Sekme veya Shift+ Sekme tuşlarına basın.
\n' +
- '\n' +
- 'Sekmeli iletişim kutularında gezinme \n' +
- '\n' +
- 'Sekmeli iletişim kutularında, iletişim kutusu açıldığında sekme menüsündeki ilk düğmeye odaklanılır.
\n' +
- '\n' +
- 'Bu iletişim kutusu sekmesinin etkileşimli bileşenleri arasında gezinmek için Sekme veya\n' +
- ' Shift+Sekme tuşlarına basın.
\n' +
- '\n' +
- 'Mevcut sekmeler arasında geçiş yapmak için sekme menüsüne odaklanıp uygun Ok tuşuna basarak\n' +
- ' başka bir iletişim kutusu sekmesine geçiş yapın.
\n');
\ No newline at end of file
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/uk.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/uk.js
deleted file mode 100644
index 028d4a4..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/uk.js
+++ /dev/null
@@ -1,93 +0,0 @@
-tinymce.Resource.add('tinymce.html-i18n.help-keynav.uk',
-'Початок роботи з навігацією за допомогою клавіатури \n' +
- '\n' +
- '\n' +
- ' Фокус на рядок меню \n' +
- ' Windows або Linux: Alt+F9 \n' +
- ' macOS: ⌥F9 \n' +
- ' Фокус на панелі інструментів \n' +
- ' Windows або Linux: Alt+F10 \n' +
- ' macOS: ⌥F10 \n' +
- ' Фокус на розділі "Нижній колонтитул" \n' +
- ' Windows або Linux: Alt+F11 \n' +
- ' macOS: ⌥F11 \n' +
- ' Фокус на сповіщення \n' +
- ' Windows або Linux: Alt+F12 \n' +
- ' macOS: ⌥F12 \n' +
- ' Фокус на контекстній панелі інструментів \n' +
- ' Windows, Linux або macOS: Ctrl+F9 \n' +
- ' \n' +
- '\n' +
- 'Навігація почнеться з першого елемента інтерфейсу користувача, який буде виділено або підкреслено в разі, якщо перший елемент знаходиться в\n' +
- ' шляху до елемента "Нижній колонтитул".
\n' +
- '\n' +
- 'Навігація між розділами інтерфейсу користувача \n' +
- '\n' +
- 'Щоб перейти з одного розділу інтерфейсу користувача до наступного розділу, натисніть клавішу Tab .
\n' +
- '\n' +
- 'Щоб перейти з одного розділу інтерфейсу користувача до попереднього розділу, натисніть сполучення клавіш Shift+Tab .
\n' +
- '\n' +
- 'Порядок Вкладок цих розділів інтерфейсу користувача такий:
\n' +
- '\n' +
- '\n' +
- ' Рядок меню \n' +
- ' Кожна група панелей інструментів \n' +
- ' Бічна панель \n' +
- ' Шлях до елементів у розділі "Нижній колонтитул" \n' +
- ' Кнопка перемикача "Кількість слів" у розділі "Нижній колонтитул" \n' +
- ' Посилання на брендинг у розділі "Нижній колонтитул" \n' +
- ' Маркер змінення розміру в розділі "Нижній колонтитул" \n' +
- ' \n' +
- '\n' +
- 'Якщо розділ інтерфейсу користувача відсутній, він пропускається.
\n' +
- '\n' +
- 'Якщо фокус навігації клавіатури знаходиться на розділі "Нижній колонтитул", але користувач не бачить видиму бічну панель, натисніть Shift+Tab ,\n' +
- ' щоб перемістити фокус на першу групу панелі інструментів, а не на останню.
\n' +
- '\n' +
- 'Навігація в межах розділів інтерфейсу користувача \n' +
- '\n' +
- 'Щоб перейти з одного елементу інтерфейсу користувача до наступного, натисніть відповідну клавішу зі стрілкою .
\n' +
- '\n' +
- 'Клавіші зі стрілками Ліворуч і Праворуч
\n' +
- '\n' +
- '\n' +
- ' переміщують між меню в рядку меню. \n' +
- ' відкривають вкладене меню в меню. \n' +
- ' переміщують користувача між кнопками в групі панелі інструментів. \n' +
- ' переміщують між елементами в шляху до елементів у розділі "Нижній колонтитул". \n' +
- ' \n' +
- '\n' +
- 'Клавіші зі стрілками Вниз і Вгору
\n' +
- '\n' +
- '\n' +
- ' переміщують між елементами меню в меню. \n' +
- ' переміщують між елементами в спливаючому меню панелі інструментів. \n' +
- ' \n' +
- '\n' +
- 'Клавіші зі стрілками переміщують фокус циклічно в межах розділу інтерфейсу користувача, на якому знаходиться фокус.
\n' +
- '\n' +
- 'Щоб закрити відкрите меню, відкрите вкладене меню або відкрите спливаюче меню, натисніть клавішу Esc .
\n' +
- '\n' +
- 'Якщо поточний фокус знаходиться на верхньому рівні певного розділу інтерфейсу користувача, натискання клавіші Esc також виконує вихід\n' +
- ' з навігації за допомогою клавіатури повністю.
\n' +
- '\n' +
- 'Виконання елементу меню або кнопки панелі інструментів \n' +
- '\n' +
- 'Коли потрібний елемент меню або кнопку панелі інструментів виділено, натисніть клавіші Return , Enter ,\n' +
- ' або Пробіл , щоб виконати цей елемент.
\n' +
- '\n' +
- 'Навігація по діалоговим вікнам без вкладок \n' +
- '\n' +
- 'У діалогових вікнах без вкладок перший інтерактивний компонент приймає фокус, коли відкривається діалогове вікно.
\n' +
- '\n' +
- 'Переходьте між інтерактивними компонентами діалогового вікна, натискаючи клавіші Tab або Shift+Tab .
\n' +
- '\n' +
- 'Навігація по діалоговим вікнам з вкладками \n' +
- '\n' +
- 'У діалогових вікнах із вкладками перша кнопка в меню вкладки приймає фокус, коли відкривається діалогове вікно.
\n' +
- '\n' +
- 'Переходьте між інтерактивними компонентами цієї вкладки діалогового вікна, натискаючи клавіші Tab або\n' +
- ' Shift+Tab .
\n' +
- '\n' +
- 'Щоб перейти на іншу вкладку діалогового вікна, перемістіть фокус на меню вкладки, а потім натисніть відповідну клавішу зі стрілкою ,\n' +
- ' щоб циклічно переходити по доступним вкладкам.
\n');
\ No newline at end of file
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/vi.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/vi.js
deleted file mode 100644
index d8eda11..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/vi.js
+++ /dev/null
@@ -1,93 +0,0 @@
-tinymce.Resource.add('tinymce.html-i18n.help-keynav.vi',
-'Bắt đầu điều hướng bàn phím \n' +
- '\n' +
- '\n' +
- ' Tập trung vào thanh menu \n' +
- ' Windows hoặc Linux: Alt+F9 \n' +
- ' macOS: ⌥F9 \n' +
- ' Tập trung vào thanh công cụ \n' +
- ' Windows hoặc Linux: Alt+F10 \n' +
- ' macOS: ⌥F10 \n' +
- ' Tập trung vào chân trang \n' +
- ' Windows hoặc Linux: Alt+F11 \n' +
- ' macOS: ⌥F11 \n' +
- ' Tập trung vào thông báo \n' +
- ' Windows hoặc Linux: Alt+F12 \n' +
- ' macOS: ⌥F12 \n' +
- ' Tập trung vào thanh công cụ ngữ cảnh \n' +
- ' Windows, Linux hoặc macOS: Ctrl+F9 \n' +
- ' \n' +
- '\n' +
- 'Điều hướng sẽ bắt đầu từ mục UI đầu tiên. Mục này sẽ được tô sáng hoặc có gạch dưới (nếu là mục đầu tiên trong\n' +
- ' đường dẫn phần tử Chân trang).
\n' +
- '\n' +
- 'Di chuyển qua lại giữa các phần UI \n' +
- '\n' +
- 'Để di chuyển từ một phần UI sang phần tiếp theo, ấn Tab .
\n' +
- '\n' +
- 'Để di chuyển từ một phần UI về phần trước đó, ấn Shift+Tab .
\n' +
- '\n' +
- 'Thứ tự Tab của các phần UI này như sau:
\n' +
- '\n' +
- '\n' +
- ' Thanh menu \n' +
- ' Từng nhóm thanh công cụ \n' +
- ' Thanh bên \n' +
- ' Đường dẫn phần tử trong chân trang \n' +
- ' Nút chuyển đổi đếm chữ ở chân trang \n' +
- ' Liên kết thương hiệu ở chân trang \n' +
- ' Núm điều tác chỉnh kích cỡ trình soạn thảo ở chân trang \n' +
- ' \n' +
- '\n' +
- 'Nếu người dùng không thấy một phần UI, thì có nghĩa phần đó bị bỏ qua.
\n' +
- '\n' +
- 'Nếu ở chân trang có tính năng tập trung điều hướng bàn phím, mà không có thanh bên nào hiện hữu, thao tác ấn Shift+Tab \n' +
- ' sẽ chuyển hướng tập trung vào nhóm thanh công cụ đầu tiên, không phải cuối cùng.
\n' +
- '\n' +
- 'Di chuyển qua lại trong các phần UI \n' +
- '\n' +
- 'Để di chuyển từ một phần tử UI sang phần tiếp theo, ấn phím Mũi tên tương ứng cho phù hợp.
\n' +
- '\n' +
- 'Các phím mũi tên Trái và Phải
\n' +
- '\n' +
- '\n' +
- ' di chuyển giữa các menu trong thanh menu. \n' +
- ' mở menu phụ trong một menu. \n' +
- ' di chuyển giữa các nút trong nhóm thanh công cụ. \n' +
- ' di chuyển giữa các mục trong đường dẫn phần tử của chân trang. \n' +
- ' \n' +
- '\n' +
- 'Các phím mũi tên Hướng xuống và Hướng lên
\n' +
- '\n' +
- '\n' +
- ' di chuyển giữa các mục menu trong menu. \n' +
- ' di chuyển giữa các mục trong menu thanh công cụ dạng bật lên. \n' +
- ' \n' +
- '\n' +
- 'Các phím mũi tên xoay vòng trong một phần UI tập trung.
\n' +
- '\n' +
- 'Để đóng một menu mở, một menu phụ đang mở, hoặc một menu dạng bật lên đang mở, hãy ấn phím Esc .
\n' +
- '\n' +
- 'Nếu trọng tâm hiện tại là ở phần “đầu” của một phần UI cụ thể, thao tác ấn phím Esc cũng sẽ thoát\n' +
- ' toàn bộ phần điều hướng bàn phím.
\n' +
- '\n' +
- 'Thực hiện chức năng của một mục menu hoặc nút thanh công cụ \n' +
- '\n' +
- 'Khi mục menu hoặc nút thanh công cụ muốn dùng được tô sáng, hãy ấn Return , Enter ,\n' +
- ' hoặc Phím cách để thực hiện chức năng mục đó.
\n' +
- '\n' +
- 'Điều hướng giữa các hộp thoại không có nhiều tab \n' +
- '\n' +
- 'Trong các hộp thoại không có nhiều tab, khi hộp thoại mở ra, trọng tâm sẽ hướng vào thành phần tương tác đầu tiên.
\n' +
- '\n' +
- 'Di chuyển giữa các thành phần hộp thoại tương tác bằng cách ấn Tab hoặc Shift+Tab .
\n' +
- '\n' +
- 'Điều hướng giữa các hộp thoại có nhiều tab \n' +
- '\n' +
- 'Trong các hộp thoại có nhiều tab, khi hộp thoại mở ra, trọng tâm sẽ hướng vào nút đầu tiên trong menu tab.
\n' +
- '\n' +
- 'Di chuyển giữa các thành phần tương tác của tab hộp thoại này bằng cách ấn Tab hoặc\n' +
- ' Shift+Tab .
\n' +
- '\n' +
- 'Chuyển sang một tab hộp thoại khác bằng cách chuyển trọng tâm vào menu tab, rồi ấn phím Mũi tên phù hợp\n' +
- ' để xoay vòng các tab hiện có.
\n');
\ No newline at end of file
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/zh_CN.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/zh_CN.js
deleted file mode 100644
index f7e73d1..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/zh_CN.js
+++ /dev/null
@@ -1,87 +0,0 @@
-tinymce.Resource.add('tinymce.html-i18n.help-keynav.zh_CN',
-'开始键盘导航 \n' +
- '\n' +
- '\n' +
- ' 使菜单栏处于焦点 \n' +
- ' Windows 或 Linux:Alt+F9 \n' +
- ' macOS:⌥F9 \n' +
- ' 使工具栏处于焦点 \n' +
- ' Windows 或 Linux:Alt+F10 \n' +
- ' macOS:⌥F10 \n' +
- ' 使页脚处于焦点 \n' +
- ' Windows 或 Linux:Alt+F11 \n' +
- ' macOS:⌥F11 \n' +
- ' 使通知处于焦点 \n' +
- ' Windows 或 Linux:Alt+F12 \n' +
- ' macOS:⌥F12 \n' +
- ' 使上下文工具栏处于焦点 \n' +
- ' Windows、Linux 或 macOS:Ctrl+F9 \n' +
- ' \n' +
- '\n' +
- '导航将在第一个 UI 项上开始,其中突出显示该项,或者对于页脚元素路径中的第一项,将为其添加下划线。
\n' +
- '\n' +
- '在 UI 部分之间导航 \n' +
- '\n' +
- '要从一个 UI 部分移至下一个,请按 Tab 。
\n' +
- '\n' +
- '要从一个 UI 部分移至上一个,请按 Shift+Tab 。
\n' +
- '\n' +
- '这些 UI 部分的 Tab 顺序为:
\n' +
- '\n' +
- '\n' +
- ' 菜单栏 \n' +
- ' 每个工具栏组 \n' +
- ' 边栏 \n' +
- ' 页脚中的元素路径 \n' +
- ' 页脚中的字数切换按钮 \n' +
- ' 页脚中的品牌链接 \n' +
- ' 页脚中的编辑器调整大小图柄 \n' +
- ' \n' +
- '\n' +
- '如果不存在某个 UI 部分,则跳过它。
\n' +
- '\n' +
- '如果键盘导航焦点在页脚,并且没有可见的边栏,则按 Shift+Tab 将焦点移至第一个工具栏组而非最后一个。
\n' +
- '\n' +
- '在 UI 部分内导航 \n' +
- '\n' +
- '要从一个 UI 元素移至下一个,请按相应的箭头 键。
\n' +
- '\n' +
- '左 和右 箭头键
\n' +
- '\n' +
- '\n' +
- ' 在菜单栏中的菜单之间移动。 \n' +
- ' 打开菜单中的子菜单。 \n' +
- ' 在工具栏组中的按钮之间移动。 \n' +
- ' 在页脚的元素路径中的各项之间移动。 \n' +
- ' \n' +
- '\n' +
- '下 和上 箭头键
\n' +
- '\n' +
- '\n' +
- ' 在菜单中的菜单项之间移动。 \n' +
- ' 在工具栏弹出菜单中的各项之间移动。 \n' +
- ' \n' +
- '\n' +
- '箭头 键在具有焦点的 UI 部分内循环。
\n' +
- '\n' +
- '要关闭打开的菜单、打开的子菜单或打开的弹出菜单,请按 Esc 键。
\n' +
- '\n' +
- '如果当前的焦点在特定 UI 部分的“顶部”,则按 Esc 键还将完全退出键盘导航。
\n' +
- '\n' +
- '执行菜单项或工具栏按钮 \n' +
- '\n' +
- '当突出显示所需的菜单项或工具栏按钮时,按 Return 、Enter 或空格 以执行该项。
\n' +
- '\n' +
- '在非标签页式对话框中导航 \n' +
- '\n' +
- '在非标签页式对话框中,当对话框打开时,第一个交互组件获得焦点。
\n' +
- '\n' +
- '通过按 Tab 或 Shift+Tab ,在交互对话框组件之间导航。
\n' +
- '\n' +
- '在标签页式对话框中导航 \n' +
- '\n' +
- '在标签页式对话框中,当对话框打开时,标签页菜单中的第一个按钮获得焦点。
\n' +
- '\n' +
- '通过按 Tab 或 Shift+Tab ,在此对话框的交互组件之间导航。
\n' +
- '\n' +
- '通过将焦点移至另一对话框标签页的菜单,然后按相应的箭头 键以在可用的标签页间循环,从而切换到该对话框标签页。
\n');
\ No newline at end of file
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/zh_TW.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/zh_TW.js
deleted file mode 100644
index 5912770..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/js/i18n/keynav/zh_TW.js
+++ /dev/null
@@ -1,93 +0,0 @@
-tinymce.Resource.add('tinymce.html-i18n.help-keynav.zh_TW',
-'開始鍵盤瀏覽 \n' +
- '\n' +
- '\n' +
- ' 跳至功能表列 \n' +
- ' Windows 或 Linux:Alt+F9 \n' +
- ' macOS:⌥F9 \n' +
- ' 跳至工具列 \n' +
- ' Windows 或 Linux:Alt+F10 \n' +
- ' macOS:⌥F10 \n' +
- ' 跳至頁尾 \n' +
- ' Windows 或 Linux:Alt+F11 \n' +
- ' macOS:⌥F11 \n' +
- ' 跳至通知 \n' +
- ' Windows 或 Linux:Alt+F12 \n' +
- ' macOS:⌥F12 \n' +
- ' 跳至關聯式工具列 \n' +
- ' Windows、Linux 或 macOS:Ctrl+F9 \n' +
- ' \n' +
- '\n' +
- '瀏覽會從第一個 UI 項目開始,該項目會反白顯示,但如果是「頁尾」元素路徑的第一項,\n' +
- ' 則加底線。
\n' +
- '\n' +
- '在 UI 區段之間瀏覽 \n' +
- '\n' +
- '從 UI 區段移至下一個,請按 Tab 。
\n' +
- '\n' +
- '從 UI 區段移回上一個,請按 Shift+Tab 。
\n' +
- '\n' +
- '這些 UI 區段的 Tab 順序如下:
\n' +
- '\n' +
- '\n' +
- ' 功能表列 \n' +
- ' 各個工具列群組 \n' +
- ' 側邊欄 \n' +
- ' 頁尾中的元素路徑 \n' +
- ' 頁尾中字數切換按鈕 \n' +
- ' 頁尾中的品牌連結 \n' +
- ' 頁尾中編輯器調整大小控點 \n' +
- ' \n' +
- '\n' +
- '如果 UI 區段未顯示,表示已略過該區段。
\n' +
- '\n' +
- '如果鍵盤瀏覽跳至頁尾,但沒有顯示側邊欄,則按下 Shift+Tab \n' +
- ' 會跳至第一個工具列群組,而不是最後一個。
\n' +
- '\n' +
- '在 UI 區段之內瀏覽 \n' +
- '\n' +
- '在兩個 UI 元素之間移動,請按適當的方向 鍵。
\n' +
- '\n' +
- '向左 和向右 方向鍵
\n' +
- '\n' +
- '\n' +
- ' 在功能表列中的功能表之間移動。 \n' +
- ' 開啟功能表中的子功能表。 \n' +
- ' 在工具列群組中的按鈕之間移動。 \n' +
- ' 在頁尾的元素路徑中項目之間移動。 \n' +
- ' \n' +
- '\n' +
- '向下 和向上 方向鍵
\n' +
- '\n' +
- '\n' +
- ' 在功能表中的功能表項目之間移動。 \n' +
- ' 在工具列快顯功能表中的項目之間移動。 \n' +
- ' \n' +
- '\n' +
- '方向 鍵會在所跳至 UI 區段之內循環。
\n' +
- '\n' +
- '若要關閉已開啟的功能表、已開啟的子功能表,或已開啟的快顯功能表,請按 Esc 鍵。
\n' +
- '\n' +
- '如果目前已跳至特定 UI 區段的「頂端」,則按 Esc 鍵也會結束\n' +
- ' 整個鍵盤瀏覽。
\n' +
- '\n' +
- '執行功能表列項目或工具列按鈕 \n' +
- '\n' +
- '當想要的功能表項目或工具列按鈕已反白顯示時,按 Return 、Enter 、\n' +
- ' 或空白鍵 即可執行該項目。
\n' +
- '\n' +
- '瀏覽非索引標籤式對話方塊 \n' +
- '\n' +
- '在非索引標籤式對話方塊中,開啟對話方塊時會跳至第一個互動元件。
\n' +
- '\n' +
- '按 Tab 或 Shift+Tab 即可在互動式對話方塊元件之間瀏覽。
\n' +
- '\n' +
- '瀏覽索引標籤式對話方塊 \n' +
- '\n' +
- '在索引標籤式對話方塊中,開啟對話方塊時會跳至索引標籤式功能表中的第一個按鈕。
\n' +
- '\n' +
- '若要在此對話方塊的互動式元件之間瀏覽,請按 Tab 或\n' +
- ' Shift+Tab 。
\n' +
- '\n' +
- '先跳至索引標籤式功能表,然後按適當的方向 鍵,即可切換至另一個對話方塊索引標籤,\n' +
- ' 以循環瀏覽可用的索引標籤。
\n');
\ No newline at end of file
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/plugin.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/plugin.js
deleted file mode 100644
index 2244114..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/plugin.js
+++ /dev/null
@@ -1,917 +0,0 @@
-/**
- * TinyMCE version 7.1.0 (2024-05-08)
- */
-
-(function () {
- 'use strict';
-
- const Cell = initial => {
- let value = initial;
- const get = () => {
- return value;
- };
- const set = v => {
- value = v;
- };
- return {
- get,
- set
- };
- };
-
- var global$4 = tinymce.util.Tools.resolve('tinymce.PluginManager');
-
- let unique = 0;
- const generate = prefix => {
- const date = new Date();
- const time = date.getTime();
- const random = Math.floor(Math.random() * 1000000000);
- unique++;
- return prefix + '_' + random + unique + String(time);
- };
-
- const get$1 = customTabs => {
- const addTab = spec => {
- var _a;
- const name = (_a = spec.name) !== null && _a !== void 0 ? _a : generate('tab-name');
- const currentCustomTabs = customTabs.get();
- currentCustomTabs[name] = spec;
- customTabs.set(currentCustomTabs);
- };
- return { addTab };
- };
-
- const register$2 = (editor, dialogOpener) => {
- editor.addCommand('mceHelp', dialogOpener);
- };
-
- const option = name => editor => editor.options.get(name);
- const register$1 = editor => {
- const registerOption = editor.options.register;
- registerOption('help_tabs', { processor: 'array' });
- };
- const getHelpTabs = option('help_tabs');
- const getForcedPlugins = option('forced_plugins');
-
- const register = (editor, dialogOpener) => {
- editor.ui.registry.addButton('help', {
- icon: 'help',
- tooltip: 'Help',
- onAction: dialogOpener
- });
- editor.ui.registry.addMenuItem('help', {
- text: 'Help',
- icon: 'help',
- shortcut: 'Alt+0',
- onAction: dialogOpener
- });
- };
-
- const hasProto = (v, constructor, predicate) => {
- var _a;
- if (predicate(v, constructor.prototype)) {
- return true;
- } else {
- return ((_a = v.constructor) === null || _a === void 0 ? void 0 : _a.name) === constructor.name;
- }
- };
- const typeOf = x => {
- const t = typeof x;
- if (x === null) {
- return 'null';
- } else if (t === 'object' && Array.isArray(x)) {
- return 'array';
- } else if (t === 'object' && hasProto(x, String, (o, proto) => proto.isPrototypeOf(o))) {
- return 'string';
- } else {
- return t;
- }
- };
- const isType = type => value => typeOf(value) === type;
- const isSimpleType = type => value => typeof value === type;
- const eq = t => a => t === a;
- const isString = isType('string');
- const isUndefined = eq(undefined);
- const isNullable = a => a === null || a === undefined;
- const isNonNullable = a => !isNullable(a);
- const isFunction = isSimpleType('function');
-
- const constant = value => {
- return () => {
- return value;
- };
- };
- const never = constant(false);
-
- class Optional {
- constructor(tag, value) {
- this.tag = tag;
- this.value = value;
- }
- static some(value) {
- return new Optional(true, value);
- }
- static none() {
- return Optional.singletonNone;
- }
- fold(onNone, onSome) {
- if (this.tag) {
- return onSome(this.value);
- } else {
- return onNone();
- }
- }
- isSome() {
- return this.tag;
- }
- isNone() {
- return !this.tag;
- }
- map(mapper) {
- if (this.tag) {
- return Optional.some(mapper(this.value));
- } else {
- return Optional.none();
- }
- }
- bind(binder) {
- if (this.tag) {
- return binder(this.value);
- } else {
- return Optional.none();
- }
- }
- exists(predicate) {
- return this.tag && predicate(this.value);
- }
- forall(predicate) {
- return !this.tag || predicate(this.value);
- }
- filter(predicate) {
- if (!this.tag || predicate(this.value)) {
- return this;
- } else {
- return Optional.none();
- }
- }
- getOr(replacement) {
- return this.tag ? this.value : replacement;
- }
- or(replacement) {
- return this.tag ? this : replacement;
- }
- getOrThunk(thunk) {
- return this.tag ? this.value : thunk();
- }
- orThunk(thunk) {
- return this.tag ? this : thunk();
- }
- getOrDie(message) {
- if (!this.tag) {
- throw new Error(message !== null && message !== void 0 ? message : 'Called getOrDie on None');
- } else {
- return this.value;
- }
- }
- static from(value) {
- return isNonNullable(value) ? Optional.some(value) : Optional.none();
- }
- getOrNull() {
- return this.tag ? this.value : null;
- }
- getOrUndefined() {
- return this.value;
- }
- each(worker) {
- if (this.tag) {
- worker(this.value);
- }
- }
- toArray() {
- return this.tag ? [this.value] : [];
- }
- toString() {
- return this.tag ? `some(${ this.value })` : 'none()';
- }
- }
- Optional.singletonNone = new Optional(false);
-
- const nativeSlice = Array.prototype.slice;
- const nativeIndexOf = Array.prototype.indexOf;
- const rawIndexOf = (ts, t) => nativeIndexOf.call(ts, t);
- const contains = (xs, x) => rawIndexOf(xs, x) > -1;
- const map = (xs, f) => {
- const len = xs.length;
- const r = new Array(len);
- for (let i = 0; i < len; i++) {
- const x = xs[i];
- r[i] = f(x, i);
- }
- return r;
- };
- const filter = (xs, pred) => {
- const r = [];
- for (let i = 0, len = xs.length; i < len; i++) {
- const x = xs[i];
- if (pred(x, i)) {
- r.push(x);
- }
- }
- return r;
- };
- const findUntil = (xs, pred, until) => {
- for (let i = 0, len = xs.length; i < len; i++) {
- const x = xs[i];
- if (pred(x, i)) {
- return Optional.some(x);
- } else if (until(x, i)) {
- break;
- }
- }
- return Optional.none();
- };
- const find = (xs, pred) => {
- return findUntil(xs, pred, never);
- };
- const sort = (xs, comparator) => {
- const copy = nativeSlice.call(xs, 0);
- copy.sort(comparator);
- return copy;
- };
-
- const keys = Object.keys;
- const hasOwnProperty = Object.hasOwnProperty;
- const get = (obj, key) => {
- return has(obj, key) ? Optional.from(obj[key]) : Optional.none();
- };
- const has = (obj, key) => hasOwnProperty.call(obj, key);
-
- const cat = arr => {
- const r = [];
- const push = x => {
- r.push(x);
- };
- for (let i = 0; i < arr.length; i++) {
- arr[i].each(push);
- }
- return r;
- };
-
- var global$3 = tinymce.util.Tools.resolve('tinymce.Resource');
-
- var global$2 = tinymce.util.Tools.resolve('tinymce.util.I18n');
-
- const pLoadHtmlByLangCode = (baseUrl, langCode) => global$3.load(`tinymce.html-i18n.help-keynav.${ langCode }`, `${ baseUrl }/js/i18n/keynav/${ langCode }.js`);
- const pLoadI18nHtml = baseUrl => pLoadHtmlByLangCode(baseUrl, global$2.getCode()).catch(() => pLoadHtmlByLangCode(baseUrl, 'en'));
- const initI18nLoad = (editor, baseUrl) => {
- editor.on('init', () => {
- pLoadI18nHtml(baseUrl);
- });
- };
-
- const pTab = async pluginUrl => {
- const body = {
- type: 'htmlpanel',
- presets: 'document',
- html: await pLoadI18nHtml(pluginUrl)
- };
- return {
- name: 'keyboardnav',
- title: 'Keyboard Navigation',
- items: [body]
- };
- };
-
- var global$1 = tinymce.util.Tools.resolve('tinymce.Env');
-
- const convertText = source => {
- const isMac = global$1.os.isMacOS() || global$1.os.isiOS();
- const mac = {
- alt: '⌥',
- ctrl: '⌃',
- shift: '⇧',
- meta: '⌘',
- access: '⌃⌥'
- };
- const other = {
- meta: 'Ctrl ',
- access: 'Shift + Alt '
- };
- const replace = isMac ? mac : other;
- const shortcut = source.split('+');
- const updated = map(shortcut, segment => {
- const search = segment.toLowerCase().trim();
- return has(replace, search) ? replace[search] : segment;
- });
- return isMac ? updated.join('').replace(/\s/, '') : updated.join('+');
- };
-
- const shortcuts = [
- {
- shortcuts: ['Meta + B'],
- action: 'Bold'
- },
- {
- shortcuts: ['Meta + I'],
- action: 'Italic'
- },
- {
- shortcuts: ['Meta + U'],
- action: 'Underline'
- },
- {
- shortcuts: ['Meta + A'],
- action: 'Select all'
- },
- {
- shortcuts: [
- 'Meta + Y',
- 'Meta + Shift + Z'
- ],
- action: 'Redo'
- },
- {
- shortcuts: ['Meta + Z'],
- action: 'Undo'
- },
- {
- shortcuts: ['Access + 1'],
- action: 'Heading 1'
- },
- {
- shortcuts: ['Access + 2'],
- action: 'Heading 2'
- },
- {
- shortcuts: ['Access + 3'],
- action: 'Heading 3'
- },
- {
- shortcuts: ['Access + 4'],
- action: 'Heading 4'
- },
- {
- shortcuts: ['Access + 5'],
- action: 'Heading 5'
- },
- {
- shortcuts: ['Access + 6'],
- action: 'Heading 6'
- },
- {
- shortcuts: ['Access + 7'],
- action: 'Paragraph'
- },
- {
- shortcuts: ['Access + 8'],
- action: 'Div'
- },
- {
- shortcuts: ['Access + 9'],
- action: 'Address'
- },
- {
- shortcuts: ['Alt + 0'],
- action: 'Open help dialog'
- },
- {
- shortcuts: ['Alt + F9'],
- action: 'Focus to menubar'
- },
- {
- shortcuts: ['Alt + F10'],
- action: 'Focus to toolbar'
- },
- {
- shortcuts: ['Alt + F11'],
- action: 'Focus to element path'
- },
- {
- shortcuts: ['Alt + F12'],
- action: 'Focus to notification'
- },
- {
- shortcuts: ['Ctrl + F9'],
- action: 'Focus to contextual toolbar'
- },
- {
- shortcuts: ['Shift + Enter'],
- action: 'Open popup menu for split buttons'
- },
- {
- shortcuts: ['Meta + K'],
- action: 'Insert link (if link plugin activated)'
- },
- {
- shortcuts: ['Meta + S'],
- action: 'Save (if save plugin activated)'
- },
- {
- shortcuts: ['Meta + F'],
- action: 'Find (if searchreplace plugin activated)'
- },
- {
- shortcuts: ['Meta + Shift + F'],
- action: 'Switch to or from fullscreen mode'
- }
- ];
-
- const tab$2 = () => {
- const shortcutList = map(shortcuts, shortcut => {
- const shortcutText = map(shortcut.shortcuts, convertText).join(' or ');
- return [
- shortcut.action,
- shortcutText
- ];
- });
- const tablePanel = {
- type: 'table',
- header: [
- 'Action',
- 'Shortcut'
- ],
- cells: shortcutList
- };
- return {
- name: 'shortcuts',
- title: 'Handy Shortcuts',
- items: [tablePanel]
- };
- };
-
- const urls = map([
- {
- key: 'accordion',
- name: 'Accordion'
- },
- {
- key: 'anchor',
- name: 'Anchor'
- },
- {
- key: 'autolink',
- name: 'Autolink'
- },
- {
- key: 'autoresize',
- name: 'Autoresize'
- },
- {
- key: 'autosave',
- name: 'Autosave'
- },
- {
- key: 'charmap',
- name: 'Character Map'
- },
- {
- key: 'code',
- name: 'Code'
- },
- {
- key: 'codesample',
- name: 'Code Sample'
- },
- {
- key: 'colorpicker',
- name: 'Color Picker'
- },
- {
- key: 'directionality',
- name: 'Directionality'
- },
- {
- key: 'emoticons',
- name: 'Emoticons'
- },
- {
- key: 'fullscreen',
- name: 'Full Screen'
- },
- {
- key: 'help',
- name: 'Help'
- },
- {
- key: 'image',
- name: 'Image'
- },
- {
- key: 'importcss',
- name: 'Import CSS'
- },
- {
- key: 'insertdatetime',
- name: 'Insert Date/Time'
- },
- {
- key: 'link',
- name: 'Link'
- },
- {
- key: 'lists',
- name: 'Lists'
- },
- {
- key: 'advlist',
- name: 'List Styles'
- },
- {
- key: 'media',
- name: 'Media'
- },
- {
- key: 'nonbreaking',
- name: 'Nonbreaking'
- },
- {
- key: 'pagebreak',
- name: 'Page Break'
- },
- {
- key: 'preview',
- name: 'Preview'
- },
- {
- key: 'quickbars',
- name: 'Quick Toolbars'
- },
- {
- key: 'save',
- name: 'Save'
- },
- {
- key: 'searchreplace',
- name: 'Search and Replace'
- },
- {
- key: 'table',
- name: 'Table'
- },
- {
- key: 'textcolor',
- name: 'Text Color'
- },
- {
- key: 'visualblocks',
- name: 'Visual Blocks'
- },
- {
- key: 'visualchars',
- name: 'Visual Characters'
- },
- {
- key: 'wordcount',
- name: 'Word Count'
- },
- {
- key: 'a11ychecker',
- name: 'Accessibility Checker',
- type: 'premium'
- },
- {
- key: 'typography',
- name: 'Advanced Typography',
- type: 'premium',
- slug: 'advanced-typography'
- },
- {
- key: 'ai',
- name: 'AI Assistant',
- type: 'premium'
- },
- {
- key: 'casechange',
- name: 'Case Change',
- type: 'premium'
- },
- {
- key: 'checklist',
- name: 'Checklist',
- type: 'premium'
- },
- {
- key: 'advcode',
- name: 'Enhanced Code Editor',
- type: 'premium'
- },
- {
- key: 'mediaembed',
- name: 'Enhanced Media Embed',
- type: 'premium',
- slug: 'introduction-to-mediaembed'
- },
- {
- key: 'advtable',
- name: 'Enhanced Tables',
- type: 'premium'
- },
- {
- key: 'exportpdf',
- name: 'Export to PDF',
- type: 'premium'
- },
- {
- key: 'exportword',
- name: 'Export to Word',
- type: 'premium'
- },
- {
- key: 'footnotes',
- name: 'Footnotes',
- type: 'premium'
- },
- {
- key: 'formatpainter',
- name: 'Format Painter',
- type: 'premium'
- },
- {
- key: 'editimage',
- name: 'Image Editing',
- type: 'premium'
- },
- {
- key: 'importword',
- name: 'Import from Word',
- type: 'premium'
- },
- {
- key: 'inlinecss',
- name: 'Inline CSS',
- type: 'premium',
- slug: 'inline-css'
- },
- {
- key: 'linkchecker',
- name: 'Link Checker',
- type: 'premium'
- },
- {
- key: 'math',
- name: 'Math',
- type: 'premium'
- },
- {
- key: 'markdown',
- name: 'Markdown',
- type: 'premium'
- },
- {
- key: 'mentions',
- name: 'Mentions',
- type: 'premium'
- },
- {
- key: 'mergetags',
- name: 'Merge Tags',
- type: 'premium'
- },
- {
- key: 'pageembed',
- name: 'Page Embed',
- type: 'premium'
- },
- {
- key: 'permanentpen',
- name: 'Permanent Pen',
- type: 'premium'
- },
- {
- key: 'powerpaste',
- name: 'PowerPaste',
- type: 'premium',
- slug: 'introduction-to-powerpaste'
- },
- {
- key: 'revisionhistory',
- name: 'Revision History',
- type: 'premium'
- },
- {
- key: 'tinymcespellchecker',
- name: 'Spell Checker',
- type: 'premium',
- slug: 'introduction-to-tiny-spellchecker'
- },
- {
- key: 'autocorrect',
- name: 'Spelling Autocorrect',
- type: 'premium'
- },
- {
- key: 'tableofcontents',
- name: 'Table of Contents',
- type: 'premium'
- },
- {
- key: 'advtemplate',
- name: 'Templates',
- type: 'premium',
- slug: 'advanced-templates'
- },
- {
- key: 'tinycomments',
- name: 'Tiny Comments',
- type: 'premium',
- slug: 'introduction-to-tiny-comments'
- },
- {
- key: 'tinydrive',
- name: 'Tiny Drive',
- type: 'premium',
- slug: 'tinydrive-introduction'
- }
- ], item => ({
- ...item,
- type: item.type || 'opensource',
- slug: item.slug || item.key
- }));
-
- const tab$1 = editor => {
- const availablePlugins = () => {
- const premiumPlugins = filter(urls, ({type}) => {
- return type === 'premium';
- });
- const sortedPremiumPlugins = sort(map(premiumPlugins, p => p.name), (s1, s2) => s1.localeCompare(s2));
- const premiumPluginList = map(sortedPremiumPlugins, pluginName => `${ pluginName } `).join('');
- return '' + '
' + global$2.translate('Premium plugins:') + '
' + '
' + '
';
- };
- const makeLink = p => `${ p.name } `;
- const identifyUnknownPlugin = (editor, key) => {
- const getMetadata = editor.plugins[key].getMetadata;
- if (isFunction(getMetadata)) {
- const metadata = getMetadata();
- return {
- name: metadata.name,
- html: makeLink(metadata)
- };
- } else {
- return {
- name: key,
- html: key
- };
- }
- };
- const getPluginData = (editor, key) => find(urls, x => {
- return x.key === key;
- }).fold(() => {
- return identifyUnknownPlugin(editor, key);
- }, x => {
- const name = x.type === 'premium' ? `${ x.name }*` : x.name;
- const html = makeLink({
- name,
- url: `https://www.tiny.cloud/docs/tinymce/7/${ x.slug }/`
- });
- return {
- name,
- html
- };
- });
- const getPluginKeys = editor => {
- const keys$1 = keys(editor.plugins);
- const forcedPlugins = getForcedPlugins(editor);
- return isUndefined(forcedPlugins) ? keys$1 : filter(keys$1, k => !contains(forcedPlugins, k));
- };
- const pluginLister = editor => {
- const pluginKeys = getPluginKeys(editor);
- const sortedPluginData = sort(map(pluginKeys, k => getPluginData(editor, k)), (pd1, pd2) => pd1.name.localeCompare(pd2.name));
- const pluginLis = map(sortedPluginData, key => {
- return '' + key.html + ' ';
- });
- const count = pluginLis.length;
- const pluginsString = pluginLis.join('');
- const html = '' + global$2.translate([
- 'Plugins installed ({0}):',
- count
- ]) + '
' + '';
- return html;
- };
- const installedPlugins = editor => {
- if (editor == null) {
- return '';
- }
- return '' + pluginLister(editor) + '
';
- };
- const htmlPanel = {
- type: 'htmlpanel',
- presets: 'document',
- html: [
- installedPlugins(editor),
- availablePlugins()
- ].join('')
- };
- return {
- name: 'plugins',
- title: 'Plugins',
- items: [htmlPanel]
- };
- };
-
- var global = tinymce.util.Tools.resolve('tinymce.EditorManager');
-
- const tab = () => {
- const getVersion = (major, minor) => major.indexOf('@') === 0 ? 'X.X.X' : major + '.' + minor;
- const version = getVersion(global.majorVersion, global.minorVersion);
- const changeLogLink = 'TinyMCE ' + version + ' ';
- const htmlPanel = {
- type: 'htmlpanel',
- html: '' + global$2.translate([
- 'You are using {0}',
- changeLogLink
- ]) + '
',
- presets: 'document'
- };
- return {
- name: 'versions',
- title: 'Version',
- items: [htmlPanel]
- };
- };
-
- const parseHelpTabsSetting = (tabsFromSettings, tabs) => {
- const newTabs = {};
- const names = map(tabsFromSettings, t => {
- var _a;
- if (isString(t)) {
- if (has(tabs, t)) {
- newTabs[t] = tabs[t];
- }
- return t;
- } else {
- const name = (_a = t.name) !== null && _a !== void 0 ? _a : generate('tab-name');
- newTabs[name] = t;
- return name;
- }
- });
- return {
- tabs: newTabs,
- names
- };
- };
- const getNamesFromTabs = tabs => {
- const names = keys(tabs);
- const idx = names.indexOf('versions');
- if (idx !== -1) {
- names.splice(idx, 1);
- names.push('versions');
- }
- return {
- tabs,
- names
- };
- };
- const pParseCustomTabs = async (editor, customTabs, pluginUrl) => {
- const shortcuts = tab$2();
- const nav = await pTab(pluginUrl);
- const plugins = tab$1(editor);
- const versions = tab();
- const tabs = {
- [shortcuts.name]: shortcuts,
- [nav.name]: nav,
- [plugins.name]: plugins,
- [versions.name]: versions,
- ...customTabs.get()
- };
- return Optional.from(getHelpTabs(editor)).fold(() => getNamesFromTabs(tabs), tabsFromSettings => parseHelpTabsSetting(tabsFromSettings, tabs));
- };
- const init = (editor, customTabs, pluginUrl) => () => {
- pParseCustomTabs(editor, customTabs, pluginUrl).then(({tabs, names}) => {
- const foundTabs = map(names, name => get(tabs, name));
- const dialogTabs = cat(foundTabs);
- const body = {
- type: 'tabpanel',
- tabs: dialogTabs
- };
- editor.windowManager.open({
- title: 'Help',
- size: 'medium',
- body,
- buttons: [{
- type: 'cancel',
- name: 'close',
- text: 'Close',
- primary: true
- }],
- initialData: {}
- });
- });
- };
-
- var Plugin = () => {
- global$4.add('help', (editor, pluginUrl) => {
- const customTabs = Cell({});
- const api = get$1(customTabs);
- register$1(editor);
- const dialogOpener = init(editor, customTabs, pluginUrl);
- register(editor, dialogOpener);
- register$2(editor, dialogOpener);
- editor.shortcuts.add('Alt+0', 'Open help dialog', 'mceHelp');
- initI18nLoad(editor, pluginUrl);
- return api;
- });
- };
-
- Plugin();
-
-})();
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/plugin.min.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/plugin.min.js
deleted file mode 100644
index c873b1e..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/help/plugin.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/**
- * TinyMCE version 7.1.0 (2024-05-08)
- */
-!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");let t=0;const n=e=>{const n=(new Date).getTime(),a=Math.floor(1e9*Math.random());return t++,e+"_"+a+t+String(n)},a=e=>t=>t.options.get(e),r=a("help_tabs"),o=a("forced_plugins"),i=("string",e=>"string"===(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(n=a=e,(r=String).prototype.isPrototypeOf(n)||(null===(o=a.constructor)||void 0===o?void 0:o.name)===r.name)?"string":t;var n,a,r,o})(e));const s=(void 0,e=>undefined===e);const l=e=>"function"==typeof e,m=(!1,()=>false);class c{constructor(e,t){this.tag=e,this.value=t}static some(e){return new c(!0,e)}static none(){return c.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?c.some(e(this.value)):c.none()}bind(e){return this.tag?e(this.value):c.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:c.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return null==e?c.none():c.some(e)}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}c.singletonNone=new c(!1);const u=Array.prototype.slice,p=Array.prototype.indexOf,y=(e,t)=>{const n=e.length,a=new Array(n);for(let r=0;r{const n=[];for(let a=0,r=e.length;a{const n=u.call(e,0);return n.sort(t),n},g=Object.keys,k=Object.hasOwnProperty,v=(e,t)=>k.call(e,t);var b=tinymce.util.Tools.resolve("tinymce.Resource"),f=tinymce.util.Tools.resolve("tinymce.util.I18n");const A=(e,t)=>b.load(`tinymce.html-i18n.help-keynav.${t}`,`${e}/js/i18n/keynav/${t}.js`),w=e=>A(e,f.getCode()).catch((()=>A(e,"en")));var C=tinymce.util.Tools.resolve("tinymce.Env");const M=e=>{const t=C.os.isMacOS()||C.os.isiOS(),n=t?{alt:"⌥",ctrl:"⌃",shift:"⇧",meta:"⌘",access:"⌃⌥"}:{meta:"Ctrl ",access:"Shift + Alt "},a=e.split("+"),r=y(a,(e=>{const t=e.toLowerCase().trim();return v(n,t)?n[t]:e}));return t?r.join("").replace(/\s/,""):r.join("+")},S=[{shortcuts:["Meta + B"],action:"Bold"},{shortcuts:["Meta + I"],action:"Italic"},{shortcuts:["Meta + U"],action:"Underline"},{shortcuts:["Meta + A"],action:"Select all"},{shortcuts:["Meta + Y","Meta + Shift + Z"],action:"Redo"},{shortcuts:["Meta + Z"],action:"Undo"},{shortcuts:["Access + 1"],action:"Heading 1"},{shortcuts:["Access + 2"],action:"Heading 2"},{shortcuts:["Access + 3"],action:"Heading 3"},{shortcuts:["Access + 4"],action:"Heading 4"},{shortcuts:["Access + 5"],action:"Heading 5"},{shortcuts:["Access + 6"],action:"Heading 6"},{shortcuts:["Access + 7"],action:"Paragraph"},{shortcuts:["Access + 8"],action:"Div"},{shortcuts:["Access + 9"],action:"Address"},{shortcuts:["Alt + 0"],action:"Open help dialog"},{shortcuts:["Alt + F9"],action:"Focus to menubar"},{shortcuts:["Alt + F10"],action:"Focus to toolbar"},{shortcuts:["Alt + F11"],action:"Focus to element path"},{shortcuts:["Alt + F12"],action:"Focus to notification"},{shortcuts:["Ctrl + F9"],action:"Focus to contextual toolbar"},{shortcuts:["Shift + Enter"],action:"Open popup menu for split buttons"},{shortcuts:["Meta + K"],action:"Insert link (if link plugin activated)"},{shortcuts:["Meta + S"],action:"Save (if save plugin activated)"},{shortcuts:["Meta + F"],action:"Find (if searchreplace plugin activated)"},{shortcuts:["Meta + Shift + F"],action:"Switch to or from fullscreen mode"}],_=()=>({name:"shortcuts",title:"Handy Shortcuts",items:[{type:"table",header:["Action","Shortcut"],cells:y(S,(e=>{const t=y(e.shortcuts,M).join(" or ");return[e.action,t]}))}]}),x=y([{key:"accordion",name:"Accordion"},{key:"anchor",name:"Anchor"},{key:"autolink",name:"Autolink"},{key:"autoresize",name:"Autoresize"},{key:"autosave",name:"Autosave"},{key:"charmap",name:"Character Map"},{key:"code",name:"Code"},{key:"codesample",name:"Code Sample"},{key:"colorpicker",name:"Color Picker"},{key:"directionality",name:"Directionality"},{key:"emoticons",name:"Emoticons"},{key:"fullscreen",name:"Full Screen"},{key:"help",name:"Help"},{key:"image",name:"Image"},{key:"importcss",name:"Import CSS"},{key:"insertdatetime",name:"Insert Date/Time"},{key:"link",name:"Link"},{key:"lists",name:"Lists"},{key:"advlist",name:"List Styles"},{key:"media",name:"Media"},{key:"nonbreaking",name:"Nonbreaking"},{key:"pagebreak",name:"Page Break"},{key:"preview",name:"Preview"},{key:"quickbars",name:"Quick Toolbars"},{key:"save",name:"Save"},{key:"searchreplace",name:"Search and Replace"},{key:"table",name:"Table"},{key:"textcolor",name:"Text Color"},{key:"visualblocks",name:"Visual Blocks"},{key:"visualchars",name:"Visual Characters"},{key:"wordcount",name:"Word Count"},{key:"a11ychecker",name:"Accessibility Checker",type:"premium"},{key:"typography",name:"Advanced Typography",type:"premium",slug:"advanced-typography"},{key:"ai",name:"AI Assistant",type:"premium"},{key:"casechange",name:"Case Change",type:"premium"},{key:"checklist",name:"Checklist",type:"premium"},{key:"advcode",name:"Enhanced Code Editor",type:"premium"},{key:"mediaembed",name:"Enhanced Media Embed",type:"premium",slug:"introduction-to-mediaembed"},{key:"advtable",name:"Enhanced Tables",type:"premium"},{key:"exportpdf",name:"Export to PDF",type:"premium"},{key:"exportword",name:"Export to Word",type:"premium"},{key:"footnotes",name:"Footnotes",type:"premium"},{key:"formatpainter",name:"Format Painter",type:"premium"},{key:"editimage",name:"Image Editing",type:"premium"},{key:"importword",name:"Import from Word",type:"premium"},{key:"inlinecss",name:"Inline CSS",type:"premium",slug:"inline-css"},{key:"linkchecker",name:"Link Checker",type:"premium"},{key:"math",name:"Math",type:"premium"},{key:"markdown",name:"Markdown",type:"premium"},{key:"mentions",name:"Mentions",type:"premium"},{key:"mergetags",name:"Merge Tags",type:"premium"},{key:"pageembed",name:"Page Embed",type:"premium"},{key:"permanentpen",name:"Permanent Pen",type:"premium"},{key:"powerpaste",name:"PowerPaste",type:"premium",slug:"introduction-to-powerpaste"},{key:"revisionhistory",name:"Revision History",type:"premium"},{key:"tinymcespellchecker",name:"Spell Checker",type:"premium",slug:"introduction-to-tiny-spellchecker"},{key:"autocorrect",name:"Spelling Autocorrect",type:"premium"},{key:"tableofcontents",name:"Table of Contents",type:"premium"},{key:"advtemplate",name:"Templates",type:"premium",slug:"advanced-templates"},{key:"tinycomments",name:"Tiny Comments",type:"premium",slug:"introduction-to-tiny-comments"},{key:"tinydrive",name:"Tiny Drive",type:"premium",slug:"tinydrive-introduction"}],(e=>({...e,type:e.type||"opensource",slug:e.slug||e.key}))),T=e=>{const t=e=>`${e.name} `,n=(e,n)=>{return(a=x,r=e=>e.key===n,((e,t,n)=>{for(let a=0,r=e.length;a((e,n)=>{const a=e.plugins[n].getMetadata;if(l(a)){const e=a();return{name:e.name,html:t(e)}}return{name:n,html:n}})(e,n)),(e=>{const n="premium"===e.type?`${e.name}*`:e.name;return{name:n,html:t({name:n,url:`https://www.tiny.cloud/docs/tinymce/7/${e.slug}/`})}}));var a,r},a=e=>{const t=(e=>{const t=g(e.plugins),n=o(e);return s(n)?t:h(t,(e=>!(((e,t)=>p.call(e,t))(n,e)>-1)))})(e),a=d(y(t,(t=>n(e,t))),((e,t)=>e.name.localeCompare(t.name))),r=y(a,(e=>""+e.html+" ")),i=r.length,l=r.join("");return""+f.translate(["Plugins installed ({0}):",i])+"
"},r={type:"htmlpanel",presets:"document",html:[(e=>null==e?"":""+a(e)+"
")(e),(()=>{const e=h(x,(({type:e})=>"premium"===e)),t=d(y(e,(e=>e.name)),((e,t)=>e.localeCompare(t))),n=y(t,(e=>`${e} `)).join("");return""+f.translate("Premium plugins:")+"
"})()].join("")};return{name:"plugins",title:"Plugins",items:[r]}};var O=tinymce.util.Tools.resolve("tinymce.EditorManager");const F=(e,t,a)=>()=>{(async(e,t,a)=>{const o=_(),s=await(async e=>({name:"keyboardnav",title:"Keyboard Navigation",items:[{type:"htmlpanel",presets:"document",html:await w(e)}]}))(a),l=T(e),m=(()=>{var e,t;const n='TinyMCE '+(e=O.majorVersion,t=O.minorVersion,(0===e.indexOf("@")?"X.X.X":e+"."+t)+" ");return{name:"versions",title:"Version",items:[{type:"htmlpanel",html:""+f.translate(["You are using {0}",n])+"
",presets:"document"}]}})(),u={[o.name]:o,[s.name]:s,[l.name]:l,[m.name]:m,...t.get()};return c.from(r(e)).fold((()=>(e=>{const t=g(e),n=t.indexOf("versions");return-1!==n&&(t.splice(n,1),t.push("versions")),{tabs:e,names:t}})(u)),(e=>((e,t)=>{const a={},r=y(e,(e=>{var r;if(i(e))return v(t,e)&&(a[e]=t[e]),e;{const t=null!==(r=e.name)&&void 0!==r?r:n("tab-name");return a[t]=e,t}}));return{tabs:a,names:r}})(e,u)))})(e,t,a).then((({tabs:t,names:n})=>{const a={type:"tabpanel",tabs:(e=>{const t=[],n=e=>{t.push(e)};for(let t=0;t{return v(n=t,a=e)?c.from(n[a]):c.none();var n,a})))};e.windowManager.open({title:"Help",size:"medium",body:a,buttons:[{type:"cancel",name:"close",text:"Close",primary:!0}],initialData:{}})}))};e.add("help",((e,t)=>{const a=(e=>{let t={};return{get:()=>t,set:e=>{t=e}}})(),r=(e=>({addTab:t=>{var a;const r=null!==(a=t.name)&&void 0!==a?a:n("tab-name"),o=e.get();o[r]=t,e.set(o)}}))(a);(e=>{(0,e.options.register)("help_tabs",{processor:"array"})})(e);const o=F(e,a,t);return((e,t)=>{e.ui.registry.addButton("help",{icon:"help",tooltip:"Help",onAction:t}),e.ui.registry.addMenuItem("help",{text:"Help",icon:"help",shortcut:"Alt+0",onAction:t})})(e,o),((e,t)=>{e.addCommand("mceHelp",t)})(e,o),e.shortcuts.add("Alt+0","Open help dialog","mceHelp"),((e,t)=>{e.on("init",(()=>{w(t)}))})(e,t),r}))}();
\ No newline at end of file
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/image/plugin.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/image/plugin.js
deleted file mode 100644
index eca7f77..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/image/plugin.js
+++ /dev/null
@@ -1,1505 +0,0 @@
-/**
- * TinyMCE version 7.1.0 (2024-05-08)
- */
-
-(function () {
- 'use strict';
-
- var global$4 = tinymce.util.Tools.resolve('tinymce.PluginManager');
-
- const getPrototypeOf = Object.getPrototypeOf;
- const hasProto = (v, constructor, predicate) => {
- var _a;
- if (predicate(v, constructor.prototype)) {
- return true;
- } else {
- return ((_a = v.constructor) === null || _a === void 0 ? void 0 : _a.name) === constructor.name;
- }
- };
- const typeOf = x => {
- const t = typeof x;
- if (x === null) {
- return 'null';
- } else if (t === 'object' && Array.isArray(x)) {
- return 'array';
- } else if (t === 'object' && hasProto(x, String, (o, proto) => proto.isPrototypeOf(o))) {
- return 'string';
- } else {
- return t;
- }
- };
- const isType = type => value => typeOf(value) === type;
- const isSimpleType = type => value => typeof value === type;
- const eq = t => a => t === a;
- const is = (value, constructor) => isObject(value) && hasProto(value, constructor, (o, proto) => getPrototypeOf(o) === proto);
- const isString = isType('string');
- const isObject = isType('object');
- const isPlainObject = value => is(value, Object);
- const isArray = isType('array');
- const isNull = eq(null);
- const isBoolean = isSimpleType('boolean');
- const isNullable = a => a === null || a === undefined;
- const isNonNullable = a => !isNullable(a);
- const isFunction = isSimpleType('function');
- const isNumber = isSimpleType('number');
- const isArrayOf = (value, pred) => {
- if (isArray(value)) {
- for (let i = 0, len = value.length; i < len; ++i) {
- if (!pred(value[i])) {
- return false;
- }
- }
- return true;
- }
- return false;
- };
-
- const noop = () => {
- };
-
- class Optional {
- constructor(tag, value) {
- this.tag = tag;
- this.value = value;
- }
- static some(value) {
- return new Optional(true, value);
- }
- static none() {
- return Optional.singletonNone;
- }
- fold(onNone, onSome) {
- if (this.tag) {
- return onSome(this.value);
- } else {
- return onNone();
- }
- }
- isSome() {
- return this.tag;
- }
- isNone() {
- return !this.tag;
- }
- map(mapper) {
- if (this.tag) {
- return Optional.some(mapper(this.value));
- } else {
- return Optional.none();
- }
- }
- bind(binder) {
- if (this.tag) {
- return binder(this.value);
- } else {
- return Optional.none();
- }
- }
- exists(predicate) {
- return this.tag && predicate(this.value);
- }
- forall(predicate) {
- return !this.tag || predicate(this.value);
- }
- filter(predicate) {
- if (!this.tag || predicate(this.value)) {
- return this;
- } else {
- return Optional.none();
- }
- }
- getOr(replacement) {
- return this.tag ? this.value : replacement;
- }
- or(replacement) {
- return this.tag ? this : replacement;
- }
- getOrThunk(thunk) {
- return this.tag ? this.value : thunk();
- }
- orThunk(thunk) {
- return this.tag ? this : thunk();
- }
- getOrDie(message) {
- if (!this.tag) {
- throw new Error(message !== null && message !== void 0 ? message : 'Called getOrDie on None');
- } else {
- return this.value;
- }
- }
- static from(value) {
- return isNonNullable(value) ? Optional.some(value) : Optional.none();
- }
- getOrNull() {
- return this.tag ? this.value : null;
- }
- getOrUndefined() {
- return this.value;
- }
- each(worker) {
- if (this.tag) {
- worker(this.value);
- }
- }
- toArray() {
- return this.tag ? [this.value] : [];
- }
- toString() {
- return this.tag ? `some(${ this.value })` : 'none()';
- }
- }
- Optional.singletonNone = new Optional(false);
-
- const keys = Object.keys;
- const hasOwnProperty = Object.hasOwnProperty;
- const each = (obj, f) => {
- const props = keys(obj);
- for (let k = 0, len = props.length; k < len; k++) {
- const i = props[k];
- const x = obj[i];
- f(x, i);
- }
- };
- const objAcc = r => (x, i) => {
- r[i] = x;
- };
- const internalFilter = (obj, pred, onTrue, onFalse) => {
- each(obj, (x, i) => {
- (pred(x, i) ? onTrue : onFalse)(x, i);
- });
- };
- const filter = (obj, pred) => {
- const t = {};
- internalFilter(obj, pred, objAcc(t), noop);
- return t;
- };
- const has = (obj, key) => hasOwnProperty.call(obj, key);
- const hasNonNullableKey = (obj, key) => has(obj, key) && obj[key] !== undefined && obj[key] !== null;
-
- const nativePush = Array.prototype.push;
- const flatten = xs => {
- const r = [];
- for (let i = 0, len = xs.length; i < len; ++i) {
- if (!isArray(xs[i])) {
- throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs);
- }
- nativePush.apply(r, xs[i]);
- }
- return r;
- };
- const get = (xs, i) => i >= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none();
- const head = xs => get(xs, 0);
- const findMap = (arr, f) => {
- for (let i = 0; i < arr.length; i++) {
- const r = f(arr[i], i);
- if (r.isSome()) {
- return r;
- }
- }
- return Optional.none();
- };
-
- typeof window !== 'undefined' ? window : Function('return this;')();
-
- const rawSet = (dom, key, value) => {
- if (isString(value) || isBoolean(value) || isNumber(value)) {
- dom.setAttribute(key, value + '');
- } else {
- console.error('Invalid call to Attribute.set. Key ', key, ':: Value ', value, ':: Element ', dom);
- throw new Error('Attribute value was not simple');
- }
- };
- const set = (element, key, value) => {
- rawSet(element.dom, key, value);
- };
- const remove = (element, key) => {
- element.dom.removeAttribute(key);
- };
-
- const fromHtml = (html, scope) => {
- const doc = scope || document;
- const div = doc.createElement('div');
- div.innerHTML = html;
- if (!div.hasChildNodes() || div.childNodes.length > 1) {
- const message = 'HTML does not have a single root node';
- console.error(message, html);
- throw new Error(message);
- }
- return fromDom(div.childNodes[0]);
- };
- const fromTag = (tag, scope) => {
- const doc = scope || document;
- const node = doc.createElement(tag);
- return fromDom(node);
- };
- const fromText = (text, scope) => {
- const doc = scope || document;
- const node = doc.createTextNode(text);
- return fromDom(node);
- };
- const fromDom = node => {
- if (node === null || node === undefined) {
- throw new Error('Node cannot be null or undefined');
- }
- return { dom: node };
- };
- const fromPoint = (docElm, x, y) => Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom);
- const SugarElement = {
- fromHtml,
- fromTag,
- fromText,
- fromDom,
- fromPoint
- };
-
- var global$3 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils');
-
- var global$2 = tinymce.util.Tools.resolve('tinymce.util.URI');
-
- const isNotEmpty = s => s.length > 0;
-
- const option = name => editor => editor.options.get(name);
- const register$2 = editor => {
- const registerOption = editor.options.register;
- registerOption('image_dimensions', {
- processor: 'boolean',
- default: true
- });
- registerOption('image_advtab', {
- processor: 'boolean',
- default: false
- });
- registerOption('image_uploadtab', {
- processor: 'boolean',
- default: true
- });
- registerOption('image_prepend_url', {
- processor: 'string',
- default: ''
- });
- registerOption('image_class_list', { processor: 'object[]' });
- registerOption('image_description', {
- processor: 'boolean',
- default: true
- });
- registerOption('image_title', {
- processor: 'boolean',
- default: false
- });
- registerOption('image_caption', {
- processor: 'boolean',
- default: false
- });
- registerOption('image_list', {
- processor: value => {
- const valid = value === false || isString(value) || isArrayOf(value, isObject) || isFunction(value);
- return valid ? {
- value,
- valid
- } : {
- valid: false,
- message: 'Must be false, a string, an array or a function.'
- };
- },
- default: false
- });
- };
- const hasDimensions = option('image_dimensions');
- const hasAdvTab = option('image_advtab');
- const hasUploadTab = option('image_uploadtab');
- const getPrependUrl = option('image_prepend_url');
- const getClassList = option('image_class_list');
- const hasDescription = option('image_description');
- const hasImageTitle = option('image_title');
- const hasImageCaption = option('image_caption');
- const getImageList = option('image_list');
- const showAccessibilityOptions = option('a11y_advanced_options');
- const isAutomaticUploadsEnabled = option('automatic_uploads');
- const hasUploadUrl = editor => isNotEmpty(editor.options.get('images_upload_url'));
- const hasUploadHandler = editor => isNonNullable(editor.options.get('images_upload_handler'));
-
- const parseIntAndGetMax = (val1, val2) => Math.max(parseInt(val1, 10), parseInt(val2, 10));
- const getImageSize = url => new Promise(callback => {
- const img = document.createElement('img');
- const done = dimensions => {
- img.onload = img.onerror = null;
- if (img.parentNode) {
- img.parentNode.removeChild(img);
- }
- callback(dimensions);
- };
- img.onload = () => {
- const width = parseIntAndGetMax(img.width, img.clientWidth);
- const height = parseIntAndGetMax(img.height, img.clientHeight);
- const dimensions = {
- width,
- height
- };
- done(Promise.resolve(dimensions));
- };
- img.onerror = () => {
- done(Promise.reject(`Failed to get image dimensions for: ${ url }`));
- };
- const style = img.style;
- style.visibility = 'hidden';
- style.position = 'fixed';
- style.bottom = style.left = '0px';
- style.width = style.height = 'auto';
- document.body.appendChild(img);
- img.src = url;
- });
- const removePixelSuffix = value => {
- if (value) {
- value = value.replace(/px$/, '');
- }
- return value;
- };
- const addPixelSuffix = value => {
- if (value.length > 0 && /^[0-9]+$/.test(value)) {
- value += 'px';
- }
- return value;
- };
- const mergeMargins = css => {
- if (css.margin) {
- const splitMargin = String(css.margin).split(' ');
- switch (splitMargin.length) {
- case 1:
- css['margin-top'] = css['margin-top'] || splitMargin[0];
- css['margin-right'] = css['margin-right'] || splitMargin[0];
- css['margin-bottom'] = css['margin-bottom'] || splitMargin[0];
- css['margin-left'] = css['margin-left'] || splitMargin[0];
- break;
- case 2:
- css['margin-top'] = css['margin-top'] || splitMargin[0];
- css['margin-right'] = css['margin-right'] || splitMargin[1];
- css['margin-bottom'] = css['margin-bottom'] || splitMargin[0];
- css['margin-left'] = css['margin-left'] || splitMargin[1];
- break;
- case 3:
- css['margin-top'] = css['margin-top'] || splitMargin[0];
- css['margin-right'] = css['margin-right'] || splitMargin[1];
- css['margin-bottom'] = css['margin-bottom'] || splitMargin[2];
- css['margin-left'] = css['margin-left'] || splitMargin[1];
- break;
- case 4:
- css['margin-top'] = css['margin-top'] || splitMargin[0];
- css['margin-right'] = css['margin-right'] || splitMargin[1];
- css['margin-bottom'] = css['margin-bottom'] || splitMargin[2];
- css['margin-left'] = css['margin-left'] || splitMargin[3];
- }
- delete css.margin;
- }
- return css;
- };
- const createImageList = (editor, callback) => {
- const imageList = getImageList(editor);
- if (isString(imageList)) {
- fetch(imageList).then(res => {
- if (res.ok) {
- res.json().then(callback);
- }
- });
- } else if (isFunction(imageList)) {
- imageList(callback);
- } else {
- callback(imageList);
- }
- };
- const waitLoadImage = (editor, data, imgElm) => {
- const selectImage = () => {
- imgElm.onload = imgElm.onerror = null;
- if (editor.selection) {
- editor.selection.select(imgElm);
- editor.nodeChanged();
- }
- };
- imgElm.onload = () => {
- if (!data.width && !data.height && hasDimensions(editor)) {
- editor.dom.setAttribs(imgElm, {
- width: String(imgElm.clientWidth),
- height: String(imgElm.clientHeight)
- });
- }
- selectImage();
- };
- imgElm.onerror = selectImage;
- };
- const blobToDataUri = blob => new Promise((resolve, reject) => {
- const reader = new FileReader();
- reader.onload = () => {
- resolve(reader.result);
- };
- reader.onerror = () => {
- var _a;
- reject((_a = reader.error) === null || _a === void 0 ? void 0 : _a.message);
- };
- reader.readAsDataURL(blob);
- });
- const isPlaceholderImage = imgElm => imgElm.nodeName === 'IMG' && (imgElm.hasAttribute('data-mce-object') || imgElm.hasAttribute('data-mce-placeholder'));
- const isSafeImageUrl = (editor, src) => {
- const getOption = editor.options.get;
- return global$2.isDomSafe(src, 'img', {
- allow_html_data_urls: getOption('allow_html_data_urls'),
- allow_script_urls: getOption('allow_script_urls'),
- allow_svg_data_urls: getOption('allow_svg_data_urls')
- });
- };
-
- const DOM = global$3.DOM;
- const getHspace = image => {
- if (image.style.marginLeft && image.style.marginRight && image.style.marginLeft === image.style.marginRight) {
- return removePixelSuffix(image.style.marginLeft);
- } else {
- return '';
- }
- };
- const getVspace = image => {
- if (image.style.marginTop && image.style.marginBottom && image.style.marginTop === image.style.marginBottom) {
- return removePixelSuffix(image.style.marginTop);
- } else {
- return '';
- }
- };
- const getBorder = image => {
- if (image.style.borderWidth) {
- return removePixelSuffix(image.style.borderWidth);
- } else {
- return '';
- }
- };
- const getAttrib = (image, name) => {
- var _a;
- if (image.hasAttribute(name)) {
- return (_a = image.getAttribute(name)) !== null && _a !== void 0 ? _a : '';
- } else {
- return '';
- }
- };
- const hasCaption = image => image.parentNode !== null && image.parentNode.nodeName === 'FIGURE';
- const updateAttrib = (image, name, value) => {
- if (value === '' || value === null) {
- image.removeAttribute(name);
- } else {
- image.setAttribute(name, value);
- }
- };
- const wrapInFigure = image => {
- const figureElm = DOM.create('figure', { class: 'image' });
- DOM.insertAfter(figureElm, image);
- figureElm.appendChild(image);
- figureElm.appendChild(DOM.create('figcaption', { contentEditable: 'true' }, 'Caption'));
- figureElm.contentEditable = 'false';
- };
- const removeFigure = image => {
- const figureElm = image.parentNode;
- if (isNonNullable(figureElm)) {
- DOM.insertAfter(image, figureElm);
- DOM.remove(figureElm);
- }
- };
- const toggleCaption = image => {
- if (hasCaption(image)) {
- removeFigure(image);
- } else {
- wrapInFigure(image);
- }
- };
- const normalizeStyle = (image, normalizeCss) => {
- const attrValue = image.getAttribute('style');
- const value = normalizeCss(attrValue !== null ? attrValue : '');
- if (value.length > 0) {
- image.setAttribute('style', value);
- image.setAttribute('data-mce-style', value);
- } else {
- image.removeAttribute('style');
- }
- };
- const setSize = (name, normalizeCss) => (image, name, value) => {
- const styles = image.style;
- if (styles[name]) {
- styles[name] = addPixelSuffix(value);
- normalizeStyle(image, normalizeCss);
- } else {
- updateAttrib(image, name, value);
- }
- };
- const getSize = (image, name) => {
- if (image.style[name]) {
- return removePixelSuffix(image.style[name]);
- } else {
- return getAttrib(image, name);
- }
- };
- const setHspace = (image, value) => {
- const pxValue = addPixelSuffix(value);
- image.style.marginLeft = pxValue;
- image.style.marginRight = pxValue;
- };
- const setVspace = (image, value) => {
- const pxValue = addPixelSuffix(value);
- image.style.marginTop = pxValue;
- image.style.marginBottom = pxValue;
- };
- const setBorder = (image, value) => {
- const pxValue = addPixelSuffix(value);
- image.style.borderWidth = pxValue;
- };
- const setBorderStyle = (image, value) => {
- image.style.borderStyle = value;
- };
- const getBorderStyle = image => {
- var _a;
- return (_a = image.style.borderStyle) !== null && _a !== void 0 ? _a : '';
- };
- const isFigure = elm => isNonNullable(elm) && elm.nodeName === 'FIGURE';
- const isImage = elm => elm.nodeName === 'IMG';
- const getIsDecorative = image => DOM.getAttrib(image, 'alt').length === 0 && DOM.getAttrib(image, 'role') === 'presentation';
- const getAlt = image => {
- if (getIsDecorative(image)) {
- return '';
- } else {
- return getAttrib(image, 'alt');
- }
- };
- const defaultData = () => ({
- src: '',
- alt: '',
- title: '',
- width: '',
- height: '',
- class: '',
- style: '',
- caption: false,
- hspace: '',
- vspace: '',
- border: '',
- borderStyle: '',
- isDecorative: false
- });
- const getStyleValue = (normalizeCss, data) => {
- var _a;
- const image = document.createElement('img');
- updateAttrib(image, 'style', data.style);
- if (getHspace(image) || data.hspace !== '') {
- setHspace(image, data.hspace);
- }
- if (getVspace(image) || data.vspace !== '') {
- setVspace(image, data.vspace);
- }
- if (getBorder(image) || data.border !== '') {
- setBorder(image, data.border);
- }
- if (getBorderStyle(image) || data.borderStyle !== '') {
- setBorderStyle(image, data.borderStyle);
- }
- return normalizeCss((_a = image.getAttribute('style')) !== null && _a !== void 0 ? _a : '');
- };
- const create = (normalizeCss, data) => {
- const image = document.createElement('img');
- write(normalizeCss, {
- ...data,
- caption: false
- }, image);
- setAlt(image, data.alt, data.isDecorative);
- if (data.caption) {
- const figure = DOM.create('figure', { class: 'image' });
- figure.appendChild(image);
- figure.appendChild(DOM.create('figcaption', { contentEditable: 'true' }, 'Caption'));
- figure.contentEditable = 'false';
- return figure;
- } else {
- return image;
- }
- };
- const read = (normalizeCss, image) => ({
- src: getAttrib(image, 'src'),
- alt: getAlt(image),
- title: getAttrib(image, 'title'),
- width: getSize(image, 'width'),
- height: getSize(image, 'height'),
- class: getAttrib(image, 'class'),
- style: normalizeCss(getAttrib(image, 'style')),
- caption: hasCaption(image),
- hspace: getHspace(image),
- vspace: getVspace(image),
- border: getBorder(image),
- borderStyle: getBorderStyle(image),
- isDecorative: getIsDecorative(image)
- });
- const updateProp = (image, oldData, newData, name, set) => {
- if (newData[name] !== oldData[name]) {
- set(image, name, String(newData[name]));
- }
- };
- const setAlt = (image, alt, isDecorative) => {
- if (isDecorative) {
- DOM.setAttrib(image, 'role', 'presentation');
- const sugarImage = SugarElement.fromDom(image);
- set(sugarImage, 'alt', '');
- } else {
- if (isNull(alt)) {
- const sugarImage = SugarElement.fromDom(image);
- remove(sugarImage, 'alt');
- } else {
- const sugarImage = SugarElement.fromDom(image);
- set(sugarImage, 'alt', alt);
- }
- if (DOM.getAttrib(image, 'role') === 'presentation') {
- DOM.setAttrib(image, 'role', '');
- }
- }
- };
- const updateAlt = (image, oldData, newData) => {
- if (newData.alt !== oldData.alt || newData.isDecorative !== oldData.isDecorative) {
- setAlt(image, newData.alt, newData.isDecorative);
- }
- };
- const normalized = (set, normalizeCss) => (image, name, value) => {
- set(image, value);
- normalizeStyle(image, normalizeCss);
- };
- const write = (normalizeCss, newData, image) => {
- const oldData = read(normalizeCss, image);
- updateProp(image, oldData, newData, 'caption', (image, _name, _value) => toggleCaption(image));
- updateProp(image, oldData, newData, 'src', updateAttrib);
- updateProp(image, oldData, newData, 'title', updateAttrib);
- updateProp(image, oldData, newData, 'width', setSize('width', normalizeCss));
- updateProp(image, oldData, newData, 'height', setSize('height', normalizeCss));
- updateProp(image, oldData, newData, 'class', updateAttrib);
- updateProp(image, oldData, newData, 'style', normalized((image, value) => updateAttrib(image, 'style', value), normalizeCss));
- updateProp(image, oldData, newData, 'hspace', normalized(setHspace, normalizeCss));
- updateProp(image, oldData, newData, 'vspace', normalized(setVspace, normalizeCss));
- updateProp(image, oldData, newData, 'border', normalized(setBorder, normalizeCss));
- updateProp(image, oldData, newData, 'borderStyle', normalized(setBorderStyle, normalizeCss));
- updateAlt(image, oldData, newData);
- };
-
- const normalizeCss$1 = (editor, cssText) => {
- const css = editor.dom.styles.parse(cssText);
- const mergedCss = mergeMargins(css);
- const compressed = editor.dom.styles.parse(editor.dom.styles.serialize(mergedCss));
- return editor.dom.styles.serialize(compressed);
- };
- const getSelectedImage = editor => {
- const imgElm = editor.selection.getNode();
- const figureElm = editor.dom.getParent(imgElm, 'figure.image');
- if (figureElm) {
- return editor.dom.select('img', figureElm)[0];
- }
- if (imgElm && (imgElm.nodeName !== 'IMG' || isPlaceholderImage(imgElm))) {
- return null;
- }
- return imgElm;
- };
- const splitTextBlock = (editor, figure) => {
- var _a;
- const dom = editor.dom;
- const textBlockElements = filter(editor.schema.getTextBlockElements(), (_, parentElm) => !editor.schema.isValidChild(parentElm, 'figure'));
- const textBlock = dom.getParent(figure.parentNode, node => hasNonNullableKey(textBlockElements, node.nodeName), editor.getBody());
- if (textBlock) {
- return (_a = dom.split(textBlock, figure)) !== null && _a !== void 0 ? _a : figure;
- } else {
- return figure;
- }
- };
- const readImageDataFromSelection = editor => {
- const image = getSelectedImage(editor);
- return image ? read(css => normalizeCss$1(editor, css), image) : defaultData();
- };
- const insertImageAtCaret = (editor, data) => {
- const elm = create(css => normalizeCss$1(editor, css), data);
- editor.dom.setAttrib(elm, 'data-mce-id', '__mcenew');
- editor.focus();
- editor.selection.setContent(elm.outerHTML);
- const insertedElm = editor.dom.select('*[data-mce-id="__mcenew"]')[0];
- editor.dom.setAttrib(insertedElm, 'data-mce-id', null);
- if (isFigure(insertedElm)) {
- const figure = splitTextBlock(editor, insertedElm);
- editor.selection.select(figure);
- } else {
- editor.selection.select(insertedElm);
- }
- };
- const syncSrcAttr = (editor, image) => {
- editor.dom.setAttrib(image, 'src', image.getAttribute('src'));
- };
- const deleteImage = (editor, image) => {
- if (image) {
- const elm = editor.dom.is(image.parentNode, 'figure.image') ? image.parentNode : image;
- editor.dom.remove(elm);
- editor.focus();
- editor.nodeChanged();
- if (editor.dom.isEmpty(editor.getBody())) {
- editor.setContent('');
- editor.selection.setCursorLocation();
- }
- }
- };
- const writeImageDataToSelection = (editor, data) => {
- const image = getSelectedImage(editor);
- if (image) {
- write(css => normalizeCss$1(editor, css), data, image);
- syncSrcAttr(editor, image);
- if (isFigure(image.parentNode)) {
- const figure = image.parentNode;
- splitTextBlock(editor, figure);
- editor.selection.select(image.parentNode);
- } else {
- editor.selection.select(image);
- waitLoadImage(editor, data, image);
- }
- }
- };
- const sanitizeImageData = (editor, data) => {
- const src = data.src;
- return {
- ...data,
- src: isSafeImageUrl(editor, src) ? src : ''
- };
- };
- const insertOrUpdateImage = (editor, partialData) => {
- const image = getSelectedImage(editor);
- if (image) {
- const selectedImageData = read(css => normalizeCss$1(editor, css), image);
- const data = {
- ...selectedImageData,
- ...partialData
- };
- const sanitizedData = sanitizeImageData(editor, data);
- if (data.src) {
- writeImageDataToSelection(editor, sanitizedData);
- } else {
- deleteImage(editor, image);
- }
- } else if (partialData.src) {
- insertImageAtCaret(editor, {
- ...defaultData(),
- ...partialData
- });
- }
- };
-
- const deep = (old, nu) => {
- const bothObjects = isPlainObject(old) && isPlainObject(nu);
- return bothObjects ? deepMerge(old, nu) : nu;
- };
- const baseMerge = merger => {
- return (...objects) => {
- if (objects.length === 0) {
- throw new Error(`Can't merge zero objects`);
- }
- const ret = {};
- for (let j = 0; j < objects.length; j++) {
- const curObject = objects[j];
- for (const key in curObject) {
- if (has(curObject, key)) {
- ret[key] = merger(ret[key], curObject[key]);
- }
- }
- }
- return ret;
- };
- };
- const deepMerge = baseMerge(deep);
-
- var global$1 = tinymce.util.Tools.resolve('tinymce.util.ImageUploader');
-
- var global = tinymce.util.Tools.resolve('tinymce.util.Tools');
-
- const getValue = item => isString(item.value) ? item.value : '';
- const getText = item => {
- if (isString(item.text)) {
- return item.text;
- } else if (isString(item.title)) {
- return item.title;
- } else {
- return '';
- }
- };
- const sanitizeList = (list, extractValue) => {
- const out = [];
- global.each(list, item => {
- const text = getText(item);
- if (item.menu !== undefined) {
- const items = sanitizeList(item.menu, extractValue);
- out.push({
- text,
- items
- });
- } else {
- const value = extractValue(item);
- out.push({
- text,
- value
- });
- }
- });
- return out;
- };
- const sanitizer = (extractor = getValue) => list => {
- if (list) {
- return Optional.from(list).map(list => sanitizeList(list, extractor));
- } else {
- return Optional.none();
- }
- };
- const sanitize = list => sanitizer(getValue)(list);
- const isGroup = item => has(item, 'items');
- const findEntryDelegate = (list, value) => findMap(list, item => {
- if (isGroup(item)) {
- return findEntryDelegate(item.items, value);
- } else if (item.value === value) {
- return Optional.some(item);
- } else {
- return Optional.none();
- }
- });
- const findEntry = (optList, value) => optList.bind(list => findEntryDelegate(list, value));
- const ListUtils = {
- sanitizer,
- sanitize,
- findEntry
- };
-
- const makeTab$2 = _info => ({
- title: 'Advanced',
- name: 'advanced',
- items: [{
- type: 'grid',
- columns: 2,
- items: [
- {
- type: 'input',
- label: 'Vertical space',
- name: 'vspace',
- inputMode: 'numeric'
- },
- {
- type: 'input',
- label: 'Horizontal space',
- name: 'hspace',
- inputMode: 'numeric'
- },
- {
- type: 'input',
- label: 'Border width',
- name: 'border',
- inputMode: 'numeric'
- },
- {
- type: 'listbox',
- name: 'borderstyle',
- label: 'Border style',
- items: [
- {
- text: 'Select...',
- value: ''
- },
- {
- text: 'Solid',
- value: 'solid'
- },
- {
- text: 'Dotted',
- value: 'dotted'
- },
- {
- text: 'Dashed',
- value: 'dashed'
- },
- {
- text: 'Double',
- value: 'double'
- },
- {
- text: 'Groove',
- value: 'groove'
- },
- {
- text: 'Ridge',
- value: 'ridge'
- },
- {
- text: 'Inset',
- value: 'inset'
- },
- {
- text: 'Outset',
- value: 'outset'
- },
- {
- text: 'None',
- value: 'none'
- },
- {
- text: 'Hidden',
- value: 'hidden'
- }
- ]
- }
- ]
- }]
- });
- const AdvTab = { makeTab: makeTab$2 };
-
- const collect = editor => {
- const urlListSanitizer = ListUtils.sanitizer(item => editor.convertURL(item.value || item.url || '', 'src'));
- const futureImageList = new Promise(completer => {
- createImageList(editor, imageList => {
- completer(urlListSanitizer(imageList).map(items => flatten([
- [{
- text: 'None',
- value: ''
- }],
- items
- ])));
- });
- });
- const classList = ListUtils.sanitize(getClassList(editor));
- const hasAdvTab$1 = hasAdvTab(editor);
- const hasUploadTab$1 = hasUploadTab(editor);
- const hasUploadUrl$1 = hasUploadUrl(editor);
- const hasUploadHandler$1 = hasUploadHandler(editor);
- const image = readImageDataFromSelection(editor);
- const hasDescription$1 = hasDescription(editor);
- const hasImageTitle$1 = hasImageTitle(editor);
- const hasDimensions$1 = hasDimensions(editor);
- const hasImageCaption$1 = hasImageCaption(editor);
- const hasAccessibilityOptions = showAccessibilityOptions(editor);
- const automaticUploads = isAutomaticUploadsEnabled(editor);
- const prependURL = Optional.some(getPrependUrl(editor)).filter(preUrl => isString(preUrl) && preUrl.length > 0);
- return futureImageList.then(imageList => ({
- image,
- imageList,
- classList,
- hasAdvTab: hasAdvTab$1,
- hasUploadTab: hasUploadTab$1,
- hasUploadUrl: hasUploadUrl$1,
- hasUploadHandler: hasUploadHandler$1,
- hasDescription: hasDescription$1,
- hasImageTitle: hasImageTitle$1,
- hasDimensions: hasDimensions$1,
- hasImageCaption: hasImageCaption$1,
- prependURL,
- hasAccessibilityOptions,
- automaticUploads
- }));
- };
-
- const makeItems = info => {
- const imageUrl = {
- name: 'src',
- type: 'urlinput',
- filetype: 'image',
- label: 'Source',
- picker_text: 'Browse files'
- };
- const imageList = info.imageList.map(items => ({
- name: 'images',
- type: 'listbox',
- label: 'Image list',
- items
- }));
- const imageDescription = {
- name: 'alt',
- type: 'input',
- label: 'Alternative description',
- enabled: !(info.hasAccessibilityOptions && info.image.isDecorative)
- };
- const imageTitle = {
- name: 'title',
- type: 'input',
- label: 'Image title'
- };
- const imageDimensions = {
- name: 'dimensions',
- type: 'sizeinput'
- };
- const isDecorative = {
- type: 'label',
- label: 'Accessibility',
- items: [{
- name: 'isDecorative',
- type: 'checkbox',
- label: 'Image is decorative'
- }]
- };
- const classList = info.classList.map(items => ({
- name: 'classes',
- type: 'listbox',
- label: 'Class',
- items
- }));
- const caption = {
- type: 'label',
- label: 'Caption',
- items: [{
- type: 'checkbox',
- name: 'caption',
- label: 'Show caption'
- }]
- };
- const getDialogContainerType = useColumns => useColumns ? {
- type: 'grid',
- columns: 2
- } : { type: 'panel' };
- return flatten([
- [imageUrl],
- imageList.toArray(),
- info.hasAccessibilityOptions && info.hasDescription ? [isDecorative] : [],
- info.hasDescription ? [imageDescription] : [],
- info.hasImageTitle ? [imageTitle] : [],
- info.hasDimensions ? [imageDimensions] : [],
- [{
- ...getDialogContainerType(info.classList.isSome() && info.hasImageCaption),
- items: flatten([
- classList.toArray(),
- info.hasImageCaption ? [caption] : []
- ])
- }]
- ]);
- };
- const makeTab$1 = info => ({
- title: 'General',
- name: 'general',
- items: makeItems(info)
- });
- const MainTab = {
- makeTab: makeTab$1,
- makeItems
- };
-
- const makeTab = _info => {
- const items = [{
- type: 'dropzone',
- name: 'fileinput'
- }];
- return {
- title: 'Upload',
- name: 'upload',
- items
- };
- };
- const UploadTab = { makeTab };
-
- const createState = info => ({
- prevImage: ListUtils.findEntry(info.imageList, info.image.src),
- prevAlt: info.image.alt,
- open: true
- });
- const fromImageData = image => ({
- src: {
- value: image.src,
- meta: {}
- },
- images: image.src,
- alt: image.alt,
- title: image.title,
- dimensions: {
- width: image.width,
- height: image.height
- },
- classes: image.class,
- caption: image.caption,
- style: image.style,
- vspace: image.vspace,
- border: image.border,
- hspace: image.hspace,
- borderstyle: image.borderStyle,
- fileinput: [],
- isDecorative: image.isDecorative
- });
- const toImageData = (data, removeEmptyAlt) => ({
- src: data.src.value,
- alt: (data.alt === null || data.alt.length === 0) && removeEmptyAlt ? null : data.alt,
- title: data.title,
- width: data.dimensions.width,
- height: data.dimensions.height,
- class: data.classes,
- style: data.style,
- caption: data.caption,
- hspace: data.hspace,
- vspace: data.vspace,
- border: data.border,
- borderStyle: data.borderstyle,
- isDecorative: data.isDecorative
- });
- const addPrependUrl2 = (info, srcURL) => {
- if (!/^(?:[a-zA-Z]+:)?\/\//.test(srcURL)) {
- return info.prependURL.bind(prependUrl => {
- if (srcURL.substring(0, prependUrl.length) !== prependUrl) {
- return Optional.some(prependUrl + srcURL);
- }
- return Optional.none();
- });
- }
- return Optional.none();
- };
- const addPrependUrl = (info, api) => {
- const data = api.getData();
- addPrependUrl2(info, data.src.value).each(srcURL => {
- api.setData({
- src: {
- value: srcURL,
- meta: data.src.meta
- }
- });
- });
- };
- const formFillFromMeta2 = (info, data, meta) => {
- if (info.hasDescription && isString(meta.alt)) {
- data.alt = meta.alt;
- }
- if (info.hasAccessibilityOptions) {
- data.isDecorative = meta.isDecorative || data.isDecorative || false;
- }
- if (info.hasImageTitle && isString(meta.title)) {
- data.title = meta.title;
- }
- if (info.hasDimensions) {
- if (isString(meta.width)) {
- data.dimensions.width = meta.width;
- }
- if (isString(meta.height)) {
- data.dimensions.height = meta.height;
- }
- }
- if (isString(meta.class)) {
- ListUtils.findEntry(info.classList, meta.class).each(entry => {
- data.classes = entry.value;
- });
- }
- if (info.hasImageCaption) {
- if (isBoolean(meta.caption)) {
- data.caption = meta.caption;
- }
- }
- if (info.hasAdvTab) {
- if (isString(meta.style)) {
- data.style = meta.style;
- }
- if (isString(meta.vspace)) {
- data.vspace = meta.vspace;
- }
- if (isString(meta.border)) {
- data.border = meta.border;
- }
- if (isString(meta.hspace)) {
- data.hspace = meta.hspace;
- }
- if (isString(meta.borderstyle)) {
- data.borderstyle = meta.borderstyle;
- }
- }
- };
- const formFillFromMeta = (info, api) => {
- const data = api.getData();
- const meta = data.src.meta;
- if (meta !== undefined) {
- const newData = deepMerge({}, data);
- formFillFromMeta2(info, newData, meta);
- api.setData(newData);
- }
- };
- const calculateImageSize = (helpers, info, state, api) => {
- const data = api.getData();
- const url = data.src.value;
- const meta = data.src.meta || {};
- if (!meta.width && !meta.height && info.hasDimensions) {
- if (isNotEmpty(url)) {
- helpers.imageSize(url).then(size => {
- if (state.open) {
- api.setData({ dimensions: size });
- }
- }).catch(e => console.error(e));
- } else {
- api.setData({
- dimensions: {
- width: '',
- height: ''
- }
- });
- }
- }
- };
- const updateImagesDropdown = (info, state, api) => {
- const data = api.getData();
- const image = ListUtils.findEntry(info.imageList, data.src.value);
- state.prevImage = image;
- api.setData({ images: image.map(entry => entry.value).getOr('') });
- };
- const changeSrc = (helpers, info, state, api) => {
- addPrependUrl(info, api);
- formFillFromMeta(info, api);
- calculateImageSize(helpers, info, state, api);
- updateImagesDropdown(info, state, api);
- };
- const changeImages = (helpers, info, state, api) => {
- const data = api.getData();
- const image = ListUtils.findEntry(info.imageList, data.images);
- image.each(img => {
- const updateAlt = data.alt === '' || state.prevImage.map(image => image.text === data.alt).getOr(false);
- if (updateAlt) {
- if (img.value === '') {
- api.setData({
- src: img,
- alt: state.prevAlt
- });
- } else {
- api.setData({
- src: img,
- alt: img.text
- });
- }
- } else {
- api.setData({ src: img });
- }
- });
- state.prevImage = image;
- changeSrc(helpers, info, state, api);
- };
- const changeFileInput = (helpers, info, state, api) => {
- const data = api.getData();
- api.block('Uploading image');
- head(data.fileinput).fold(() => {
- api.unblock();
- }, file => {
- const blobUri = URL.createObjectURL(file);
- const finalize = () => {
- api.unblock();
- URL.revokeObjectURL(blobUri);
- };
- const updateSrcAndSwitchTab = url => {
- api.setData({
- src: {
- value: url,
- meta: {}
- }
- });
- api.showTab('general');
- changeSrc(helpers, info, state, api);
- };
- blobToDataUri(file).then(dataUrl => {
- const blobInfo = helpers.createBlobCache(file, blobUri, dataUrl);
- if (info.automaticUploads) {
- helpers.uploadImage(blobInfo).then(result => {
- updateSrcAndSwitchTab(result.url);
- finalize();
- }).catch(err => {
- finalize();
- helpers.alertErr(err);
- });
- } else {
- helpers.addToBlobCache(blobInfo);
- updateSrcAndSwitchTab(blobInfo.blobUri());
- api.unblock();
- }
- });
- });
- };
- const changeHandler = (helpers, info, state) => (api, evt) => {
- if (evt.name === 'src') {
- changeSrc(helpers, info, state, api);
- } else if (evt.name === 'images') {
- changeImages(helpers, info, state, api);
- } else if (evt.name === 'alt') {
- state.prevAlt = api.getData().alt;
- } else if (evt.name === 'fileinput') {
- changeFileInput(helpers, info, state, api);
- } else if (evt.name === 'isDecorative') {
- api.setEnabled('alt', !api.getData().isDecorative);
- }
- };
- const closeHandler = state => () => {
- state.open = false;
- };
- const makeDialogBody = info => {
- if (info.hasAdvTab || info.hasUploadUrl || info.hasUploadHandler) {
- const tabPanel = {
- type: 'tabpanel',
- tabs: flatten([
- [MainTab.makeTab(info)],
- info.hasAdvTab ? [AdvTab.makeTab(info)] : [],
- info.hasUploadTab && (info.hasUploadUrl || info.hasUploadHandler) ? [UploadTab.makeTab(info)] : []
- ])
- };
- return tabPanel;
- } else {
- const panel = {
- type: 'panel',
- items: MainTab.makeItems(info)
- };
- return panel;
- }
- };
- const submitHandler = (editor, info, helpers) => api => {
- const data = deepMerge(fromImageData(info.image), api.getData());
- const finalData = {
- ...data,
- style: getStyleValue(helpers.normalizeCss, toImageData(data, false))
- };
- editor.execCommand('mceUpdateImage', false, toImageData(finalData, info.hasAccessibilityOptions));
- editor.editorUpload.uploadImagesAuto();
- api.close();
- };
- const imageSize = editor => url => {
- if (!isSafeImageUrl(editor, url)) {
- return Promise.resolve({
- width: '',
- height: ''
- });
- } else {
- return getImageSize(editor.documentBaseURI.toAbsolute(url)).then(dimensions => ({
- width: String(dimensions.width),
- height: String(dimensions.height)
- }));
- }
- };
- const createBlobCache = editor => (file, blobUri, dataUrl) => {
- var _a;
- return editor.editorUpload.blobCache.create({
- blob: file,
- blobUri,
- name: (_a = file.name) === null || _a === void 0 ? void 0 : _a.replace(/\.[^\.]+$/, ''),
- filename: file.name,
- base64: dataUrl.split(',')[1]
- });
- };
- const addToBlobCache = editor => blobInfo => {
- editor.editorUpload.blobCache.add(blobInfo);
- };
- const alertErr = editor => message => {
- editor.windowManager.alert(message);
- };
- const normalizeCss = editor => cssText => normalizeCss$1(editor, cssText);
- const parseStyle = editor => cssText => editor.dom.parseStyle(cssText);
- const serializeStyle = editor => (stylesArg, name) => editor.dom.serializeStyle(stylesArg, name);
- const uploadImage = editor => blobInfo => global$1(editor).upload([blobInfo], false).then(results => {
- var _a;
- if (results.length === 0) {
- return Promise.reject('Failed to upload image');
- } else if (results[0].status === false) {
- return Promise.reject((_a = results[0].error) === null || _a === void 0 ? void 0 : _a.message);
- } else {
- return results[0];
- }
- });
- const Dialog = editor => {
- const helpers = {
- imageSize: imageSize(editor),
- addToBlobCache: addToBlobCache(editor),
- createBlobCache: createBlobCache(editor),
- alertErr: alertErr(editor),
- normalizeCss: normalizeCss(editor),
- parseStyle: parseStyle(editor),
- serializeStyle: serializeStyle(editor),
- uploadImage: uploadImage(editor)
- };
- const open = () => {
- collect(editor).then(info => {
- const state = createState(info);
- return {
- title: 'Insert/Edit Image',
- size: 'normal',
- body: makeDialogBody(info),
- buttons: [
- {
- type: 'cancel',
- name: 'cancel',
- text: 'Cancel'
- },
- {
- type: 'submit',
- name: 'save',
- text: 'Save',
- primary: true
- }
- ],
- initialData: fromImageData(info.image),
- onSubmit: submitHandler(editor, info, helpers),
- onChange: changeHandler(helpers, info, state),
- onClose: closeHandler(state)
- };
- }).then(editor.windowManager.open);
- };
- return { open };
- };
-
- const register$1 = editor => {
- editor.addCommand('mceImage', Dialog(editor).open);
- editor.addCommand('mceUpdateImage', (_ui, data) => {
- editor.undoManager.transact(() => insertOrUpdateImage(editor, data));
- });
- };
-
- const hasImageClass = node => {
- const className = node.attr('class');
- return isNonNullable(className) && /\bimage\b/.test(className);
- };
- const toggleContentEditableState = state => nodes => {
- let i = nodes.length;
- const toggleContentEditable = node => {
- node.attr('contenteditable', state ? 'true' : null);
- };
- while (i--) {
- const node = nodes[i];
- if (hasImageClass(node)) {
- node.attr('contenteditable', state ? 'false' : null);
- global.each(node.getAll('figcaption'), toggleContentEditable);
- }
- }
- };
- const setup = editor => {
- editor.on('PreInit', () => {
- editor.parser.addNodeFilter('figure', toggleContentEditableState(true));
- editor.serializer.addNodeFilter('figure', toggleContentEditableState(false));
- });
- };
-
- const onSetupEditable = editor => api => {
- const nodeChanged = () => {
- api.setEnabled(editor.selection.isEditable());
- };
- editor.on('NodeChange', nodeChanged);
- nodeChanged();
- return () => {
- editor.off('NodeChange', nodeChanged);
- };
- };
- const register = editor => {
- editor.ui.registry.addToggleButton('image', {
- icon: 'image',
- tooltip: 'Insert/edit image',
- onAction: Dialog(editor).open,
- onSetup: buttonApi => {
- buttonApi.setActive(isNonNullable(getSelectedImage(editor)));
- const unbindSelectorChanged = editor.selection.selectorChangedWithUnbind('img:not([data-mce-object]):not([data-mce-placeholder]),figure.image', buttonApi.setActive).unbind;
- const unbindEditable = onSetupEditable(editor)(buttonApi);
- return () => {
- unbindSelectorChanged();
- unbindEditable();
- };
- }
- });
- editor.ui.registry.addMenuItem('image', {
- icon: 'image',
- text: 'Image...',
- onAction: Dialog(editor).open,
- onSetup: onSetupEditable(editor)
- });
- editor.ui.registry.addContextMenu('image', { update: element => editor.selection.isEditable() && (isFigure(element) || isImage(element) && !isPlaceholderImage(element)) ? ['image'] : [] });
- };
-
- var Plugin = () => {
- global$4.add('image', editor => {
- register$2(editor);
- setup(editor);
- register(editor);
- register$1(editor);
- });
- };
-
- Plugin();
-
-})();
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/image/plugin.min.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/image/plugin.min.js
deleted file mode 100644
index 8390ec5..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/image/plugin.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/**
- * TinyMCE version 7.1.0 (2024-05-08)
- */
-!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=Object.getPrototypeOf,a=(e,t,a)=>{var i;return!!a(e,t.prototype)||(null===(i=e.constructor)||void 0===i?void 0:i.name)===t.name},i=e=>t=>(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&a(e,String,((e,t)=>t.isPrototypeOf(e)))?"string":t})(t)===e,s=e=>t=>typeof t===e,r=i("string"),o=i("object"),n=e=>((e,i)=>o(e)&&a(e,i,((e,a)=>t(e)===a)))(e,Object),l=i("array"),c=(null,e=>null===e);const m=s("boolean"),d=e=>!(e=>null==e)(e),g=s("function"),u=s("number"),p=()=>{};class h{constructor(e,t){this.tag=e,this.value=t}static some(e){return new h(!0,e)}static none(){return h.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?h.some(e(this.value)):h.none()}bind(e){return this.tag?e(this.value):h.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:h.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return d(e)?h.some(e):h.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}h.singletonNone=new h(!1);const b=Object.keys,v=Object.hasOwnProperty,y=(e,t)=>v.call(e,t),f=Array.prototype.push,w=e=>{const t=[];for(let a=0,i=e.length;a{((e,t,a)=>{if(!(r(a)||m(a)||u(a)))throw console.error("Invalid call to Attribute.set. Key ",t,":: Value ",a,":: Element ",e),new Error("Attribute value was not simple");e.setAttribute(t,a+"")})(e.dom,t,a)},D=e=>{if(null==e)throw new Error("Node cannot be null or undefined");return{dom:e}},_=D;var C=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),I=tinymce.util.Tools.resolve("tinymce.util.URI");const U=e=>e.length>0,x=e=>t=>t.options.get(e),S=x("image_dimensions"),N=x("image_advtab"),T=x("image_uploadtab"),O=x("image_prepend_url"),E=x("image_class_list"),L=x("image_description"),j=x("image_title"),M=x("image_caption"),R=x("image_list"),k=x("a11y_advanced_options"),z=x("automatic_uploads"),B=(e,t)=>Math.max(parseInt(e,10),parseInt(t,10)),P=e=>(e&&(e=e.replace(/px$/,"")),e),F=e=>(e.length>0&&/^[0-9]+$/.test(e)&&(e+="px"),e),H=e=>"IMG"===e.nodeName&&(e.hasAttribute("data-mce-object")||e.hasAttribute("data-mce-placeholder")),G=(e,t)=>{const a=e.options.get;return I.isDomSafe(t,"img",{allow_html_data_urls:a("allow_html_data_urls"),allow_script_urls:a("allow_script_urls"),allow_svg_data_urls:a("allow_svg_data_urls")})},W=C.DOM,$=e=>e.style.marginLeft&&e.style.marginRight&&e.style.marginLeft===e.style.marginRight?P(e.style.marginLeft):"",V=e=>e.style.marginTop&&e.style.marginBottom&&e.style.marginTop===e.style.marginBottom?P(e.style.marginTop):"",K=e=>e.style.borderWidth?P(e.style.borderWidth):"",Z=(e,t)=>{var a;return e.hasAttribute(t)&&null!==(a=e.getAttribute(t))&&void 0!==a?a:""},q=e=>null!==e.parentNode&&"FIGURE"===e.parentNode.nodeName,J=(e,t,a)=>{""===a||null===a?e.removeAttribute(t):e.setAttribute(t,a)},Q=(e,t)=>{const a=e.getAttribute("style"),i=t(null!==a?a:"");i.length>0?(e.setAttribute("style",i),e.setAttribute("data-mce-style",i)):e.removeAttribute("style")},X=(e,t)=>(e,a,i)=>{const s=e.style;s[a]?(s[a]=F(i),Q(e,t)):J(e,a,i)},Y=(e,t)=>e.style[t]?P(e.style[t]):Z(e,t),ee=(e,t)=>{const a=F(t);e.style.marginLeft=a,e.style.marginRight=a},te=(e,t)=>{const a=F(t);e.style.marginTop=a,e.style.marginBottom=a},ae=(e,t)=>{const a=F(t);e.style.borderWidth=a},ie=(e,t)=>{e.style.borderStyle=t},se=e=>{var t;return null!==(t=e.style.borderStyle)&&void 0!==t?t:""},re=e=>d(e)&&"FIGURE"===e.nodeName,oe=e=>0===W.getAttrib(e,"alt").length&&"presentation"===W.getAttrib(e,"role"),ne=e=>oe(e)?"":Z(e,"alt"),le=(e,t)=>{var a;const i=document.createElement("img");return J(i,"style",t.style),($(i)||""!==t.hspace)&&ee(i,t.hspace),(V(i)||""!==t.vspace)&&te(i,t.vspace),(K(i)||""!==t.border)&&ae(i,t.border),(se(i)||""!==t.borderStyle)&&ie(i,t.borderStyle),e(null!==(a=i.getAttribute("style"))&&void 0!==a?a:"")},ce=(e,t)=>({src:Z(t,"src"),alt:ne(t),title:Z(t,"title"),width:Y(t,"width"),height:Y(t,"height"),class:Z(t,"class"),style:e(Z(t,"style")),caption:q(t),hspace:$(t),vspace:V(t),border:K(t),borderStyle:se(t),isDecorative:oe(t)}),me=(e,t,a,i,s)=>{a[i]!==t[i]&&s(e,i,String(a[i]))},de=(e,t,a)=>{if(a){W.setAttrib(e,"role","presentation");const t=_(e);A(t,"alt","")}else{if(c(t)){"alt",_(e).dom.removeAttribute("alt")}else{const a=_(e);A(a,"alt",t)}"presentation"===W.getAttrib(e,"role")&&W.setAttrib(e,"role","")}},ge=(e,t)=>(a,i,s)=>{e(a,s),Q(a,t)},ue=(e,t,a)=>{const i=ce(e,a);me(a,i,t,"caption",((e,t,a)=>(e=>{q(e)?(e=>{const t=e.parentNode;d(t)&&(W.insertAfter(e,t),W.remove(t))})(e):(e=>{const t=W.create("figure",{class:"image"});W.insertAfter(t,e),t.appendChild(e),t.appendChild(W.create("figcaption",{contentEditable:"true"},"Caption")),t.contentEditable="false"})(e)})(e))),me(a,i,t,"src",J),me(a,i,t,"title",J),me(a,i,t,"width",X(0,e)),me(a,i,t,"height",X(0,e)),me(a,i,t,"class",J),me(a,i,t,"style",ge(((e,t)=>J(e,"style",t)),e)),me(a,i,t,"hspace",ge(ee,e)),me(a,i,t,"vspace",ge(te,e)),me(a,i,t,"border",ge(ae,e)),me(a,i,t,"borderStyle",ge(ie,e)),((e,t,a)=>{a.alt===t.alt&&a.isDecorative===t.isDecorative||de(e,a.alt,a.isDecorative)})(a,i,t)},pe=(e,t)=>{const a=(e=>{if(e.margin){const t=String(e.margin).split(" ");switch(t.length){case 1:e["margin-top"]=e["margin-top"]||t[0],e["margin-right"]=e["margin-right"]||t[0],e["margin-bottom"]=e["margin-bottom"]||t[0],e["margin-left"]=e["margin-left"]||t[0];break;case 2:e["margin-top"]=e["margin-top"]||t[0],e["margin-right"]=e["margin-right"]||t[1],e["margin-bottom"]=e["margin-bottom"]||t[0],e["margin-left"]=e["margin-left"]||t[1];break;case 3:e["margin-top"]=e["margin-top"]||t[0],e["margin-right"]=e["margin-right"]||t[1],e["margin-bottom"]=e["margin-bottom"]||t[2],e["margin-left"]=e["margin-left"]||t[1];break;case 4:e["margin-top"]=e["margin-top"]||t[0],e["margin-right"]=e["margin-right"]||t[1],e["margin-bottom"]=e["margin-bottom"]||t[2],e["margin-left"]=e["margin-left"]||t[3]}delete e.margin}return e})(e.dom.styles.parse(t)),i=e.dom.styles.parse(e.dom.styles.serialize(a));return e.dom.styles.serialize(i)},he=e=>{const t=e.selection.getNode(),a=e.dom.getParent(t,"figure.image");return a?e.dom.select("img",a)[0]:t&&("IMG"!==t.nodeName||H(t))?null:t},be=(e,t)=>{var a;const i=e.dom,s=((t,a)=>{const i={};var s;return((e,t,a,i)=>{((e,t)=>{const a=b(e);for(let i=0,s=a.length;i{(t(e,s)?a:i)(e,s)}))})(t,((t,a)=>!e.schema.isValidChild(a,"figure")),(s=i,(e,t)=>{s[t]=e}),p),i})(e.schema.getTextBlockElements()),r=i.getParent(t.parentNode,(e=>{return t=s,a=e.nodeName,y(t,a)&&void 0!==t[a]&&null!==t[a];var t,a}),e.getBody());return r&&null!==(a=i.split(r,t))&&void 0!==a?a:t},ve=(e,t)=>{const a=((t,a)=>{const i=document.createElement("img");if(ue((t=>pe(e,t)),{...a,caption:!1},i),de(i,a.alt,a.isDecorative),a.caption){const e=W.create("figure",{class:"image"});return e.appendChild(i),e.appendChild(W.create("figcaption",{contentEditable:"true"},"Caption")),e.contentEditable="false",e}return i})(0,t);e.dom.setAttrib(a,"data-mce-id","__mcenew"),e.focus(),e.selection.setContent(a.outerHTML);const i=e.dom.select('*[data-mce-id="__mcenew"]')[0];if(e.dom.setAttrib(i,"data-mce-id",null),re(i)){const t=be(e,i);e.selection.select(t)}else e.selection.select(i)},ye=(e,t)=>{const a=he(e);if(a){const i={...ce((t=>pe(e,t)),a),...t},s=((e,t)=>{const a=t.src;return{...t,src:G(e,a)?a:""}})(e,i);i.src?((e,t)=>{const a=he(e);if(a)if(ue((t=>pe(e,t)),t,a),((e,t)=>{e.dom.setAttrib(t,"src",t.getAttribute("src"))})(e,a),re(a.parentNode)){const t=a.parentNode;be(e,t),e.selection.select(a.parentNode)}else e.selection.select(a),((e,t,a)=>{const i=()=>{a.onload=a.onerror=null,e.selection&&(e.selection.select(a),e.nodeChanged())};a.onload=()=>{t.width||t.height||!S(e)||e.dom.setAttribs(a,{width:String(a.clientWidth),height:String(a.clientHeight)}),i()},a.onerror=i})(e,t,a)})(e,s):((e,t)=>{if(t){const a=e.dom.is(t.parentNode,"figure.image")?t.parentNode:t;e.dom.remove(a),e.focus(),e.nodeChanged(),e.dom.isEmpty(e.getBody())&&(e.setContent(""),e.selection.setCursorLocation())}})(e,a)}else t.src&&ve(e,{src:"",alt:"",title:"",width:"",height:"",class:"",style:"",caption:!1,hspace:"",vspace:"",border:"",borderStyle:"",isDecorative:!1,...t})},fe=(we=(e,t)=>n(e)&&n(t)?fe(e,t):t,(...e)=>{if(0===e.length)throw new Error("Can't merge zero objects");const t={};for(let a=0;ar(e.value)?e.value:"",Ce=(e,t)=>{const a=[];return De.each(e,(e=>{const i=(e=>r(e.text)?e.text:r(e.title)?e.title:"")(e);if(void 0!==e.menu){const s=Ce(e.menu,t);a.push({text:i,items:s})}else{const s=t(e);a.push({text:i,value:s})}})),a},Ie=(e=_e)=>t=>t?h.from(t).map((t=>Ce(t,e))):h.none(),Ue=(e,t)=>((e,a)=>{for(let a=0;ay(e,"items"))(i=e[a])?Ue(i.items,t):i.value===t?h.some(i):h.none();if(s.isSome())return s}var i;return h.none()})(e),xe=Ie,Se=(e,t)=>e.bind((e=>Ue(e,t))),Ne=e=>{const t=xe((t=>e.convertURL(t.value||t.url||"","src"))),a=new Promise((a=>{((e,t)=>{const a=R(e);r(a)?fetch(a).then((e=>{e.ok&&e.json().then(t)})):g(a)?a(t):t(a)})(e,(e=>{a(t(e).map((e=>w([[{text:"None",value:""}],e]))))}))})),i=(A=E(e),Ie(_e)(A)),s=N(e),o=T(e),n=(e=>U(e.options.get("images_upload_url")))(e),l=(e=>d(e.options.get("images_upload_handler")))(e),c=(e=>{const t=he(e);return t?ce((t=>pe(e,t)),t):{src:"",alt:"",title:"",width:"",height:"",class:"",style:"",caption:!1,hspace:"",vspace:"",border:"",borderStyle:"",isDecorative:!1}})(e),m=L(e),u=j(e),p=S(e),b=M(e),v=k(e),y=z(e),f=h.some(O(e)).filter((e=>r(e)&&e.length>0));var A;return a.then((e=>({image:c,imageList:e,classList:i,hasAdvTab:s,hasUploadTab:o,hasUploadUrl:n,hasUploadHandler:l,hasDescription:m,hasImageTitle:u,hasDimensions:p,hasImageCaption:b,prependURL:f,hasAccessibilityOptions:v,automaticUploads:y})))},Te=e=>{const t=e.imageList.map((e=>({name:"images",type:"listbox",label:"Image list",items:e}))),a={name:"alt",type:"input",label:"Alternative description",enabled:!(e.hasAccessibilityOptions&&e.image.isDecorative)},i=e.classList.map((e=>({name:"classes",type:"listbox",label:"Class",items:e})));return w([[{name:"src",type:"urlinput",filetype:"image",label:"Source",picker_text:"Browse files"}],t.toArray(),e.hasAccessibilityOptions&&e.hasDescription?[{type:"label",label:"Accessibility",items:[{name:"isDecorative",type:"checkbox",label:"Image is decorative"}]}]:[],e.hasDescription?[a]:[],e.hasImageTitle?[{name:"title",type:"input",label:"Image title"}]:[],e.hasDimensions?[{name:"dimensions",type:"sizeinput"}]:[],[{...(s=e.classList.isSome()&&e.hasImageCaption,s?{type:"grid",columns:2}:{type:"panel"}),items:w([i.toArray(),e.hasImageCaption?[{type:"label",label:"Caption",items:[{type:"checkbox",name:"caption",label:"Show caption"}]}]:[]])}]]);var s},Oe=e=>({title:"General",name:"general",items:Te(e)}),Ee=Te,Le=e=>({src:{value:e.src,meta:{}},images:e.src,alt:e.alt,title:e.title,dimensions:{width:e.width,height:e.height},classes:e.class,caption:e.caption,style:e.style,vspace:e.vspace,border:e.border,hspace:e.hspace,borderstyle:e.borderStyle,fileinput:[],isDecorative:e.isDecorative}),je=(e,t)=>({src:e.src.value,alt:null!==e.alt&&0!==e.alt.length||!t?e.alt:null,title:e.title,width:e.dimensions.width,height:e.dimensions.height,class:e.classes,style:e.style,caption:e.caption,hspace:e.hspace,vspace:e.vspace,border:e.border,borderStyle:e.borderstyle,isDecorative:e.isDecorative}),Me=(e,t,a,i)=>{((e,t)=>{const a=t.getData();((e,t)=>/^(?:[a-zA-Z]+:)?\/\//.test(t)?h.none():e.prependURL.bind((e=>t.substring(0,e.length)!==e?h.some(e+t):h.none())))(e,a.src.value).each((e=>{t.setData({src:{value:e,meta:a.src.meta}})}))})(t,i),((e,t)=>{const a=t.getData(),i=a.src.meta;if(void 0!==i){const s=fe({},a);((e,t,a)=>{e.hasDescription&&r(a.alt)&&(t.alt=a.alt),e.hasAccessibilityOptions&&(t.isDecorative=a.isDecorative||t.isDecorative||!1),e.hasImageTitle&&r(a.title)&&(t.title=a.title),e.hasDimensions&&(r(a.width)&&(t.dimensions.width=a.width),r(a.height)&&(t.dimensions.height=a.height)),r(a.class)&&Se(e.classList,a.class).each((e=>{t.classes=e.value})),e.hasImageCaption&&m(a.caption)&&(t.caption=a.caption),e.hasAdvTab&&(r(a.style)&&(t.style=a.style),r(a.vspace)&&(t.vspace=a.vspace),r(a.border)&&(t.border=a.border),r(a.hspace)&&(t.hspace=a.hspace),r(a.borderstyle)&&(t.borderstyle=a.borderstyle))})(e,s,i),t.setData(s)}})(t,i),((e,t,a,i)=>{const s=i.getData(),r=s.src.value,o=s.src.meta||{};o.width||o.height||!t.hasDimensions||(U(r)?e.imageSize(r).then((e=>{a.open&&i.setData({dimensions:e})})).catch((e=>console.error(e))):i.setData({dimensions:{width:"",height:""}}))})(e,t,a,i),((e,t,a)=>{const i=a.getData(),s=Se(e.imageList,i.src.value);t.prevImage=s,a.setData({images:s.map((e=>e.value)).getOr("")})})(t,a,i)},Re=(e,t,a,i)=>{const s=i.getData();var r;i.block("Uploading image"),(r=s.fileinput,((e,t)=>0{i.unblock()}),(s=>{const r=URL.createObjectURL(s),o=()=>{i.unblock(),URL.revokeObjectURL(r)},n=s=>{i.setData({src:{value:s,meta:{}}}),i.showTab("general"),Me(e,t,a,i)};var l;(l=s,new Promise(((e,t)=>{const a=new FileReader;a.onload=()=>{e(a.result)},a.onerror=()=>{var e;t(null===(e=a.error)||void 0===e?void 0:e.message)},a.readAsDataURL(l)}))).then((a=>{const l=e.createBlobCache(s,r,a);t.automaticUploads?e.uploadImage(l).then((e=>{n(e.url),o()})).catch((t=>{o(),e.alertErr(t)})):(e.addToBlobCache(l),n(l.blobUri()),i.unblock())}))}))},ke=(e,t,a)=>(i,s)=>{"src"===s.name?Me(e,t,a,i):"images"===s.name?((e,t,a,i)=>{const s=i.getData(),r=Se(t.imageList,s.images);r.each((e=>{const t=""===s.alt||a.prevImage.map((e=>e.text===s.alt)).getOr(!1);t?""===e.value?i.setData({src:e,alt:a.prevAlt}):i.setData({src:e,alt:e.text}):i.setData({src:e})})),a.prevImage=r,Me(e,t,a,i)})(e,t,a,i):"alt"===s.name?a.prevAlt=i.getData().alt:"fileinput"===s.name?Re(e,t,a,i):"isDecorative"===s.name&&i.setEnabled("alt",!i.getData().isDecorative)},ze=e=>()=>{e.open=!1},Be=e=>e.hasAdvTab||e.hasUploadUrl||e.hasUploadHandler?{type:"tabpanel",tabs:w([[Oe(e)],e.hasAdvTab?[{title:"Advanced",name:"advanced",items:[{type:"grid",columns:2,items:[{type:"input",label:"Vertical space",name:"vspace",inputMode:"numeric"},{type:"input",label:"Horizontal space",name:"hspace",inputMode:"numeric"},{type:"input",label:"Border width",name:"border",inputMode:"numeric"},{type:"listbox",name:"borderstyle",label:"Border style",items:[{text:"Select...",value:""},{text:"Solid",value:"solid"},{text:"Dotted",value:"dotted"},{text:"Dashed",value:"dashed"},{text:"Double",value:"double"},{text:"Groove",value:"groove"},{text:"Ridge",value:"ridge"},{text:"Inset",value:"inset"},{text:"Outset",value:"outset"},{text:"None",value:"none"},{text:"Hidden",value:"hidden"}]}]}]}]:[],e.hasUploadTab&&(e.hasUploadUrl||e.hasUploadHandler)?[{title:"Upload",name:"upload",items:[{type:"dropzone",name:"fileinput"}]}]:[]])}:{type:"panel",items:Ee(e)},Pe=(e,t,a)=>i=>{const s=fe(Le(t.image),i.getData()),r={...s,style:le(a.normalizeCss,je(s,!1))};e.execCommand("mceUpdateImage",!1,je(r,t.hasAccessibilityOptions)),e.editorUpload.uploadImagesAuto(),i.close()},Fe=e=>t=>G(e,t)?(e=>new Promise((t=>{const a=document.createElement("img"),i=e=>{a.onload=a.onerror=null,a.parentNode&&a.parentNode.removeChild(a),t(e)};a.onload=()=>{const e={width:B(a.width,a.clientWidth),height:B(a.height,a.clientHeight)};i(Promise.resolve(e))},a.onerror=()=>{i(Promise.reject(`Failed to get image dimensions for: ${e}`))};const s=a.style;s.visibility="hidden",s.position="fixed",s.bottom=s.left="0px",s.width=s.height="auto",document.body.appendChild(a),a.src=e})))(e.documentBaseURI.toAbsolute(t)).then((e=>({width:String(e.width),height:String(e.height)}))):Promise.resolve({width:"",height:""}),He=e=>(t,a,i)=>{var s;return e.editorUpload.blobCache.create({blob:t,blobUri:a,name:null===(s=t.name)||void 0===s?void 0:s.replace(/\.[^\.]+$/,""),filename:t.name,base64:i.split(",")[1]})},Ge=e=>t=>{e.editorUpload.blobCache.add(t)},We=e=>t=>{e.windowManager.alert(t)},$e=e=>t=>pe(e,t),Ve=e=>t=>e.dom.parseStyle(t),Ke=e=>(t,a)=>e.dom.serializeStyle(t,a),Ze=e=>t=>Ae(e).upload([t],!1).then((e=>{var t;return 0===e.length?Promise.reject("Failed to upload image"):!1===e[0].status?Promise.reject(null===(t=e[0].error)||void 0===t?void 0:t.message):e[0]})),qe=e=>{const t={imageSize:Fe(e),addToBlobCache:Ge(e),createBlobCache:He(e),alertErr:We(e),normalizeCss:$e(e),parseStyle:Ve(e),serializeStyle:Ke(e),uploadImage:Ze(e)};return{open:()=>{Ne(e).then((a=>{const i=(e=>({prevImage:Se(e.imageList,e.image.src),prevAlt:e.image.alt,open:!0}))(a);return{title:"Insert/Edit Image",size:"normal",body:Be(a),buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:Le(a.image),onSubmit:Pe(e,a,t),onChange:ke(t,a,i),onClose:ze(i)}})).then(e.windowManager.open)}}},Je=e=>{const t=e.attr("class");return d(t)&&/\bimage\b/.test(t)},Qe=e=>t=>{let a=t.length;const i=t=>{t.attr("contenteditable",e?"true":null)};for(;a--;){const s=t[a];Je(s)&&(s.attr("contenteditable",e?"false":null),De.each(s.getAll("figcaption"),i))}},Xe=e=>t=>{const a=()=>{t.setEnabled(e.selection.isEditable())};return e.on("NodeChange",a),a(),()=>{e.off("NodeChange",a)}};e.add("image",(e=>{(e=>{const t=e.options.register;t("image_dimensions",{processor:"boolean",default:!0}),t("image_advtab",{processor:"boolean",default:!1}),t("image_uploadtab",{processor:"boolean",default:!0}),t("image_prepend_url",{processor:"string",default:""}),t("image_class_list",{processor:"object[]"}),t("image_description",{processor:"boolean",default:!0}),t("image_title",{processor:"boolean",default:!1}),t("image_caption",{processor:"boolean",default:!1}),t("image_list",{processor:e=>{const t=!1===e||r(e)||((e,t)=>{if(l(e)){for(let a=0,i=e.length;a{e.on("PreInit",(()=>{e.parser.addNodeFilter("figure",Qe(!0)),e.serializer.addNodeFilter("figure",Qe(!1))}))})(e),(e=>{e.ui.registry.addToggleButton("image",{icon:"image",tooltip:"Insert/edit image",onAction:qe(e).open,onSetup:t=>{t.setActive(d(he(e)));const a=e.selection.selectorChangedWithUnbind("img:not([data-mce-object]):not([data-mce-placeholder]),figure.image",t.setActive).unbind,i=Xe(e)(t);return()=>{a(),i()}}}),e.ui.registry.addMenuItem("image",{icon:"image",text:"Image...",onAction:qe(e).open,onSetup:Xe(e)}),e.ui.registry.addContextMenu("image",{update:t=>e.selection.isEditable()&&(re(t)||"IMG"===t.nodeName&&!H(t))?["image"]:[]})})(e),(e=>{e.addCommand("mceImage",qe(e).open),e.addCommand("mceUpdateImage",((t,a)=>{e.undoManager.transact((()=>ye(e,a)))}))})(e)}))}();
\ No newline at end of file
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/importcss/plugin.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/importcss/plugin.js
deleted file mode 100644
index 966b7b3..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/importcss/plugin.js
+++ /dev/null
@@ -1,345 +0,0 @@
-/**
- * TinyMCE version 7.1.0 (2024-05-08)
- */
-
-(function () {
- 'use strict';
-
- var global$4 = tinymce.util.Tools.resolve('tinymce.PluginManager');
-
- const hasProto = (v, constructor, predicate) => {
- var _a;
- if (predicate(v, constructor.prototype)) {
- return true;
- } else {
- return ((_a = v.constructor) === null || _a === void 0 ? void 0 : _a.name) === constructor.name;
- }
- };
- const typeOf = x => {
- const t = typeof x;
- if (x === null) {
- return 'null';
- } else if (t === 'object' && Array.isArray(x)) {
- return 'array';
- } else if (t === 'object' && hasProto(x, String, (o, proto) => proto.isPrototypeOf(o))) {
- return 'string';
- } else {
- return t;
- }
- };
- const isType = type => value => typeOf(value) === type;
- const isSimpleType = type => value => typeof value === type;
- const isString = isType('string');
- const isObject = isType('object');
- const isArray = isType('array');
- const isFunction = isSimpleType('function');
-
- var global$3 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils');
-
- var global$2 = tinymce.util.Tools.resolve('tinymce.EditorManager');
-
- var global$1 = tinymce.util.Tools.resolve('tinymce.Env');
-
- var global = tinymce.util.Tools.resolve('tinymce.util.Tools');
-
- const option = name => editor => editor.options.get(name);
- const register = editor => {
- const registerOption = editor.options.register;
- const filterProcessor = value => isString(value) || isFunction(value) || isObject(value);
- registerOption('importcss_merge_classes', {
- processor: 'boolean',
- default: true
- });
- registerOption('importcss_exclusive', {
- processor: 'boolean',
- default: true
- });
- registerOption('importcss_selector_converter', { processor: 'function' });
- registerOption('importcss_selector_filter', { processor: filterProcessor });
- registerOption('importcss_file_filter', { processor: filterProcessor });
- registerOption('importcss_groups', { processor: 'object[]' });
- registerOption('importcss_append', {
- processor: 'boolean',
- default: false
- });
- };
- const shouldMergeClasses = option('importcss_merge_classes');
- const shouldImportExclusive = option('importcss_exclusive');
- const getSelectorConverter = option('importcss_selector_converter');
- const getSelectorFilter = option('importcss_selector_filter');
- const getCssGroups = option('importcss_groups');
- const shouldAppend = option('importcss_append');
- const getFileFilter = option('importcss_file_filter');
- const getSkin = option('skin');
- const getSkinUrl = option('skin_url');
-
- const nativePush = Array.prototype.push;
- const map = (xs, f) => {
- const len = xs.length;
- const r = new Array(len);
- for (let i = 0; i < len; i++) {
- const x = xs[i];
- r[i] = f(x, i);
- }
- return r;
- };
- const flatten = xs => {
- const r = [];
- for (let i = 0, len = xs.length; i < len; ++i) {
- if (!isArray(xs[i])) {
- throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs);
- }
- nativePush.apply(r, xs[i]);
- }
- return r;
- };
- const bind = (xs, f) => flatten(map(xs, f));
-
- const generate = () => {
- const ungroupedOrder = [];
- const groupOrder = [];
- const groups = {};
- const addItemToGroup = (groupTitle, itemInfo) => {
- if (groups[groupTitle]) {
- groups[groupTitle].push(itemInfo);
- } else {
- groupOrder.push(groupTitle);
- groups[groupTitle] = [itemInfo];
- }
- };
- const addItem = itemInfo => {
- ungroupedOrder.push(itemInfo);
- };
- const toFormats = () => {
- const groupItems = bind(groupOrder, g => {
- const items = groups[g];
- return items.length === 0 ? [] : [{
- title: g,
- items
- }];
- });
- return groupItems.concat(ungroupedOrder);
- };
- return {
- addItemToGroup,
- addItem,
- toFormats
- };
- };
-
- const internalEditorStyle = /^\.(?:ephox|tiny-pageembed|mce)(?:[.-]+\w+)+$/;
- const removeCacheSuffix = url => {
- const cacheSuffix = global$1.cacheSuffix;
- if (isString(url)) {
- url = url.replace('?' + cacheSuffix, '').replace('&' + cacheSuffix, '');
- }
- return url;
- };
- const isSkinContentCss = (editor, href) => {
- const skin = getSkin(editor);
- if (skin) {
- const skinUrlBase = getSkinUrl(editor);
- const skinUrl = skinUrlBase ? editor.documentBaseURI.toAbsolute(skinUrlBase) : global$2.baseURL + '/skins/ui/' + skin;
- const contentSkinUrlPart = global$2.baseURL + '/skins/content/';
- const suffix = editor.editorManager.suffix;
- return href === skinUrl + '/content' + (editor.inline ? '.inline' : '') + `${ suffix }.css` || href.indexOf(contentSkinUrlPart) !== -1;
- }
- return false;
- };
- const compileFilter = filter => {
- if (isString(filter)) {
- return value => {
- return value.indexOf(filter) !== -1;
- };
- } else if (filter instanceof RegExp) {
- return value => {
- return filter.test(value);
- };
- }
- return filter;
- };
- const isCssImportRule = rule => rule.styleSheet;
- const isCssPageRule = rule => rule.selectorText;
- const getSelectors = (editor, doc, fileFilter) => {
- const selectors = [];
- const contentCSSUrls = {};
- const append = (styleSheet, imported) => {
- let href = styleSheet.href;
- let rules;
- href = removeCacheSuffix(href);
- if (!href || fileFilter && !fileFilter(href, imported) || isSkinContentCss(editor, href)) {
- return;
- }
- global.each(styleSheet.imports, styleSheet => {
- append(styleSheet, true);
- });
- try {
- rules = styleSheet.cssRules || styleSheet.rules;
- } catch (e) {
- }
- global.each(rules, cssRule => {
- if (isCssImportRule(cssRule) && cssRule.styleSheet) {
- append(cssRule.styleSheet, true);
- } else if (isCssPageRule(cssRule)) {
- global.each(cssRule.selectorText.split(','), selector => {
- selectors.push(global.trim(selector));
- });
- }
- });
- };
- global.each(editor.contentCSS, url => {
- contentCSSUrls[url] = true;
- });
- if (!fileFilter) {
- fileFilter = (href, imported) => {
- return imported || contentCSSUrls[href];
- };
- }
- try {
- global.each(doc.styleSheets, styleSheet => {
- append(styleSheet);
- });
- } catch (e) {
- }
- return selectors;
- };
- const defaultConvertSelectorToFormat = (editor, selectorText) => {
- let format = {};
- const selector = /^(?:([a-z0-9\-_]+))?(\.[a-z0-9_\-\.]+)$/i.exec(selectorText);
- if (!selector) {
- return;
- }
- const elementName = selector[1];
- const classes = selector[2].substr(1).split('.').join(' ');
- const inlineSelectorElements = global.makeMap('a,img');
- if (selector[1]) {
- format = { title: selectorText };
- if (editor.schema.getTextBlockElements()[elementName]) {
- format.block = elementName;
- } else if (editor.schema.getBlockElements()[elementName] || inlineSelectorElements[elementName.toLowerCase()]) {
- format.selector = elementName;
- } else {
- format.inline = elementName;
- }
- } else if (selector[2]) {
- format = {
- inline: 'span',
- title: selectorText.substr(1),
- classes
- };
- }
- if (shouldMergeClasses(editor)) {
- format.classes = classes;
- } else {
- format.attributes = { class: classes };
- }
- return format;
- };
- const getGroupsBySelector = (groups, selector) => {
- return global.grep(groups, group => {
- return !group.filter || group.filter(selector);
- });
- };
- const compileUserDefinedGroups = groups => {
- return global.map(groups, group => {
- return global.extend({}, group, {
- original: group,
- selectors: {},
- filter: compileFilter(group.filter)
- });
- });
- };
- const isExclusiveMode = (editor, group) => {
- return group === null || shouldImportExclusive(editor);
- };
- const isUniqueSelector = (editor, selector, group, globallyUniqueSelectors) => {
- return !(isExclusiveMode(editor, group) ? selector in globallyUniqueSelectors : selector in group.selectors);
- };
- const markUniqueSelector = (editor, selector, group, globallyUniqueSelectors) => {
- if (isExclusiveMode(editor, group)) {
- globallyUniqueSelectors[selector] = true;
- } else {
- group.selectors[selector] = true;
- }
- };
- const convertSelectorToFormat = (editor, plugin, selector, group) => {
- let selectorConverter;
- const converter = getSelectorConverter(editor);
- if (group && group.selector_converter) {
- selectorConverter = group.selector_converter;
- } else if (converter) {
- selectorConverter = converter;
- } else {
- selectorConverter = () => {
- return defaultConvertSelectorToFormat(editor, selector);
- };
- }
- return selectorConverter.call(plugin, selector, group);
- };
- const setup = editor => {
- editor.on('init', () => {
- const model = generate();
- const globallyUniqueSelectors = {};
- const selectorFilter = compileFilter(getSelectorFilter(editor));
- const groups = compileUserDefinedGroups(getCssGroups(editor));
- const processSelector = (selector, group) => {
- if (isUniqueSelector(editor, selector, group, globallyUniqueSelectors)) {
- markUniqueSelector(editor, selector, group, globallyUniqueSelectors);
- const format = convertSelectorToFormat(editor, editor.plugins.importcss, selector, group);
- if (format) {
- const formatName = format.name || global$3.DOM.uniqueId();
- editor.formatter.register(formatName, format);
- return {
- title: format.title,
- format: formatName
- };
- }
- }
- return null;
- };
- global.each(getSelectors(editor, editor.getDoc(), compileFilter(getFileFilter(editor))), selector => {
- if (!internalEditorStyle.test(selector)) {
- if (!selectorFilter || selectorFilter(selector)) {
- const selectorGroups = getGroupsBySelector(groups, selector);
- if (selectorGroups.length > 0) {
- global.each(selectorGroups, group => {
- const menuItem = processSelector(selector, group);
- if (menuItem) {
- model.addItemToGroup(group.title, menuItem);
- }
- });
- } else {
- const menuItem = processSelector(selector, null);
- if (menuItem) {
- model.addItem(menuItem);
- }
- }
- }
- }
- });
- const items = model.toFormats();
- editor.dispatch('addStyleModifications', {
- items,
- replace: !shouldAppend(editor)
- });
- });
- };
-
- const get = editor => {
- const convertSelectorToFormat = selectorText => {
- return defaultConvertSelectorToFormat(editor, selectorText);
- };
- return { convertSelectorToFormat };
- };
-
- var Plugin = () => {
- global$4.add('importcss', editor => {
- register(editor);
- setup(editor);
- return get(editor);
- });
- };
-
- Plugin();
-
-})();
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/importcss/plugin.min.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/importcss/plugin.min.js
deleted file mode 100644
index 26811ef..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/importcss/plugin.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/**
- * TinyMCE version 7.1.0 (2024-05-08)
- */
-!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=e=>t=>(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(s=r=e,(o=String).prototype.isPrototypeOf(s)||(null===(n=r.constructor)||void 0===n?void 0:n.name)===o.name)?"string":t;var s,r,o,n})(t)===e,s=t("string"),r=t("object"),o=t("array"),n=("function",e=>"function"==typeof e);var c=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),i=tinymce.util.Tools.resolve("tinymce.EditorManager"),l=tinymce.util.Tools.resolve("tinymce.Env"),a=tinymce.util.Tools.resolve("tinymce.util.Tools");const p=e=>t=>t.options.get(e),u=p("importcss_merge_classes"),m=p("importcss_exclusive"),f=p("importcss_selector_converter"),y=p("importcss_selector_filter"),d=p("importcss_groups"),h=p("importcss_append"),g=p("importcss_file_filter"),_=p("skin"),v=p("skin_url"),b=Array.prototype.push,x=/^\.(?:ephox|tiny-pageembed|mce)(?:[.-]+\w+)+$/,T=e=>s(e)?t=>-1!==t.indexOf(e):e instanceof RegExp?t=>e.test(t):e,S=(e,t)=>{let s={};const r=/^(?:([a-z0-9\-_]+))?(\.[a-z0-9_\-\.]+)$/i.exec(t);if(!r)return;const o=r[1],n=r[2].substr(1).split(".").join(" "),c=a.makeMap("a,img");return r[1]?(s={title:t},e.schema.getTextBlockElements()[o]?s.block=o:e.schema.getBlockElements()[o]||c[o.toLowerCase()]?s.selector=o:s.inline=o):r[2]&&(s={inline:"span",title:t.substr(1),classes:n}),u(e)?s.classes=n:s.attributes={class:n},s},k=(e,t)=>null===t||m(e),M=e=>{e.on("init",(()=>{const t=(()=>{const e=[],t=[],s={};return{addItemToGroup:(e,r)=>{s[e]?s[e].push(r):(t.push(e),s[e]=[r])},addItem:t=>{e.push(t)},toFormats:()=>{return(r=t,n=e=>{const t=s[e];return 0===t.length?[]:[{title:e,items:t}]},(e=>{const t=[];for(let s=0,r=e.length;s{const s=e.length,r=new Array(s);for(let o=0;oa.map(e,(e=>a.extend({},e,{original:e,selectors:{},filter:T(e.filter)}))))(d(e)),u=(t,s)=>{if(((e,t,s,r)=>!(k(e,s)?t in r:t in s.selectors))(e,t,s,r)){((e,t,s,r)=>{k(e,s)?r[t]=!0:s.selectors[t]=!0})(e,t,s,r);const o=((e,t,s,r)=>{let o;const n=f(e);return o=r&&r.selector_converter?r.selector_converter:n||(()=>S(e,s)),o.call(t,s,r)})(e,e.plugins.importcss,t,s);if(o){const t=o.name||c.DOM.uniqueId();return e.formatter.register(t,o),{title:o.title,format:t}}}return null};a.each(((e,t,r)=>{const o=[],n={},c=(t,n)=>{let p,u=t.href;if(u=(e=>{const t=l.cacheSuffix;return s(e)&&(e=e.replace("?"+t,"").replace("&"+t,"")),e})(u),u&&(!r||r(u,n))&&!((e,t)=>{const s=_(e);if(s){const r=v(e),o=r?e.documentBaseURI.toAbsolute(r):i.baseURL+"/skins/ui/"+s,n=i.baseURL+"/skins/content/",c=e.editorManager.suffix;return t===o+"/content"+(e.inline?".inline":"")+`${c}.css`||-1!==t.indexOf(n)}return!1})(e,u)){a.each(t.imports,(e=>{c(e,!0)}));try{p=t.cssRules||t.rules}catch(e){}a.each(p,(e=>{e.styleSheet&&e.styleSheet?c(e.styleSheet,!0):e.selectorText&&a.each(e.selectorText.split(","),(e=>{o.push(a.trim(e))}))}))}};a.each(e.contentCSS,(e=>{n[e]=!0})),r||(r=(e,t)=>t||n[e]);try{a.each(t.styleSheets,(e=>{c(e)}))}catch(e){}return o})(e,e.getDoc(),T(g(e))),(e=>{if(!x.test(e)&&(!n||n(e))){const s=((e,t)=>a.grep(e,(e=>!e.filter||e.filter(t))))(p,e);if(s.length>0)a.each(s,(s=>{const r=u(e,s);r&&t.addItemToGroup(s.title,r)}));else{const s=u(e,null);s&&t.addItem(s)}}}));const m=t.toFormats();e.dispatch("addStyleModifications",{items:m,replace:!h(e)})}))};e.add("importcss",(e=>((e=>{const t=e.options.register,o=e=>s(e)||n(e)||r(e);t("importcss_merge_classes",{processor:"boolean",default:!0}),t("importcss_exclusive",{processor:"boolean",default:!0}),t("importcss_selector_converter",{processor:"function"}),t("importcss_selector_filter",{processor:o}),t("importcss_file_filter",{processor:o}),t("importcss_groups",{processor:"object[]"}),t("importcss_append",{processor:"boolean",default:!1})})(e),M(e),(e=>({convertSelectorToFormat:t=>S(e,t)}))(e))))}();
\ No newline at end of file
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/insertdatetime/plugin.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/insertdatetime/plugin.js
deleted file mode 100644
index 0fc14da..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/insertdatetime/plugin.js
+++ /dev/null
@@ -1,187 +0,0 @@
-/**
- * TinyMCE version 7.1.0 (2024-05-08)
- */
-
-(function () {
- 'use strict';
-
- var global$1 = tinymce.util.Tools.resolve('tinymce.PluginManager');
-
- const option = name => editor => editor.options.get(name);
- const register$2 = editor => {
- const registerOption = editor.options.register;
- registerOption('insertdatetime_dateformat', {
- processor: 'string',
- default: editor.translate('%Y-%m-%d')
- });
- registerOption('insertdatetime_timeformat', {
- processor: 'string',
- default: editor.translate('%H:%M:%S')
- });
- registerOption('insertdatetime_formats', {
- processor: 'string[]',
- default: [
- '%H:%M:%S',
- '%Y-%m-%d',
- '%I:%M:%S %p',
- '%D'
- ]
- });
- registerOption('insertdatetime_element', {
- processor: 'boolean',
- default: false
- });
- };
- const getDateFormat = option('insertdatetime_dateformat');
- const getTimeFormat = option('insertdatetime_timeformat');
- const getFormats = option('insertdatetime_formats');
- const shouldInsertTimeElement = option('insertdatetime_element');
- const getDefaultDateTime = editor => {
- const formats = getFormats(editor);
- return formats.length > 0 ? formats[0] : getTimeFormat(editor);
- };
-
- const daysShort = 'Sun Mon Tue Wed Thu Fri Sat Sun'.split(' ');
- const daysLong = 'Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday'.split(' ');
- const monthsShort = 'Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec'.split(' ');
- const monthsLong = 'January February March April May June July August September October November December'.split(' ');
- const addZeros = (value, len) => {
- value = '' + value;
- if (value.length < len) {
- for (let i = 0; i < len - value.length; i++) {
- value = '0' + value;
- }
- }
- return value;
- };
- const getDateTime = (editor, fmt, date = new Date()) => {
- fmt = fmt.replace('%D', '%m/%d/%Y');
- fmt = fmt.replace('%r', '%I:%M:%S %p');
- fmt = fmt.replace('%Y', '' + date.getFullYear());
- fmt = fmt.replace('%y', '' + date.getYear());
- fmt = fmt.replace('%m', addZeros(date.getMonth() + 1, 2));
- fmt = fmt.replace('%d', addZeros(date.getDate(), 2));
- fmt = fmt.replace('%H', '' + addZeros(date.getHours(), 2));
- fmt = fmt.replace('%M', '' + addZeros(date.getMinutes(), 2));
- fmt = fmt.replace('%S', '' + addZeros(date.getSeconds(), 2));
- fmt = fmt.replace('%I', '' + ((date.getHours() + 11) % 12 + 1));
- fmt = fmt.replace('%p', '' + (date.getHours() < 12 ? 'AM' : 'PM'));
- fmt = fmt.replace('%B', '' + editor.translate(monthsLong[date.getMonth()]));
- fmt = fmt.replace('%b', '' + editor.translate(monthsShort[date.getMonth()]));
- fmt = fmt.replace('%A', '' + editor.translate(daysLong[date.getDay()]));
- fmt = fmt.replace('%a', '' + editor.translate(daysShort[date.getDay()]));
- fmt = fmt.replace('%%', '%');
- return fmt;
- };
- const updateElement = (editor, timeElm, computerTime, userTime) => {
- const newTimeElm = editor.dom.create('time', { datetime: computerTime }, userTime);
- editor.dom.replace(newTimeElm, timeElm);
- editor.selection.select(newTimeElm, true);
- editor.selection.collapse(false);
- };
- const insertDateTime = (editor, format) => {
- if (shouldInsertTimeElement(editor)) {
- const userTime = getDateTime(editor, format);
- let computerTime;
- if (/%[HMSIp]/.test(format)) {
- computerTime = getDateTime(editor, '%Y-%m-%dT%H:%M');
- } else {
- computerTime = getDateTime(editor, '%Y-%m-%d');
- }
- const timeElm = editor.dom.getParent(editor.selection.getStart(), 'time');
- if (timeElm) {
- updateElement(editor, timeElm, computerTime, userTime);
- } else {
- editor.insertContent('' + userTime + ' ');
- }
- } else {
- editor.insertContent(getDateTime(editor, format));
- }
- };
-
- const register$1 = editor => {
- editor.addCommand('mceInsertDate', (_ui, value) => {
- insertDateTime(editor, value !== null && value !== void 0 ? value : getDateFormat(editor));
- });
- editor.addCommand('mceInsertTime', (_ui, value) => {
- insertDateTime(editor, value !== null && value !== void 0 ? value : getTimeFormat(editor));
- });
- };
-
- const Cell = initial => {
- let value = initial;
- const get = () => {
- return value;
- };
- const set = v => {
- value = v;
- };
- return {
- get,
- set
- };
- };
-
- var global = tinymce.util.Tools.resolve('tinymce.util.Tools');
-
- const onSetupEditable = editor => api => {
- const nodeChanged = () => {
- api.setEnabled(editor.selection.isEditable());
- };
- editor.on('NodeChange', nodeChanged);
- nodeChanged();
- return () => {
- editor.off('NodeChange', nodeChanged);
- };
- };
- const register = editor => {
- const formats = getFormats(editor);
- const defaultFormat = Cell(getDefaultDateTime(editor));
- const insertDateTime = format => editor.execCommand('mceInsertDate', false, format);
- editor.ui.registry.addSplitButton('insertdatetime', {
- icon: 'insert-time',
- tooltip: 'Insert date/time',
- select: value => value === defaultFormat.get(),
- fetch: done => {
- done(global.map(formats, format => ({
- type: 'choiceitem',
- text: getDateTime(editor, format),
- value: format
- })));
- },
- onAction: _api => {
- insertDateTime(defaultFormat.get());
- },
- onItemAction: (_api, value) => {
- defaultFormat.set(value);
- insertDateTime(value);
- },
- onSetup: onSetupEditable(editor)
- });
- const makeMenuItemHandler = format => () => {
- defaultFormat.set(format);
- insertDateTime(format);
- };
- editor.ui.registry.addNestedMenuItem('insertdatetime', {
- icon: 'insert-time',
- text: 'Date/time',
- getSubmenuItems: () => global.map(formats, format => ({
- type: 'menuitem',
- text: getDateTime(editor, format),
- onAction: makeMenuItemHandler(format)
- })),
- onSetup: onSetupEditable(editor)
- });
- };
-
- var Plugin = () => {
- global$1.add('insertdatetime', editor => {
- register$2(editor);
- register$1(editor);
- register(editor);
- });
- };
-
- Plugin();
-
-})();
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/insertdatetime/plugin.min.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/insertdatetime/plugin.min.js
deleted file mode 100644
index 9b21731..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/insertdatetime/plugin.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/**
- * TinyMCE version 7.1.0 (2024-05-08)
- */
-!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=e=>t=>t.options.get(e),a=t("insertdatetime_dateformat"),n=t("insertdatetime_timeformat"),r=t("insertdatetime_formats"),s=t("insertdatetime_element"),i="Sun Mon Tue Wed Thu Fri Sat Sun".split(" "),o="Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday".split(" "),l="Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),m="January February March April May June July August September October November December".split(" "),c=(e,t)=>{if((e=""+e).length(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=t.replace("%D","%m/%d/%Y")).replace("%r","%I:%M:%S %p")).replace("%Y",""+a.getFullYear())).replace("%y",""+a.getYear())).replace("%m",c(a.getMonth()+1,2))).replace("%d",c(a.getDate(),2))).replace("%H",""+c(a.getHours(),2))).replace("%M",""+c(a.getMinutes(),2))).replace("%S",""+c(a.getSeconds(),2))).replace("%I",""+((a.getHours()+11)%12+1))).replace("%p",a.getHours()<12?"AM":"PM")).replace("%B",""+e.translate(m[a.getMonth()]))).replace("%b",""+e.translate(l[a.getMonth()]))).replace("%A",""+e.translate(o[a.getDay()]))).replace("%a",""+e.translate(i[a.getDay()]))).replace("%%","%"),u=(e,t)=>{if(s(e)){const a=d(e,t);let n;n=/%[HMSIp]/.test(t)?d(e,"%Y-%m-%dT%H:%M"):d(e,"%Y-%m-%d");const r=e.dom.getParent(e.selection.getStart(),"time");r?((e,t,a,n)=>{const r=e.dom.create("time",{datetime:a},n);e.dom.replace(r,t),e.selection.select(r,!0),e.selection.collapse(!1)})(e,r,n,a):e.insertContent(''+a+" ")}else e.insertContent(d(e,t))};var p=tinymce.util.Tools.resolve("tinymce.util.Tools");const g=e=>t=>{const a=()=>{t.setEnabled(e.selection.isEditable())};return e.on("NodeChange",a),a(),()=>{e.off("NodeChange",a)}};e.add("insertdatetime",(e=>{(e=>{const t=e.options.register;t("insertdatetime_dateformat",{processor:"string",default:e.translate("%Y-%m-%d")}),t("insertdatetime_timeformat",{processor:"string",default:e.translate("%H:%M:%S")}),t("insertdatetime_formats",{processor:"string[]",default:["%H:%M:%S","%Y-%m-%d","%I:%M:%S %p","%D"]}),t("insertdatetime_element",{processor:"boolean",default:!1})})(e),(e=>{e.addCommand("mceInsertDate",((t,n)=>{u(e,null!=n?n:a(e))})),e.addCommand("mceInsertTime",((t,a)=>{u(e,null!=a?a:n(e))}))})(e),(e=>{const t=r(e),a=(e=>{let t=e;return{get:()=>t,set:e=>{t=e}}})((e=>{const t=r(e);return t.length>0?t[0]:n(e)})(e)),s=t=>e.execCommand("mceInsertDate",!1,t);e.ui.registry.addSplitButton("insertdatetime",{icon:"insert-time",tooltip:"Insert date/time",select:e=>e===a.get(),fetch:a=>{a(p.map(t,(t=>({type:"choiceitem",text:d(e,t),value:t}))))},onAction:e=>{s(a.get())},onItemAction:(e,t)=>{a.set(t),s(t)},onSetup:g(e)});const i=e=>()=>{a.set(e),s(e)};e.ui.registry.addNestedMenuItem("insertdatetime",{icon:"insert-time",text:"Date/time",getSubmenuItems:()=>p.map(t,(t=>({type:"menuitem",text:d(e,t),onAction:i(t)}))),onSetup:g(e)})})(e)}))}();
\ No newline at end of file
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/link/plugin.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/link/plugin.js
deleted file mode 100644
index 6b30bac..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/link/plugin.js
+++ /dev/null
@@ -1,1245 +0,0 @@
-/**
- * TinyMCE version 7.1.0 (2024-05-08)
- */
-
-(function () {
- 'use strict';
-
- var global$5 = tinymce.util.Tools.resolve('tinymce.PluginManager');
-
- const hasProto = (v, constructor, predicate) => {
- var _a;
- if (predicate(v, constructor.prototype)) {
- return true;
- } else {
- return ((_a = v.constructor) === null || _a === void 0 ? void 0 : _a.name) === constructor.name;
- }
- };
- const typeOf = x => {
- const t = typeof x;
- if (x === null) {
- return 'null';
- } else if (t === 'object' && Array.isArray(x)) {
- return 'array';
- } else if (t === 'object' && hasProto(x, String, (o, proto) => proto.isPrototypeOf(o))) {
- return 'string';
- } else {
- return t;
- }
- };
- const isType = type => value => typeOf(value) === type;
- const isSimpleType = type => value => typeof value === type;
- const eq = t => a => t === a;
- const isString = isType('string');
- const isObject = isType('object');
- const isArray = isType('array');
- const isNull = eq(null);
- const isBoolean = isSimpleType('boolean');
- const isNullable = a => a === null || a === undefined;
- const isNonNullable = a => !isNullable(a);
- const isFunction = isSimpleType('function');
- const isArrayOf = (value, pred) => {
- if (isArray(value)) {
- for (let i = 0, len = value.length; i < len; ++i) {
- if (!pred(value[i])) {
- return false;
- }
- }
- return true;
- }
- return false;
- };
-
- const noop = () => {
- };
- const constant = value => {
- return () => {
- return value;
- };
- };
- const tripleEquals = (a, b) => {
- return a === b;
- };
-
- class Optional {
- constructor(tag, value) {
- this.tag = tag;
- this.value = value;
- }
- static some(value) {
- return new Optional(true, value);
- }
- static none() {
- return Optional.singletonNone;
- }
- fold(onNone, onSome) {
- if (this.tag) {
- return onSome(this.value);
- } else {
- return onNone();
- }
- }
- isSome() {
- return this.tag;
- }
- isNone() {
- return !this.tag;
- }
- map(mapper) {
- if (this.tag) {
- return Optional.some(mapper(this.value));
- } else {
- return Optional.none();
- }
- }
- bind(binder) {
- if (this.tag) {
- return binder(this.value);
- } else {
- return Optional.none();
- }
- }
- exists(predicate) {
- return this.tag && predicate(this.value);
- }
- forall(predicate) {
- return !this.tag || predicate(this.value);
- }
- filter(predicate) {
- if (!this.tag || predicate(this.value)) {
- return this;
- } else {
- return Optional.none();
- }
- }
- getOr(replacement) {
- return this.tag ? this.value : replacement;
- }
- or(replacement) {
- return this.tag ? this : replacement;
- }
- getOrThunk(thunk) {
- return this.tag ? this.value : thunk();
- }
- orThunk(thunk) {
- return this.tag ? this : thunk();
- }
- getOrDie(message) {
- if (!this.tag) {
- throw new Error(message !== null && message !== void 0 ? message : 'Called getOrDie on None');
- } else {
- return this.value;
- }
- }
- static from(value) {
- return isNonNullable(value) ? Optional.some(value) : Optional.none();
- }
- getOrNull() {
- return this.tag ? this.value : null;
- }
- getOrUndefined() {
- return this.value;
- }
- each(worker) {
- if (this.tag) {
- worker(this.value);
- }
- }
- toArray() {
- return this.tag ? [this.value] : [];
- }
- toString() {
- return this.tag ? `some(${ this.value })` : 'none()';
- }
- }
- Optional.singletonNone = new Optional(false);
-
- const nativeIndexOf = Array.prototype.indexOf;
- const nativePush = Array.prototype.push;
- const rawIndexOf = (ts, t) => nativeIndexOf.call(ts, t);
- const contains = (xs, x) => rawIndexOf(xs, x) > -1;
- const map = (xs, f) => {
- const len = xs.length;
- const r = new Array(len);
- for (let i = 0; i < len; i++) {
- const x = xs[i];
- r[i] = f(x, i);
- }
- return r;
- };
- const each$1 = (xs, f) => {
- for (let i = 0, len = xs.length; i < len; i++) {
- const x = xs[i];
- f(x, i);
- }
- };
- const foldl = (xs, f, acc) => {
- each$1(xs, (x, i) => {
- acc = f(acc, x, i);
- });
- return acc;
- };
- const flatten = xs => {
- const r = [];
- for (let i = 0, len = xs.length; i < len; ++i) {
- if (!isArray(xs[i])) {
- throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs);
- }
- nativePush.apply(r, xs[i]);
- }
- return r;
- };
- const bind = (xs, f) => flatten(map(xs, f));
- const findMap = (arr, f) => {
- for (let i = 0; i < arr.length; i++) {
- const r = f(arr[i], i);
- if (r.isSome()) {
- return r;
- }
- }
- return Optional.none();
- };
-
- const is = (lhs, rhs, comparator = tripleEquals) => lhs.exists(left => comparator(left, rhs));
- const cat = arr => {
- const r = [];
- const push = x => {
- r.push(x);
- };
- for (let i = 0; i < arr.length; i++) {
- arr[i].each(push);
- }
- return r;
- };
- const someIf = (b, a) => b ? Optional.some(a) : Optional.none();
-
- const option = name => editor => editor.options.get(name);
- const register$1 = editor => {
- const registerOption = editor.options.register;
- registerOption('link_assume_external_targets', {
- processor: value => {
- const valid = isString(value) || isBoolean(value);
- if (valid) {
- if (value === true) {
- return {
- value: 1,
- valid
- };
- } else if (value === 'http' || value === 'https') {
- return {
- value,
- valid
- };
- } else {
- return {
- value: 0,
- valid
- };
- }
- } else {
- return {
- valid: false,
- message: 'Must be a string or a boolean.'
- };
- }
- },
- default: false
- });
- registerOption('link_context_toolbar', {
- processor: 'boolean',
- default: false
- });
- registerOption('link_list', { processor: value => isString(value) || isFunction(value) || isArrayOf(value, isObject) });
- registerOption('link_default_target', { processor: 'string' });
- registerOption('link_default_protocol', {
- processor: 'string',
- default: 'https'
- });
- registerOption('link_target_list', {
- processor: value => isBoolean(value) || isArrayOf(value, isObject),
- default: true
- });
- registerOption('link_rel_list', {
- processor: 'object[]',
- default: []
- });
- registerOption('link_class_list', {
- processor: 'object[]',
- default: []
- });
- registerOption('link_title', {
- processor: 'boolean',
- default: true
- });
- registerOption('allow_unsafe_link_target', {
- processor: 'boolean',
- default: false
- });
- registerOption('link_quicklink', {
- processor: 'boolean',
- default: false
- });
- };
- const assumeExternalTargets = option('link_assume_external_targets');
- const hasContextToolbar = option('link_context_toolbar');
- const getLinkList = option('link_list');
- const getDefaultLinkTarget = option('link_default_target');
- const getDefaultLinkProtocol = option('link_default_protocol');
- const getTargetList = option('link_target_list');
- const getRelList = option('link_rel_list');
- const getLinkClassList = option('link_class_list');
- const shouldShowLinkTitle = option('link_title');
- const allowUnsafeLinkTarget = option('allow_unsafe_link_target');
- const useQuickLink = option('link_quicklink');
-
- var global$4 = tinymce.util.Tools.resolve('tinymce.util.Tools');
-
- const getValue = item => isString(item.value) ? item.value : '';
- const getText = item => {
- if (isString(item.text)) {
- return item.text;
- } else if (isString(item.title)) {
- return item.title;
- } else {
- return '';
- }
- };
- const sanitizeList = (list, extractValue) => {
- const out = [];
- global$4.each(list, item => {
- const text = getText(item);
- if (item.menu !== undefined) {
- const items = sanitizeList(item.menu, extractValue);
- out.push({
- text,
- items
- });
- } else {
- const value = extractValue(item);
- out.push({
- text,
- value
- });
- }
- });
- return out;
- };
- const sanitizeWith = (extracter = getValue) => list => Optional.from(list).map(list => sanitizeList(list, extracter));
- const sanitize = list => sanitizeWith(getValue)(list);
- const createUi = (name, label) => items => ({
- name,
- type: 'listbox',
- label,
- items
- });
- const ListOptions = {
- sanitize,
- sanitizeWith,
- createUi,
- getValue
- };
-
- const keys = Object.keys;
- const hasOwnProperty = Object.hasOwnProperty;
- const each = (obj, f) => {
- const props = keys(obj);
- for (let k = 0, len = props.length; k < len; k++) {
- const i = props[k];
- const x = obj[i];
- f(x, i);
- }
- };
- const objAcc = r => (x, i) => {
- r[i] = x;
- };
- const internalFilter = (obj, pred, onTrue, onFalse) => {
- each(obj, (x, i) => {
- (pred(x, i) ? onTrue : onFalse)(x, i);
- });
- };
- const filter = (obj, pred) => {
- const t = {};
- internalFilter(obj, pred, objAcc(t), noop);
- return t;
- };
- const has = (obj, key) => hasOwnProperty.call(obj, key);
- const hasNonNullableKey = (obj, key) => has(obj, key) && obj[key] !== undefined && obj[key] !== null;
-
- var global$3 = tinymce.util.Tools.resolve('tinymce.dom.TreeWalker');
-
- var global$2 = tinymce.util.Tools.resolve('tinymce.util.URI');
-
- const isAnchor = elm => isNonNullable(elm) && elm.nodeName.toLowerCase() === 'a';
- const isLink = elm => isAnchor(elm) && !!getHref(elm);
- const collectNodesInRange = (rng, predicate) => {
- if (rng.collapsed) {
- return [];
- } else {
- const contents = rng.cloneContents();
- const firstChild = contents.firstChild;
- const walker = new global$3(firstChild, contents);
- const elements = [];
- let current = firstChild;
- do {
- if (predicate(current)) {
- elements.push(current);
- }
- } while (current = walker.next());
- return elements;
- }
- };
- const hasProtocol = url => /^\w+:/i.test(url);
- const getHref = elm => {
- var _a, _b;
- return (_b = (_a = elm.getAttribute('data-mce-href')) !== null && _a !== void 0 ? _a : elm.getAttribute('href')) !== null && _b !== void 0 ? _b : '';
- };
- const applyRelTargetRules = (rel, isUnsafe) => {
- const rules = ['noopener'];
- const rels = rel ? rel.split(/\s+/) : [];
- const toString = rels => global$4.trim(rels.sort().join(' '));
- const addTargetRules = rels => {
- rels = removeTargetRules(rels);
- return rels.length > 0 ? rels.concat(rules) : rules;
- };
- const removeTargetRules = rels => rels.filter(val => global$4.inArray(rules, val) === -1);
- const newRels = isUnsafe ? addTargetRules(rels) : removeTargetRules(rels);
- return newRels.length > 0 ? toString(newRels) : '';
- };
- const trimCaretContainers = text => text.replace(/\uFEFF/g, '');
- const getAnchorElement = (editor, selectedElm) => {
- selectedElm = selectedElm || getLinksInSelection(editor.selection.getRng())[0] || editor.selection.getNode();
- if (isImageFigure(selectedElm)) {
- return Optional.from(editor.dom.select('a[href]', selectedElm)[0]);
- } else {
- return Optional.from(editor.dom.getParent(selectedElm, 'a[href]'));
- }
- };
- const isInAnchor = (editor, selectedElm) => getAnchorElement(editor, selectedElm).isSome();
- const getAnchorText = (selection, anchorElm) => {
- const text = anchorElm.fold(() => selection.getContent({ format: 'text' }), anchorElm => anchorElm.innerText || anchorElm.textContent || '');
- return trimCaretContainers(text);
- };
- const getLinksInSelection = rng => collectNodesInRange(rng, isLink);
- const getLinks$2 = elements => global$4.grep(elements, isLink);
- const hasLinks = elements => getLinks$2(elements).length > 0;
- const hasLinksInSelection = rng => getLinksInSelection(rng).length > 0;
- const isOnlyTextSelected = editor => {
- const inlineTextElements = editor.schema.getTextInlineElements();
- const isElement = elm => elm.nodeType === 1 && !isAnchor(elm) && !has(inlineTextElements, elm.nodeName.toLowerCase());
- const isInBlockAnchor = getAnchorElement(editor).exists(anchor => anchor.hasAttribute('data-mce-block'));
- if (isInBlockAnchor) {
- return false;
- }
- const rng = editor.selection.getRng();
- if (!rng.collapsed) {
- const elements = collectNodesInRange(rng, isElement);
- return elements.length === 0;
- } else {
- return true;
- }
- };
- const isImageFigure = elm => isNonNullable(elm) && elm.nodeName === 'FIGURE' && /\bimage\b/i.test(elm.className);
- const getLinkAttrs = data => {
- const attrs = [
- 'title',
- 'rel',
- 'class',
- 'target'
- ];
- return foldl(attrs, (acc, key) => {
- data[key].each(value => {
- acc[key] = value.length > 0 ? value : null;
- });
- return acc;
- }, { href: data.href });
- };
- const handleExternalTargets = (href, assumeExternalTargets) => {
- if ((assumeExternalTargets === 'http' || assumeExternalTargets === 'https') && !hasProtocol(href)) {
- return assumeExternalTargets + '://' + href;
- }
- return href;
- };
- const applyLinkOverrides = (editor, linkAttrs) => {
- const newLinkAttrs = { ...linkAttrs };
- if (getRelList(editor).length === 0 && !allowUnsafeLinkTarget(editor)) {
- const newRel = applyRelTargetRules(newLinkAttrs.rel, newLinkAttrs.target === '_blank');
- newLinkAttrs.rel = newRel ? newRel : null;
- }
- if (Optional.from(newLinkAttrs.target).isNone() && getTargetList(editor) === false) {
- newLinkAttrs.target = getDefaultLinkTarget(editor);
- }
- newLinkAttrs.href = handleExternalTargets(newLinkAttrs.href, assumeExternalTargets(editor));
- return newLinkAttrs;
- };
- const updateLink = (editor, anchorElm, text, linkAttrs) => {
- text.each(text => {
- if (has(anchorElm, 'innerText')) {
- anchorElm.innerText = text;
- } else {
- anchorElm.textContent = text;
- }
- });
- editor.dom.setAttribs(anchorElm, linkAttrs);
- editor.selection.select(anchorElm);
- };
- const createLink = (editor, selectedElm, text, linkAttrs) => {
- const dom = editor.dom;
- if (isImageFigure(selectedElm)) {
- linkImageFigure(dom, selectedElm, linkAttrs);
- } else {
- text.fold(() => {
- editor.execCommand('mceInsertLink', false, linkAttrs);
- }, text => {
- editor.insertContent(dom.createHTML('a', linkAttrs, dom.encode(text)));
- });
- }
- };
- const linkDomMutation = (editor, attachState, data) => {
- const selectedElm = editor.selection.getNode();
- const anchorElm = getAnchorElement(editor, selectedElm);
- const linkAttrs = applyLinkOverrides(editor, getLinkAttrs(data));
- editor.undoManager.transact(() => {
- if (data.href === attachState.href) {
- attachState.attach();
- }
- anchorElm.fold(() => {
- createLink(editor, selectedElm, data.text, linkAttrs);
- }, elm => {
- editor.focus();
- updateLink(editor, elm, data.text, linkAttrs);
- });
- });
- };
- const unlinkSelection = editor => {
- const dom = editor.dom, selection = editor.selection;
- const bookmark = selection.getBookmark();
- const rng = selection.getRng().cloneRange();
- const startAnchorElm = dom.getParent(rng.startContainer, 'a[href]', editor.getBody());
- const endAnchorElm = dom.getParent(rng.endContainer, 'a[href]', editor.getBody());
- if (startAnchorElm) {
- rng.setStartBefore(startAnchorElm);
- }
- if (endAnchorElm) {
- rng.setEndAfter(endAnchorElm);
- }
- selection.setRng(rng);
- editor.execCommand('unlink');
- selection.moveToBookmark(bookmark);
- };
- const unlinkDomMutation = editor => {
- editor.undoManager.transact(() => {
- const node = editor.selection.getNode();
- if (isImageFigure(node)) {
- unlinkImageFigure(editor, node);
- } else {
- unlinkSelection(editor);
- }
- editor.focus();
- });
- };
- const unwrapOptions = data => {
- const {
- class: cls,
- href,
- rel,
- target,
- text,
- title
- } = data;
- return filter({
- class: cls.getOrNull(),
- href,
- rel: rel.getOrNull(),
- target: target.getOrNull(),
- text: text.getOrNull(),
- title: title.getOrNull()
- }, (v, _k) => isNull(v) === false);
- };
- const sanitizeData = (editor, data) => {
- const getOption = editor.options.get;
- const uriOptions = {
- allow_html_data_urls: getOption('allow_html_data_urls'),
- allow_script_urls: getOption('allow_script_urls'),
- allow_svg_data_urls: getOption('allow_svg_data_urls')
- };
- const href = data.href;
- return {
- ...data,
- href: global$2.isDomSafe(href, 'a', uriOptions) ? href : ''
- };
- };
- const link = (editor, attachState, data) => {
- const sanitizedData = sanitizeData(editor, data);
- editor.hasPlugin('rtc', true) ? editor.execCommand('createlink', false, unwrapOptions(sanitizedData)) : linkDomMutation(editor, attachState, sanitizedData);
- };
- const unlink = editor => {
- editor.hasPlugin('rtc', true) ? editor.execCommand('unlink') : unlinkDomMutation(editor);
- };
- const unlinkImageFigure = (editor, fig) => {
- var _a;
- const img = editor.dom.select('img', fig)[0];
- if (img) {
- const a = editor.dom.getParents(img, 'a[href]', fig)[0];
- if (a) {
- (_a = a.parentNode) === null || _a === void 0 ? void 0 : _a.insertBefore(img, a);
- editor.dom.remove(a);
- }
- }
- };
- const linkImageFigure = (dom, fig, attrs) => {
- var _a;
- const img = dom.select('img', fig)[0];
- if (img) {
- const a = dom.create('a', attrs);
- (_a = img.parentNode) === null || _a === void 0 ? void 0 : _a.insertBefore(a, img);
- a.appendChild(img);
- }
- };
-
- const isListGroup = item => hasNonNullableKey(item, 'items');
- const findTextByValue = (value, catalog) => findMap(catalog, item => {
- if (isListGroup(item)) {
- return findTextByValue(value, item.items);
- } else {
- return someIf(item.value === value, item);
- }
- });
- const getDelta = (persistentText, fieldName, catalog, data) => {
- const value = data[fieldName];
- const hasPersistentText = persistentText.length > 0;
- return value !== undefined ? findTextByValue(value, catalog).map(i => ({
- url: {
- value: i.value,
- meta: {
- text: hasPersistentText ? persistentText : i.text,
- attach: noop
- }
- },
- text: hasPersistentText ? persistentText : i.text
- })) : Optional.none();
- };
- const findCatalog = (catalogs, fieldName) => {
- if (fieldName === 'link') {
- return catalogs.link;
- } else if (fieldName === 'anchor') {
- return catalogs.anchor;
- } else {
- return Optional.none();
- }
- };
- const init = (initialData, linkCatalog) => {
- const persistentData = {
- text: initialData.text,
- title: initialData.title
- };
- const getTitleFromUrlChange = url => {
- var _a;
- return someIf(persistentData.title.length <= 0, Optional.from((_a = url.meta) === null || _a === void 0 ? void 0 : _a.title).getOr(''));
- };
- const getTextFromUrlChange = url => {
- var _a;
- return someIf(persistentData.text.length <= 0, Optional.from((_a = url.meta) === null || _a === void 0 ? void 0 : _a.text).getOr(url.value));
- };
- const onUrlChange = data => {
- const text = getTextFromUrlChange(data.url);
- const title = getTitleFromUrlChange(data.url);
- if (text.isSome() || title.isSome()) {
- return Optional.some({
- ...text.map(text => ({ text })).getOr({}),
- ...title.map(title => ({ title })).getOr({})
- });
- } else {
- return Optional.none();
- }
- };
- const onCatalogChange = (data, change) => {
- const catalog = findCatalog(linkCatalog, change).getOr([]);
- return getDelta(persistentData.text, change, catalog, data);
- };
- const onChange = (getData, change) => {
- const name = change.name;
- if (name === 'url') {
- return onUrlChange(getData());
- } else if (contains([
- 'anchor',
- 'link'
- ], name)) {
- return onCatalogChange(getData(), name);
- } else if (name === 'text' || name === 'title') {
- persistentData[name] = getData()[name];
- return Optional.none();
- } else {
- return Optional.none();
- }
- };
- return { onChange };
- };
- const DialogChanges = {
- init,
- getDelta
- };
-
- var global$1 = tinymce.util.Tools.resolve('tinymce.util.Delay');
-
- const delayedConfirm = (editor, message, callback) => {
- const rng = editor.selection.getRng();
- global$1.setEditorTimeout(editor, () => {
- editor.windowManager.confirm(message, state => {
- editor.selection.setRng(rng);
- callback(state);
- });
- });
- };
- const tryEmailTransform = data => {
- const url = data.href;
- const suggestMailTo = url.indexOf('@') > 0 && url.indexOf('/') === -1 && url.indexOf('mailto:') === -1;
- return suggestMailTo ? Optional.some({
- message: 'The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?',
- preprocess: oldData => ({
- ...oldData,
- href: 'mailto:' + url
- })
- }) : Optional.none();
- };
- const tryProtocolTransform = (assumeExternalTargets, defaultLinkProtocol) => data => {
- const url = data.href;
- const suggestProtocol = assumeExternalTargets === 1 && !hasProtocol(url) || assumeExternalTargets === 0 && /^\s*www(\.|\d\.)/i.test(url);
- return suggestProtocol ? Optional.some({
- message: `The URL you entered seems to be an external link. Do you want to add the required ${ defaultLinkProtocol }:// prefix?`,
- preprocess: oldData => ({
- ...oldData,
- href: defaultLinkProtocol + '://' + url
- })
- }) : Optional.none();
- };
- const preprocess = (editor, data) => findMap([
- tryEmailTransform,
- tryProtocolTransform(assumeExternalTargets(editor), getDefaultLinkProtocol(editor))
- ], f => f(data)).fold(() => Promise.resolve(data), transform => new Promise(callback => {
- delayedConfirm(editor, transform.message, state => {
- callback(state ? transform.preprocess(data) : data);
- });
- }));
- const DialogConfirms = { preprocess };
-
- const getAnchors = editor => {
- const anchorNodes = editor.dom.select('a:not([href])');
- const anchors = bind(anchorNodes, anchor => {
- const id = anchor.name || anchor.id;
- return id ? [{
- text: id,
- value: '#' + id
- }] : [];
- });
- return anchors.length > 0 ? Optional.some([{
- text: 'None',
- value: ''
- }].concat(anchors)) : Optional.none();
- };
- const AnchorListOptions = { getAnchors };
-
- const getClasses = editor => {
- const list = getLinkClassList(editor);
- if (list.length > 0) {
- return ListOptions.sanitize(list);
- }
- return Optional.none();
- };
- const ClassListOptions = { getClasses };
-
- const parseJson = text => {
- try {
- return Optional.some(JSON.parse(text));
- } catch (err) {
- return Optional.none();
- }
- };
- const getLinks$1 = editor => {
- const extractor = item => editor.convertURL(item.value || item.url || '', 'href');
- const linkList = getLinkList(editor);
- return new Promise(resolve => {
- if (isString(linkList)) {
- fetch(linkList).then(res => res.ok ? res.text().then(parseJson) : Promise.reject()).then(resolve, () => resolve(Optional.none()));
- } else if (isFunction(linkList)) {
- linkList(output => resolve(Optional.some(output)));
- } else {
- resolve(Optional.from(linkList));
- }
- }).then(optItems => optItems.bind(ListOptions.sanitizeWith(extractor)).map(items => {
- if (items.length > 0) {
- const noneItem = [{
- text: 'None',
- value: ''
- }];
- return noneItem.concat(items);
- } else {
- return items;
- }
- }));
- };
- const LinkListOptions = { getLinks: getLinks$1 };
-
- const getRels = (editor, initialTarget) => {
- const list = getRelList(editor);
- if (list.length > 0) {
- const isTargetBlank = is(initialTarget, '_blank');
- const enforceSafe = allowUnsafeLinkTarget(editor) === false;
- const safeRelExtractor = item => applyRelTargetRules(ListOptions.getValue(item), isTargetBlank);
- const sanitizer = enforceSafe ? ListOptions.sanitizeWith(safeRelExtractor) : ListOptions.sanitize;
- return sanitizer(list);
- }
- return Optional.none();
- };
- const RelOptions = { getRels };
-
- const fallbacks = [
- {
- text: 'Current window',
- value: ''
- },
- {
- text: 'New window',
- value: '_blank'
- }
- ];
- const getTargets = editor => {
- const list = getTargetList(editor);
- if (isArray(list)) {
- return ListOptions.sanitize(list).orThunk(() => Optional.some(fallbacks));
- } else if (list === false) {
- return Optional.none();
- }
- return Optional.some(fallbacks);
- };
- const TargetOptions = { getTargets };
-
- const nonEmptyAttr = (dom, elem, name) => {
- const val = dom.getAttrib(elem, name);
- return val !== null && val.length > 0 ? Optional.some(val) : Optional.none();
- };
- const extractFromAnchor = (editor, anchor) => {
- const dom = editor.dom;
- const onlyText = isOnlyTextSelected(editor);
- const text = onlyText ? Optional.some(getAnchorText(editor.selection, anchor)) : Optional.none();
- const url = anchor.bind(anchorElm => Optional.from(dom.getAttrib(anchorElm, 'href')));
- const target = anchor.bind(anchorElm => Optional.from(dom.getAttrib(anchorElm, 'target')));
- const rel = anchor.bind(anchorElm => nonEmptyAttr(dom, anchorElm, 'rel'));
- const linkClass = anchor.bind(anchorElm => nonEmptyAttr(dom, anchorElm, 'class'));
- const title = anchor.bind(anchorElm => nonEmptyAttr(dom, anchorElm, 'title'));
- return {
- url,
- text,
- title,
- target,
- rel,
- linkClass
- };
- };
- const collect = (editor, linkNode) => LinkListOptions.getLinks(editor).then(links => {
- const anchor = extractFromAnchor(editor, linkNode);
- return {
- anchor,
- catalogs: {
- targets: TargetOptions.getTargets(editor),
- rels: RelOptions.getRels(editor, anchor.target),
- classes: ClassListOptions.getClasses(editor),
- anchor: AnchorListOptions.getAnchors(editor),
- link: links
- },
- optNode: linkNode,
- flags: { titleEnabled: shouldShowLinkTitle(editor) }
- };
- });
- const DialogInfo = { collect };
-
- const handleSubmit = (editor, info) => api => {
- const data = api.getData();
- if (!data.url.value) {
- unlink(editor);
- api.close();
- return;
- }
- const getChangedValue = key => Optional.from(data[key]).filter(value => !is(info.anchor[key], value));
- const changedData = {
- href: data.url.value,
- text: getChangedValue('text'),
- target: getChangedValue('target'),
- rel: getChangedValue('rel'),
- class: getChangedValue('linkClass'),
- title: getChangedValue('title')
- };
- const attachState = {
- href: data.url.value,
- attach: data.url.meta !== undefined && data.url.meta.attach ? data.url.meta.attach : noop
- };
- DialogConfirms.preprocess(editor, changedData).then(pData => {
- link(editor, attachState, pData);
- });
- api.close();
- };
- const collectData = editor => {
- const anchorNode = getAnchorElement(editor);
- return DialogInfo.collect(editor, anchorNode);
- };
- const getInitialData = (info, defaultTarget) => {
- const anchor = info.anchor;
- const url = anchor.url.getOr('');
- return {
- url: {
- value: url,
- meta: { original: { value: url } }
- },
- text: anchor.text.getOr(''),
- title: anchor.title.getOr(''),
- anchor: url,
- link: url,
- rel: anchor.rel.getOr(''),
- target: anchor.target.or(defaultTarget).getOr(''),
- linkClass: anchor.linkClass.getOr('')
- };
- };
- const makeDialog = (settings, onSubmit, editor) => {
- const urlInput = [{
- name: 'url',
- type: 'urlinput',
- filetype: 'file',
- label: 'URL',
- picker_text: 'Browse links'
- }];
- const displayText = settings.anchor.text.map(() => ({
- name: 'text',
- type: 'input',
- label: 'Text to display'
- })).toArray();
- const titleText = settings.flags.titleEnabled ? [{
- name: 'title',
- type: 'input',
- label: 'Title'
- }] : [];
- const defaultTarget = Optional.from(getDefaultLinkTarget(editor));
- const initialData = getInitialData(settings, defaultTarget);
- const catalogs = settings.catalogs;
- const dialogDelta = DialogChanges.init(initialData, catalogs);
- const body = {
- type: 'panel',
- items: flatten([
- urlInput,
- displayText,
- titleText,
- cat([
- catalogs.anchor.map(ListOptions.createUi('anchor', 'Anchors')),
- catalogs.rels.map(ListOptions.createUi('rel', 'Rel')),
- catalogs.targets.map(ListOptions.createUi('target', 'Open link in...')),
- catalogs.link.map(ListOptions.createUi('link', 'Link list')),
- catalogs.classes.map(ListOptions.createUi('linkClass', 'Class'))
- ])
- ])
- };
- return {
- title: 'Insert/Edit Link',
- size: 'normal',
- body,
- buttons: [
- {
- type: 'cancel',
- name: 'cancel',
- text: 'Cancel'
- },
- {
- type: 'submit',
- name: 'save',
- text: 'Save',
- primary: true
- }
- ],
- initialData,
- onChange: (api, {name}) => {
- dialogDelta.onChange(api.getData, { name }).each(newData => {
- api.setData(newData);
- });
- },
- onSubmit
- };
- };
- const open$1 = editor => {
- const data = collectData(editor);
- data.then(info => {
- const onSubmit = handleSubmit(editor, info);
- return makeDialog(info, onSubmit, editor);
- }).then(spec => {
- editor.windowManager.open(spec);
- });
- };
-
- const register = editor => {
- editor.addCommand('mceLink', (_ui, value) => {
- if ((value === null || value === void 0 ? void 0 : value.dialog) === true || !useQuickLink(editor)) {
- open$1(editor);
- } else {
- editor.dispatch('contexttoolbar-show', { toolbarKey: 'quicklink' });
- }
- });
- };
-
- var global = tinymce.util.Tools.resolve('tinymce.util.VK');
-
- const appendClickRemove = (link, evt) => {
- document.body.appendChild(link);
- link.dispatchEvent(evt);
- document.body.removeChild(link);
- };
- const open = url => {
- const link = document.createElement('a');
- link.target = '_blank';
- link.href = url;
- link.rel = 'noreferrer noopener';
- const evt = document.createEvent('MouseEvents');
- evt.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
- appendClickRemove(link, evt);
- };
-
- const isSelectionOnImageWithEmbeddedLink = editor => {
- const rng = editor.selection.getRng();
- const node = rng.startContainer;
- return isLink(node) && rng.startContainer === rng.endContainer && editor.dom.select('img', node).length === 1;
- };
- const getLinks = editor => editor.selection.isCollapsed() || isSelectionOnImageWithEmbeddedLink(editor) ? getLinks$2(editor.dom.getParents(editor.selection.getStart())) : getLinksInSelection(editor.selection.getRng());
- const getSelectedLink = editor => getLinks(editor)[0];
- const hasOnlyAltModifier = e => {
- return e.altKey === true && e.shiftKey === false && e.ctrlKey === false && e.metaKey === false;
- };
- const gotoLink = (editor, a) => {
- if (a) {
- const href = getHref(a);
- if (/^#/.test(href)) {
- const targetEl = editor.dom.select(href);
- if (targetEl.length) {
- editor.selection.scrollIntoView(targetEl[0], true);
- }
- } else {
- open(a.href);
- }
- }
- };
- const openDialog = editor => () => {
- editor.execCommand('mceLink', false, { dialog: true });
- };
- const gotoSelectedLink = editor => () => {
- gotoLink(editor, getSelectedLink(editor));
- };
- const setupGotoLinks = editor => {
- editor.on('click', e => {
- const links = getLinks$2(editor.dom.getParents(e.target));
- if (links.length === 1 && global.metaKeyPressed(e)) {
- e.preventDefault();
- gotoLink(editor, links[0]);
- }
- });
- editor.on('keydown', e => {
- if (!e.isDefaultPrevented() && e.keyCode === 13 && hasOnlyAltModifier(e)) {
- const link = getSelectedLink(editor);
- if (link) {
- e.preventDefault();
- gotoLink(editor, link);
- }
- }
- });
- };
- const toggleState = (editor, toggler) => {
- editor.on('NodeChange', toggler);
- return () => editor.off('NodeChange', toggler);
- };
- const toggleLinkState = editor => api => {
- const updateState = () => {
- api.setActive(!editor.mode.isReadOnly() && isInAnchor(editor, editor.selection.getNode()));
- api.setEnabled(editor.selection.isEditable());
- };
- updateState();
- return toggleState(editor, updateState);
- };
- const toggleLinkMenuState = editor => api => {
- const updateState = () => {
- api.setEnabled(editor.selection.isEditable());
- };
- updateState();
- return toggleState(editor, updateState);
- };
- const hasExactlyOneLinkInSelection = editor => getLinks(editor).length === 1;
- const toggleGotoLinkState = editor => api => {
- const updateState = () => api.setEnabled(hasExactlyOneLinkInSelection(editor));
- updateState();
- return toggleState(editor, updateState);
- };
- const toggleUnlinkState = editor => api => {
- const hasLinks$1 = parents => hasLinks(parents) || hasLinksInSelection(editor.selection.getRng());
- const parents = editor.dom.getParents(editor.selection.getStart());
- const updateEnabled = parents => {
- api.setEnabled(hasLinks$1(parents) && editor.selection.isEditable());
- };
- updateEnabled(parents);
- return toggleState(editor, e => updateEnabled(e.parents));
- };
-
- const setup = editor => {
- editor.addShortcut('Meta+K', '', () => {
- editor.execCommand('mceLink');
- });
- };
-
- const setupButtons = editor => {
- editor.ui.registry.addToggleButton('link', {
- icon: 'link',
- tooltip: 'Insert/edit link',
- onAction: openDialog(editor),
- onSetup: toggleLinkState(editor),
- shortcut: 'Meta+K'
- });
- editor.ui.registry.addButton('openlink', {
- icon: 'new-tab',
- tooltip: 'Open link',
- onAction: gotoSelectedLink(editor),
- onSetup: toggleGotoLinkState(editor)
- });
- editor.ui.registry.addButton('unlink', {
- icon: 'unlink',
- tooltip: 'Remove link',
- onAction: () => unlink(editor),
- onSetup: toggleUnlinkState(editor)
- });
- };
- const setupMenuItems = editor => {
- editor.ui.registry.addMenuItem('openlink', {
- text: 'Open link',
- icon: 'new-tab',
- onAction: gotoSelectedLink(editor),
- onSetup: toggleGotoLinkState(editor)
- });
- editor.ui.registry.addMenuItem('link', {
- icon: 'link',
- text: 'Link...',
- shortcut: 'Meta+K',
- onSetup: toggleLinkMenuState(editor),
- onAction: openDialog(editor)
- });
- editor.ui.registry.addMenuItem('unlink', {
- icon: 'unlink',
- text: 'Remove link',
- onAction: () => unlink(editor),
- onSetup: toggleUnlinkState(editor)
- });
- };
- const setupContextMenu = editor => {
- const inLink = 'link unlink openlink';
- const noLink = 'link';
- editor.ui.registry.addContextMenu('link', {
- update: element => {
- const isEditable = editor.dom.isEditable(element);
- if (!isEditable) {
- return '';
- }
- return hasLinks(editor.dom.getParents(element, 'a')) ? inLink : noLink;
- }
- });
- };
- const setupContextToolbars = editor => {
- const collapseSelectionToEnd = editor => {
- editor.selection.collapse(false);
- };
- const onSetupLink = buttonApi => {
- const node = editor.selection.getNode();
- buttonApi.setEnabled(isInAnchor(editor, node));
- return noop;
- };
- const getLinkText = value => {
- const anchor = getAnchorElement(editor);
- const onlyText = isOnlyTextSelected(editor);
- if (anchor.isNone() && onlyText) {
- const text = getAnchorText(editor.selection, anchor);
- return someIf(text.length === 0, value);
- } else {
- return Optional.none();
- }
- };
- editor.ui.registry.addContextForm('quicklink', {
- launch: {
- type: 'contextformtogglebutton',
- icon: 'link',
- tooltip: 'Link',
- onSetup: toggleLinkState(editor)
- },
- label: 'Link',
- predicate: node => hasContextToolbar(editor) && isInAnchor(editor, node),
- initValue: () => {
- const elm = getAnchorElement(editor);
- return elm.fold(constant(''), getHref);
- },
- commands: [
- {
- type: 'contextformtogglebutton',
- icon: 'link',
- tooltip: 'Link',
- primary: true,
- onSetup: buttonApi => {
- const node = editor.selection.getNode();
- buttonApi.setActive(isInAnchor(editor, node));
- return toggleLinkState(editor)(buttonApi);
- },
- onAction: formApi => {
- const value = formApi.getValue();
- const text = getLinkText(value);
- const attachState = {
- href: value,
- attach: noop
- };
- link(editor, attachState, {
- href: value,
- text,
- title: Optional.none(),
- rel: Optional.none(),
- target: Optional.from(getDefaultLinkTarget(editor)),
- class: Optional.none()
- });
- collapseSelectionToEnd(editor);
- formApi.hide();
- }
- },
- {
- type: 'contextformbutton',
- icon: 'unlink',
- tooltip: 'Remove link',
- onSetup: onSetupLink,
- onAction: formApi => {
- unlink(editor);
- formApi.hide();
- }
- },
- {
- type: 'contextformbutton',
- icon: 'new-tab',
- tooltip: 'Open link',
- onSetup: onSetupLink,
- onAction: formApi => {
- gotoSelectedLink(editor)();
- formApi.hide();
- }
- }
- ]
- });
- };
-
- var Plugin = () => {
- global$5.add('link', editor => {
- register$1(editor);
- setupButtons(editor);
- setupMenuItems(editor);
- setupContextMenu(editor);
- setupContextToolbars(editor);
- setupGotoLinks(editor);
- register(editor);
- setup(editor);
- });
- };
-
- Plugin();
-
-})();
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/link/plugin.min.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/link/plugin.min.js
deleted file mode 100644
index 46c4f5d..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/link/plugin.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/**
- * TinyMCE version 7.1.0 (2024-05-08)
- */
-!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=e=>t=>(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(n=o=e,(r=String).prototype.isPrototypeOf(n)||(null===(l=o.constructor)||void 0===l?void 0:l.name)===r.name)?"string":t;var n,o,r,l})(t)===e,n=e=>t=>typeof t===e,o=t("string"),r=t("object"),l=t("array"),i=(null,e=>null===e);const a=n("boolean"),s=e=>!(e=>null==e)(e),c=n("function"),u=(e,t)=>{if(l(e)){for(let n=0,o=e.length;n{},d=(e,t)=>e===t;class m{constructor(e,t){this.tag=e,this.value=t}static some(e){return new m(!0,e)}static none(){return m.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?m.some(e(this.value)):m.none()}bind(e){return this.tag?e(this.value):m.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:m.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return s(e)?m.some(e):m.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}m.singletonNone=new m(!1);const h=Array.prototype.indexOf,f=Array.prototype.push,p=e=>{const t=[];for(let n=0,o=e.length;n{for(let n=0;ne.exists((e=>n(e,t))),x=e=>{const t=[],n=e=>{t.push(e)};for(let t=0;te?m.some(t):m.none(),b=e=>t=>t.options.get(e),_=b("link_assume_external_targets"),w=b("link_context_toolbar"),C=b("link_list"),O=b("link_default_target"),N=b("link_default_protocol"),A=b("link_target_list"),S=b("link_rel_list"),E=b("link_class_list"),T=b("link_title"),R=b("allow_unsafe_link_target"),P=b("link_quicklink");var L=tinymce.util.Tools.resolve("tinymce.util.Tools");const M=e=>o(e.value)?e.value:"",D=(e,t)=>{const n=[];return L.each(e,(e=>{const r=(e=>o(e.text)?e.text:o(e.title)?e.title:"")(e);if(void 0!==e.menu){const o=D(e.menu,t);n.push({text:r,items:o})}else{const o=t(e);n.push({text:r,value:o})}})),n},B=(e=M)=>t=>m.from(t).map((t=>D(t,e))),I=e=>B(M)(e),K=B,j=(e,t)=>n=>({name:e,type:"listbox",label:t,items:n}),U=M,q=Object.keys,F=Object.hasOwnProperty,V=(e,t)=>F.call(e,t);var $=tinymce.util.Tools.resolve("tinymce.dom.TreeWalker"),z=tinymce.util.Tools.resolve("tinymce.util.URI");const G=e=>s(e)&&"a"===e.nodeName.toLowerCase(),H=e=>G(e)&&!!Q(e),J=(e,t)=>{if(e.collapsed)return[];{const n=e.cloneContents(),o=n.firstChild,r=new $(o,n),l=[];let i=o;do{t(i)&&l.push(i)}while(i=r.next());return l}},W=e=>/^\w+:/i.test(e),Q=e=>{var t,n;return null!==(n=null!==(t=e.getAttribute("data-mce-href"))&&void 0!==t?t:e.getAttribute("href"))&&void 0!==n?n:""},X=(e,t)=>{const n=["noopener"],o=e?e.split(/\s+/):[],r=e=>e.filter((e=>-1===L.inArray(n,e))),l=t?(e=>(e=r(e)).length>0?e.concat(n):n)(o):r(o);return l.length>0?(e=>L.trim(e.sort().join(" ")))(l):""},Y=(e,t)=>(t=t||te(e.selection.getRng())[0]||e.selection.getNode(),le(t)?m.from(e.dom.select("a[href]",t)[0]):m.from(e.dom.getParent(t,"a[href]"))),Z=(e,t)=>Y(e,t).isSome(),ee=(e,t)=>t.fold((()=>e.getContent({format:"text"})),(e=>e.innerText||e.textContent||"")).replace(/\uFEFF/g,""),te=e=>J(e,H),ne=e=>L.grep(e,H),oe=e=>ne(e).length>0,re=e=>{const t=e.schema.getTextInlineElements();if(Y(e).exists((e=>e.hasAttribute("data-mce-block"))))return!1;const n=e.selection.getRng();return!!n.collapsed||0===J(n,(e=>1===e.nodeType&&!G(e)&&!V(t,e.nodeName.toLowerCase()))).length},le=e=>s(e)&&"FIGURE"===e.nodeName&&/\bimage\b/i.test(e.className),ie=(e,t,n)=>{const o=e.selection.getNode(),r=Y(e,o),l=((e,t)=>{const n={...t};if(0===S(e).length&&!R(e)){const e=X(n.rel,"_blank"===n.target);n.rel=e||null}return m.from(n.target).isNone()&&!1===A(e)&&(n.target=O(e)),n.href=((e,t)=>"http"!==t&&"https"!==t||W(e)?e:t+"://"+e)(n.href,_(e)),n})(e,(e=>{return t=["title","rel","class","target"],n=(t,n)=>(e[n].each((e=>{t[n]=e.length>0?e:null})),t),o={href:e.href},((e,t)=>{for(let n=0,o=e.length;n{o=n(o,e)})),o;var t,n,o})(n));e.undoManager.transact((()=>{n.href===t.href&&t.attach(),r.fold((()=>{((e,t,n,o)=>{const r=e.dom;le(t)?ge(r,t,o):n.fold((()=>{e.execCommand("mceInsertLink",!1,o)}),(t=>{e.insertContent(r.createHTML("a",o,r.encode(t)))}))})(e,o,n.text,l)}),(t=>{e.focus(),((e,t,n,o)=>{n.each((e=>{V(t,"innerText")?t.innerText=e:t.textContent=e})),e.dom.setAttribs(t,o),e.selection.select(t)})(e,t,n.text,l)}))}))},ae=e=>{const{class:t,href:n,rel:o,target:r,text:l,title:a}=e;return((e,t)=>{const n={};var o;return((e,t,n,o)=>{((e,t)=>{const n=q(e);for(let o=0,r=n.length;o{(t(e,r)?n:o)(e,r)}))})(e,((e,t)=>!1===i(e)),(o=n,(e,t)=>{o[t]=e}),g),n})({class:t.getOrNull(),href:n,rel:o.getOrNull(),target:r.getOrNull(),text:l.getOrNull(),title:a.getOrNull()})},se=(e,t,n)=>{const o=((e,t)=>{const n=e.options.get,o={allow_html_data_urls:n("allow_html_data_urls"),allow_script_urls:n("allow_script_urls"),allow_svg_data_urls:n("allow_svg_data_urls")},r=t.href;return{...t,href:z.isDomSafe(r,"a",o)?r:""}})(e,n);e.hasPlugin("rtc",!0)?e.execCommand("createlink",!1,ae(o)):ie(e,t,o)},ce=e=>{e.hasPlugin("rtc",!0)?e.execCommand("unlink"):(e=>{e.undoManager.transact((()=>{const t=e.selection.getNode();le(t)?ue(e,t):(e=>{const t=e.dom,n=e.selection,o=n.getBookmark(),r=n.getRng().cloneRange(),l=t.getParent(r.startContainer,"a[href]",e.getBody()),i=t.getParent(r.endContainer,"a[href]",e.getBody());l&&r.setStartBefore(l),i&&r.setEndAfter(i),n.setRng(r),e.execCommand("unlink"),n.moveToBookmark(o)})(e),e.focus()}))})(e)},ue=(e,t)=>{var n;const o=e.dom.select("img",t)[0];if(o){const r=e.dom.getParents(o,"a[href]",t)[0];r&&(null===(n=r.parentNode)||void 0===n||n.insertBefore(o,r),e.dom.remove(r))}},ge=(e,t,n)=>{var o;const r=e.select("img",t)[0];if(r){const t=e.create("a",n);null===(o=r.parentNode)||void 0===o||o.insertBefore(t,r),t.appendChild(r)}},de=(e,t)=>k(t,(t=>(e=>{return V(t=e,n="items")&&void 0!==t[n]&&null!==t[n];var t,n})(t)?de(e,t.items):y(t.value===e,t))),me=(e,t)=>{const n={text:e.text,title:e.title},o=(e,o)=>{const r=(l=t,i=o,"link"===i?l.link:"anchor"===i?l.anchor:m.none()).getOr([]);var l,i;return((e,t,n,o)=>{const r=o[t],l=e.length>0;return void 0!==r?de(r,n).map((t=>({url:{value:t.value,meta:{text:l?e:t.text,attach:g}},text:l?e:t.text}))):m.none()})(n.text,o,r,e)};return{onChange:(e,t)=>{const r=t.name;return"url"===r?(e=>{const t=(o=e.url,y(n.text.length<=0,m.from(null===(r=o.meta)||void 0===r?void 0:r.text).getOr(o.value)));var o,r;const l=(e=>{var t;return y(n.title.length<=0,m.from(null===(t=e.meta)||void 0===t?void 0:t.title).getOr(""))})(e.url);return t.isSome()||l.isSome()?m.some({...t.map((e=>({text:e}))).getOr({}),...l.map((e=>({title:e}))).getOr({})}):m.none()})(e()):((e,t)=>h.call(e,t))(["anchor","link"],r)>-1?o(e(),r):"text"===r||"title"===r?(n[r]=e()[r],m.none()):m.none()}}};var he=tinymce.util.Tools.resolve("tinymce.util.Delay");const fe=e=>{const t=e.href;return t.indexOf("@")>0&&-1===t.indexOf("/")&&-1===t.indexOf("mailto:")?m.some({message:"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?",preprocess:e=>({...e,href:"mailto:"+t})}):m.none()},pe=(e,t)=>n=>{const o=n.href;return 1===e&&!W(o)||0===e&&/^\s*www(\.|\d\.)/i.test(o)?m.some({message:`The URL you entered seems to be an external link. Do you want to add the required ${t}:// prefix?`,preprocess:e=>({...e,href:t+"://"+o})}):m.none()},ke=e=>{const t=e.dom.select("a:not([href])"),n=p(((e,t)=>{const n=e.length,o=new Array(n);for(let r=0;r{const t=e.name||e.id;return t?[{text:t,value:"#"+t}]:[]})));return n.length>0?m.some([{text:"None",value:""}].concat(n)):m.none()},ve=e=>{const t=E(e);return t.length>0?I(t):m.none()},xe=e=>{try{return m.some(JSON.parse(e))}catch(e){return m.none()}},ye=(e,t)=>{const n=S(e);if(n.length>0){const o=v(t,"_blank"),r=e=>X(U(e),o);return(!1===R(e)?K(r):I)(n)}return m.none()},be=[{text:"Current window",value:""},{text:"New window",value:"_blank"}],_e=e=>{const t=A(e);return l(t)?I(t).orThunk((()=>m.some(be))):!1===t?m.none():m.some(be)},we=(e,t,n)=>{const o=e.getAttrib(t,n);return null!==o&&o.length>0?m.some(o):m.none()},Ce=(e,t)=>(e=>{const t=t=>e.convertURL(t.value||t.url||"","href"),n=C(e);return new Promise((e=>{o(n)?fetch(n).then((e=>e.ok?e.text().then(xe):Promise.reject())).then(e,(()=>e(m.none()))):c(n)?n((t=>e(m.some(t)))):e(m.from(n))})).then((e=>e.bind(K(t)).map((e=>e.length>0?[{text:"None",value:""}].concat(e):e))))})(e).then((n=>{const o=((e,t)=>{const n=e.dom,o=re(e)?m.some(ee(e.selection,t)):m.none(),r=t.bind((e=>m.from(n.getAttrib(e,"href")))),l=t.bind((e=>m.from(n.getAttrib(e,"target")))),i=t.bind((e=>we(n,e,"rel"))),a=t.bind((e=>we(n,e,"class")));return{url:r,text:o,title:t.bind((e=>we(n,e,"title"))),target:l,rel:i,linkClass:a}})(e,t);return{anchor:o,catalogs:{targets:_e(e),rels:ye(e,o.target),classes:ve(e),anchor:ke(e),link:n},optNode:t,flags:{titleEnabled:T(e)}}})),Oe=e=>{const t=(e=>{const t=Y(e);return Ce(e,t)})(e);t.then((t=>{const n=((e,t)=>n=>{const o=n.getData();if(!o.url.value)return ce(e),void n.close();const r=e=>m.from(o[e]).filter((n=>!v(t.anchor[e],n))),l={href:o.url.value,text:r("text"),target:r("target"),rel:r("rel"),class:r("linkClass"),title:r("title")},i={href:o.url.value,attach:void 0!==o.url.meta&&o.url.meta.attach?o.url.meta.attach:g};((e,t)=>k([fe,pe(_(e),N(e))],(e=>e(t))).fold((()=>Promise.resolve(t)),(n=>new Promise((o=>{((e,t,n)=>{const o=e.selection.getRng();he.setEditorTimeout(e,(()=>{e.windowManager.confirm(t,(t=>{e.selection.setRng(o),n(t)}))}))})(e,n.message,(e=>{o(e?n.preprocess(t):t)}))})))))(e,l).then((t=>{se(e,i,t)})),n.close()})(e,t);return((e,t,n)=>{const o=e.anchor.text.map((()=>({name:"text",type:"input",label:"Text to display"}))).toArray(),r=e.flags.titleEnabled?[{name:"title",type:"input",label:"Title"}]:[],l=((e,t)=>{const n=e.anchor,o=n.url.getOr("");return{url:{value:o,meta:{original:{value:o}}},text:n.text.getOr(""),title:n.title.getOr(""),anchor:o,link:o,rel:n.rel.getOr(""),target:n.target.or(t).getOr(""),linkClass:n.linkClass.getOr("")}})(e,m.from(O(n))),i=e.catalogs,a=me(l,i);return{title:"Insert/Edit Link",size:"normal",body:{type:"panel",items:p([[{name:"url",type:"urlinput",filetype:"file",label:"URL",picker_text:"Browse links"}],o,r,x([i.anchor.map(j("anchor","Anchors")),i.rels.map(j("rel","Rel")),i.targets.map(j("target","Open link in...")),i.link.map(j("link","Link list")),i.classes.map(j("linkClass","Class"))])])},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:l,onChange:(e,{name:t})=>{a.onChange(e.getData,{name:t}).each((t=>{e.setData(t)}))},onSubmit:t}})(t,n,e)})).then((t=>{e.windowManager.open(t)}))};var Ne=tinymce.util.Tools.resolve("tinymce.util.VK");const Ae=e=>e.selection.isCollapsed()||(e=>{const t=e.selection.getRng(),n=t.startContainer;return H(n)&&t.startContainer===t.endContainer&&1===e.dom.select("img",n).length})(e)?ne(e.dom.getParents(e.selection.getStart())):te(e.selection.getRng()),Se=e=>Ae(e)[0],Ee=(e,t)=>{if(t){const n=Q(t);if(/^#/.test(n)){const t=e.dom.select(n);t.length&&e.selection.scrollIntoView(t[0],!0)}else(e=>{const t=document.createElement("a");t.target="_blank",t.href=e,t.rel="noreferrer noopener";const n=document.createEvent("MouseEvents");n.initMouseEvent("click",!0,!0,window,0,0,0,0,0,!1,!1,!1,!1,0,null),((e,t)=>{document.body.appendChild(e),e.dispatchEvent(t),document.body.removeChild(e)})(t,n)})(t.href)}},Te=e=>()=>{e.execCommand("mceLink",!1,{dialog:!0})},Re=e=>()=>{Ee(e,Se(e))},Pe=(e,t)=>(e.on("NodeChange",t),()=>e.off("NodeChange",t)),Le=e=>t=>{const n=()=>{t.setActive(!e.mode.isReadOnly()&&Z(e,e.selection.getNode())),t.setEnabled(e.selection.isEditable())};return n(),Pe(e,n)},Me=e=>t=>{const n=()=>{t.setEnabled(e.selection.isEditable())};return n(),Pe(e,n)},De=e=>t=>{const n=()=>t.setEnabled((e=>1===Ae(e).length)(e));return n(),Pe(e,n)},Be=e=>t=>{const n=e.dom.getParents(e.selection.getStart()),o=n=>{t.setEnabled((t=>{return oe(t)||(n=e.selection.getRng(),te(n).length>0);var n})(n)&&e.selection.isEditable())};return o(n),Pe(e,(e=>o(e.parents)))};e.add("link",(e=>{(e=>{const t=e.options.register;t("link_assume_external_targets",{processor:e=>{const t=o(e)||a(e);return t?!0===e?{value:1,valid:t}:"http"===e||"https"===e?{value:e,valid:t}:{value:0,valid:t}:{valid:!1,message:"Must be a string or a boolean."}},default:!1}),t("link_context_toolbar",{processor:"boolean",default:!1}),t("link_list",{processor:e=>o(e)||c(e)||u(e,r)}),t("link_default_target",{processor:"string"}),t("link_default_protocol",{processor:"string",default:"https"}),t("link_target_list",{processor:e=>a(e)||u(e,r),default:!0}),t("link_rel_list",{processor:"object[]",default:[]}),t("link_class_list",{processor:"object[]",default:[]}),t("link_title",{processor:"boolean",default:!0}),t("allow_unsafe_link_target",{processor:"boolean",default:!1}),t("link_quicklink",{processor:"boolean",default:!1})})(e),(e=>{e.ui.registry.addToggleButton("link",{icon:"link",tooltip:"Insert/edit link",onAction:Te(e),onSetup:Le(e),shortcut:"Meta+K"}),e.ui.registry.addButton("openlink",{icon:"new-tab",tooltip:"Open link",onAction:Re(e),onSetup:De(e)}),e.ui.registry.addButton("unlink",{icon:"unlink",tooltip:"Remove link",onAction:()=>ce(e),onSetup:Be(e)})})(e),(e=>{e.ui.registry.addMenuItem("openlink",{text:"Open link",icon:"new-tab",onAction:Re(e),onSetup:De(e)}),e.ui.registry.addMenuItem("link",{icon:"link",text:"Link...",shortcut:"Meta+K",onSetup:Me(e),onAction:Te(e)}),e.ui.registry.addMenuItem("unlink",{icon:"unlink",text:"Remove link",onAction:()=>ce(e),onSetup:Be(e)})})(e),(e=>{e.ui.registry.addContextMenu("link",{update:t=>e.dom.isEditable(t)?oe(e.dom.getParents(t,"a"))?"link unlink openlink":"link":""})})(e),(e=>{const t=t=>{const n=e.selection.getNode();return t.setEnabled(Z(e,n)),g};e.ui.registry.addContextForm("quicklink",{launch:{type:"contextformtogglebutton",icon:"link",tooltip:"Link",onSetup:Le(e)},label:"Link",predicate:t=>w(e)&&Z(e,t),initValue:()=>Y(e).fold((()=>""),Q),commands:[{type:"contextformtogglebutton",icon:"link",tooltip:"Link",primary:!0,onSetup:t=>{const n=e.selection.getNode();return t.setActive(Z(e,n)),Le(e)(t)},onAction:t=>{const n=t.getValue(),o=(t=>{const n=Y(e),o=re(e);if(n.isNone()&&o){const o=ee(e.selection,n);return y(0===o.length,t)}return m.none()})(n);se(e,{href:n,attach:g},{href:n,text:o,title:m.none(),rel:m.none(),target:m.from(O(e)),class:m.none()}),(e=>{e.selection.collapse(!1)})(e),t.hide()}},{type:"contextformbutton",icon:"unlink",tooltip:"Remove link",onSetup:t,onAction:t=>{ce(e),t.hide()}},{type:"contextformbutton",icon:"new-tab",tooltip:"Open link",onSetup:t,onAction:t=>{Re(e)(),t.hide()}}]})})(e),(e=>{e.on("click",(t=>{const n=ne(e.dom.getParents(t.target));1===n.length&&Ne.metaKeyPressed(t)&&(t.preventDefault(),Ee(e,n[0]))})),e.on("keydown",(t=>{if(!t.isDefaultPrevented()&&13===t.keyCode&&(e=>!0===e.altKey&&!1===e.shiftKey&&!1===e.ctrlKey&&!1===e.metaKey)(t)){const n=Se(e);n&&(t.preventDefault(),Ee(e,n))}}))})(e),(e=>{e.addCommand("mceLink",((t,n)=>{!0!==(null==n?void 0:n.dialog)&&P(e)?e.dispatch("contexttoolbar-show",{toolbarKey:"quicklink"}):Oe(e)}))})(e),(e=>{e.addShortcut("Meta+K","",(()=>{e.execCommand("mceLink")}))})(e)}))}();
\ No newline at end of file
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/lists/plugin.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/lists/plugin.js
deleted file mode 100644
index c482a3a..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/lists/plugin.js
+++ /dev/null
@@ -1,2177 +0,0 @@
-/**
- * TinyMCE version 7.1.0 (2024-05-08)
- */
-
-(function () {
- 'use strict';
-
- var global$7 = tinymce.util.Tools.resolve('tinymce.PluginManager');
-
- const hasProto = (v, constructor, predicate) => {
- var _a;
- if (predicate(v, constructor.prototype)) {
- return true;
- } else {
- return ((_a = v.constructor) === null || _a === void 0 ? void 0 : _a.name) === constructor.name;
- }
- };
- const typeOf = x => {
- const t = typeof x;
- if (x === null) {
- return 'null';
- } else if (t === 'object' && Array.isArray(x)) {
- return 'array';
- } else if (t === 'object' && hasProto(x, String, (o, proto) => proto.isPrototypeOf(o))) {
- return 'string';
- } else {
- return t;
- }
- };
- const isType$1 = type => value => typeOf(value) === type;
- const isSimpleType = type => value => typeof value === type;
- const isString = isType$1('string');
- const isObject = isType$1('object');
- const isArray = isType$1('array');
- const isBoolean = isSimpleType('boolean');
- const isNullable = a => a === null || a === undefined;
- const isNonNullable = a => !isNullable(a);
- const isFunction = isSimpleType('function');
- const isNumber = isSimpleType('number');
-
- const noop = () => {
- };
- const compose1 = (fbc, fab) => a => fbc(fab(a));
- const constant = value => {
- return () => {
- return value;
- };
- };
- const tripleEquals = (a, b) => {
- return a === b;
- };
- function curry(fn, ...initialArgs) {
- return (...restArgs) => {
- const all = initialArgs.concat(restArgs);
- return fn.apply(null, all);
- };
- }
- const not = f => t => !f(t);
- const never = constant(false);
-
- class Optional {
- constructor(tag, value) {
- this.tag = tag;
- this.value = value;
- }
- static some(value) {
- return new Optional(true, value);
- }
- static none() {
- return Optional.singletonNone;
- }
- fold(onNone, onSome) {
- if (this.tag) {
- return onSome(this.value);
- } else {
- return onNone();
- }
- }
- isSome() {
- return this.tag;
- }
- isNone() {
- return !this.tag;
- }
- map(mapper) {
- if (this.tag) {
- return Optional.some(mapper(this.value));
- } else {
- return Optional.none();
- }
- }
- bind(binder) {
- if (this.tag) {
- return binder(this.value);
- } else {
- return Optional.none();
- }
- }
- exists(predicate) {
- return this.tag && predicate(this.value);
- }
- forall(predicate) {
- return !this.tag || predicate(this.value);
- }
- filter(predicate) {
- if (!this.tag || predicate(this.value)) {
- return this;
- } else {
- return Optional.none();
- }
- }
- getOr(replacement) {
- return this.tag ? this.value : replacement;
- }
- or(replacement) {
- return this.tag ? this : replacement;
- }
- getOrThunk(thunk) {
- return this.tag ? this.value : thunk();
- }
- orThunk(thunk) {
- return this.tag ? this : thunk();
- }
- getOrDie(message) {
- if (!this.tag) {
- throw new Error(message !== null && message !== void 0 ? message : 'Called getOrDie on None');
- } else {
- return this.value;
- }
- }
- static from(value) {
- return isNonNullable(value) ? Optional.some(value) : Optional.none();
- }
- getOrNull() {
- return this.tag ? this.value : null;
- }
- getOrUndefined() {
- return this.value;
- }
- each(worker) {
- if (this.tag) {
- worker(this.value);
- }
- }
- toArray() {
- return this.tag ? [this.value] : [];
- }
- toString() {
- return this.tag ? `some(${ this.value })` : 'none()';
- }
- }
- Optional.singletonNone = new Optional(false);
-
- const nativeSlice = Array.prototype.slice;
- const nativeIndexOf = Array.prototype.indexOf;
- const nativePush = Array.prototype.push;
- const rawIndexOf = (ts, t) => nativeIndexOf.call(ts, t);
- const contains$1 = (xs, x) => rawIndexOf(xs, x) > -1;
- const exists = (xs, pred) => {
- for (let i = 0, len = xs.length; i < len; i++) {
- const x = xs[i];
- if (pred(x, i)) {
- return true;
- }
- }
- return false;
- };
- const map = (xs, f) => {
- const len = xs.length;
- const r = new Array(len);
- for (let i = 0; i < len; i++) {
- const x = xs[i];
- r[i] = f(x, i);
- }
- return r;
- };
- const each$1 = (xs, f) => {
- for (let i = 0, len = xs.length; i < len; i++) {
- const x = xs[i];
- f(x, i);
- }
- };
- const filter$1 = (xs, pred) => {
- const r = [];
- for (let i = 0, len = xs.length; i < len; i++) {
- const x = xs[i];
- if (pred(x, i)) {
- r.push(x);
- }
- }
- return r;
- };
- const groupBy = (xs, f) => {
- if (xs.length === 0) {
- return [];
- } else {
- let wasType = f(xs[0]);
- const r = [];
- let group = [];
- for (let i = 0, len = xs.length; i < len; i++) {
- const x = xs[i];
- const type = f(x);
- if (type !== wasType) {
- r.push(group);
- group = [];
- }
- wasType = type;
- group.push(x);
- }
- if (group.length !== 0) {
- r.push(group);
- }
- return r;
- }
- };
- const foldl = (xs, f, acc) => {
- each$1(xs, (x, i) => {
- acc = f(acc, x, i);
- });
- return acc;
- };
- const findUntil = (xs, pred, until) => {
- for (let i = 0, len = xs.length; i < len; i++) {
- const x = xs[i];
- if (pred(x, i)) {
- return Optional.some(x);
- } else if (until(x, i)) {
- break;
- }
- }
- return Optional.none();
- };
- const find = (xs, pred) => {
- return findUntil(xs, pred, never);
- };
- const flatten = xs => {
- const r = [];
- for (let i = 0, len = xs.length; i < len; ++i) {
- if (!isArray(xs[i])) {
- throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs);
- }
- nativePush.apply(r, xs[i]);
- }
- return r;
- };
- const bind = (xs, f) => flatten(map(xs, f));
- const reverse = xs => {
- const r = nativeSlice.call(xs, 0);
- r.reverse();
- return r;
- };
- const get$1 = (xs, i) => i >= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none();
- const head = xs => get$1(xs, 0);
- const last = xs => get$1(xs, xs.length - 1);
- const unique = (xs, comparator) => {
- const r = [];
- const isDuplicated = isFunction(comparator) ? x => exists(r, i => comparator(i, x)) : x => contains$1(r, x);
- for (let i = 0, len = xs.length; i < len; i++) {
- const x = xs[i];
- if (!isDuplicated(x)) {
- r.push(x);
- }
- }
- return r;
- };
-
- const is$2 = (lhs, rhs, comparator = tripleEquals) => lhs.exists(left => comparator(left, rhs));
- const equals = (lhs, rhs, comparator = tripleEquals) => lift2(lhs, rhs, comparator).getOr(lhs.isNone() && rhs.isNone());
- const lift2 = (oa, ob, f) => oa.isSome() && ob.isSome() ? Optional.some(f(oa.getOrDie(), ob.getOrDie())) : Optional.none();
-
- const COMMENT = 8;
- const DOCUMENT = 9;
- const DOCUMENT_FRAGMENT = 11;
- const ELEMENT = 1;
- const TEXT = 3;
-
- const fromHtml = (html, scope) => {
- const doc = scope || document;
- const div = doc.createElement('div');
- div.innerHTML = html;
- if (!div.hasChildNodes() || div.childNodes.length > 1) {
- const message = 'HTML does not have a single root node';
- console.error(message, html);
- throw new Error(message);
- }
- return fromDom$1(div.childNodes[0]);
- };
- const fromTag = (tag, scope) => {
- const doc = scope || document;
- const node = doc.createElement(tag);
- return fromDom$1(node);
- };
- const fromText = (text, scope) => {
- const doc = scope || document;
- const node = doc.createTextNode(text);
- return fromDom$1(node);
- };
- const fromDom$1 = node => {
- if (node === null || node === undefined) {
- throw new Error('Node cannot be null or undefined');
- }
- return { dom: node };
- };
- const fromPoint = (docElm, x, y) => Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom$1);
- const SugarElement = {
- fromHtml,
- fromTag,
- fromText,
- fromDom: fromDom$1,
- fromPoint
- };
-
- const is$1 = (element, selector) => {
- const dom = element.dom;
- if (dom.nodeType !== ELEMENT) {
- return false;
- } else {
- const elem = dom;
- if (elem.matches !== undefined) {
- return elem.matches(selector);
- } else if (elem.msMatchesSelector !== undefined) {
- return elem.msMatchesSelector(selector);
- } else if (elem.webkitMatchesSelector !== undefined) {
- return elem.webkitMatchesSelector(selector);
- } else if (elem.mozMatchesSelector !== undefined) {
- return elem.mozMatchesSelector(selector);
- } else {
- throw new Error('Browser lacks native selectors');
- }
- }
- };
-
- const eq = (e1, e2) => e1.dom === e2.dom;
- const contains = (e1, e2) => {
- const d1 = e1.dom;
- const d2 = e2.dom;
- return d1 === d2 ? false : d1.contains(d2);
- };
- const is = is$1;
-
- const Global = typeof window !== 'undefined' ? window : Function('return this;')();
-
- const path = (parts, scope) => {
- let o = scope !== undefined && scope !== null ? scope : Global;
- for (let i = 0; i < parts.length && o !== undefined && o !== null; ++i) {
- o = o[parts[i]];
- }
- return o;
- };
- const resolve = (p, scope) => {
- const parts = p.split('.');
- return path(parts, scope);
- };
-
- const unsafe = (name, scope) => {
- return resolve(name, scope);
- };
- const getOrDie = (name, scope) => {
- const actual = unsafe(name, scope);
- if (actual === undefined || actual === null) {
- throw new Error(name + ' not available on this browser');
- }
- return actual;
- };
-
- const getPrototypeOf = Object.getPrototypeOf;
- const sandHTMLElement = scope => {
- return getOrDie('HTMLElement', scope);
- };
- const isPrototypeOf = x => {
- const scope = resolve('ownerDocument.defaultView', x);
- return isObject(x) && (sandHTMLElement(scope).prototype.isPrototypeOf(x) || /^HTML\w*Element$/.test(getPrototypeOf(x).constructor.name));
- };
-
- const name = element => {
- const r = element.dom.nodeName;
- return r.toLowerCase();
- };
- const type = element => element.dom.nodeType;
- const isType = t => element => type(element) === t;
- const isComment = element => type(element) === COMMENT || name(element) === '#comment';
- const isHTMLElement = element => isElement$1(element) && isPrototypeOf(element.dom);
- const isElement$1 = isType(ELEMENT);
- const isText = isType(TEXT);
- const isDocument = isType(DOCUMENT);
- const isDocumentFragment = isType(DOCUMENT_FRAGMENT);
- const isTag = tag => e => isElement$1(e) && name(e) === tag;
-
- const owner = element => SugarElement.fromDom(element.dom.ownerDocument);
- const documentOrOwner = dos => isDocument(dos) ? dos : owner(dos);
- const parent = element => Optional.from(element.dom.parentNode).map(SugarElement.fromDom);
- const parentElement = element => Optional.from(element.dom.parentElement).map(SugarElement.fromDom);
- const nextSibling = element => Optional.from(element.dom.nextSibling).map(SugarElement.fromDom);
- const children = element => map(element.dom.childNodes, SugarElement.fromDom);
- const child = (element, index) => {
- const cs = element.dom.childNodes;
- return Optional.from(cs[index]).map(SugarElement.fromDom);
- };
- const firstChild = element => child(element, 0);
- const lastChild = element => child(element, element.dom.childNodes.length - 1);
-
- const isShadowRoot = dos => isDocumentFragment(dos) && isNonNullable(dos.dom.host);
- const supported = isFunction(Element.prototype.attachShadow) && isFunction(Node.prototype.getRootNode);
- const getRootNode = supported ? e => SugarElement.fromDom(e.dom.getRootNode()) : documentOrOwner;
- const getShadowRoot = e => {
- const r = getRootNode(e);
- return isShadowRoot(r) ? Optional.some(r) : Optional.none();
- };
- const getShadowHost = e => SugarElement.fromDom(e.dom.host);
-
- const inBody = element => {
- const dom = isText(element) ? element.dom.parentNode : element.dom;
- if (dom === undefined || dom === null || dom.ownerDocument === null) {
- return false;
- }
- const doc = dom.ownerDocument;
- return getShadowRoot(SugarElement.fromDom(dom)).fold(() => doc.body.contains(dom), compose1(inBody, getShadowHost));
- };
-
- var ClosestOrAncestor = (is, ancestor, scope, a, isRoot) => {
- if (is(scope, a)) {
- return Optional.some(scope);
- } else if (isFunction(isRoot) && isRoot(scope)) {
- return Optional.none();
- } else {
- return ancestor(scope, a, isRoot);
- }
- };
-
- const ancestor$3 = (scope, predicate, isRoot) => {
- let element = scope.dom;
- const stop = isFunction(isRoot) ? isRoot : never;
- while (element.parentNode) {
- element = element.parentNode;
- const el = SugarElement.fromDom(element);
- if (predicate(el)) {
- return Optional.some(el);
- } else if (stop(el)) {
- break;
- }
- }
- return Optional.none();
- };
- const closest$2 = (scope, predicate, isRoot) => {
- const is = (s, test) => test(s);
- return ClosestOrAncestor(is, ancestor$3, scope, predicate, isRoot);
- };
-
- const ancestor$2 = (scope, selector, isRoot) => ancestor$3(scope, e => is$1(e, selector), isRoot);
- const closest$1 = (scope, selector, isRoot) => {
- const is = (element, selector) => is$1(element, selector);
- return ClosestOrAncestor(is, ancestor$2, scope, selector, isRoot);
- };
-
- const closest = target => closest$1(target, '[contenteditable]');
- const isEditable = (element, assumeEditable = false) => {
- if (inBody(element)) {
- return element.dom.isContentEditable;
- } else {
- return closest(element).fold(constant(assumeEditable), editable => getRaw(editable) === 'true');
- }
- };
- const getRaw = element => element.dom.contentEditable;
-
- const before$1 = (marker, element) => {
- const parent$1 = parent(marker);
- parent$1.each(v => {
- v.dom.insertBefore(element.dom, marker.dom);
- });
- };
- const after = (marker, element) => {
- const sibling = nextSibling(marker);
- sibling.fold(() => {
- const parent$1 = parent(marker);
- parent$1.each(v => {
- append$1(v, element);
- });
- }, v => {
- before$1(v, element);
- });
- };
- const prepend = (parent, element) => {
- const firstChild$1 = firstChild(parent);
- firstChild$1.fold(() => {
- append$1(parent, element);
- }, v => {
- parent.dom.insertBefore(element.dom, v.dom);
- });
- };
- const append$1 = (parent, element) => {
- parent.dom.appendChild(element.dom);
- };
-
- const before = (marker, elements) => {
- each$1(elements, x => {
- before$1(marker, x);
- });
- };
- const append = (parent, elements) => {
- each$1(elements, x => {
- append$1(parent, x);
- });
- };
-
- const empty = element => {
- element.dom.textContent = '';
- each$1(children(element), rogue => {
- remove(rogue);
- });
- };
- const remove = element => {
- const dom = element.dom;
- if (dom.parentNode !== null) {
- dom.parentNode.removeChild(dom);
- }
- };
-
- var global$6 = tinymce.util.Tools.resolve('tinymce.dom.RangeUtils');
-
- var global$5 = tinymce.util.Tools.resolve('tinymce.dom.TreeWalker');
-
- var global$4 = tinymce.util.Tools.resolve('tinymce.util.VK');
-
- const fromDom = nodes => map(nodes, SugarElement.fromDom);
-
- const keys = Object.keys;
- const each = (obj, f) => {
- const props = keys(obj);
- for (let k = 0, len = props.length; k < len; k++) {
- const i = props[k];
- const x = obj[i];
- f(x, i);
- }
- };
- const objAcc = r => (x, i) => {
- r[i] = x;
- };
- const internalFilter = (obj, pred, onTrue, onFalse) => {
- each(obj, (x, i) => {
- (pred(x, i) ? onTrue : onFalse)(x, i);
- });
- };
- const filter = (obj, pred) => {
- const t = {};
- internalFilter(obj, pred, objAcc(t), noop);
- return t;
- };
-
- const rawSet = (dom, key, value) => {
- if (isString(value) || isBoolean(value) || isNumber(value)) {
- dom.setAttribute(key, value + '');
- } else {
- console.error('Invalid call to Attribute.set. Key ', key, ':: Value ', value, ':: Element ', dom);
- throw new Error('Attribute value was not simple');
- }
- };
- const setAll = (element, attrs) => {
- const dom = element.dom;
- each(attrs, (v, k) => {
- rawSet(dom, k, v);
- });
- };
- const clone$1 = element => foldl(element.dom.attributes, (acc, attr) => {
- acc[attr.name] = attr.value;
- return acc;
- }, {});
-
- const clone = (original, isDeep) => SugarElement.fromDom(original.dom.cloneNode(isDeep));
- const deep = original => clone(original, true);
- const shallowAs = (original, tag) => {
- const nu = SugarElement.fromTag(tag);
- const attributes = clone$1(original);
- setAll(nu, attributes);
- return nu;
- };
- const mutate = (original, tag) => {
- const nu = shallowAs(original, tag);
- after(original, nu);
- const children$1 = children(original);
- append(nu, children$1);
- remove(original);
- return nu;
- };
-
- var global$3 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils');
-
- var global$2 = tinymce.util.Tools.resolve('tinymce.util.Tools');
-
- const matchNodeName = name => node => isNonNullable(node) && node.nodeName.toLowerCase() === name;
- const matchNodeNames = regex => node => isNonNullable(node) && regex.test(node.nodeName);
- const isTextNode$1 = node => isNonNullable(node) && node.nodeType === 3;
- const isElement = node => isNonNullable(node) && node.nodeType === 1;
- const isListNode = matchNodeNames(/^(OL|UL|DL)$/);
- const isOlUlNode = matchNodeNames(/^(OL|UL)$/);
- const isOlNode = matchNodeName('ol');
- const isListItemNode = matchNodeNames(/^(LI|DT|DD)$/);
- const isDlItemNode = matchNodeNames(/^(DT|DD)$/);
- const isTableCellNode = matchNodeNames(/^(TH|TD)$/);
- const isBr = matchNodeName('br');
- const isFirstChild = node => {
- var _a;
- return ((_a = node.parentNode) === null || _a === void 0 ? void 0 : _a.firstChild) === node;
- };
- const isTextBlock = (editor, node) => isNonNullable(node) && node.nodeName in editor.schema.getTextBlockElements();
- const isBlock = (node, blockElements) => isNonNullable(node) && node.nodeName in blockElements;
- const isVoid = (editor, node) => isNonNullable(node) && node.nodeName in editor.schema.getVoidElements();
- const isBogusBr = (dom, node) => {
- if (!isBr(node)) {
- return false;
- }
- return dom.isBlock(node.nextSibling) && !isBr(node.previousSibling);
- };
- const isEmpty$2 = (dom, elm, keepBookmarks) => {
- const empty = dom.isEmpty(elm);
- if (keepBookmarks && dom.select('span[data-mce-type=bookmark]', elm).length > 0) {
- return false;
- }
- return empty;
- };
- const isChildOfBody = (dom, elm) => dom.isChildOf(elm, dom.getRoot());
-
- const option = name => editor => editor.options.get(name);
- const register$3 = editor => {
- const registerOption = editor.options.register;
- registerOption('lists_indent_on_tab', {
- processor: 'boolean',
- default: true
- });
- };
- const shouldIndentOnTab = option('lists_indent_on_tab');
- const getForcedRootBlock = option('forced_root_block');
- const getForcedRootBlockAttrs = option('forced_root_block_attrs');
-
- const createTextBlock = (editor, contentNode, attrs = {}) => {
- const dom = editor.dom;
- const blockElements = editor.schema.getBlockElements();
- const fragment = dom.createFragment();
- const blockName = getForcedRootBlock(editor);
- const blockAttrs = getForcedRootBlockAttrs(editor);
- let node;
- let textBlock;
- let hasContentNode = false;
- textBlock = dom.create(blockName, {
- ...blockAttrs,
- ...attrs.style ? { style: attrs.style } : {}
- });
- if (!isBlock(contentNode.firstChild, blockElements)) {
- fragment.appendChild(textBlock);
- }
- while (node = contentNode.firstChild) {
- const nodeName = node.nodeName;
- if (!hasContentNode && (nodeName !== 'SPAN' || node.getAttribute('data-mce-type') !== 'bookmark')) {
- hasContentNode = true;
- }
- if (isBlock(node, blockElements)) {
- fragment.appendChild(node);
- textBlock = null;
- } else {
- if (!textBlock) {
- textBlock = dom.create(blockName, blockAttrs);
- fragment.appendChild(textBlock);
- }
- textBlock.appendChild(node);
- }
- }
- if (!hasContentNode && textBlock) {
- textBlock.appendChild(dom.create('br', { 'data-mce-bogus': '1' }));
- }
- return fragment;
- };
-
- const DOM$2 = global$3.DOM;
- const splitList = (editor, list, li) => {
- const removeAndKeepBookmarks = targetNode => {
- const parent = targetNode.parentNode;
- if (parent) {
- global$2.each(bookmarks, node => {
- parent.insertBefore(node, li.parentNode);
- });
- }
- DOM$2.remove(targetNode);
- };
- const bookmarks = DOM$2.select('span[data-mce-type="bookmark"]', list);
- const newBlock = createTextBlock(editor, li);
- const tmpRng = DOM$2.createRng();
- tmpRng.setStartAfter(li);
- tmpRng.setEndAfter(list);
- const fragment = tmpRng.extractContents();
- for (let node = fragment.firstChild; node; node = node.firstChild) {
- if (node.nodeName === 'LI' && editor.dom.isEmpty(node)) {
- DOM$2.remove(node);
- break;
- }
- }
- if (!editor.dom.isEmpty(fragment)) {
- DOM$2.insertAfter(fragment, list);
- }
- DOM$2.insertAfter(newBlock, list);
- const parent = li.parentElement;
- if (parent && isEmpty$2(editor.dom, parent)) {
- removeAndKeepBookmarks(parent);
- }
- DOM$2.remove(li);
- if (isEmpty$2(editor.dom, list)) {
- DOM$2.remove(list);
- }
- };
-
- const isDescriptionDetail = isTag('dd');
- const isDescriptionTerm = isTag('dt');
- const outdentDlItem = (editor, item) => {
- if (isDescriptionDetail(item)) {
- mutate(item, 'dt');
- } else if (isDescriptionTerm(item)) {
- parentElement(item).each(dl => splitList(editor, dl.dom, item.dom));
- }
- };
- const indentDlItem = item => {
- if (isDescriptionTerm(item)) {
- mutate(item, 'dd');
- }
- };
- const dlIndentation = (editor, indentation, dlItems) => {
- if (indentation === 'Indent') {
- each$1(dlItems, indentDlItem);
- } else {
- each$1(dlItems, item => outdentDlItem(editor, item));
- }
- };
-
- const getNormalizedPoint = (container, offset) => {
- if (isTextNode$1(container)) {
- return {
- container,
- offset
- };
- }
- const node = global$6.getNode(container, offset);
- if (isTextNode$1(node)) {
- return {
- container: node,
- offset: offset >= container.childNodes.length ? node.data.length : 0
- };
- } else if (node.previousSibling && isTextNode$1(node.previousSibling)) {
- return {
- container: node.previousSibling,
- offset: node.previousSibling.data.length
- };
- } else if (node.nextSibling && isTextNode$1(node.nextSibling)) {
- return {
- container: node.nextSibling,
- offset: 0
- };
- }
- return {
- container,
- offset
- };
- };
- const normalizeRange = rng => {
- const outRng = rng.cloneRange();
- const rangeStart = getNormalizedPoint(rng.startContainer, rng.startOffset);
- outRng.setStart(rangeStart.container, rangeStart.offset);
- const rangeEnd = getNormalizedPoint(rng.endContainer, rng.endOffset);
- outRng.setEnd(rangeEnd.container, rangeEnd.offset);
- return outRng;
- };
-
- const listNames = [
- 'OL',
- 'UL',
- 'DL'
- ];
- const listSelector = listNames.join(',');
- const getParentList = (editor, node) => {
- const selectionStart = node || editor.selection.getStart(true);
- return editor.dom.getParent(selectionStart, listSelector, getClosestListHost(editor, selectionStart));
- };
- const isParentListSelected = (parentList, selectedBlocks) => isNonNullable(parentList) && selectedBlocks.length === 1 && selectedBlocks[0] === parentList;
- const findSubLists = parentList => filter$1(parentList.querySelectorAll(listSelector), isListNode);
- const getSelectedSubLists = editor => {
- const parentList = getParentList(editor);
- const selectedBlocks = editor.selection.getSelectedBlocks();
- if (isParentListSelected(parentList, selectedBlocks)) {
- return findSubLists(parentList);
- } else {
- return filter$1(selectedBlocks, elm => {
- return isListNode(elm) && parentList !== elm;
- });
- }
- };
- const findParentListItemsNodes = (editor, elms) => {
- const listItemsElms = global$2.map(elms, elm => {
- const parentLi = editor.dom.getParent(elm, 'li,dd,dt', getClosestListHost(editor, elm));
- return parentLi ? parentLi : elm;
- });
- return unique(listItemsElms);
- };
- const getSelectedListItems = editor => {
- const selectedBlocks = editor.selection.getSelectedBlocks();
- return filter$1(findParentListItemsNodes(editor, selectedBlocks), isListItemNode);
- };
- const getSelectedDlItems = editor => filter$1(getSelectedListItems(editor), isDlItemNode);
- const getClosestEditingHost = (editor, elm) => {
- const parentTableCell = editor.dom.getParents(elm, 'TD,TH');
- return parentTableCell.length > 0 ? parentTableCell[0] : editor.getBody();
- };
- const isListHost = (schema, node) => !isListNode(node) && !isListItemNode(node) && exists(listNames, listName => schema.isValidChild(node.nodeName, listName));
- const getClosestListHost = (editor, elm) => {
- const parentBlocks = editor.dom.getParents(elm, editor.dom.isBlock);
- const isNotForcedRootBlock = elm => elm.nodeName.toLowerCase() !== getForcedRootBlock(editor);
- const parentBlock = find(parentBlocks, elm => isNotForcedRootBlock(elm) && isListHost(editor.schema, elm));
- return parentBlock.getOr(editor.getBody());
- };
- const isListInsideAnLiWithFirstAndLastNotListElement = list => parent(list).exists(parent => isListItemNode(parent.dom) && firstChild(parent).exists(firstChild => !isListNode(firstChild.dom)) && lastChild(parent).exists(lastChild => !isListNode(lastChild.dom)));
- const findLastParentListNode = (editor, elm) => {
- const parentLists = editor.dom.getParents(elm, 'ol,ul', getClosestListHost(editor, elm));
- return last(parentLists);
- };
- const getSelectedLists = editor => {
- const firstList = findLastParentListNode(editor, editor.selection.getStart());
- const subsequentLists = filter$1(editor.selection.getSelectedBlocks(), isOlUlNode);
- return firstList.toArray().concat(subsequentLists);
- };
- const getParentLists = editor => {
- const elm = editor.selection.getStart();
- return editor.dom.getParents(elm, 'ol,ul', getClosestListHost(editor, elm));
- };
- const getSelectedListRoots = editor => {
- const selectedLists = getSelectedLists(editor);
- const parentLists = getParentLists(editor);
- return find(parentLists, p => isListInsideAnLiWithFirstAndLastNotListElement(SugarElement.fromDom(p))).fold(() => getUniqueListRoots(editor, selectedLists), l => [l]);
- };
- const getUniqueListRoots = (editor, lists) => {
- const listRoots = map(lists, list => findLastParentListNode(editor, list).getOr(list));
- return unique(listRoots);
- };
-
- const isCustomList = list => /\btox\-/.test(list.className);
- const inList = (parents, listName) => findUntil(parents, isListNode, isTableCellNode).exists(list => list.nodeName === listName && !isCustomList(list));
- const isWithinNonEditable = (editor, element) => element !== null && !editor.dom.isEditable(element);
- const selectionIsWithinNonEditableList = editor => {
- const parentList = getParentList(editor);
- return isWithinNonEditable(editor, parentList);
- };
- const isWithinNonEditableList = (editor, element) => {
- const parentList = editor.dom.getParent(element, 'ol,ul,dl');
- return isWithinNonEditable(editor, parentList);
- };
- const setNodeChangeHandler = (editor, nodeChangeHandler) => {
- const initialNode = editor.selection.getNode();
- nodeChangeHandler({
- parents: editor.dom.getParents(initialNode),
- element: initialNode
- });
- editor.on('NodeChange', nodeChangeHandler);
- return () => editor.off('NodeChange', nodeChangeHandler);
- };
-
- const fromElements = (elements, scope) => {
- const doc = scope || document;
- const fragment = doc.createDocumentFragment();
- each$1(elements, element => {
- fragment.appendChild(element.dom);
- });
- return SugarElement.fromDom(fragment);
- };
-
- const fireListEvent = (editor, action, element) => editor.dispatch('ListMutation', {
- action,
- element
- });
-
- const blank = r => s => s.replace(r, '');
- const trim = blank(/^\s+|\s+$/g);
- const isNotEmpty = s => s.length > 0;
- const isEmpty$1 = s => !isNotEmpty(s);
-
- const isSupported = dom => dom.style !== undefined && isFunction(dom.style.getPropertyValue);
-
- const internalSet = (dom, property, value) => {
- if (!isString(value)) {
- console.error('Invalid call to CSS.set. Property ', property, ':: Value ', value, ':: Element ', dom);
- throw new Error('CSS value must be a string: ' + value);
- }
- if (isSupported(dom)) {
- dom.style.setProperty(property, value);
- }
- };
- const set = (element, property, value) => {
- const dom = element.dom;
- internalSet(dom, property, value);
- };
-
- const isList = el => is(el, 'OL,UL');
- const isListItem = el => is(el, 'LI');
- const hasFirstChildList = el => firstChild(el).exists(isList);
- const hasLastChildList = el => lastChild(el).exists(isList);
-
- const isEntryList = entry => 'listAttributes' in entry;
- const isEntryComment = entry => 'isComment' in entry;
- const isEntryFragment = entry => 'isFragment' in entry;
- const isIndented = entry => entry.depth > 0;
- const isSelected = entry => entry.isSelected;
- const cloneItemContent = li => {
- const children$1 = children(li);
- const content = hasLastChildList(li) ? children$1.slice(0, -1) : children$1;
- return map(content, deep);
- };
- const createEntry = (li, depth, isSelected) => parent(li).filter(isElement$1).map(list => ({
- depth,
- dirty: false,
- isSelected,
- content: cloneItemContent(li),
- itemAttributes: clone$1(li),
- listAttributes: clone$1(list),
- listType: name(list),
- isInPreviousLi: false
- }));
-
- const joinSegment = (parent, child) => {
- append$1(parent.item, child.list);
- };
- const joinSegments = segments => {
- for (let i = 1; i < segments.length; i++) {
- joinSegment(segments[i - 1], segments[i]);
- }
- };
- const appendSegments = (head$1, tail) => {
- lift2(last(head$1), head(tail), joinSegment);
- };
- const createSegment = (scope, listType) => {
- const segment = {
- list: SugarElement.fromTag(listType, scope),
- item: SugarElement.fromTag('li', scope)
- };
- append$1(segment.list, segment.item);
- return segment;
- };
- const createSegments = (scope, entry, size) => {
- const segments = [];
- for (let i = 0; i < size; i++) {
- segments.push(createSegment(scope, isEntryList(entry) ? entry.listType : entry.parentListType));
- }
- return segments;
- };
- const populateSegments = (segments, entry) => {
- for (let i = 0; i < segments.length - 1; i++) {
- set(segments[i].item, 'list-style-type', 'none');
- }
- last(segments).each(segment => {
- if (isEntryList(entry)) {
- setAll(segment.list, entry.listAttributes);
- setAll(segment.item, entry.itemAttributes);
- }
- append(segment.item, entry.content);
- });
- };
- const normalizeSegment = (segment, entry) => {
- if (name(segment.list) !== entry.listType) {
- segment.list = mutate(segment.list, entry.listType);
- }
- setAll(segment.list, entry.listAttributes);
- };
- const createItem = (scope, attr, content) => {
- const item = SugarElement.fromTag('li', scope);
- setAll(item, attr);
- append(item, content);
- return item;
- };
- const appendItem = (segment, item) => {
- append$1(segment.list, item);
- segment.item = item;
- };
- const writeShallow = (scope, cast, entry) => {
- const newCast = cast.slice(0, entry.depth);
- last(newCast).each(segment => {
- if (isEntryList(entry)) {
- const item = createItem(scope, entry.itemAttributes, entry.content);
- appendItem(segment, item);
- normalizeSegment(segment, entry);
- } else if (isEntryFragment(entry)) {
- append(segment.item, entry.content);
- } else {
- const item = SugarElement.fromHtml(``);
- append$1(segment.list, item);
- }
- });
- return newCast;
- };
- const writeDeep = (scope, cast, entry) => {
- const segments = createSegments(scope, entry, entry.depth - cast.length);
- joinSegments(segments);
- populateSegments(segments, entry);
- appendSegments(cast, segments);
- return cast.concat(segments);
- };
- const composeList = (scope, entries) => {
- let firstCommentEntryOpt = Optional.none();
- const cast = foldl(entries, (cast, entry, i) => {
- if (!isEntryComment(entry)) {
- return entry.depth > cast.length ? writeDeep(scope, cast, entry) : writeShallow(scope, cast, entry);
- } else {
- if (i === 0) {
- firstCommentEntryOpt = Optional.some(entry);
- return cast;
- }
- return writeShallow(scope, cast, entry);
- }
- }, []);
- firstCommentEntryOpt.each(firstCommentEntry => {
- const item = SugarElement.fromHtml(``);
- head(cast).each(fistCast => {
- prepend(fistCast.list, item);
- });
- });
- return head(cast).map(segment => segment.list);
- };
-
- const indentEntry = (indentation, entry) => {
- switch (indentation) {
- case 'Indent':
- entry.depth++;
- break;
- case 'Outdent':
- entry.depth--;
- break;
- case 'Flatten':
- entry.depth = 0;
- }
- entry.dirty = true;
- };
-
- const cloneListProperties = (target, source) => {
- if (isEntryList(target) && isEntryList(source)) {
- target.listType = source.listType;
- target.listAttributes = { ...source.listAttributes };
- }
- };
- const cleanListProperties = entry => {
- entry.listAttributes = filter(entry.listAttributes, (_value, key) => key !== 'start');
- };
- const closestSiblingEntry = (entries, start) => {
- const depth = entries[start].depth;
- const matches = entry => entry.depth === depth && !entry.dirty;
- const until = entry => entry.depth < depth;
- return findUntil(reverse(entries.slice(0, start)), matches, until).orThunk(() => findUntil(entries.slice(start + 1), matches, until));
- };
- const normalizeEntries = entries => {
- each$1(entries, (entry, i) => {
- closestSiblingEntry(entries, i).fold(() => {
- if (entry.dirty && isEntryList(entry)) {
- cleanListProperties(entry);
- }
- }, matchingEntry => cloneListProperties(entry, matchingEntry));
- });
- return entries;
- };
-
- const Cell = initial => {
- let value = initial;
- const get = () => {
- return value;
- };
- const set = v => {
- value = v;
- };
- return {
- get,
- set
- };
- };
-
- const parseSingleItem = (depth, itemSelection, selectionState, item) => {
- var _a;
- if (isComment(item)) {
- return [{
- depth: depth + 1,
- content: (_a = item.dom.nodeValue) !== null && _a !== void 0 ? _a : '',
- dirty: false,
- isSelected: false,
- isComment: true
- }];
- }
- itemSelection.each(selection => {
- if (eq(selection.start, item)) {
- selectionState.set(true);
- }
- });
- const currentItemEntry = createEntry(item, depth, selectionState.get());
- itemSelection.each(selection => {
- if (eq(selection.end, item)) {
- selectionState.set(false);
- }
- });
- const childListEntries = lastChild(item).filter(isList).map(list => parseList(depth, itemSelection, selectionState, list)).getOr([]);
- return currentItemEntry.toArray().concat(childListEntries);
- };
- const parseItem = (depth, itemSelection, selectionState, item) => firstChild(item).filter(isList).fold(() => parseSingleItem(depth, itemSelection, selectionState, item), list => {
- const parsedSiblings = foldl(children(item), (acc, liChild, i) => {
- if (i === 0) {
- return acc;
- } else {
- if (isListItem(liChild)) {
- return acc.concat(parseSingleItem(depth, itemSelection, selectionState, liChild));
- } else {
- const fragment = {
- isFragment: true,
- depth,
- content: [liChild],
- isSelected: false,
- dirty: false,
- parentListType: name(list)
- };
- return acc.concat(fragment);
- }
- }
- }, []);
- return parseList(depth, itemSelection, selectionState, list).concat(parsedSiblings);
- });
- const parseList = (depth, itemSelection, selectionState, list) => bind(children(list), element => {
- const parser = isList(element) ? parseList : parseItem;
- const newDepth = depth + 1;
- return parser(newDepth, itemSelection, selectionState, element);
- });
- const parseLists = (lists, itemSelection) => {
- const selectionState = Cell(false);
- const initialDepth = 0;
- return map(lists, list => ({
- sourceList: list,
- entries: parseList(initialDepth, itemSelection, selectionState, list)
- }));
- };
-
- const outdentedComposer = (editor, entries) => {
- const normalizedEntries = normalizeEntries(entries);
- return map(normalizedEntries, entry => {
- const content = !isEntryComment(entry) ? fromElements(entry.content) : fromElements([SugarElement.fromHtml(``)]);
- const listItemAttrs = isEntryList(entry) ? entry.itemAttributes : {};
- return SugarElement.fromDom(createTextBlock(editor, content.dom, listItemAttrs));
- });
- };
- const indentedComposer = (editor, entries) => {
- const normalizedEntries = normalizeEntries(entries);
- return composeList(editor.contentDocument, normalizedEntries).toArray();
- };
- const composeEntries = (editor, entries) => bind(groupBy(entries, isIndented), entries => {
- const groupIsIndented = head(entries).exists(isIndented);
- return groupIsIndented ? indentedComposer(editor, entries) : outdentedComposer(editor, entries);
- });
- const indentSelectedEntries = (entries, indentation) => {
- each$1(filter$1(entries, isSelected), entry => indentEntry(indentation, entry));
- };
- const getItemSelection = editor => {
- const selectedListItems = map(getSelectedListItems(editor), SugarElement.fromDom);
- return lift2(find(selectedListItems, not(hasFirstChildList)), find(reverse(selectedListItems), not(hasFirstChildList)), (start, end) => ({
- start,
- end
- }));
- };
- const listIndentation = (editor, lists, indentation) => {
- const entrySets = parseLists(lists, getItemSelection(editor));
- each$1(entrySets, entrySet => {
- indentSelectedEntries(entrySet.entries, indentation);
- const composedLists = composeEntries(editor, entrySet.entries);
- each$1(composedLists, composedList => {
- fireListEvent(editor, indentation === 'Indent' ? 'IndentList' : 'OutdentList', composedList.dom);
- });
- before(entrySet.sourceList, composedLists);
- remove(entrySet.sourceList);
- });
- };
-
- const selectionIndentation = (editor, indentation) => {
- const lists = fromDom(getSelectedListRoots(editor));
- const dlItems = fromDom(getSelectedDlItems(editor));
- let isHandled = false;
- if (lists.length || dlItems.length) {
- const bookmark = editor.selection.getBookmark();
- listIndentation(editor, lists, indentation);
- dlIndentation(editor, indentation, dlItems);
- editor.selection.moveToBookmark(bookmark);
- editor.selection.setRng(normalizeRange(editor.selection.getRng()));
- editor.nodeChanged();
- isHandled = true;
- }
- return isHandled;
- };
- const handleIndentation = (editor, indentation) => !selectionIsWithinNonEditableList(editor) && selectionIndentation(editor, indentation);
- const indentListSelection = editor => handleIndentation(editor, 'Indent');
- const outdentListSelection = editor => handleIndentation(editor, 'Outdent');
- const flattenListSelection = editor => handleIndentation(editor, 'Flatten');
-
- const zeroWidth = '\uFEFF';
- const isZwsp = char => char === zeroWidth;
-
- const ancestor$1 = (scope, predicate, isRoot) => ancestor$3(scope, predicate, isRoot).isSome();
-
- const ancestor = (element, target) => ancestor$1(element, curry(eq, target));
-
- var global$1 = tinymce.util.Tools.resolve('tinymce.dom.BookmarkManager');
-
- const DOM$1 = global$3.DOM;
- const createBookmark = rng => {
- const bookmark = {};
- const setupEndPoint = start => {
- let container = rng[start ? 'startContainer' : 'endContainer'];
- let offset = rng[start ? 'startOffset' : 'endOffset'];
- if (isElement(container)) {
- const offsetNode = DOM$1.create('span', { 'data-mce-type': 'bookmark' });
- if (container.hasChildNodes()) {
- offset = Math.min(offset, container.childNodes.length - 1);
- if (start) {
- container.insertBefore(offsetNode, container.childNodes[offset]);
- } else {
- DOM$1.insertAfter(offsetNode, container.childNodes[offset]);
- }
- } else {
- container.appendChild(offsetNode);
- }
- container = offsetNode;
- offset = 0;
- }
- bookmark[start ? 'startContainer' : 'endContainer'] = container;
- bookmark[start ? 'startOffset' : 'endOffset'] = offset;
- };
- setupEndPoint(true);
- if (!rng.collapsed) {
- setupEndPoint();
- }
- return bookmark;
- };
- const resolveBookmark = bookmark => {
- const restoreEndPoint = start => {
- const nodeIndex = container => {
- var _a;
- let node = (_a = container.parentNode) === null || _a === void 0 ? void 0 : _a.firstChild;
- let idx = 0;
- while (node) {
- if (node === container) {
- return idx;
- }
- if (!isElement(node) || node.getAttribute('data-mce-type') !== 'bookmark') {
- idx++;
- }
- node = node.nextSibling;
- }
- return -1;
- };
- let container = bookmark[start ? 'startContainer' : 'endContainer'];
- let offset = bookmark[start ? 'startOffset' : 'endOffset'];
- if (!container) {
- return;
- }
- if (isElement(container) && container.parentNode) {
- const node = container;
- offset = nodeIndex(container);
- container = container.parentNode;
- DOM$1.remove(node);
- if (!container.hasChildNodes() && DOM$1.isBlock(container)) {
- container.appendChild(DOM$1.create('br'));
- }
- }
- bookmark[start ? 'startContainer' : 'endContainer'] = container;
- bookmark[start ? 'startOffset' : 'endOffset'] = offset;
- };
- restoreEndPoint(true);
- restoreEndPoint();
- const rng = DOM$1.createRng();
- rng.setStart(bookmark.startContainer, bookmark.startOffset);
- if (bookmark.endContainer) {
- rng.setEnd(bookmark.endContainer, bookmark.endOffset);
- }
- return normalizeRange(rng);
- };
-
- const listToggleActionFromListName = listName => {
- switch (listName) {
- case 'UL':
- return 'ToggleUlList';
- case 'OL':
- return 'ToggleOlList';
- case 'DL':
- return 'ToggleDLList';
- }
- };
-
- const updateListStyle = (dom, el, detail) => {
- const type = detail['list-style-type'] ? detail['list-style-type'] : null;
- dom.setStyle(el, 'list-style-type', type);
- };
- const setAttribs = (elm, attrs) => {
- global$2.each(attrs, (value, key) => {
- elm.setAttribute(key, value);
- });
- };
- const updateListAttrs = (dom, el, detail) => {
- setAttribs(el, detail['list-attributes']);
- global$2.each(dom.select('li', el), li => {
- setAttribs(li, detail['list-item-attributes']);
- });
- };
- const updateListWithDetails = (dom, el, detail) => {
- updateListStyle(dom, el, detail);
- updateListAttrs(dom, el, detail);
- };
- const removeStyles = (dom, element, styles) => {
- global$2.each(styles, style => dom.setStyle(element, style, ''));
- };
- const isInline = (editor, node) => isNonNullable(node) && !isBlock(node, editor.schema.getBlockElements());
- const getEndPointNode = (editor, rng, start, root) => {
- let container = rng[start ? 'startContainer' : 'endContainer'];
- const offset = rng[start ? 'startOffset' : 'endOffset'];
- if (isElement(container)) {
- container = container.childNodes[Math.min(offset, container.childNodes.length - 1)] || container;
- }
- if (!start && isBr(container.nextSibling)) {
- container = container.nextSibling;
- }
- const findBlockAncestor = node => {
- while (!editor.dom.isBlock(node) && node.parentNode && root !== node) {
- node = node.parentNode;
- }
- return node;
- };
- const findBetterContainer = (container, forward) => {
- var _a;
- const walker = new global$5(container, findBlockAncestor(container));
- const dir = forward ? 'next' : 'prev';
- let node;
- while (node = walker[dir]()) {
- if (!(isVoid(editor, node) || isZwsp(node.textContent) || ((_a = node.textContent) === null || _a === void 0 ? void 0 : _a.length) === 0)) {
- return Optional.some(node);
- }
- }
- return Optional.none();
- };
- if (start && isTextNode$1(container)) {
- if (isZwsp(container.textContent)) {
- container = findBetterContainer(container, false).getOr(container);
- } else {
- if (container.parentNode !== null && isInline(editor, container.parentNode)) {
- container = container.parentNode;
- }
- while (container.previousSibling !== null && (isInline(editor, container.previousSibling) || isTextNode$1(container.previousSibling))) {
- container = container.previousSibling;
- }
- }
- }
- if (!start && isTextNode$1(container)) {
- if (isZwsp(container.textContent)) {
- container = findBetterContainer(container, true).getOr(container);
- } else {
- if (container.parentNode !== null && isInline(editor, container.parentNode)) {
- container = container.parentNode;
- }
- while (container.nextSibling !== null && (isInline(editor, container.nextSibling) || isTextNode$1(container.nextSibling))) {
- container = container.nextSibling;
- }
- }
- }
- while (container.parentNode !== root) {
- const parent = container.parentNode;
- if (isTextBlock(editor, container)) {
- return container;
- }
- if (/^(TD|TH)$/.test(parent.nodeName)) {
- return container;
- }
- container = parent;
- }
- return container;
- };
- const getSelectedTextBlocks = (editor, rng, root) => {
- const textBlocks = [];
- const dom = editor.dom;
- const startNode = getEndPointNode(editor, rng, true, root);
- const endNode = getEndPointNode(editor, rng, false, root);
- let block;
- const siblings = [];
- for (let node = startNode; node; node = node.nextSibling) {
- siblings.push(node);
- if (node === endNode) {
- break;
- }
- }
- global$2.each(siblings, node => {
- var _a;
- if (isTextBlock(editor, node)) {
- textBlocks.push(node);
- block = null;
- return;
- }
- if (dom.isBlock(node) || isBr(node)) {
- if (isBr(node)) {
- dom.remove(node);
- }
- block = null;
- return;
- }
- const nextSibling = node.nextSibling;
- if (global$1.isBookmarkNode(node)) {
- if (isListNode(nextSibling) || isTextBlock(editor, nextSibling) || !nextSibling && node.parentNode === root) {
- block = null;
- return;
- }
- }
- if (!block) {
- block = dom.create('p');
- (_a = node.parentNode) === null || _a === void 0 ? void 0 : _a.insertBefore(block, node);
- textBlocks.push(block);
- }
- block.appendChild(node);
- });
- return textBlocks;
- };
- const hasCompatibleStyle = (dom, sib, detail) => {
- const sibStyle = dom.getStyle(sib, 'list-style-type');
- let detailStyle = detail ? detail['list-style-type'] : '';
- detailStyle = detailStyle === null ? '' : detailStyle;
- return sibStyle === detailStyle;
- };
- const getRootSearchStart = (editor, range) => {
- const start = editor.selection.getStart(true);
- const startPoint = getEndPointNode(editor, range, true, editor.getBody());
- if (ancestor(SugarElement.fromDom(startPoint), SugarElement.fromDom(range.commonAncestorContainer))) {
- return range.commonAncestorContainer;
- } else {
- return start;
- }
- };
- const applyList = (editor, listName, detail) => {
- const rng = editor.selection.getRng();
- let listItemName = 'LI';
- const root = getClosestListHost(editor, getRootSearchStart(editor, rng));
- const dom = editor.dom;
- if (dom.getContentEditable(editor.selection.getNode()) === 'false') {
- return;
- }
- listName = listName.toUpperCase();
- if (listName === 'DL') {
- listItemName = 'DT';
- }
- const bookmark = createBookmark(rng);
- const selectedTextBlocks = filter$1(getSelectedTextBlocks(editor, rng, root), editor.dom.isEditable);
- global$2.each(selectedTextBlocks, block => {
- let listBlock;
- const sibling = block.previousSibling;
- const parent = block.parentNode;
- if (!isListItemNode(parent)) {
- if (sibling && isListNode(sibling) && sibling.nodeName === listName && hasCompatibleStyle(dom, sibling, detail)) {
- listBlock = sibling;
- block = dom.rename(block, listItemName);
- sibling.appendChild(block);
- } else {
- listBlock = dom.create(listName);
- parent.insertBefore(listBlock, block);
- listBlock.appendChild(block);
- block = dom.rename(block, listItemName);
- }
- removeStyles(dom, block, [
- 'margin',
- 'margin-right',
- 'margin-bottom',
- 'margin-left',
- 'margin-top',
- 'padding',
- 'padding-right',
- 'padding-bottom',
- 'padding-left',
- 'padding-top'
- ]);
- updateListWithDetails(dom, listBlock, detail);
- mergeWithAdjacentLists(editor.dom, listBlock);
- }
- });
- editor.selection.setRng(resolveBookmark(bookmark));
- };
- const isValidLists = (list1, list2) => {
- return isListNode(list1) && list1.nodeName === (list2 === null || list2 === void 0 ? void 0 : list2.nodeName);
- };
- const hasSameListStyle = (dom, list1, list2) => {
- const targetStyle = dom.getStyle(list1, 'list-style-type', true);
- const style = dom.getStyle(list2, 'list-style-type', true);
- return targetStyle === style;
- };
- const hasSameClasses = (elm1, elm2) => {
- return elm1.className === elm2.className;
- };
- const shouldMerge = (dom, list1, list2) => {
- return isValidLists(list1, list2) && hasSameListStyle(dom, list1, list2) && hasSameClasses(list1, list2);
- };
- const mergeWithAdjacentLists = (dom, listBlock) => {
- let node;
- let sibling = listBlock.nextSibling;
- if (shouldMerge(dom, listBlock, sibling)) {
- const liSibling = sibling;
- while (node = liSibling.firstChild) {
- listBlock.appendChild(node);
- }
- dom.remove(liSibling);
- }
- sibling = listBlock.previousSibling;
- if (shouldMerge(dom, listBlock, sibling)) {
- const liSibling = sibling;
- while (node = liSibling.lastChild) {
- listBlock.insertBefore(node, listBlock.firstChild);
- }
- dom.remove(liSibling);
- }
- };
- const updateList$1 = (editor, list, listName, detail) => {
- if (list.nodeName !== listName) {
- const newList = editor.dom.rename(list, listName);
- updateListWithDetails(editor.dom, newList, detail);
- fireListEvent(editor, listToggleActionFromListName(listName), newList);
- } else {
- updateListWithDetails(editor.dom, list, detail);
- fireListEvent(editor, listToggleActionFromListName(listName), list);
- }
- };
- const updateCustomList = (editor, list, listName, detail) => {
- list.classList.forEach((cls, _, classList) => {
- if (cls.startsWith('tox-')) {
- classList.remove(cls);
- if (classList.length === 0) {
- list.removeAttribute('class');
- }
- }
- });
- if (list.nodeName !== listName) {
- const newList = editor.dom.rename(list, listName);
- updateListWithDetails(editor.dom, newList, detail);
- fireListEvent(editor, listToggleActionFromListName(listName), newList);
- } else {
- updateListWithDetails(editor.dom, list, detail);
- fireListEvent(editor, listToggleActionFromListName(listName), list);
- }
- };
- const toggleMultipleLists = (editor, parentList, lists, listName, detail) => {
- const parentIsList = isListNode(parentList);
- if (parentIsList && parentList.nodeName === listName && !hasListStyleDetail(detail) && !isCustomList(parentList)) {
- flattenListSelection(editor);
- } else {
- applyList(editor, listName, detail);
- const bookmark = createBookmark(editor.selection.getRng());
- const allLists = parentIsList ? [
- parentList,
- ...lists
- ] : lists;
- const updateFunction = parentIsList && isCustomList(parentList) ? updateCustomList : updateList$1;
- global$2.each(allLists, elm => {
- updateFunction(editor, elm, listName, detail);
- });
- editor.selection.setRng(resolveBookmark(bookmark));
- }
- };
- const hasListStyleDetail = detail => {
- return 'list-style-type' in detail;
- };
- const toggleSingleList = (editor, parentList, listName, detail) => {
- if (parentList === editor.getBody()) {
- return;
- }
- if (parentList) {
- if (parentList.nodeName === listName && !hasListStyleDetail(detail) && !isCustomList(parentList)) {
- flattenListSelection(editor);
- } else {
- const bookmark = createBookmark(editor.selection.getRng());
- if (isCustomList(parentList)) {
- parentList.classList.forEach((cls, _, classList) => {
- if (cls.startsWith('tox-')) {
- classList.remove(cls);
- if (classList.length === 0) {
- parentList.removeAttribute('class');
- }
- }
- });
- }
- updateListWithDetails(editor.dom, parentList, detail);
- const newList = editor.dom.rename(parentList, listName);
- mergeWithAdjacentLists(editor.dom, newList);
- editor.selection.setRng(resolveBookmark(bookmark));
- applyList(editor, listName, detail);
- fireListEvent(editor, listToggleActionFromListName(listName), newList);
- }
- } else {
- applyList(editor, listName, detail);
- fireListEvent(editor, listToggleActionFromListName(listName), parentList);
- }
- };
- const toggleList = (editor, listName, _detail) => {
- const parentList = getParentList(editor);
- if (isWithinNonEditableList(editor, parentList)) {
- return;
- }
- const selectedSubLists = getSelectedSubLists(editor);
- const detail = isObject(_detail) ? _detail : {};
- if (selectedSubLists.length > 0) {
- toggleMultipleLists(editor, parentList, selectedSubLists, listName, detail);
- } else {
- toggleSingleList(editor, parentList, listName, detail);
- }
- };
-
- const DOM = global$3.DOM;
- const normalizeList = (dom, list) => {
- const parentNode = list.parentElement;
- if (parentNode && parentNode.nodeName === 'LI' && parentNode.firstChild === list) {
- const sibling = parentNode.previousSibling;
- if (sibling && sibling.nodeName === 'LI') {
- sibling.appendChild(list);
- if (isEmpty$2(dom, parentNode)) {
- DOM.remove(parentNode);
- }
- } else {
- DOM.setStyle(parentNode, 'listStyleType', 'none');
- }
- }
- if (isListNode(parentNode)) {
- const sibling = parentNode.previousSibling;
- if (sibling && sibling.nodeName === 'LI') {
- sibling.appendChild(list);
- }
- }
- };
- const normalizeLists = (dom, element) => {
- const lists = global$2.grep(dom.select('ol,ul', element));
- global$2.each(lists, list => {
- normalizeList(dom, list);
- });
- };
-
- const findNextCaretContainer = (editor, rng, isForward, root) => {
- let node = rng.startContainer;
- const offset = rng.startOffset;
- if (isTextNode$1(node) && (isForward ? offset < node.data.length : offset > 0)) {
- return node;
- }
- const nonEmptyBlocks = editor.schema.getNonEmptyElements();
- if (isElement(node)) {
- node = global$6.getNode(node, offset);
- }
- const walker = new global$5(node, root);
- if (isForward) {
- if (isBogusBr(editor.dom, node)) {
- walker.next();
- }
- }
- const walkFn = isForward ? walker.next.bind(walker) : walker.prev2.bind(walker);
- while (node = walkFn()) {
- if (node.nodeName === 'LI' && !node.hasChildNodes()) {
- return node;
- }
- if (nonEmptyBlocks[node.nodeName]) {
- return node;
- }
- if (isTextNode$1(node) && node.data.length > 0) {
- return node;
- }
- }
- return null;
- };
- const hasOnlyOneBlockChild = (dom, elm) => {
- const childNodes = elm.childNodes;
- return childNodes.length === 1 && !isListNode(childNodes[0]) && dom.isBlock(childNodes[0]);
- };
- const isUnwrappable = node => Optional.from(node).map(SugarElement.fromDom).filter(isHTMLElement).exists(el => isEditable(el) && !contains$1(['details'], name(el)));
- const unwrapSingleBlockChild = (dom, elm) => {
- if (hasOnlyOneBlockChild(dom, elm) && isUnwrappable(elm.firstChild)) {
- dom.remove(elm.firstChild, true);
- }
- };
- const moveChildren = (dom, fromElm, toElm) => {
- let node;
- const targetElm = hasOnlyOneBlockChild(dom, toElm) ? toElm.firstChild : toElm;
- unwrapSingleBlockChild(dom, fromElm);
- if (!isEmpty$2(dom, fromElm, true)) {
- while (node = fromElm.firstChild) {
- targetElm.appendChild(node);
- }
- }
- };
- const mergeLiElements = (dom, fromElm, toElm) => {
- let listNode;
- const ul = fromElm.parentNode;
- if (!isChildOfBody(dom, fromElm) || !isChildOfBody(dom, toElm)) {
- return;
- }
- if (isListNode(toElm.lastChild)) {
- listNode = toElm.lastChild;
- }
- if (ul === toElm.lastChild) {
- if (isBr(ul.previousSibling)) {
- dom.remove(ul.previousSibling);
- }
- }
- const node = toElm.lastChild;
- if (node && isBr(node) && fromElm.hasChildNodes()) {
- dom.remove(node);
- }
- if (isEmpty$2(dom, toElm, true)) {
- empty(SugarElement.fromDom(toElm));
- }
- moveChildren(dom, fromElm, toElm);
- if (listNode) {
- toElm.appendChild(listNode);
- }
- const contains$1 = contains(SugarElement.fromDom(toElm), SugarElement.fromDom(fromElm));
- const nestedLists = contains$1 ? dom.getParents(fromElm, isListNode, toElm) : [];
- dom.remove(fromElm);
- each$1(nestedLists, list => {
- if (isEmpty$2(dom, list) && list !== dom.getRoot()) {
- dom.remove(list);
- }
- });
- };
- const mergeIntoEmptyLi = (editor, fromLi, toLi) => {
- empty(SugarElement.fromDom(toLi));
- mergeLiElements(editor.dom, fromLi, toLi);
- editor.selection.setCursorLocation(toLi, 0);
- };
- const mergeForward = (editor, rng, fromLi, toLi) => {
- const dom = editor.dom;
- if (dom.isEmpty(toLi)) {
- mergeIntoEmptyLi(editor, fromLi, toLi);
- } else {
- const bookmark = createBookmark(rng);
- mergeLiElements(dom, fromLi, toLi);
- editor.selection.setRng(resolveBookmark(bookmark));
- }
- };
- const mergeBackward = (editor, rng, fromLi, toLi) => {
- const bookmark = createBookmark(rng);
- mergeLiElements(editor.dom, fromLi, toLi);
- const resolvedBookmark = resolveBookmark(bookmark);
- editor.selection.setRng(resolvedBookmark);
- };
- const backspaceDeleteFromListToListCaret = (editor, isForward) => {
- const dom = editor.dom, selection = editor.selection;
- const selectionStartElm = selection.getStart();
- const root = getClosestEditingHost(editor, selectionStartElm);
- const li = dom.getParent(selection.getStart(), 'LI', root);
- if (li) {
- const ul = li.parentElement;
- if (ul === editor.getBody() && isEmpty$2(dom, ul)) {
- return true;
- }
- const rng = normalizeRange(selection.getRng());
- const otherLi = dom.getParent(findNextCaretContainer(editor, rng, isForward, root), 'LI', root);
- const willMergeParentIntoChild = otherLi && (isForward ? dom.isChildOf(li, otherLi) : dom.isChildOf(otherLi, li));
- if (otherLi && otherLi !== li && !willMergeParentIntoChild) {
- editor.undoManager.transact(() => {
- if (isForward) {
- mergeForward(editor, rng, otherLi, li);
- } else {
- if (isFirstChild(li)) {
- outdentListSelection(editor);
- } else {
- mergeBackward(editor, rng, li, otherLi);
- }
- }
- });
- return true;
- } else if (willMergeParentIntoChild && !isForward && otherLi !== li) {
- editor.undoManager.transact(() => {
- if (rng.commonAncestorContainer.parentElement) {
- const bookmark = createBookmark(rng);
- const oldParentElRef = rng.commonAncestorContainer.parentElement;
- moveChildren(dom, rng.commonAncestorContainer.parentElement, otherLi);
- oldParentElRef.remove();
- const resolvedBookmark = resolveBookmark(bookmark);
- editor.selection.setRng(resolvedBookmark);
- }
- });
- return true;
- } else if (!otherLi) {
- if (!isForward && rng.startOffset === 0 && rng.endOffset === 0) {
- editor.undoManager.transact(() => {
- flattenListSelection(editor);
- });
- return true;
- }
- }
- }
- return false;
- };
- const removeBlock = (dom, block, root) => {
- const parentBlock = dom.getParent(block.parentNode, dom.isBlock, root);
- dom.remove(block);
- if (parentBlock && dom.isEmpty(parentBlock)) {
- dom.remove(parentBlock);
- }
- };
- const backspaceDeleteIntoListCaret = (editor, isForward) => {
- const dom = editor.dom;
- const selectionStartElm = editor.selection.getStart();
- const root = getClosestEditingHost(editor, selectionStartElm);
- const block = dom.getParent(selectionStartElm, dom.isBlock, root);
- if (block && dom.isEmpty(block, undefined, { checkRootAsContent: true })) {
- const rng = normalizeRange(editor.selection.getRng());
- const otherLi = dom.getParent(findNextCaretContainer(editor, rng, isForward, root), 'LI', root);
- if (otherLi) {
- const findValidElement = element => contains$1([
- 'td',
- 'th',
- 'caption'
- ], name(element));
- const findRoot = node => node.dom === root;
- const otherLiCell = closest$2(SugarElement.fromDom(otherLi), findValidElement, findRoot);
- const caretCell = closest$2(SugarElement.fromDom(rng.startContainer), findValidElement, findRoot);
- if (!equals(otherLiCell, caretCell, eq)) {
- return false;
- }
- editor.undoManager.transact(() => {
- const parentNode = otherLi.parentNode;
- removeBlock(dom, block, root);
- mergeWithAdjacentLists(dom, parentNode);
- editor.selection.select(otherLi, true);
- editor.selection.collapse(isForward);
- });
- return true;
- }
- }
- return false;
- };
- const backspaceDeleteCaret = (editor, isForward) => {
- return backspaceDeleteFromListToListCaret(editor, isForward) || backspaceDeleteIntoListCaret(editor, isForward);
- };
- const hasListSelection = editor => {
- const selectionStartElm = editor.selection.getStart();
- const root = getClosestEditingHost(editor, selectionStartElm);
- const startListParent = editor.dom.getParent(selectionStartElm, 'LI,DT,DD', root);
- return startListParent || getSelectedListItems(editor).length > 0;
- };
- const backspaceDeleteRange = editor => {
- if (hasListSelection(editor)) {
- editor.undoManager.transact(() => {
- editor.execCommand('Delete');
- normalizeLists(editor.dom, editor.getBody());
- });
- return true;
- }
- return false;
- };
- const backspaceDelete = (editor, isForward) => {
- const selection = editor.selection;
- return !isWithinNonEditableList(editor, selection.getNode()) && (selection.isCollapsed() ? backspaceDeleteCaret(editor, isForward) : backspaceDeleteRange(editor));
- };
- const setup$2 = editor => {
- editor.on('ExecCommand', e => {
- const cmd = e.command.toLowerCase();
- if ((cmd === 'delete' || cmd === 'forwarddelete') && hasListSelection(editor)) {
- normalizeLists(editor.dom, editor.getBody());
- }
- });
- editor.on('keydown', e => {
- if (e.keyCode === global$4.BACKSPACE) {
- if (backspaceDelete(editor, false)) {
- e.preventDefault();
- }
- } else if (e.keyCode === global$4.DELETE) {
- if (backspaceDelete(editor, true)) {
- e.preventDefault();
- }
- }
- });
- };
-
- const get = editor => ({
- backspaceDelete: isForward => {
- backspaceDelete(editor, isForward);
- }
- });
-
- const updateList = (editor, update) => {
- const parentList = getParentList(editor);
- if (parentList === null || isWithinNonEditableList(editor, parentList)) {
- return;
- }
- editor.undoManager.transact(() => {
- if (isObject(update.styles)) {
- editor.dom.setStyles(parentList, update.styles);
- }
- if (isObject(update.attrs)) {
- each(update.attrs, (v, k) => editor.dom.setAttrib(parentList, k, v));
- }
- });
- };
-
- const parseAlphabeticBase26 = str => {
- const chars = reverse(trim(str).split(''));
- const values = map(chars, (char, i) => {
- const charValue = char.toUpperCase().charCodeAt(0) - 'A'.charCodeAt(0) + 1;
- return Math.pow(26, i) * charValue;
- });
- return foldl(values, (sum, v) => sum + v, 0);
- };
- const composeAlphabeticBase26 = value => {
- value--;
- if (value < 0) {
- return '';
- } else {
- const remainder = value % 26;
- const quotient = Math.floor(value / 26);
- const rest = composeAlphabeticBase26(quotient);
- const char = String.fromCharCode('A'.charCodeAt(0) + remainder);
- return rest + char;
- }
- };
- const isUppercase = str => /^[A-Z]+$/.test(str);
- const isLowercase = str => /^[a-z]+$/.test(str);
- const isNumeric = str => /^[0-9]+$/.test(str);
- const deduceListType = start => {
- if (isNumeric(start)) {
- return 2;
- } else if (isUppercase(start)) {
- return 0;
- } else if (isLowercase(start)) {
- return 1;
- } else if (isEmpty$1(start)) {
- return 3;
- } else {
- return 4;
- }
- };
- const parseStartValue = start => {
- switch (deduceListType(start)) {
- case 2:
- return Optional.some({
- listStyleType: Optional.none(),
- start
- });
- case 0:
- return Optional.some({
- listStyleType: Optional.some('upper-alpha'),
- start: parseAlphabeticBase26(start).toString()
- });
- case 1:
- return Optional.some({
- listStyleType: Optional.some('lower-alpha'),
- start: parseAlphabeticBase26(start).toString()
- });
- case 3:
- return Optional.some({
- listStyleType: Optional.none(),
- start: ''
- });
- case 4:
- return Optional.none();
- }
- };
- const parseDetail = detail => {
- const start = parseInt(detail.start, 10);
- if (is$2(detail.listStyleType, 'upper-alpha')) {
- return composeAlphabeticBase26(start);
- } else if (is$2(detail.listStyleType, 'lower-alpha')) {
- return composeAlphabeticBase26(start).toLowerCase();
- } else {
- return detail.start;
- }
- };
-
- const open = editor => {
- const currentList = getParentList(editor);
- if (!isOlNode(currentList) || isWithinNonEditableList(editor, currentList)) {
- return;
- }
- editor.windowManager.open({
- title: 'List Properties',
- body: {
- type: 'panel',
- items: [{
- type: 'input',
- name: 'start',
- label: 'Start list at number',
- inputMode: 'numeric'
- }]
- },
- initialData: {
- start: parseDetail({
- start: editor.dom.getAttrib(currentList, 'start', '1'),
- listStyleType: Optional.from(editor.dom.getStyle(currentList, 'list-style-type'))
- })
- },
- buttons: [
- {
- type: 'cancel',
- name: 'cancel',
- text: 'Cancel'
- },
- {
- type: 'submit',
- name: 'save',
- text: 'Save',
- primary: true
- }
- ],
- onSubmit: api => {
- const data = api.getData();
- parseStartValue(data.start).each(detail => {
- editor.execCommand('mceListUpdate', false, {
- attrs: { start: detail.start === '1' ? '' : detail.start },
- styles: { 'list-style-type': detail.listStyleType.getOr('') }
- });
- });
- api.close();
- }
- });
- };
-
- const queryListCommandState = (editor, listName) => () => {
- const parentList = getParentList(editor);
- return isNonNullable(parentList) && parentList.nodeName === listName;
- };
- const registerDialog = editor => {
- editor.addCommand('mceListProps', () => {
- open(editor);
- });
- };
- const register$2 = editor => {
- editor.on('BeforeExecCommand', e => {
- const cmd = e.command.toLowerCase();
- if (cmd === 'indent') {
- indentListSelection(editor);
- } else if (cmd === 'outdent') {
- outdentListSelection(editor);
- }
- });
- editor.addCommand('InsertUnorderedList', (ui, detail) => {
- toggleList(editor, 'UL', detail);
- });
- editor.addCommand('InsertOrderedList', (ui, detail) => {
- toggleList(editor, 'OL', detail);
- });
- editor.addCommand('InsertDefinitionList', (ui, detail) => {
- toggleList(editor, 'DL', detail);
- });
- editor.addCommand('RemoveList', () => {
- flattenListSelection(editor);
- });
- registerDialog(editor);
- editor.addCommand('mceListUpdate', (ui, detail) => {
- if (isObject(detail)) {
- updateList(editor, detail);
- }
- });
- editor.addQueryStateHandler('InsertUnorderedList', queryListCommandState(editor, 'UL'));
- editor.addQueryStateHandler('InsertOrderedList', queryListCommandState(editor, 'OL'));
- editor.addQueryStateHandler('InsertDefinitionList', queryListCommandState(editor, 'DL'));
- };
-
- var global = tinymce.util.Tools.resolve('tinymce.html.Node');
-
- const isTextNode = node => node.type === 3;
- const isEmpty = nodeBuffer => nodeBuffer.length === 0;
- const wrapInvalidChildren = list => {
- const insertListItem = (buffer, refNode) => {
- const li = global.create('li');
- each$1(buffer, node => li.append(node));
- if (refNode) {
- list.insert(li, refNode, true);
- } else {
- list.append(li);
- }
- };
- const reducer = (buffer, node) => {
- if (isTextNode(node)) {
- return [
- ...buffer,
- node
- ];
- } else if (!isEmpty(buffer) && !isTextNode(node)) {
- insertListItem(buffer, node);
- return [];
- } else {
- return buffer;
- }
- };
- const restBuffer = foldl(list.children(), reducer, []);
- if (!isEmpty(restBuffer)) {
- insertListItem(restBuffer);
- }
- };
- const setup$1 = editor => {
- editor.on('PreInit', () => {
- const {parser} = editor;
- parser.addNodeFilter('ul,ol', nodes => each$1(nodes, wrapInvalidChildren));
- });
- };
-
- const setupTabKey = editor => {
- editor.on('keydown', e => {
- if (e.keyCode !== global$4.TAB || global$4.metaKeyPressed(e)) {
- return;
- }
- editor.undoManager.transact(() => {
- if (e.shiftKey ? outdentListSelection(editor) : indentListSelection(editor)) {
- e.preventDefault();
- }
- });
- });
- };
- const setup = editor => {
- if (shouldIndentOnTab(editor)) {
- setupTabKey(editor);
- }
- setup$2(editor);
- };
-
- const setupToggleButtonHandler = (editor, listName) => api => {
- const toggleButtonHandler = e => {
- api.setActive(inList(e.parents, listName));
- api.setEnabled(!isWithinNonEditableList(editor, e.element) && editor.selection.isEditable());
- };
- api.setEnabled(editor.selection.isEditable());
- return setNodeChangeHandler(editor, toggleButtonHandler);
- };
- const register$1 = editor => {
- const exec = command => () => editor.execCommand(command);
- if (!editor.hasPlugin('advlist')) {
- editor.ui.registry.addToggleButton('numlist', {
- icon: 'ordered-list',
- active: false,
- tooltip: 'Numbered list',
- onAction: exec('InsertOrderedList'),
- onSetup: setupToggleButtonHandler(editor, 'OL')
- });
- editor.ui.registry.addToggleButton('bullist', {
- icon: 'unordered-list',
- active: false,
- tooltip: 'Bullet list',
- onAction: exec('InsertUnorderedList'),
- onSetup: setupToggleButtonHandler(editor, 'UL')
- });
- }
- };
-
- const setupMenuButtonHandler = (editor, listName) => api => {
- const menuButtonHandler = e => api.setEnabled(inList(e.parents, listName) && !isWithinNonEditableList(editor, e.element));
- return setNodeChangeHandler(editor, menuButtonHandler);
- };
- const register = editor => {
- const listProperties = {
- text: 'List properties...',
- icon: 'ordered-list',
- onAction: () => editor.execCommand('mceListProps'),
- onSetup: setupMenuButtonHandler(editor, 'OL')
- };
- editor.ui.registry.addMenuItem('listprops', listProperties);
- editor.ui.registry.addContextMenu('lists', {
- update: node => {
- const parentList = getParentList(editor, node);
- return isOlNode(parentList) ? ['listprops'] : [];
- }
- });
- };
-
- var Plugin = () => {
- global$7.add('lists', editor => {
- register$3(editor);
- setup$1(editor);
- if (!editor.hasPlugin('rtc', true)) {
- setup(editor);
- register$2(editor);
- } else {
- registerDialog(editor);
- }
- register$1(editor);
- register(editor);
- return get(editor);
- });
- };
-
- Plugin();
-
-})();
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/lists/plugin.min.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/lists/plugin.min.js
deleted file mode 100644
index c12b9e0..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/lists/plugin.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/**
- * TinyMCE version 7.1.0 (2024-05-08)
- */
-!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=e=>t=>(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(n=o=e,(r=String).prototype.isPrototypeOf(n)||(null===(s=o.constructor)||void 0===s?void 0:s.name)===r.name)?"string":t;var n,o,r,s})(t)===e,n=e=>t=>typeof t===e,o=t("string"),r=t("object"),s=t("array"),i=n("boolean"),l=e=>!(e=>null==e)(e),a=n("function"),d=n("number"),c=()=>{},m=e=>()=>e,u=(e,t)=>e===t,p=e=>t=>!e(t),g=m(!1);class h{constructor(e,t){this.tag=e,this.value=t}static some(e){return new h(!0,e)}static none(){return h.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?h.some(e(this.value)):h.none()}bind(e){return this.tag?e(this.value):h.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:h.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return l(e)?h.some(e):h.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}h.singletonNone=new h(!1);const f=Array.prototype.slice,y=Array.prototype.indexOf,v=Array.prototype.push,C=(e,t)=>{return n=e,o=t,y.call(n,o)>-1;var n,o},b=(e,t)=>{for(let n=0,o=e.length;n{const n=e.length,o=new Array(n);for(let r=0;r{for(let n=0,o=e.length;n{const n=[];for(let o=0,r=e.length;o(S(e,((e,o)=>{n=t(n,e,o)})),n),A=(e,t,n)=>{for(let o=0,r=e.length;oA(e,t,g),w=(e,t)=>(e=>{const t=[];for(let n=0,o=e.length;n{const t=f.call(e,0);return t.reverse(),t},E=(e,t)=>t>=0&&tE(e,0),D=e=>E(e,e.length-1),B=(e,t)=>{const n=[],o=a(t)?e=>b(n,(n=>t(n,e))):e=>C(n,e);for(let t=0,r=e.length;te.exists((e=>n(e,t))),P=(e,t,n)=>e.isSome()&&t.isSome()?h.some(n(e.getOrDie(),t.getOrDie())):h.none(),I=e=>{if(null==e)throw new Error("Node cannot be null or undefined");return{dom:e}},R=(e,t)=>{const n=(t||document).createElement("div");if(n.innerHTML=e,!n.hasChildNodes()||n.childNodes.length>1){const t="HTML does not have a single root node";throw console.error(t,e),new Error(t)}return I(n.childNodes[0])},U=(e,t)=>{const n=(t||document).createElement(e);return I(n)},$=I,_=(e,t)=>{const n=e.dom;if(1!==n.nodeType)return!1;{const e=n;if(void 0!==e.matches)return e.matches(t);if(void 0!==e.msMatchesSelector)return e.msMatchesSelector(t);if(void 0!==e.webkitMatchesSelector)return e.webkitMatchesSelector(t);if(void 0!==e.mozMatchesSelector)return e.mozMatchesSelector(t);throw new Error("Browser lacks native selectors")}},H=(e,t)=>e.dom===t.dom,F=_,V="undefined"!=typeof window?window:Function("return this;")(),j=(e,t)=>((e,t)=>{let n=null!=t?t:V;for(let t=0;t{const t=j("ownerDocument.defaultView",e);return r(e)&&((e=>((e,t)=>{const n=((e,t)=>j(e,t))(e,t);if(null==n)throw new Error(e+" not available on this browser");return n})("HTMLElement",e))(t).prototype.isPrototypeOf(e)||/^HTML\w*Element$/.test(K(e).constructor.name))},Q=e=>e.dom.nodeName.toLowerCase(),W=e=>e.dom.nodeType,q=e=>t=>W(t)===e,Z=e=>G(e)&&z(e.dom),G=q(1),J=q(3),X=q(9),Y=q(11),ee=e=>t=>G(t)&&Q(t)===e,te=e=>h.from(e.dom.parentNode).map($),ne=e=>N(e.dom.childNodes,$),oe=(e,t)=>{const n=e.dom.childNodes;return h.from(n[t]).map($)},re=e=>oe(e,0),se=e=>oe(e,e.dom.childNodes.length-1),ie=a(Element.prototype.attachShadow)&&a(Node.prototype.getRootNode)?e=>$(e.dom.getRootNode()):e=>X(e)?e:$(e.dom.ownerDocument),le=e=>$(e.dom.host),ae=e=>{const t=J(e)?e.dom.parentNode:e.dom;if(null==t||null===t.ownerDocument)return!1;const n=t.ownerDocument;return(e=>{const t=ie(e);return Y(n=t)&&l(n.dom.host)?h.some(t):h.none();var n})($(t)).fold((()=>n.body.contains(t)),(o=ae,r=le,e=>o(r(e))));var o,r};var de=(e,t,n,o,r)=>e(n,o)?h.some(n):a(r)&&r(n)?h.none():t(n,o,r);const ce=(e,t,n)=>{let o=e.dom;const r=a(n)?n:g;for(;o.parentNode;){o=o.parentNode;const e=$(o);if(t(e))return h.some(e);if(r(e))break}return h.none()},me=(e,t,n)=>de(((e,t)=>t(e)),ce,e,t,n),ue=(e,t,n)=>ce(e,(e=>_(e,t)),n),pe=(e,t)=>{te(e).each((n=>{n.dom.insertBefore(t.dom,e.dom)}))},ge=(e,t)=>{e.dom.appendChild(t.dom)},he=(e,t)=>{S(t,(t=>{ge(e,t)}))},fe=e=>{e.dom.textContent="",S(ne(e),(e=>{ye(e)}))},ye=e=>{const t=e.dom;null!==t.parentNode&&t.parentNode.removeChild(t)};var ve=tinymce.util.Tools.resolve("tinymce.dom.RangeUtils"),Ce=tinymce.util.Tools.resolve("tinymce.dom.TreeWalker"),be=tinymce.util.Tools.resolve("tinymce.util.VK");const Ne=e=>N(e,$),Se=Object.keys,Le=(e,t)=>{const n=Se(e);for(let o=0,r=n.length;o{const n=e.dom;Le(t,((e,t)=>{((e,t,n)=>{if(!(o(n)||i(n)||d(n)))throw console.error("Invalid call to Attribute.set. Key ",t,":: Value ",n,":: Element ",e),new Error("Attribute value was not simple");e.setAttribute(t,n+"")})(n,t,e)}))},Ae=e=>O(e.dom.attributes,((e,t)=>(e[t.name]=t.value,e)),{}),Te=e=>((e,t)=>$(e.dom.cloneNode(!0)))(e),we=(e,t)=>{const n=((e,t)=>{const n=U(t),o=Ae(e);return Oe(n,o),n})(e,t);var o,r;r=n,(e=>h.from(e.dom.nextSibling).map($))(o=e).fold((()=>{te(o).each((e=>{ge(e,r)}))}),(e=>{pe(e,r)}));const s=ne(e);return he(n,s),ye(e),n};var xe=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),Ee=tinymce.util.Tools.resolve("tinymce.util.Tools");const ke=e=>t=>l(t)&&t.nodeName.toLowerCase()===e,De=e=>t=>l(t)&&e.test(t.nodeName),Be=e=>l(e)&&3===e.nodeType,Me=e=>l(e)&&1===e.nodeType,Pe=De(/^(OL|UL|DL)$/),Ie=De(/^(OL|UL)$/),Re=ke("ol"),Ue=De(/^(LI|DT|DD)$/),$e=De(/^(DT|DD)$/),_e=De(/^(TH|TD)$/),He=ke("br"),Fe=(e,t)=>l(t)&&t.nodeName in e.schema.getTextBlockElements(),Ve=(e,t)=>l(e)&&e.nodeName in t,je=(e,t)=>l(t)&&t.nodeName in e.schema.getVoidElements(),Ke=(e,t,n)=>{const o=e.isEmpty(t);return!(n&&e.select("span[data-mce-type=bookmark]",t).length>0)&&o},ze=(e,t)=>e.isChildOf(t,e.getRoot()),Qe=e=>t=>t.options.get(e),We=Qe("lists_indent_on_tab"),qe=Qe("forced_root_block"),Ze=Qe("forced_root_block_attrs"),Ge=(e,t,n={})=>{const o=e.dom,r=e.schema.getBlockElements(),s=o.createFragment(),i=qe(e),l=Ze(e);let a,d,c=!1;for(d=o.create(i,{...l,...n.style?{style:n.style}:{}}),Ve(t.firstChild,r)||s.appendChild(d);a=t.firstChild;){const e=a.nodeName;c||"SPAN"===e&&"bookmark"===a.getAttribute("data-mce-type")||(c=!0),Ve(a,r)?(s.appendChild(a),d=null):(d||(d=o.create(i,l),s.appendChild(d)),d.appendChild(a))}return!c&&d&&d.appendChild(o.create("br",{"data-mce-bogus":"1"})),s},Je=xe.DOM,Xe=ee("dd"),Ye=ee("dt"),et=(e,t)=>{var n;Xe(t)?we(t,"dt"):Ye(t)&&(n=t,h.from(n.dom.parentElement).map($)).each((n=>((e,t,n)=>{const o=Je.select('span[data-mce-type="bookmark"]',t),r=Ge(e,n),s=Je.createRng();s.setStartAfter(n),s.setEndAfter(t);const i=s.extractContents();for(let t=i.firstChild;t;t=t.firstChild)if("LI"===t.nodeName&&e.dom.isEmpty(t)){Je.remove(t);break}e.dom.isEmpty(i)||Je.insertAfter(i,t),Je.insertAfter(r,t);const l=n.parentElement;l&&Ke(e.dom,l)&&(e=>{const t=e.parentNode;t&&Ee.each(o,(e=>{t.insertBefore(e,n.parentNode)})),Je.remove(e)})(l),Je.remove(n),Ke(e.dom,t)&&Je.remove(t)})(e,n.dom,t.dom)))},tt=e=>{Ye(e)&&we(e,"dd")},nt=(e,t)=>{if(Be(e))return{container:e,offset:t};const n=ve.getNode(e,t);return Be(n)?{container:n,offset:t>=e.childNodes.length?n.data.length:0}:n.previousSibling&&Be(n.previousSibling)?{container:n.previousSibling,offset:n.previousSibling.data.length}:n.nextSibling&&Be(n.nextSibling)?{container:n.nextSibling,offset:0}:{container:e,offset:t}},ot=e=>{const t=e.cloneRange(),n=nt(e.startContainer,e.startOffset);t.setStart(n.container,n.offset);const o=nt(e.endContainer,e.endOffset);return t.setEnd(o.container,o.offset),t},rt=["OL","UL","DL"],st=rt.join(","),it=(e,t)=>{const n=t||e.selection.getStart(!0);return e.dom.getParent(n,st,dt(e,n))},lt=e=>{const t=e.selection.getSelectedBlocks();return L(((e,t)=>{const n=Ee.map(t,(t=>e.dom.getParent(t,"li,dd,dt",dt(e,t))||t));return B(n)})(e,t),Ue)},at=(e,t)=>{const n=e.dom.getParents(t,"TD,TH");return n.length>0?n[0]:e.getBody()},dt=(e,t)=>{const n=e.dom.getParents(t,e.dom.isBlock),o=T(n,(t=>{return(t=>t.nodeName.toLowerCase()!==qe(e))(t)&&(n=e.schema,!Pe(o=t)&&!Ue(o)&&b(rt,(e=>n.isValidChild(o.nodeName,e))));var n,o}));return o.getOr(e.getBody())},ct=(e,t)=>{const n=e.dom.getParents(t,"ol,ul",dt(e,t));return D(n)},mt=(e,t)=>{const n=N(t,(t=>ct(e,t).getOr(t)));return B(n)},ut=e=>/\btox\-/.test(e.className),pt=(e,t)=>A(e,Pe,_e).exists((e=>e.nodeName===t&&!ut(e))),gt=(e,t)=>null!==t&&!e.dom.isEditable(t),ht=(e,t)=>{const n=e.dom.getParent(t,"ol,ul,dl");return gt(e,n)},ft=(e,t)=>{const n=e.selection.getNode();return t({parents:e.dom.getParents(n),element:n}),e.on("NodeChange",t),()=>e.off("NodeChange",t)},yt=(e,t)=>{const n=(t||document).createDocumentFragment();return S(e,(e=>{n.appendChild(e.dom)})),$(n)},vt=(e,t,n)=>e.dispatch("ListMutation",{action:t,element:n}),Ct=(bt=/^\s+|\s+$/g,e=>e.replace(bt,""));var bt;const Nt=(e,t,n)=>{((e,t,n)=>{if(!o(n))throw console.error("Invalid call to CSS.set. Property ",t,":: Value ",n,":: Element ",e),new Error("CSS value must be a string: "+n);(e=>void 0!==e.style&&a(e.style.getPropertyValue))(e)&&e.style.setProperty(t,n)})(e.dom,t,n)},St=e=>F(e,"OL,UL"),Lt=e=>re(e).exists(St),Ot=e=>"listAttributes"in e,At=e=>"isComment"in e,Tt=e=>e.depth>0,wt=e=>e.isSelected,xt=e=>{const t=ne(e),n=se(e).exists(St)?t.slice(0,-1):t;return N(n,Te)},Et=(e,t)=>{ge(e.item,t.list)},kt=(e,t)=>{const n={list:U(t,e),item:U("li",e)};return ge(n.list,n.item),n},Dt=(e,t,n)=>{const o=t.slice(0,n.depth);return D(o).each((t=>{if(Ot(n)){const o=((e,t,n)=>{const o=U("li",e);return Oe(o,t),he(o,n),o})(e,n.itemAttributes,n.content);((e,t)=>{ge(e.list,t),e.item=t})(t,o),((e,t)=>{Q(e.list)!==t.listType&&(e.list=we(e.list,t.listType)),Oe(e.list,t.listAttributes)})(t,n)}else if((e=>"isFragment"in e)(n))he(t.item,n.content);else{const e=R(`\x3c!--${n.content}--\x3e`);ge(t.list,e)}})),o},Bt=(e,t)=>{let n=h.none();const o=O(t,((t,o,r)=>At(o)?0===r?(n=h.some(o),t):Dt(e,t,o):o.depth>t.length?((e,t,n)=>{const o=((e,t,n)=>{const o=[];for(let r=0;r{for(let t=1;t{for(let t=0;t{Ot(t)&&(Oe(e.list,t.listAttributes),Oe(e.item,t.itemAttributes)),he(e.item,t.content)}))})(o,n),r=o,P(D(t),k(r),Et),t.concat(o)})(e,t,o):Dt(e,t,o)),[]);return n.each((e=>{const t=R(`\x3c!--${e.content}--\x3e`);k(o).each((e=>{((e,t)=>{re(e).fold((()=>{ge(e,t)}),(n=>{e.dom.insertBefore(t.dom,n.dom)}))})(e.list,t)}))})),k(o).map((e=>e.list))},Mt=e=>(S(e,((t,n)=>{((e,t)=>{const n=e[t].depth,o=e=>e.depth===n&&!e.dirty,r=e=>e.depthA(e.slice(t+1),o,r)))})(e,n).fold((()=>{t.dirty&&Ot(t)&&(e=>{e.listAttributes=((e,t)=>{const n={};var o;return((e,t,n,o)=>{Le(e,((e,r)=>{(t(e,r)?n:o)(e,r)}))})(e,t,(o=n,(e,t)=>{o[t]=e}),c),n})(e.listAttributes,((e,t)=>"start"!==t))})(t)}),(e=>{return o=e,void(Ot(n=t)&&Ot(o)&&(n.listType=o.listType,n.listAttributes={...o.listAttributes}));var n,o}))})),e),Pt=(e,t,n,o)=>{var r,s;if(8===W(s=o)||"#comment"===Q(s))return[{depth:e+1,content:null!==(r=o.dom.nodeValue)&&void 0!==r?r:"",dirty:!1,isSelected:!1,isComment:!0}];t.each((e=>{H(e.start,o)&&n.set(!0)}));const i=((e,t,n)=>te(e).filter(G).map((o=>({depth:t,dirty:!1,isSelected:n,content:xt(e),itemAttributes:Ae(e),listAttributes:Ae(o),listType:Q(o),isInPreviousLi:!1}))))(o,e,n.get());t.each((e=>{H(e.end,o)&&n.set(!1)}));const l=se(o).filter(St).map((o=>Rt(e,t,n,o))).getOr([]);return i.toArray().concat(l)},It=(e,t,n,o)=>re(o).filter(St).fold((()=>Pt(e,t,n,o)),(r=>{const s=O(ne(o),((o,s,i)=>{if(0===i)return o;if(F(s,"LI"))return o.concat(Pt(e,t,n,s));{const t={isFragment:!0,depth:e,content:[s],isSelected:!1,dirty:!1,parentListType:Q(r)};return o.concat(t)}}),[]);return Rt(e,t,n,r).concat(s)})),Rt=(e,t,n,o)=>w(ne(o),(o=>(St(o)?Rt:It)(e+1,t,n,o))),Ut=(e,t,n)=>{const o=((e,t)=>{const n=(e=>{let t=!1;return{get:()=>t,set:e=>{t=e}}})();return N(e,(e=>({sourceList:e,entries:Rt(0,t,n,e)})))})(t,(e=>{const t=N(lt(e),$);return P(T(t,p(Lt)),T(x(t),p(Lt)),((e,t)=>({start:e,end:t})))})(e));S(o,(t=>{((e,t)=>{S(L(e,wt),(e=>((e,t)=>{switch(e){case"Indent":t.depth++;break;case"Outdent":t.depth--;break;case"Flatten":t.depth=0}t.dirty=!0})(t,e)))})(t.entries,n);const o=((e,t)=>w(((e,t)=>{if(0===e.length)return[];{let n=t(e[0]);const o=[];let r=[];for(let s=0,i=e.length;sk(t).exists(Tt)?((e,t)=>{const n=Mt(t);return Bt(e.contentDocument,n).toArray()})(e,t):((e,t)=>{const n=Mt(t);return N(n,(t=>{const n=At(t)?yt([R(`\x3c!--${t.content}--\x3e`)]):yt(t.content),o=Ot(t)?t.itemAttributes:{};return $(Ge(e,n.dom,o))}))})(e,t))))(e,t.entries);var r;S(o,(t=>{vt(e,"Indent"===n?"IndentList":"OutdentList",t.dom)})),r=t.sourceList,S(o,(e=>{pe(r,e)})),ye(t.sourceList)}))},$t=(e,t)=>{const n=Ne((e=>{const t=(e=>{const t=ct(e,e.selection.getStart()),n=L(e.selection.getSelectedBlocks(),Ie);return t.toArray().concat(n)})(e),n=(e=>{const t=e.selection.getStart();return e.dom.getParents(t,"ol,ul",dt(e,t))})(e);return T(n,(e=>{return t=$(e),te(t).exists((e=>Ue(e.dom)&&re(e).exists((e=>!Pe(e.dom)))&&se(e).exists((e=>!Pe(e.dom)))));var t})).fold((()=>mt(e,t)),(e=>[e]))})(e)),o=Ne((e=>L(lt(e),$e))(e));let r=!1;if(n.length||o.length){const s=e.selection.getBookmark();Ut(e,n,t),((e,t,n)=>{S(n,"Indent"===t?tt:t=>et(e,t))})(e,t,o),e.selection.moveToBookmark(s),e.selection.setRng(ot(e.selection.getRng())),e.nodeChanged(),r=!0}return r},_t=(e,t)=>!(e=>{const t=it(e);return gt(e,t)})(e)&&$t(e,t),Ht=e=>_t(e,"Indent"),Ft=e=>_t(e,"Outdent"),Vt=e=>_t(e,"Flatten"),jt=e=>"\ufeff"===e;var Kt=tinymce.util.Tools.resolve("tinymce.dom.BookmarkManager");const zt=xe.DOM,Qt=e=>{const t={},n=n=>{let o=e[n?"startContainer":"endContainer"],r=e[n?"startOffset":"endOffset"];if(Me(o)){const e=zt.create("span",{"data-mce-type":"bookmark"});o.hasChildNodes()?(r=Math.min(r,o.childNodes.length-1),n?o.insertBefore(e,o.childNodes[r]):zt.insertAfter(e,o.childNodes[r])):o.appendChild(e),o=e,r=0}t[n?"startContainer":"endContainer"]=o,t[n?"startOffset":"endOffset"]=r};return n(!0),e.collapsed||n(),t},Wt=e=>{const t=t=>{let n=e[t?"startContainer":"endContainer"],o=e[t?"startOffset":"endOffset"];if(n){if(Me(n)&&n.parentNode){const e=n;o=(e=>{var t;let n=null===(t=e.parentNode)||void 0===t?void 0:t.firstChild,o=0;for(;n;){if(n===e)return o;Me(n)&&"bookmark"===n.getAttribute("data-mce-type")||o++,n=n.nextSibling}return-1})(n),n=n.parentNode,zt.remove(e),!n.hasChildNodes()&&zt.isBlock(n)&&n.appendChild(zt.create("br"))}e[t?"startContainer":"endContainer"]=n,e[t?"startOffset":"endOffset"]=o}};t(!0),t();const n=zt.createRng();return n.setStart(e.startContainer,e.startOffset),e.endContainer&&n.setEnd(e.endContainer,e.endOffset),ot(n)},qt=e=>{switch(e){case"UL":return"ToggleUlList";case"OL":return"ToggleOlList";case"DL":return"ToggleDLList"}},Zt=(e,t)=>{Ee.each(t,((t,n)=>{e.setAttribute(n,t)}))},Gt=(e,t,n)=>{((e,t,n)=>{const o=n["list-style-type"]?n["list-style-type"]:null;e.setStyle(t,"list-style-type",o)})(e,t,n),((e,t,n)=>{Zt(t,n["list-attributes"]),Ee.each(e.select("li",t),(e=>{Zt(e,n["list-item-attributes"])}))})(e,t,n)},Jt=(e,t)=>l(t)&&!Ve(t,e.schema.getBlockElements()),Xt=(e,t,n,o)=>{let r=t[n?"startContainer":"endContainer"];const s=t[n?"startOffset":"endOffset"];Me(r)&&(r=r.childNodes[Math.min(s,r.childNodes.length-1)]||r),!n&&He(r.nextSibling)&&(r=r.nextSibling);const i=(t,n)=>{var r;const s=new Ce(t,(t=>{for(;!e.dom.isBlock(t)&&t.parentNode&&o!==t;)t=t.parentNode;return t})(t)),i=n?"next":"prev";let l;for(;l=s[i]();)if(!je(e,l)&&!jt(l.textContent)&&0!==(null===(r=l.textContent)||void 0===r?void 0:r.length))return h.some(l);return h.none()};if(n&&Be(r))if(jt(r.textContent))r=i(r,!1).getOr(r);else for(null!==r.parentNode&&Jt(e,r.parentNode)&&(r=r.parentNode);null!==r.previousSibling&&(Jt(e,r.previousSibling)||Be(r.previousSibling));)r=r.previousSibling;if(!n&&Be(r))if(jt(r.textContent))r=i(r,!0).getOr(r);else for(null!==r.parentNode&&Jt(e,r.parentNode)&&(r=r.parentNode);null!==r.nextSibling&&(Jt(e,r.nextSibling)||Be(r.nextSibling));)r=r.nextSibling;for(;r.parentNode!==o;){const t=r.parentNode;if(Fe(e,r))return r;if(/^(TD|TH)$/.test(t.nodeName))return r;r=t}return r},Yt=(e,t,n)=>{const o=e.selection.getRng();let r="LI";const s=dt(e,((e,t)=>{const n=e.selection.getStart(!0),o=Xt(e,t,!0,e.getBody());return r=$(o),s=$(t.commonAncestorContainer),i=r,l=function(e,...t){return(...n)=>{const o=t.concat(n);return e.apply(null,o)}}(H,s),ce(i,l,void 0).isSome()?t.commonAncestorContainer:n;var r,s,i,l})(e,o)),i=e.dom;if("false"===i.getContentEditable(e.selection.getNode()))return;"DL"===(t=t.toUpperCase())&&(r="DT");const l=Qt(o),a=L(((e,t,n)=>{const o=[],r=e.dom,s=Xt(e,t,!0,n),i=Xt(e,t,!1,n);let l;const a=[];for(let e=s;e&&(a.push(e),e!==i);e=e.nextSibling);return Ee.each(a,(t=>{var s;if(Fe(e,t))return o.push(t),void(l=null);if(r.isBlock(t)||He(t))return He(t)&&r.remove(t),void(l=null);const i=t.nextSibling;Kt.isBookmarkNode(t)&&(Pe(i)||Fe(e,i)||!i&&t.parentNode===n)?l=null:(l||(l=r.create("p"),null===(s=t.parentNode)||void 0===s||s.insertBefore(l,t),o.push(l)),l.appendChild(t))})),o})(e,o,s),e.dom.isEditable);Ee.each(a,(o=>{let s;const l=o.previousSibling,a=o.parentNode;Ue(a)||(l&&Pe(l)&&l.nodeName===t&&((e,t,n)=>{const o=e.getStyle(t,"list-style-type");let r=n?n["list-style-type"]:"";return r=null===r?"":r,o===r})(i,l,n)?(s=l,o=i.rename(o,r),l.appendChild(o)):(s=i.create(t),a.insertBefore(s,o),s.appendChild(o),o=i.rename(o,r)),((e,t,n)=>{Ee.each(["margin","margin-right","margin-bottom","margin-left","margin-top","padding","padding-right","padding-bottom","padding-left","padding-top"],(n=>e.setStyle(t,n,"")))})(i,o),Gt(i,s,n),tn(e.dom,s))})),e.selection.setRng(Wt(l))},en=(e,t,n)=>{return((e,t)=>Pe(e)&&e.nodeName===(null==t?void 0:t.nodeName))(t,n)&&((e,t,n)=>e.getStyle(t,"list-style-type",!0)===e.getStyle(n,"list-style-type",!0))(e,t,n)&&(o=n,t.className===o.className);var o},tn=(e,t)=>{let n,o=t.nextSibling;if(en(e,t,o)){const r=o;for(;n=r.firstChild;)t.appendChild(n);e.remove(r)}if(o=t.previousSibling,en(e,t,o)){const r=o;for(;n=r.lastChild;)t.insertBefore(n,t.firstChild);e.remove(r)}},nn=(e,t,n,o)=>{if(t.nodeName!==n){const r=e.dom.rename(t,n);Gt(e.dom,r,o),vt(e,qt(n),r)}else Gt(e.dom,t,o),vt(e,qt(n),t)},on=(e,t,n,o)=>{if(t.classList.forEach(((e,n,o)=>{e.startsWith("tox-")&&(o.remove(e),0===o.length&&t.removeAttribute("class"))})),t.nodeName!==n){const r=e.dom.rename(t,n);Gt(e.dom,r,o),vt(e,qt(n),r)}else Gt(e.dom,t,o),vt(e,qt(n),t)},rn=e=>"list-style-type"in e,sn=(e,t,n)=>{const o=it(e);if(ht(e,o))return;const s=(e=>{const t=it(e),n=e.selection.getSelectedBlocks();return((e,t)=>l(e)&&1===t.length&&t[0]===e)(t,n)?(e=>L(e.querySelectorAll(st),Pe))(t):L(n,(e=>Pe(e)&&t!==e))})(e),i=r(n)?n:{};s.length>0?((e,t,n,o,r)=>{const s=Pe(t);if(!s||t.nodeName!==o||rn(r)||ut(t)){Yt(e,o,r);const i=Qt(e.selection.getRng()),l=s?[t,...n]:n,a=s&&ut(t)?on:nn;Ee.each(l,(t=>{a(e,t,o,r)})),e.selection.setRng(Wt(i))}else Vt(e)})(e,o,s,t,i):((e,t,n,o)=>{if(t!==e.getBody())if(t)if(t.nodeName!==n||rn(o)||ut(t)){const r=Qt(e.selection.getRng());ut(t)&&t.classList.forEach(((e,n,o)=>{e.startsWith("tox-")&&(o.remove(e),0===o.length&&t.removeAttribute("class"))})),Gt(e.dom,t,o);const s=e.dom.rename(t,n);tn(e.dom,s),e.selection.setRng(Wt(r)),Yt(e,n,o),vt(e,qt(n),s)}else Vt(e);else Yt(e,n,o),vt(e,qt(n),t)})(e,o,t,i)},ln=xe.DOM,an=(e,t)=>{const n=Ee.grep(e.select("ol,ul",t));Ee.each(n,(t=>{((e,t)=>{const n=t.parentElement;if(n&&"LI"===n.nodeName&&n.firstChild===t){const o=n.previousSibling;o&&"LI"===o.nodeName?(o.appendChild(t),Ke(e,n)&&ln.remove(n)):ln.setStyle(n,"listStyleType","none")}if(Pe(n)){const e=n.previousSibling;e&&"LI"===e.nodeName&&e.appendChild(t)}})(e,t)}))},dn=(e,t,n,o)=>{let r=t.startContainer;const s=t.startOffset;if(Be(r)&&(n?s0))return r;const i=e.schema.getNonEmptyElements();Me(r)&&(r=ve.getNode(r,s));const l=new Ce(r,o);n&&((e,t)=>!!He(t)&&e.isBlock(t.nextSibling)&&!He(t.previousSibling))(e.dom,r)&&l.next();const a=n?l.next.bind(l):l.prev2.bind(l);for(;r=a();){if("LI"===r.nodeName&&!r.hasChildNodes())return r;if(i[r.nodeName])return r;if(Be(r)&&r.data.length>0)return r}return null},cn=(e,t)=>{const n=t.childNodes;return 1===n.length&&!Pe(n[0])&&e.isBlock(n[0])},mn=e=>h.from(e).map($).filter(Z).exists((e=>((e,t=!1)=>{return ae(e)?e.dom.isContentEditable:(n=e,de(((e,t)=>_(e,t)),ue,n,"[contenteditable]",void 0)).fold(m(t),(e=>"true"===(e=>e.dom.contentEditable)(e)));var n})(e)&&!C(["details"],Q(e)))),un=(e,t,n)=>{let o;const r=cn(e,n)?n.firstChild:n;if(((e,t)=>{cn(e,t)&&mn(t.firstChild)&&e.remove(t.firstChild,!0)})(e,t),!Ke(e,t,!0))for(;o=t.firstChild;)r.appendChild(o)},pn=(e,t,n)=>{let o;const r=t.parentNode;if(!ze(e,t)||!ze(e,n))return;Pe(n.lastChild)&&(o=n.lastChild),r===n.lastChild&&He(r.previousSibling)&&e.remove(r.previousSibling);const s=n.lastChild;s&&He(s)&&t.hasChildNodes()&&e.remove(s),Ke(e,n,!0)&&fe($(n)),un(e,t,n),o&&n.appendChild(o);const i=((e,t)=>{const n=e.dom,o=t.dom;return n!==o&&n.contains(o)})($(n),$(t))?e.getParents(t,Pe,n):[];e.remove(t),S(i,(t=>{Ke(e,t)&&t!==e.getRoot()&&e.remove(t)}))},gn=(e,t)=>{const n=e.dom,o=e.selection,r=o.getStart(),s=at(e,r),i=n.getParent(o.getStart(),"LI",s);if(i){const r=i.parentElement;if(r===e.getBody()&&Ke(n,r))return!0;const l=ot(o.getRng()),a=n.getParent(dn(e,l,t,s),"LI",s),d=a&&(t?n.isChildOf(i,a):n.isChildOf(a,i));if(a&&a!==i&&!d)return e.undoManager.transact((()=>{var n,o;t?((e,t,n,o)=>{const r=e.dom;if(r.isEmpty(o))((e,t,n)=>{fe($(n)),pn(e.dom,t,n),e.selection.setCursorLocation(n,0)})(e,n,o);else{const s=Qt(t);pn(r,n,o),e.selection.setRng(Wt(s))}})(e,l,a,i):(null===(o=(n=i).parentNode)||void 0===o?void 0:o.firstChild)===n?Ft(e):((e,t,n,o)=>{const r=Qt(t);pn(e.dom,n,o);const s=Wt(r);e.selection.setRng(s)})(e,l,i,a)})),!0;if(d&&!t&&a!==i)return e.undoManager.transact((()=>{if(l.commonAncestorContainer.parentElement){const t=Qt(l),o=l.commonAncestorContainer.parentElement;un(n,l.commonAncestorContainer.parentElement,a),o.remove();const r=Wt(t);e.selection.setRng(r)}})),!0;if(!a&&!t&&0===l.startOffset&&0===l.endOffset)return e.undoManager.transact((()=>{Vt(e)})),!0}return!1},hn=e=>{const t=e.selection.getStart(),n=at(e,t);return e.dom.getParent(t,"LI,DT,DD",n)||lt(e).length>0},fn=(e,t)=>{const n=e.selection;return!ht(e,n.getNode())&&(n.isCollapsed()?((e,t)=>gn(e,t)||((e,t)=>{const n=e.dom,o=e.selection.getStart(),r=at(e,o),s=n.getParent(o,n.isBlock,r);if(s&&n.isEmpty(s,void 0,{checkRootAsContent:!0})){const o=ot(e.selection.getRng()),i=n.getParent(dn(e,o,t,r),"LI",r);if(i){const l=e=>C(["td","th","caption"],Q(e)),a=e=>e.dom===r;return!!((e,t,n=u)=>P(e,t,n).getOr(e.isNone()&&t.isNone()))(me($(i),l,a),me($(o.startContainer),l,a),H)&&(e.undoManager.transact((()=>{const o=i.parentNode;((e,t,n)=>{const o=e.getParent(t.parentNode,e.isBlock,n);e.remove(t),o&&e.isEmpty(o)&&e.remove(o)})(n,s,r),tn(n,o),e.selection.select(i,!0),e.selection.collapse(t)})),!0)}}return!1})(e,t))(e,t):(e=>!!hn(e)&&(e.undoManager.transact((()=>{e.execCommand("Delete"),an(e.dom,e.getBody())})),!0))(e))},yn=e=>{const t=x(Ct(e).split("")),n=N(t,((e,t)=>{const n=e.toUpperCase().charCodeAt(0)-"A".charCodeAt(0)+1;return Math.pow(26,t)*n}));return O(n,((e,t)=>e+t),0)},vn=e=>{if(--e<0)return"";{const t=e%26,n=Math.floor(e/26);return vn(n)+String.fromCharCode("A".charCodeAt(0)+t)}},Cn=e=>{const t=parseInt(e.start,10);return M(e.listStyleType,"upper-alpha")?vn(t):M(e.listStyleType,"lower-alpha")?vn(t).toLowerCase():e.start},bn=(e,t)=>()=>{const n=it(e);return l(n)&&n.nodeName===t},Nn=e=>{e.addCommand("mceListProps",(()=>{(e=>{const t=it(e);Re(t)&&!ht(e,t)&&e.windowManager.open({title:"List Properties",body:{type:"panel",items:[{type:"input",name:"start",label:"Start list at number",inputMode:"numeric"}]},initialData:{start:Cn({start:e.dom.getAttrib(t,"start","1"),listStyleType:h.from(e.dom.getStyle(t,"list-style-type"))})},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],onSubmit:t=>{(e=>{switch((e=>/^[0-9]+$/.test(e)?2:/^[A-Z]+$/.test(e)?0:/^[a-z]+$/.test(e)?1:e.length>0?4:3)(e)){case 2:return h.some({listStyleType:h.none(),start:e});case 0:return h.some({listStyleType:h.some("upper-alpha"),start:yn(e).toString()});case 1:return h.some({listStyleType:h.some("lower-alpha"),start:yn(e).toString()});case 3:return h.some({listStyleType:h.none(),start:""});case 4:return h.none()}})(t.getData().start).each((t=>{e.execCommand("mceListUpdate",!1,{attrs:{start:"1"===t.start?"":t.start},styles:{"list-style-type":t.listStyleType.getOr("")}})})),t.close()}})})(e)}))};var Sn=tinymce.util.Tools.resolve("tinymce.html.Node");const Ln=e=>3===e.type,On=e=>0===e.length,An=e=>{const t=(t,n)=>{const o=Sn.create("li");S(t,(e=>o.append(e))),n?e.insert(o,n,!0):e.append(o)},n=O(e.children(),((e,n)=>Ln(n)?[...e,n]:On(e)||Ln(n)?e:(t(e,n),[])),[]);On(n)||t(n)},Tn=(e,t)=>n=>(n.setEnabled(e.selection.isEditable()),ft(e,(o=>{n.setActive(pt(o.parents,t)),n.setEnabled(!ht(e,o.element)&&e.selection.isEditable())}))),wn=(e,t)=>n=>ft(e,(o=>n.setEnabled(pt(o.parents,t)&&!ht(e,o.element))));e.add("lists",(e=>((e=>{(0,e.options.register)("lists_indent_on_tab",{processor:"boolean",default:!0})})(e),(e=>{e.on("PreInit",(()=>{const{parser:t}=e;t.addNodeFilter("ul,ol",(e=>S(e,An)))}))})(e),e.hasPlugin("rtc",!0)?Nn(e):((e=>{We(e)&&(e=>{e.on("keydown",(t=>{t.keyCode!==be.TAB||be.metaKeyPressed(t)||e.undoManager.transact((()=>{(t.shiftKey?Ft(e):Ht(e))&&t.preventDefault()}))}))})(e),(e=>{e.on("ExecCommand",(t=>{const n=t.command.toLowerCase();"delete"!==n&&"forwarddelete"!==n||!hn(e)||an(e.dom,e.getBody())})),e.on("keydown",(t=>{t.keyCode===be.BACKSPACE?fn(e,!1)&&t.preventDefault():t.keyCode===be.DELETE&&fn(e,!0)&&t.preventDefault()}))})(e)})(e),(e=>{e.on("BeforeExecCommand",(t=>{const n=t.command.toLowerCase();"indent"===n?Ht(e):"outdent"===n&&Ft(e)})),e.addCommand("InsertUnorderedList",((t,n)=>{sn(e,"UL",n)})),e.addCommand("InsertOrderedList",((t,n)=>{sn(e,"OL",n)})),e.addCommand("InsertDefinitionList",((t,n)=>{sn(e,"DL",n)})),e.addCommand("RemoveList",(()=>{Vt(e)})),Nn(e),e.addCommand("mceListUpdate",((t,n)=>{r(n)&&((e,t)=>{const n=it(e);null===n||ht(e,n)||e.undoManager.transact((()=>{r(t.styles)&&e.dom.setStyles(n,t.styles),r(t.attrs)&&Le(t.attrs,((t,o)=>e.dom.setAttrib(n,o,t)))}))})(e,n)})),e.addQueryStateHandler("InsertUnorderedList",bn(e,"UL")),e.addQueryStateHandler("InsertOrderedList",bn(e,"OL")),e.addQueryStateHandler("InsertDefinitionList",bn(e,"DL"))})(e)),(e=>{const t=t=>()=>e.execCommand(t);e.hasPlugin("advlist")||(e.ui.registry.addToggleButton("numlist",{icon:"ordered-list",active:!1,tooltip:"Numbered list",onAction:t("InsertOrderedList"),onSetup:Tn(e,"OL")}),e.ui.registry.addToggleButton("bullist",{icon:"unordered-list",active:!1,tooltip:"Bullet list",onAction:t("InsertUnorderedList"),onSetup:Tn(e,"UL")}))})(e),(e=>{const t={text:"List properties...",icon:"ordered-list",onAction:()=>e.execCommand("mceListProps"),onSetup:wn(e,"OL")};e.ui.registry.addMenuItem("listprops",t),e.ui.registry.addContextMenu("lists",{update:t=>{const n=it(e,t);return Re(n)?["listprops"]:[]}})})(e),(e=>({backspaceDelete:t=>{fn(e,t)}}))(e))))}();
\ No newline at end of file
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/media/plugin.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/media/plugin.js
deleted file mode 100644
index 934a8c0..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/media/plugin.js
+++ /dev/null
@@ -1,1223 +0,0 @@
-/**
- * TinyMCE version 7.1.0 (2024-05-08)
- */
-
-(function () {
- 'use strict';
-
- var global$6 = tinymce.util.Tools.resolve('tinymce.PluginManager');
-
- const hasProto = (v, constructor, predicate) => {
- var _a;
- if (predicate(v, constructor.prototype)) {
- return true;
- } else {
- return ((_a = v.constructor) === null || _a === void 0 ? void 0 : _a.name) === constructor.name;
- }
- };
- const typeOf = x => {
- const t = typeof x;
- if (x === null) {
- return 'null';
- } else if (t === 'object' && Array.isArray(x)) {
- return 'array';
- } else if (t === 'object' && hasProto(x, String, (o, proto) => proto.isPrototypeOf(o))) {
- return 'string';
- } else {
- return t;
- }
- };
- const isType = type => value => typeOf(value) === type;
- const isString = isType('string');
- const isObject = isType('object');
- const isArray = isType('array');
- const isNullable = a => a === null || a === undefined;
- const isNonNullable = a => !isNullable(a);
-
- class Optional {
- constructor(tag, value) {
- this.tag = tag;
- this.value = value;
- }
- static some(value) {
- return new Optional(true, value);
- }
- static none() {
- return Optional.singletonNone;
- }
- fold(onNone, onSome) {
- if (this.tag) {
- return onSome(this.value);
- } else {
- return onNone();
- }
- }
- isSome() {
- return this.tag;
- }
- isNone() {
- return !this.tag;
- }
- map(mapper) {
- if (this.tag) {
- return Optional.some(mapper(this.value));
- } else {
- return Optional.none();
- }
- }
- bind(binder) {
- if (this.tag) {
- return binder(this.value);
- } else {
- return Optional.none();
- }
- }
- exists(predicate) {
- return this.tag && predicate(this.value);
- }
- forall(predicate) {
- return !this.tag || predicate(this.value);
- }
- filter(predicate) {
- if (!this.tag || predicate(this.value)) {
- return this;
- } else {
- return Optional.none();
- }
- }
- getOr(replacement) {
- return this.tag ? this.value : replacement;
- }
- or(replacement) {
- return this.tag ? this : replacement;
- }
- getOrThunk(thunk) {
- return this.tag ? this.value : thunk();
- }
- orThunk(thunk) {
- return this.tag ? this : thunk();
- }
- getOrDie(message) {
- if (!this.tag) {
- throw new Error(message !== null && message !== void 0 ? message : 'Called getOrDie on None');
- } else {
- return this.value;
- }
- }
- static from(value) {
- return isNonNullable(value) ? Optional.some(value) : Optional.none();
- }
- getOrNull() {
- return this.tag ? this.value : null;
- }
- getOrUndefined() {
- return this.value;
- }
- each(worker) {
- if (this.tag) {
- worker(this.value);
- }
- }
- toArray() {
- return this.tag ? [this.value] : [];
- }
- toString() {
- return this.tag ? `some(${ this.value })` : 'none()';
- }
- }
- Optional.singletonNone = new Optional(false);
-
- const nativePush = Array.prototype.push;
- const each$1 = (xs, f) => {
- for (let i = 0, len = xs.length; i < len; i++) {
- const x = xs[i];
- f(x, i);
- }
- };
- const flatten = xs => {
- const r = [];
- for (let i = 0, len = xs.length; i < len; ++i) {
- if (!isArray(xs[i])) {
- throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs);
- }
- nativePush.apply(r, xs[i]);
- }
- return r;
- };
-
- const Cell = initial => {
- let value = initial;
- const get = () => {
- return value;
- };
- const set = v => {
- value = v;
- };
- return {
- get,
- set
- };
- };
-
- const keys = Object.keys;
- const hasOwnProperty = Object.hasOwnProperty;
- const each = (obj, f) => {
- const props = keys(obj);
- for (let k = 0, len = props.length; k < len; k++) {
- const i = props[k];
- const x = obj[i];
- f(x, i);
- }
- };
- const get$1 = (obj, key) => {
- return has(obj, key) ? Optional.from(obj[key]) : Optional.none();
- };
- const has = (obj, key) => hasOwnProperty.call(obj, key);
-
- const option = name => editor => editor.options.get(name);
- const register$2 = editor => {
- const registerOption = editor.options.register;
- registerOption('audio_template_callback', { processor: 'function' });
- registerOption('video_template_callback', { processor: 'function' });
- registerOption('iframe_template_callback', { processor: 'function' });
- registerOption('media_live_embeds', {
- processor: 'boolean',
- default: true
- });
- registerOption('media_filter_html', {
- processor: 'boolean',
- default: true
- });
- registerOption('media_url_resolver', { processor: 'function' });
- registerOption('media_alt_source', {
- processor: 'boolean',
- default: true
- });
- registerOption('media_poster', {
- processor: 'boolean',
- default: true
- });
- registerOption('media_dimensions', {
- processor: 'boolean',
- default: true
- });
- };
- const getAudioTemplateCallback = option('audio_template_callback');
- const getVideoTemplateCallback = option('video_template_callback');
- const getIframeTemplateCallback = option('iframe_template_callback');
- const hasLiveEmbeds = option('media_live_embeds');
- const shouldFilterHtml = option('media_filter_html');
- const getUrlResolver = option('media_url_resolver');
- const hasAltSource = option('media_alt_source');
- const hasPoster = option('media_poster');
- const hasDimensions = option('media_dimensions');
-
- var global$5 = tinymce.util.Tools.resolve('tinymce.util.Tools');
-
- var global$4 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils');
-
- var global$3 = tinymce.util.Tools.resolve('tinymce.html.DomParser');
-
- const DOM$1 = global$4.DOM;
- const trimPx = value => value.replace(/px$/, '');
- const getEphoxEmbedData = node => {
- const style = node.attr('style');
- const styles = style ? DOM$1.parseStyle(style) : {};
- return {
- type: 'ephox-embed-iri',
- source: node.attr('data-ephox-embed-iri'),
- altsource: '',
- poster: '',
- width: get$1(styles, 'max-width').map(trimPx).getOr(''),
- height: get$1(styles, 'max-height').map(trimPx).getOr('')
- };
- };
- const htmlToData = (html, schema) => {
- let data = {};
- const parser = global$3({
- validate: false,
- forced_root_block: false
- }, schema);
- const rootNode = parser.parse(html);
- for (let node = rootNode; node; node = node.walk()) {
- if (node.type === 1) {
- const name = node.name;
- if (node.attr('data-ephox-embed-iri')) {
- data = getEphoxEmbedData(node);
- break;
- } else {
- if (!data.source && name === 'param') {
- data.source = node.attr('movie');
- }
- if (name === 'iframe' || name === 'object' || name === 'embed' || name === 'video' || name === 'audio') {
- if (!data.type) {
- data.type = name;
- }
- data = global$5.extend(node.attributes.map, data);
- }
- if (name === 'source') {
- if (!data.source) {
- data.source = node.attr('src');
- } else if (!data.altsource) {
- data.altsource = node.attr('src');
- }
- }
- if (name === 'img' && !data.poster) {
- data.poster = node.attr('src');
- }
- }
- }
- }
- data.source = data.source || data.src || '';
- data.altsource = data.altsource || '';
- data.poster = data.poster || '';
- return data;
- };
-
- const guess = url => {
- var _a;
- const mimes = {
- mp3: 'audio/mpeg',
- m4a: 'audio/x-m4a',
- wav: 'audio/wav',
- mp4: 'video/mp4',
- webm: 'video/webm',
- ogg: 'video/ogg',
- swf: 'application/x-shockwave-flash'
- };
- const fileEnd = (_a = url.toLowerCase().split('.').pop()) !== null && _a !== void 0 ? _a : '';
- return get$1(mimes, fileEnd).getOr('');
- };
-
- var global$2 = tinymce.util.Tools.resolve('tinymce.html.Node');
-
- var global$1 = tinymce.util.Tools.resolve('tinymce.html.Serializer');
-
- const Parser = (schema, settings = {}) => global$3({
- forced_root_block: false,
- validate: false,
- allow_conditional_comments: true,
- ...settings
- }, schema);
-
- const DOM = global$4.DOM;
- const addPx = value => /^[0-9.]+$/.test(value) ? value + 'px' : value;
- const updateEphoxEmbed = (data, node) => {
- const style = node.attr('style');
- const styleMap = style ? DOM.parseStyle(style) : {};
- if (isNonNullable(data.width)) {
- styleMap['max-width'] = addPx(data.width);
- }
- if (isNonNullable(data.height)) {
- styleMap['max-height'] = addPx(data.height);
- }
- node.attr('style', DOM.serializeStyle(styleMap));
- };
- const sources = [
- 'source',
- 'altsource'
- ];
- const updateHtml = (html, data, updateAll, schema) => {
- let numSources = 0;
- let sourceCount = 0;
- const parser = Parser(schema);
- parser.addNodeFilter('source', nodes => numSources = nodes.length);
- const rootNode = parser.parse(html);
- for (let node = rootNode; node; node = node.walk()) {
- if (node.type === 1) {
- const name = node.name;
- if (node.attr('data-ephox-embed-iri')) {
- updateEphoxEmbed(data, node);
- break;
- } else {
- switch (name) {
- case 'video':
- case 'object':
- case 'embed':
- case 'img':
- case 'iframe':
- if (data.height !== undefined && data.width !== undefined) {
- node.attr('width', data.width);
- node.attr('height', data.height);
- }
- break;
- }
- if (updateAll) {
- switch (name) {
- case 'video':
- node.attr('poster', data.poster);
- node.attr('src', null);
- for (let index = numSources; index < 2; index++) {
- if (data[sources[index]]) {
- const source = new global$2('source', 1);
- source.attr('src', data[sources[index]]);
- source.attr('type', data[sources[index] + 'mime'] || null);
- node.append(source);
- }
- }
- break;
- case 'iframe':
- node.attr('src', data.source);
- break;
- case 'object':
- const hasImage = node.getAll('img').length > 0;
- if (data.poster && !hasImage) {
- node.attr('src', data.poster);
- const img = new global$2('img', 1);
- img.attr('src', data.poster);
- img.attr('width', data.width);
- img.attr('height', data.height);
- node.append(img);
- }
- break;
- case 'source':
- if (sourceCount < 2) {
- node.attr('src', data[sources[sourceCount]]);
- node.attr('type', data[sources[sourceCount] + 'mime'] || null);
- if (!data[sources[sourceCount]]) {
- node.remove();
- continue;
- }
- }
- sourceCount++;
- break;
- case 'img':
- if (!data.poster) {
- node.remove();
- }
- break;
- }
- }
- }
- }
- }
- return global$1({}, schema).serialize(rootNode);
- };
-
- const urlPatterns = [
- {
- regex: /youtu\.be\/([\w\-_\?&=.]+)/i,
- type: 'iframe',
- w: 560,
- h: 314,
- url: 'www.youtube.com/embed/$1',
- allowFullscreen: true
- },
- {
- regex: /youtube\.com(.+)v=([^&]+)(&([a-z0-9&=\-_]+))?/i,
- type: 'iframe',
- w: 560,
- h: 314,
- url: 'www.youtube.com/embed/$2?$4',
- allowFullscreen: true
- },
- {
- regex: /youtube.com\/embed\/([a-z0-9\?&=\-_]+)/i,
- type: 'iframe',
- w: 560,
- h: 314,
- url: 'www.youtube.com/embed/$1',
- allowFullscreen: true
- },
- {
- regex: /vimeo\.com\/([0-9]+)\?h=(\w+)/,
- type: 'iframe',
- w: 425,
- h: 350,
- url: 'player.vimeo.com/video/$1?h=$2&title=0&byline=0&portrait=0&color=8dc7dc',
- allowFullscreen: true
- },
- {
- regex: /vimeo\.com\/(.*)\/([0-9]+)\?h=(\w+)/,
- type: 'iframe',
- w: 425,
- h: 350,
- url: 'player.vimeo.com/video/$2?h=$3&title=0&byline=0',
- allowFullscreen: true
- },
- {
- regex: /vimeo\.com\/([0-9]+)/,
- type: 'iframe',
- w: 425,
- h: 350,
- url: 'player.vimeo.com/video/$1?title=0&byline=0&portrait=0&color=8dc7dc',
- allowFullscreen: true
- },
- {
- regex: /vimeo\.com\/(.*)\/([0-9]+)/,
- type: 'iframe',
- w: 425,
- h: 350,
- url: 'player.vimeo.com/video/$2?title=0&byline=0',
- allowFullscreen: true
- },
- {
- regex: /maps\.google\.([a-z]{2,3})\/maps\/(.+)msid=(.+)/,
- type: 'iframe',
- w: 425,
- h: 350,
- url: 'maps.google.com/maps/ms?msid=$2&output=embed"',
- allowFullscreen: false
- },
- {
- regex: /dailymotion\.com\/video\/([^_]+)/,
- type: 'iframe',
- w: 480,
- h: 270,
- url: 'www.dailymotion.com/embed/video/$1',
- allowFullscreen: true
- },
- {
- regex: /dai\.ly\/([^_]+)/,
- type: 'iframe',
- w: 480,
- h: 270,
- url: 'www.dailymotion.com/embed/video/$1',
- allowFullscreen: true
- }
- ];
- const getProtocol = url => {
- const protocolMatches = url.match(/^(https?:\/\/|www\.)(.+)$/i);
- if (protocolMatches && protocolMatches.length > 1) {
- return protocolMatches[1] === 'www.' ? 'https://' : protocolMatches[1];
- } else {
- return 'https://';
- }
- };
- const getUrl = (pattern, url) => {
- const protocol = getProtocol(url);
- const match = pattern.regex.exec(url);
- let newUrl = protocol + pattern.url;
- if (isNonNullable(match)) {
- for (let i = 0; i < match.length; i++) {
- newUrl = newUrl.replace('$' + i, () => match[i] ? match[i] : '');
- }
- }
- return newUrl.replace(/\?$/, '');
- };
- const matchPattern = url => {
- const patterns = urlPatterns.filter(pattern => pattern.regex.test(url));
- if (patterns.length > 0) {
- return global$5.extend({}, patterns[0], { url: getUrl(patterns[0], url) });
- } else {
- return null;
- }
- };
-
- const getIframeHtml = (data, iframeTemplateCallback) => {
- if (iframeTemplateCallback) {
- return iframeTemplateCallback(data);
- } else {
- const allowFullscreen = data.allowfullscreen ? ' allowFullscreen="1"' : '';
- return '';
- }
- };
- const getFlashHtml = data => {
- let html = '';
- if (data.poster) {
- html += ' ';
- }
- html += ' ';
- return html;
- };
- const getAudioHtml = (data, audioTemplateCallback) => {
- if (audioTemplateCallback) {
- return audioTemplateCallback(data);
- } else {
- return '' + (data.altsource ? '\n \n' : '') + ' ';
- }
- };
- const getVideoHtml = (data, videoTemplateCallback) => {
- if (videoTemplateCallback) {
- return videoTemplateCallback(data);
- } else {
- return '\n' + ' \n' + (data.altsource ? ' \n' : '') + ' ';
- }
- };
- const dataToHtml = (editor, dataIn) => {
- var _a;
- const data = global$5.extend({}, dataIn);
- if (!data.source) {
- global$5.extend(data, htmlToData((_a = data.embed) !== null && _a !== void 0 ? _a : '', editor.schema));
- if (!data.source) {
- return '';
- }
- }
- if (!data.altsource) {
- data.altsource = '';
- }
- if (!data.poster) {
- data.poster = '';
- }
- data.source = editor.convertURL(data.source, 'source');
- data.altsource = editor.convertURL(data.altsource, 'source');
- data.sourcemime = guess(data.source);
- data.altsourcemime = guess(data.altsource);
- data.poster = editor.convertURL(data.poster, 'poster');
- const pattern = matchPattern(data.source);
- if (pattern) {
- data.source = pattern.url;
- data.type = pattern.type;
- data.allowfullscreen = pattern.allowFullscreen;
- data.width = data.width || String(pattern.w);
- data.height = data.height || String(pattern.h);
- }
- if (data.embed) {
- return updateHtml(data.embed, data, true, editor.schema);
- } else {
- const audioTemplateCallback = getAudioTemplateCallback(editor);
- const videoTemplateCallback = getVideoTemplateCallback(editor);
- const iframeTemplateCallback = getIframeTemplateCallback(editor);
- data.width = data.width || '300';
- data.height = data.height || '150';
- global$5.each(data, (value, key) => {
- data[key] = editor.dom.encode('' + value);
- });
- if (data.type === 'iframe') {
- return getIframeHtml(data, iframeTemplateCallback);
- } else if (data.sourcemime === 'application/x-shockwave-flash') {
- return getFlashHtml(data);
- } else if (data.sourcemime.indexOf('audio') !== -1) {
- return getAudioHtml(data, audioTemplateCallback);
- } else {
- return getVideoHtml(data, videoTemplateCallback);
- }
- }
- };
-
- const isMediaElement = element => element.hasAttribute('data-mce-object') || element.hasAttribute('data-ephox-embed-iri');
- const setup$2 = editor => {
- editor.on('mousedown', e => {
- const previewObj = editor.dom.getParent(e.target, '.mce-preview-object');
- if (previewObj && editor.dom.getAttrib(previewObj, 'data-mce-selected') === '2') {
- e.stopImmediatePropagation();
- }
- });
- editor.on('click keyup touchend', () => {
- const selectedNode = editor.selection.getNode();
- if (selectedNode && editor.dom.hasClass(selectedNode, 'mce-preview-object')) {
- if (editor.dom.getAttrib(selectedNode, 'data-mce-selected')) {
- selectedNode.setAttribute('data-mce-selected', '2');
- }
- }
- });
- editor.on('ObjectResized', e => {
- const target = e.target;
- if (target.getAttribute('data-mce-object')) {
- let html = target.getAttribute('data-mce-html');
- if (html) {
- html = unescape(html);
- target.setAttribute('data-mce-html', escape(updateHtml(html, {
- width: String(e.width),
- height: String(e.height)
- }, false, editor.schema)));
- }
- }
- });
- };
-
- const cache = {};
- const embedPromise = (data, dataToHtml, handler) => {
- return new Promise((res, rej) => {
- const wrappedResolve = response => {
- if (response.html) {
- cache[data.source] = response;
- }
- return res({
- url: data.source,
- html: response.html ? response.html : dataToHtml(data)
- });
- };
- if (cache[data.source]) {
- wrappedResolve(cache[data.source]);
- } else {
- handler({ url: data.source }).then(wrappedResolve).catch(rej);
- }
- });
- };
- const defaultPromise = (data, dataToHtml) => Promise.resolve({
- html: dataToHtml(data),
- url: data.source
- });
- const loadedData = editor => data => dataToHtml(editor, data);
- const getEmbedHtml = (editor, data) => {
- const embedHandler = getUrlResolver(editor);
- return embedHandler ? embedPromise(data, loadedData(editor), embedHandler) : defaultPromise(data, loadedData(editor));
- };
- const isCached = url => has(cache, url);
-
- const extractMeta = (sourceInput, data) => get$1(data, sourceInput).bind(mainData => get$1(mainData, 'meta'));
- const getValue = (data, metaData, sourceInput) => prop => {
- const getFromData = () => get$1(data, prop);
- const getFromMetaData = () => get$1(metaData, prop);
- const getNonEmptyValue = c => get$1(c, 'value').bind(v => v.length > 0 ? Optional.some(v) : Optional.none());
- const getFromValueFirst = () => getFromData().bind(child => isObject(child) ? getNonEmptyValue(child).orThunk(getFromMetaData) : getFromMetaData().orThunk(() => Optional.from(child)));
- const getFromMetaFirst = () => getFromMetaData().orThunk(() => getFromData().bind(child => isObject(child) ? getNonEmptyValue(child) : Optional.from(child)));
- return { [prop]: (prop === sourceInput ? getFromValueFirst() : getFromMetaFirst()).getOr('') };
- };
- const getDimensions = (data, metaData) => {
- const dimensions = {};
- get$1(data, 'dimensions').each(dims => {
- each$1([
- 'width',
- 'height'
- ], prop => {
- get$1(metaData, prop).orThunk(() => get$1(dims, prop)).each(value => dimensions[prop] = value);
- });
- });
- return dimensions;
- };
- const unwrap = (data, sourceInput) => {
- const metaData = sourceInput && sourceInput !== 'dimensions' ? extractMeta(sourceInput, data).getOr({}) : {};
- const get = getValue(data, metaData, sourceInput);
- return {
- ...get('source'),
- ...get('altsource'),
- ...get('poster'),
- ...get('embed'),
- ...getDimensions(data, metaData)
- };
- };
- const wrap = data => {
- const wrapped = {
- ...data,
- source: { value: get$1(data, 'source').getOr('') },
- altsource: { value: get$1(data, 'altsource').getOr('') },
- poster: { value: get$1(data, 'poster').getOr('') }
- };
- each$1([
- 'width',
- 'height'
- ], prop => {
- get$1(data, prop).each(value => {
- const dimensions = wrapped.dimensions || {};
- dimensions[prop] = value;
- wrapped.dimensions = dimensions;
- });
- });
- return wrapped;
- };
- const handleError = editor => error => {
- const errorMessage = error && error.msg ? 'Media embed handler error: ' + error.msg : 'Media embed handler threw unknown error.';
- editor.notificationManager.open({
- type: 'error',
- text: errorMessage
- });
- };
- const getEditorData = editor => {
- const element = editor.selection.getNode();
- const snippet = isMediaElement(element) ? editor.serializer.serialize(element, { selection: true }) : '';
- const data = htmlToData(snippet, editor.schema);
- const getDimensionsOfElement = () => {
- if (isEmbedIframe(data.source, data.type)) {
- const rect = editor.dom.getRect(element);
- return {
- width: rect.w.toString().replace(/px$/, ''),
- height: rect.h.toString().replace(/px$/, '')
- };
- } else {
- return {};
- }
- };
- const dimensions = getDimensionsOfElement();
- return {
- embed: snippet,
- ...data,
- ...dimensions
- };
- };
- const addEmbedHtml = (api, editor) => response => {
- if (isString(response.url) && response.url.trim().length > 0) {
- const html = response.html;
- const snippetData = htmlToData(html, editor.schema);
- const nuData = {
- ...snippetData,
- source: response.url,
- embed: html
- };
- api.setData(wrap(nuData));
- }
- };
- const selectPlaceholder = (editor, beforeObjects) => {
- const afterObjects = editor.dom.select('*[data-mce-object]');
- for (let i = 0; i < beforeObjects.length; i++) {
- for (let y = afterObjects.length - 1; y >= 0; y--) {
- if (beforeObjects[i] === afterObjects[y]) {
- afterObjects.splice(y, 1);
- }
- }
- }
- editor.selection.select(afterObjects[0]);
- };
- const handleInsert = (editor, html) => {
- const beforeObjects = editor.dom.select('*[data-mce-object]');
- editor.insertContent(html);
- selectPlaceholder(editor, beforeObjects);
- editor.nodeChanged();
- };
- const isEmbedIframe = (url, mediaDataType) => isNonNullable(mediaDataType) && mediaDataType === 'ephox-embed-iri' && isNonNullable(matchPattern(url));
- const shouldInsertAsNewIframe = (prevData, newData) => {
- const hasDimensionsChanged = (prevData, newData) => prevData.width !== newData.width || prevData.height !== newData.height;
- return hasDimensionsChanged(prevData, newData) && isEmbedIframe(newData.source, prevData.type);
- };
- const submitForm = (prevData, newData, editor) => {
- var _a;
- newData.embed = shouldInsertAsNewIframe(prevData, newData) && hasDimensions(editor) ? dataToHtml(editor, {
- ...newData,
- embed: ''
- }) : updateHtml((_a = newData.embed) !== null && _a !== void 0 ? _a : '', newData, false, editor.schema);
- if (newData.embed && (prevData.source === newData.source || isCached(newData.source))) {
- handleInsert(editor, newData.embed);
- } else {
- getEmbedHtml(editor, newData).then(response => {
- handleInsert(editor, response.html);
- }).catch(handleError(editor));
- }
- };
- const showDialog = editor => {
- const editorData = getEditorData(editor);
- const currentData = Cell(editorData);
- const initialData = wrap(editorData);
- const handleSource = (prevData, api) => {
- const serviceData = unwrap(api.getData(), 'source');
- if (prevData.source !== serviceData.source) {
- addEmbedHtml(win, editor)({
- url: serviceData.source,
- html: ''
- });
- getEmbedHtml(editor, serviceData).then(addEmbedHtml(win, editor)).catch(handleError(editor));
- }
- };
- const handleEmbed = api => {
- var _a;
- const data = unwrap(api.getData());
- const dataFromEmbed = htmlToData((_a = data.embed) !== null && _a !== void 0 ? _a : '', editor.schema);
- api.setData(wrap(dataFromEmbed));
- };
- const handleUpdate = (api, sourceInput, prevData) => {
- const dialogData = unwrap(api.getData(), sourceInput);
- const data = shouldInsertAsNewIframe(prevData, dialogData) && hasDimensions(editor) ? {
- ...dialogData,
- embed: ''
- } : dialogData;
- const embed = dataToHtml(editor, data);
- api.setData(wrap({
- ...data,
- embed
- }));
- };
- const mediaInput = [{
- name: 'source',
- type: 'urlinput',
- filetype: 'media',
- label: 'Source',
- picker_text: 'Browse files'
- }];
- const sizeInput = !hasDimensions(editor) ? [] : [{
- type: 'sizeinput',
- name: 'dimensions',
- label: 'Constrain proportions',
- constrain: true
- }];
- const generalTab = {
- title: 'General',
- name: 'general',
- items: flatten([
- mediaInput,
- sizeInput
- ])
- };
- const embedTextarea = {
- type: 'textarea',
- name: 'embed',
- label: 'Paste your embed code below:'
- };
- const embedTab = {
- title: 'Embed',
- items: [embedTextarea]
- };
- const advancedFormItems = [];
- if (hasAltSource(editor)) {
- advancedFormItems.push({
- name: 'altsource',
- type: 'urlinput',
- filetype: 'media',
- label: 'Alternative source URL'
- });
- }
- if (hasPoster(editor)) {
- advancedFormItems.push({
- name: 'poster',
- type: 'urlinput',
- filetype: 'image',
- label: 'Media poster (Image URL)'
- });
- }
- const advancedTab = {
- title: 'Advanced',
- name: 'advanced',
- items: advancedFormItems
- };
- const tabs = [
- generalTab,
- embedTab
- ];
- if (advancedFormItems.length > 0) {
- tabs.push(advancedTab);
- }
- const body = {
- type: 'tabpanel',
- tabs
- };
- const win = editor.windowManager.open({
- title: 'Insert/Edit Media',
- size: 'normal',
- body,
- buttons: [
- {
- type: 'cancel',
- name: 'cancel',
- text: 'Cancel'
- },
- {
- type: 'submit',
- name: 'save',
- text: 'Save',
- primary: true
- }
- ],
- onSubmit: api => {
- const serviceData = unwrap(api.getData());
- submitForm(currentData.get(), serviceData, editor);
- api.close();
- },
- onChange: (api, detail) => {
- switch (detail.name) {
- case 'source':
- handleSource(currentData.get(), api);
- break;
- case 'embed':
- handleEmbed(api);
- break;
- case 'dimensions':
- case 'altsource':
- case 'poster':
- handleUpdate(api, detail.name, currentData.get());
- break;
- }
- currentData.set(unwrap(api.getData()));
- },
- initialData
- });
- };
-
- const get = editor => {
- const showDialog$1 = () => {
- showDialog(editor);
- };
- return { showDialog: showDialog$1 };
- };
-
- const register$1 = editor => {
- const showDialog$1 = () => {
- showDialog(editor);
- };
- editor.addCommand('mceMedia', showDialog$1);
- };
-
- const checkRange = (str, substr, start) => substr === '' || str.length >= substr.length && str.substr(start, start + substr.length) === substr;
- const startsWith = (str, prefix) => {
- return checkRange(str, prefix, 0);
- };
-
- var global = tinymce.util.Tools.resolve('tinymce.Env');
-
- const isLiveEmbedNode = node => {
- const name = node.name;
- return name === 'iframe' || name === 'video' || name === 'audio';
- };
- const getDimension = (node, styles, dimension, defaultValue = null) => {
- const value = node.attr(dimension);
- if (isNonNullable(value)) {
- return value;
- } else if (!has(styles, dimension)) {
- return defaultValue;
- } else {
- return null;
- }
- };
- const setDimensions = (node, previewNode, styles) => {
- const useDefaults = previewNode.name === 'img' || node.name === 'video';
- const defaultWidth = useDefaults ? '300' : null;
- const fallbackHeight = node.name === 'audio' ? '30' : '150';
- const defaultHeight = useDefaults ? fallbackHeight : null;
- previewNode.attr({
- width: getDimension(node, styles, 'width', defaultWidth),
- height: getDimension(node, styles, 'height', defaultHeight)
- });
- };
- const appendNodeContent = (editor, nodeName, previewNode, html) => {
- const newNode = Parser(editor.schema).parse(html, { context: nodeName });
- while (newNode.firstChild) {
- previewNode.append(newNode.firstChild);
- }
- };
- const createPlaceholderNode = (editor, node) => {
- const name = node.name;
- const placeHolder = new global$2('img', 1);
- retainAttributesAndInnerHtml(editor, node, placeHolder);
- setDimensions(node, placeHolder, {});
- placeHolder.attr({
- 'style': node.attr('style'),
- 'src': global.transparentSrc,
- 'data-mce-object': name,
- 'class': 'mce-object mce-object-' + name
- });
- return placeHolder;
- };
- const createPreviewNode = (editor, node) => {
- var _a;
- const name = node.name;
- const previewWrapper = new global$2('span', 1);
- previewWrapper.attr({
- 'contentEditable': 'false',
- 'style': node.attr('style'),
- 'data-mce-object': name,
- 'class': 'mce-preview-object mce-object-' + name
- });
- retainAttributesAndInnerHtml(editor, node, previewWrapper);
- const styles = editor.dom.parseStyle((_a = node.attr('style')) !== null && _a !== void 0 ? _a : '');
- const previewNode = new global$2(name, 1);
- setDimensions(node, previewNode, styles);
- previewNode.attr({
- src: node.attr('src'),
- style: node.attr('style'),
- class: node.attr('class')
- });
- if (name === 'iframe') {
- previewNode.attr({
- allowfullscreen: node.attr('allowfullscreen'),
- frameborder: '0',
- sandbox: node.attr('sandbox')
- });
- } else {
- const attrs = [
- 'controls',
- 'crossorigin',
- 'currentTime',
- 'loop',
- 'muted',
- 'poster',
- 'preload'
- ];
- each$1(attrs, attrName => {
- previewNode.attr(attrName, node.attr(attrName));
- });
- const sanitizedHtml = previewWrapper.attr('data-mce-html');
- if (isNonNullable(sanitizedHtml)) {
- appendNodeContent(editor, name, previewNode, unescape(sanitizedHtml));
- }
- }
- const shimNode = new global$2('span', 1);
- shimNode.attr('class', 'mce-shim');
- previewWrapper.append(previewNode);
- previewWrapper.append(shimNode);
- return previewWrapper;
- };
- const retainAttributesAndInnerHtml = (editor, sourceNode, targetNode) => {
- var _a;
- const attribs = (_a = sourceNode.attributes) !== null && _a !== void 0 ? _a : [];
- let ai = attribs.length;
- while (ai--) {
- const attrName = attribs[ai].name;
- let attrValue = attribs[ai].value;
- if (attrName !== 'width' && attrName !== 'height' && attrName !== 'style' && !startsWith(attrName, 'data-mce-')) {
- if (attrName === 'data' || attrName === 'src') {
- attrValue = editor.convertURL(attrValue, attrName);
- }
- targetNode.attr('data-mce-p-' + attrName, attrValue);
- }
- }
- const serializer = global$1({ inner: true }, editor.schema);
- const tempNode = new global$2('div', 1);
- each$1(sourceNode.children(), child => tempNode.append(child));
- const innerHtml = serializer.serialize(tempNode);
- if (innerHtml) {
- targetNode.attr('data-mce-html', escape(innerHtml));
- targetNode.empty();
- }
- };
- const isPageEmbedWrapper = node => {
- const nodeClass = node.attr('class');
- return isString(nodeClass) && /\btiny-pageembed\b/.test(nodeClass);
- };
- const isWithinEmbedWrapper = node => {
- let tempNode = node;
- while (tempNode = tempNode.parent) {
- if (tempNode.attr('data-ephox-embed-iri') || isPageEmbedWrapper(tempNode)) {
- return true;
- }
- }
- return false;
- };
- const placeHolderConverter = editor => nodes => {
- let i = nodes.length;
- let node;
- while (i--) {
- node = nodes[i];
- if (!node.parent) {
- continue;
- }
- if (node.parent.attr('data-mce-object')) {
- continue;
- }
- if (isLiveEmbedNode(node) && hasLiveEmbeds(editor)) {
- if (!isWithinEmbedWrapper(node)) {
- node.replace(createPreviewNode(editor, node));
- }
- } else {
- if (!isWithinEmbedWrapper(node)) {
- node.replace(createPlaceholderNode(editor, node));
- }
- }
- }
- };
-
- const parseAndSanitize = (editor, context, html) => {
- const getEditorOption = editor.options.get;
- const sanitize = getEditorOption('xss_sanitization');
- const validate = shouldFilterHtml(editor);
- return Parser(editor.schema, {
- sanitize,
- validate
- }).parse(html, { context });
- };
-
- const setup$1 = editor => {
- editor.on('PreInit', () => {
- const {schema, serializer, parser} = editor;
- const boolAttrs = schema.getBoolAttrs();
- each$1('webkitallowfullscreen mozallowfullscreen'.split(' '), name => {
- boolAttrs[name] = {};
- });
- each({ embed: ['wmode'] }, (attrs, name) => {
- const rule = schema.getElementRule(name);
- if (rule) {
- each$1(attrs, attr => {
- rule.attributes[attr] = {};
- rule.attributesOrder.push(attr);
- });
- }
- });
- parser.addNodeFilter('iframe,video,audio,object,embed', placeHolderConverter(editor));
- serializer.addAttributeFilter('data-mce-object', (nodes, name) => {
- var _a;
- let i = nodes.length;
- while (i--) {
- const node = nodes[i];
- if (!node.parent) {
- continue;
- }
- const realElmName = node.attr(name);
- const realElm = new global$2(realElmName, 1);
- if (realElmName !== 'audio') {
- const className = node.attr('class');
- if (className && className.indexOf('mce-preview-object') !== -1 && node.firstChild) {
- realElm.attr({
- width: node.firstChild.attr('width'),
- height: node.firstChild.attr('height')
- });
- } else {
- realElm.attr({
- width: node.attr('width'),
- height: node.attr('height')
- });
- }
- }
- realElm.attr({ style: node.attr('style') });
- const attribs = (_a = node.attributes) !== null && _a !== void 0 ? _a : [];
- let ai = attribs.length;
- while (ai--) {
- const attrName = attribs[ai].name;
- if (attrName.indexOf('data-mce-p-') === 0) {
- realElm.attr(attrName.substr(11), attribs[ai].value);
- }
- }
- const innerHtml = node.attr('data-mce-html');
- if (innerHtml) {
- const fragment = parseAndSanitize(editor, realElmName, unescape(innerHtml));
- each$1(fragment.children(), child => realElm.append(child));
- }
- node.replace(realElm);
- }
- });
- });
- editor.on('SetContent', () => {
- const dom = editor.dom;
- each$1(dom.select('span.mce-preview-object'), elm => {
- if (dom.select('span.mce-shim', elm).length === 0) {
- dom.add(elm, 'span', { class: 'mce-shim' });
- }
- });
- });
- };
-
- const setup = editor => {
- editor.on('ResolveName', e => {
- let name;
- if (e.target.nodeType === 1 && (name = e.target.getAttribute('data-mce-object'))) {
- e.name = name;
- }
- });
- };
-
- const onSetupEditable = editor => api => {
- const nodeChanged = () => {
- api.setEnabled(editor.selection.isEditable());
- };
- editor.on('NodeChange', nodeChanged);
- nodeChanged();
- return () => {
- editor.off('NodeChange', nodeChanged);
- };
- };
- const register = editor => {
- const onAction = () => editor.execCommand('mceMedia');
- editor.ui.registry.addToggleButton('media', {
- tooltip: 'Insert/edit media',
- icon: 'embed',
- onAction,
- onSetup: buttonApi => {
- const selection = editor.selection;
- buttonApi.setActive(isMediaElement(selection.getNode()));
- const unbindSelectorChanged = selection.selectorChangedWithUnbind('img[data-mce-object],span[data-mce-object],div[data-ephox-embed-iri]', buttonApi.setActive).unbind;
- const unbindEditable = onSetupEditable(editor)(buttonApi);
- return () => {
- unbindSelectorChanged();
- unbindEditable();
- };
- }
- });
- editor.ui.registry.addMenuItem('media', {
- icon: 'embed',
- text: 'Media...',
- onAction,
- onSetup: onSetupEditable(editor)
- });
- };
-
- var Plugin = () => {
- global$6.add('media', editor => {
- register$2(editor);
- register$1(editor);
- register(editor);
- setup(editor);
- setup$1(editor);
- setup$2(editor);
- return get(editor);
- });
- };
-
- Plugin();
-
-})();
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/media/plugin.min.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/media/plugin.min.js
deleted file mode 100644
index f2c463e..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/media/plugin.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/**
- * TinyMCE version 7.1.0 (2024-05-08)
- */
-!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=e=>t=>(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(r=o=e,(a=String).prototype.isPrototypeOf(r)||(null===(s=o.constructor)||void 0===s?void 0:s.name)===a.name)?"string":t;var r,o,a,s})(t)===e,r=t("string"),o=t("object"),a=t("array"),s=e=>!(e=>null==e)(e);class i{constructor(e,t){this.tag=e,this.value=t}static some(e){return new i(!0,e)}static none(){return i.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?i.some(e(this.value)):i.none()}bind(e){return this.tag?e(this.value):i.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:i.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return s(e)?i.some(e):i.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}i.singletonNone=new i(!1);const n=Array.prototype.push,l=(e,t)=>{for(let r=0,o=e.length;r{const t=[];for(let r=0,o=e.length;rh(e,t)?i.from(e[t]):i.none(),h=(e,t)=>u.call(e,t),p=e=>t=>t.options.get(e),g=p("audio_template_callback"),b=p("video_template_callback"),w=p("iframe_template_callback"),v=p("media_live_embeds"),f=p("media_filter_html"),y=p("media_url_resolver"),x=p("media_alt_source"),_=p("media_poster"),k=p("media_dimensions");var j=tinymce.util.Tools.resolve("tinymce.util.Tools"),O=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),A=tinymce.util.Tools.resolve("tinymce.html.DomParser");const S=O.DOM,$=e=>e.replace(/px$/,""),C=e=>{const t=e.attr("style"),r=t?S.parseStyle(t):{};return{type:"ephox-embed-iri",source:e.attr("data-ephox-embed-iri"),altsource:"",poster:"",width:d(r,"max-width").map($).getOr(""),height:d(r,"max-height").map($).getOr("")}},T=(e,t)=>{let r={};for(let o=A({validate:!1,forced_root_block:!1},t).parse(e);o;o=o.walk())if(1===o.type){const e=o.name;if(o.attr("data-ephox-embed-iri")){r=C(o);break}r.source||"param"!==e||(r.source=o.attr("movie")),"iframe"!==e&&"object"!==e&&"embed"!==e&&"video"!==e&&"audio"!==e||(r.type||(r.type=e),r=j.extend(o.attributes.map,r)),"source"===e&&(r.source?r.altsource||(r.altsource=o.attr("src")):r.source=o.attr("src")),"img"!==e||r.poster||(r.poster=o.attr("src"))}return r.source=r.source||r.src||"",r.altsource=r.altsource||"",r.poster=r.poster||"",r},z=e=>{var t;const r=null!==(t=e.toLowerCase().split(".").pop())&&void 0!==t?t:"";return d({mp3:"audio/mpeg",m4a:"audio/x-m4a",wav:"audio/wav",mp4:"video/mp4",webm:"video/webm",ogg:"video/ogg",swf:"application/x-shockwave-flash"},r).getOr("")};var D=tinymce.util.Tools.resolve("tinymce.html.Node"),F=tinymce.util.Tools.resolve("tinymce.html.Serializer");const M=(e,t={})=>A({forced_root_block:!1,validate:!1,allow_conditional_comments:!0,...t},e),N=O.DOM,P=e=>/^[0-9.]+$/.test(e)?e+"px":e,R=(e,t)=>{const r=t.attr("style"),o=r?N.parseStyle(r):{};s(e.width)&&(o["max-width"]=P(e.width)),s(e.height)&&(o["max-height"]=P(e.height)),t.attr("style",N.serializeStyle(o))},E=["source","altsource"],U=(e,t,r,o)=>{let a=0,s=0;const i=M(o);i.addNodeFilter("source",(e=>a=e.length));const n=i.parse(e);for(let e=n;e;e=e.walk())if(1===e.type){const o=e.name;if(e.attr("data-ephox-embed-iri")){R(t,e);break}switch(o){case"video":case"object":case"embed":case"img":case"iframe":void 0!==t.height&&void 0!==t.width&&(e.attr("width",t.width),e.attr("height",t.height))}if(r)switch(o){case"video":e.attr("poster",t.poster),e.attr("src",null);for(let r=a;r<2;r++)if(t[E[r]]){const o=new D("source",1);o.attr("src",t[E[r]]),o.attr("type",t[E[r]+"mime"]||null),e.append(o)}break;case"iframe":e.attr("src",t.source);break;case"object":const r=e.getAll("img").length>0;if(t.poster&&!r){e.attr("src",t.poster);const r=new D("img",1);r.attr("src",t.poster),r.attr("width",t.width),r.attr("height",t.height),e.append(r)}break;case"source":if(s<2&&(e.attr("src",t[E[s]]),e.attr("type",t[E[s]+"mime"]||null),!t[E[s]])){e.remove();continue}s++;break;case"img":t.poster||e.remove()}}return F({},o).serialize(n)},L=[{regex:/youtu\.be\/([\w\-_\?&=.]+)/i,type:"iframe",w:560,h:314,url:"www.youtube.com/embed/$1",allowFullscreen:!0},{regex:/youtube\.com(.+)v=([^&]+)(&([a-z0-9&=\-_]+))?/i,type:"iframe",w:560,h:314,url:"www.youtube.com/embed/$2?$4",allowFullscreen:!0},{regex:/youtube.com\/embed\/([a-z0-9\?&=\-_]+)/i,type:"iframe",w:560,h:314,url:"www.youtube.com/embed/$1",allowFullscreen:!0},{regex:/vimeo\.com\/([0-9]+)\?h=(\w+)/,type:"iframe",w:425,h:350,url:"player.vimeo.com/video/$1?h=$2&title=0&byline=0&portrait=0&color=8dc7dc",allowFullscreen:!0},{regex:/vimeo\.com\/(.*)\/([0-9]+)\?h=(\w+)/,type:"iframe",w:425,h:350,url:"player.vimeo.com/video/$2?h=$3&title=0&byline=0",allowFullscreen:!0},{regex:/vimeo\.com\/([0-9]+)/,type:"iframe",w:425,h:350,url:"player.vimeo.com/video/$1?title=0&byline=0&portrait=0&color=8dc7dc",allowFullscreen:!0},{regex:/vimeo\.com\/(.*)\/([0-9]+)/,type:"iframe",w:425,h:350,url:"player.vimeo.com/video/$2?title=0&byline=0",allowFullscreen:!0},{regex:/maps\.google\.([a-z]{2,3})\/maps\/(.+)msid=(.+)/,type:"iframe",w:425,h:350,url:'maps.google.com/maps/ms?msid=$2&output=embed"',allowFullscreen:!1},{regex:/dailymotion\.com\/video\/([^_]+)/,type:"iframe",w:480,h:270,url:"www.dailymotion.com/embed/video/$1",allowFullscreen:!0},{regex:/dai\.ly\/([^_]+)/,type:"iframe",w:480,h:270,url:"www.dailymotion.com/embed/video/$1",allowFullscreen:!0}],I=(e,t)=>{const r=(e=>{const t=e.match(/^(https?:\/\/|www\.)(.+)$/i);return t&&t.length>1?"www."===t[1]?"https://":t[1]:"https://"})(t),o=e.regex.exec(t);let a=r+e.url;if(s(o))for(let e=0;eo[e]?o[e]:""));return a.replace(/\?$/,"")},B=e=>{const t=L.filter((t=>t.regex.test(e)));return t.length>0?j.extend({},t[0],{url:I(t[0],e)}):null},G=(e,t)=>{var r;const o=j.extend({},t);if(!o.source&&(j.extend(o,T(null!==(r=o.embed)&&void 0!==r?r:"",e.schema)),!o.source))return"";o.altsource||(o.altsource=""),o.poster||(o.poster=""),o.source=e.convertURL(o.source,"source"),o.altsource=e.convertURL(o.altsource,"source"),o.sourcemime=z(o.source),o.altsourcemime=z(o.altsource),o.poster=e.convertURL(o.poster,"poster");const a=B(o.source);if(a&&(o.source=a.url,o.type=a.type,o.allowfullscreen=a.allowFullscreen,o.width=o.width||String(a.w),o.height=o.height||String(a.h)),o.embed)return U(o.embed,o,!0,e.schema);{const t=g(e),r=b(e),a=w(e);return o.width=o.width||"300",o.height=o.height||"150",j.each(o,((t,r)=>{o[r]=e.dom.encode(""+t)})),"iframe"===o.type?((e,t)=>{if(t)return t(e);{const t=e.allowfullscreen?' allowFullscreen="1"':"";return'"}})(o,a):"application/x-shockwave-flash"===o.sourcemime?(e=>{let t='';return e.poster&&(t+=' '),t+=" ",t})(o):-1!==o.sourcemime.indexOf("audio")?((e,t)=>t?t(e):''+(e.altsource?'\n \n":"")+" ")(o,t):((e,t)=>t?t(e):'\n \n"+(e.altsource?' \n":"")+" ")(o,r)}},W=e=>e.hasAttribute("data-mce-object")||e.hasAttribute("data-ephox-embed-iri"),q={},H=e=>t=>G(e,t),J=(e,t)=>{const r=y(e);return r?((e,t,r)=>new Promise(((o,a)=>{const s=r=>(r.html&&(q[e.source]=r),o({url:e.source,html:r.html?r.html:t(e)}));q[e.source]?s(q[e.source]):r({url:e.source}).then(s).catch(a)})))(t,H(e),r):((e,t)=>Promise.resolve({html:t(e),url:e.source}))(t,H(e))},K=(e,t)=>{const r={};return d(e,"dimensions").each((e=>{l(["width","height"],(o=>{d(t,o).orThunk((()=>d(e,o))).each((e=>r[o]=e))}))})),r},Q=(e,t)=>{const r=t&&"dimensions"!==t?((e,t)=>d(t,e).bind((e=>d(e,"meta"))))(t,e).getOr({}):{},a=((e,t,r)=>a=>{const s=()=>d(e,a),n=()=>d(t,a),l=e=>d(e,"value").bind((e=>e.length>0?i.some(e):i.none()));return{[a]:(a===r?s().bind((e=>o(e)?l(e).orThunk(n):n().orThunk((()=>i.from(e))))):n().orThunk((()=>s().bind((e=>o(e)?l(e):i.from(e)))))).getOr("")}})(e,r,t);return{...a("source"),...a("altsource"),...a("poster"),...a("embed"),...K(e,r)}},V=e=>{const t={...e,source:{value:d(e,"source").getOr("")},altsource:{value:d(e,"altsource").getOr("")},poster:{value:d(e,"poster").getOr("")}};return l(["width","height"],(r=>{d(e,r).each((e=>{const o=t.dimensions||{};o[r]=e,t.dimensions=o}))})),t},X=e=>t=>{const r=t&&t.msg?"Media embed handler error: "+t.msg:"Media embed handler threw unknown error.";e.notificationManager.open({type:"error",text:r})},Y=(e,t)=>o=>{if(r(o.url)&&o.url.trim().length>0){const r=o.html,a={...T(r,t.schema),source:o.url,embed:r};e.setData(V(a))}},Z=(e,t)=>{const r=e.dom.select("*[data-mce-object]");e.insertContent(t),((e,t)=>{const r=e.dom.select("*[data-mce-object]");for(let e=0;e=0;o--)t[e]===r[o]&&r.splice(o,1);e.selection.select(r[0])})(e,r),e.nodeChanged()},ee=(e,t)=>s(t)&&"ephox-embed-iri"===t&&s(B(e)),te=(e,t)=>((e,t)=>e.width!==t.width||e.height!==t.height)(e,t)&&ee(t.source,e.type),re=e=>{const t=(e=>{const t=e.selection.getNode(),r=W(t)?e.serializer.serialize(t,{selection:!0}):"",o=T(r,e.schema),a=(()=>{if(ee(o.source,o.type)){const r=e.dom.getRect(t);return{width:r.w.toString().replace(/px$/,""),height:r.h.toString().replace(/px$/,"")}}return{}})();return{embed:r,...o,...a}})(e),r=(e=>{let t=e;return{get:()=>t,set:e=>{t=e}}})(t),o=V(t),a=k(e)?[{type:"sizeinput",name:"dimensions",label:"Constrain proportions",constrain:!0}]:[],s={title:"General",name:"general",items:c([[{name:"source",type:"urlinput",filetype:"media",label:"Source",picker_text:"Browse files"}],a])},i=[];x(e)&&i.push({name:"altsource",type:"urlinput",filetype:"media",label:"Alternative source URL"}),_(e)&&i.push({name:"poster",type:"urlinput",filetype:"image",label:"Media poster (Image URL)"});const n={title:"Advanced",name:"advanced",items:i},l=[s,{title:"Embed",items:[{type:"textarea",name:"embed",label:"Paste your embed code below:"}]}];i.length>0&&l.push(n);const m={type:"tabpanel",tabs:l},u=e.windowManager.open({title:"Insert/Edit Media",size:"normal",body:m,buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],onSubmit:t=>{const o=Q(t.getData());((e,t,r)=>{var o,a;t.embed=te(e,t)&&k(r)?G(r,{...t,embed:""}):U(null!==(o=t.embed)&&void 0!==o?o:"",t,!1,r.schema),t.embed&&(e.source===t.source||(a=t.source,h(q,a)))?Z(r,t.embed):J(r,t).then((e=>{Z(r,e.html)})).catch(X(r))})(r.get(),o,e),t.close()},onChange:(t,o)=>{switch(o.name){case"source":((t,r)=>{const o=Q(r.getData(),"source");t.source!==o.source&&(Y(u,e)({url:o.source,html:""}),J(e,o).then(Y(u,e)).catch(X(e)))})(r.get(),t);break;case"embed":(t=>{var r;const o=Q(t.getData()),a=T(null!==(r=o.embed)&&void 0!==r?r:"",e.schema);t.setData(V(a))})(t);break;case"dimensions":case"altsource":case"poster":((t,r,o)=>{const a=Q(t.getData(),r),s=te(o,a)&&k(e)?{...a,embed:""}:a,i=G(e,s);t.setData(V({...s,embed:i}))})(t,o.name,r.get())}r.set(Q(t.getData()))},initialData:o})};var oe=tinymce.util.Tools.resolve("tinymce.Env");const ae=e=>{const t=e.name;return"iframe"===t||"video"===t||"audio"===t},se=(e,t,r,o=null)=>{const a=e.attr(r);return s(a)?a:h(t,r)?null:o},ie=(e,t,r)=>{const o="img"===t.name||"video"===e.name,a=o?"300":null,s="audio"===e.name?"30":"150",i=o?s:null;t.attr({width:se(e,r,"width",a),height:se(e,r,"height",i)})},ne=(e,t)=>{const r=t.name,o=new D("img",1);return ce(e,t,o),ie(t,o,{}),o.attr({style:t.attr("style"),src:oe.transparentSrc,"data-mce-object":r,class:"mce-object mce-object-"+r}),o},le=(e,t)=>{var r;const o=t.name,a=new D("span",1);a.attr({contentEditable:"false",style:t.attr("style"),"data-mce-object":o,class:"mce-preview-object mce-object-"+o}),ce(e,t,a);const i=e.dom.parseStyle(null!==(r=t.attr("style"))&&void 0!==r?r:""),n=new D(o,1);if(ie(t,n,i),n.attr({src:t.attr("src"),style:t.attr("style"),class:t.attr("class")}),"iframe"===o)n.attr({allowfullscreen:t.attr("allowfullscreen"),frameborder:"0",sandbox:t.attr("sandbox")});else{l(["controls","crossorigin","currentTime","loop","muted","poster","preload"],(e=>{n.attr(e,t.attr(e))}));const r=a.attr("data-mce-html");s(r)&&((e,t,r,o)=>{const a=M(e.schema).parse(o,{context:t});for(;a.firstChild;)r.append(a.firstChild)})(e,o,n,unescape(r))}const c=new D("span",1);return c.attr("class","mce-shim"),a.append(n),a.append(c),a},ce=(e,t,r)=>{var o;const a=null!==(o=t.attributes)&&void 0!==o?o:[];let s=a.length;for(;s--;){const t=a[s].name;let o=a[s].value;"width"===t||"height"===t||"style"===t||(n="data-mce-",(i=t).length>=9&&i.substr(0,9)===n)||("data"!==t&&"src"!==t||(o=e.convertURL(o,t)),r.attr("data-mce-p-"+t,o))}var i,n;const c=F({inner:!0},e.schema),m=new D("div",1);l(t.children(),(e=>m.append(e)));const u=c.serialize(m);u&&(r.attr("data-mce-html",escape(u)),r.empty())},me=e=>{const t=e.attr("class");return r(t)&&/\btiny-pageembed\b/.test(t)},ue=e=>{let t=e;for(;t=t.parent;)if(t.attr("data-ephox-embed-iri")||me(t))return!0;return!1},de=(e,t,r)=>{const o=(0,e.options.get)("xss_sanitization"),a=f(e);return M(e.schema,{sanitize:o,validate:a}).parse(r,{context:t})},he=e=>t=>{const r=()=>{t.setEnabled(e.selection.isEditable())};return e.on("NodeChange",r),r(),()=>{e.off("NodeChange",r)}};e.add("media",(e=>((e=>{const t=e.options.register;t("audio_template_callback",{processor:"function"}),t("video_template_callback",{processor:"function"}),t("iframe_template_callback",{processor:"function"}),t("media_live_embeds",{processor:"boolean",default:!0}),t("media_filter_html",{processor:"boolean",default:!0}),t("media_url_resolver",{processor:"function"}),t("media_alt_source",{processor:"boolean",default:!0}),t("media_poster",{processor:"boolean",default:!0}),t("media_dimensions",{processor:"boolean",default:!0})})(e),(e=>{e.addCommand("mceMedia",(()=>{re(e)}))})(e),(e=>{const t=()=>e.execCommand("mceMedia");e.ui.registry.addToggleButton("media",{tooltip:"Insert/edit media",icon:"embed",onAction:t,onSetup:t=>{const r=e.selection;t.setActive(W(r.getNode()));const o=r.selectorChangedWithUnbind("img[data-mce-object],span[data-mce-object],div[data-ephox-embed-iri]",t.setActive).unbind,a=he(e)(t);return()=>{o(),a()}}}),e.ui.registry.addMenuItem("media",{icon:"embed",text:"Media...",onAction:t,onSetup:he(e)})})(e),(e=>{e.on("ResolveName",(e=>{let t;1===e.target.nodeType&&(t=e.target.getAttribute("data-mce-object"))&&(e.name=t)}))})(e),(e=>{e.on("PreInit",(()=>{const{schema:t,serializer:r,parser:o}=e,a=t.getBoolAttrs();l("webkitallowfullscreen mozallowfullscreen".split(" "),(e=>{a[e]={}})),((e,t)=>{const r=m(e);for(let o=0,a=r.length;o{const o=t.getElementRule(r);o&&l(e,(e=>{o.attributes[e]={},o.attributesOrder.push(e)}))})),o.addNodeFilter("iframe,video,audio,object,embed",(e=>t=>{let r,o=t.length;for(;o--;)r=t[o],r.parent&&(r.parent.attr("data-mce-object")||(ae(r)&&v(e)?ue(r)||r.replace(le(e,r)):ue(r)||r.replace(ne(e,r))))})(e)),r.addAttributeFilter("data-mce-object",((t,r)=>{var o;let a=t.length;for(;a--;){const s=t[a];if(!s.parent)continue;const i=s.attr(r),n=new D(i,1);if("audio"!==i){const e=s.attr("class");e&&-1!==e.indexOf("mce-preview-object")&&s.firstChild?n.attr({width:s.firstChild.attr("width"),height:s.firstChild.attr("height")}):n.attr({width:s.attr("width"),height:s.attr("height")})}n.attr({style:s.attr("style")});const c=null!==(o=s.attributes)&&void 0!==o?o:[];let m=c.length;for(;m--;){const e=c[m].name;0===e.indexOf("data-mce-p-")&&n.attr(e.substr(11),c[m].value)}const u=s.attr("data-mce-html");if(u){const t=de(e,i,unescape(u));l(t.children(),(e=>n.append(e)))}s.replace(n)}}))})),e.on("SetContent",(()=>{const t=e.dom;l(t.select("span.mce-preview-object"),(e=>{0===t.select("span.mce-shim",e).length&&t.add(e,"span",{class:"mce-shim"})}))}))})(e),(e=>{e.on("mousedown",(t=>{const r=e.dom.getParent(t.target,".mce-preview-object");r&&"2"===e.dom.getAttrib(r,"data-mce-selected")&&t.stopImmediatePropagation()})),e.on("click keyup touchend",(()=>{const t=e.selection.getNode();t&&e.dom.hasClass(t,"mce-preview-object")&&e.dom.getAttrib(t,"data-mce-selected")&&t.setAttribute("data-mce-selected","2")})),e.on("ObjectResized",(t=>{const r=t.target;if(r.getAttribute("data-mce-object")){let o=r.getAttribute("data-mce-html");o&&(o=unescape(o),r.setAttribute("data-mce-html",escape(U(o,{width:String(t.width),height:String(t.height)},!1,e.schema))))}}))})(e),(e=>({showDialog:()=>{re(e)}}))(e))))}();
\ No newline at end of file
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/nonbreaking/plugin.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/nonbreaking/plugin.js
deleted file mode 100644
index cc90291..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/nonbreaking/plugin.js
+++ /dev/null
@@ -1,123 +0,0 @@
-/**
- * TinyMCE version 7.1.0 (2024-05-08)
- */
-
-(function () {
- 'use strict';
-
- var global$1 = tinymce.util.Tools.resolve('tinymce.PluginManager');
-
- const isSimpleType = type => value => typeof value === type;
- const isBoolean = isSimpleType('boolean');
- const isNumber = isSimpleType('number');
-
- const option = name => editor => editor.options.get(name);
- const register$2 = editor => {
- const registerOption = editor.options.register;
- registerOption('nonbreaking_force_tab', {
- processor: value => {
- if (isBoolean(value)) {
- return {
- value: value ? 3 : 0,
- valid: true
- };
- } else if (isNumber(value)) {
- return {
- value,
- valid: true
- };
- } else {
- return {
- valid: false,
- message: 'Must be a boolean or number.'
- };
- }
- },
- default: false
- });
- registerOption('nonbreaking_wrap', {
- processor: 'boolean',
- default: true
- });
- };
- const getKeyboardSpaces = option('nonbreaking_force_tab');
- const wrapNbsps = option('nonbreaking_wrap');
-
- const stringRepeat = (string, repeats) => {
- let str = '';
- for (let index = 0; index < repeats; index++) {
- str += string;
- }
- return str;
- };
- const isVisualCharsEnabled = editor => editor.plugins.visualchars ? editor.plugins.visualchars.isEnabled() : false;
- const insertNbsp = (editor, times) => {
- const classes = () => isVisualCharsEnabled(editor) ? 'mce-nbsp-wrap mce-nbsp' : 'mce-nbsp-wrap';
- const nbspSpan = () => `${ stringRepeat(' ', times) } `;
- const shouldWrap = wrapNbsps(editor);
- const html = shouldWrap || editor.plugins.visualchars ? nbspSpan() : stringRepeat(' ', times);
- editor.undoManager.transact(() => editor.insertContent(html));
- };
-
- const register$1 = editor => {
- editor.addCommand('mceNonBreaking', () => {
- insertNbsp(editor, 1);
- });
- };
-
- var global = tinymce.util.Tools.resolve('tinymce.util.VK');
-
- const setup = editor => {
- const spaces = getKeyboardSpaces(editor);
- if (spaces > 0) {
- editor.on('keydown', e => {
- if (e.keyCode === global.TAB && !e.isDefaultPrevented()) {
- if (e.shiftKey) {
- return;
- }
- e.preventDefault();
- e.stopImmediatePropagation();
- insertNbsp(editor, spaces);
- }
- });
- }
- };
-
- const onSetupEditable = editor => api => {
- const nodeChanged = () => {
- api.setEnabled(editor.selection.isEditable());
- };
- editor.on('NodeChange', nodeChanged);
- nodeChanged();
- return () => {
- editor.off('NodeChange', nodeChanged);
- };
- };
- const register = editor => {
- const onAction = () => editor.execCommand('mceNonBreaking');
- editor.ui.registry.addButton('nonbreaking', {
- icon: 'non-breaking',
- tooltip: 'Nonbreaking space',
- onAction,
- onSetup: onSetupEditable(editor)
- });
- editor.ui.registry.addMenuItem('nonbreaking', {
- icon: 'non-breaking',
- text: 'Nonbreaking space',
- onAction,
- onSetup: onSetupEditable(editor)
- });
- };
-
- var Plugin = () => {
- global$1.add('nonbreaking', editor => {
- register$2(editor);
- register$1(editor);
- register(editor);
- setup(editor);
- });
- };
-
- Plugin();
-
-})();
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/nonbreaking/plugin.min.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/nonbreaking/plugin.min.js
deleted file mode 100644
index adea761..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/nonbreaking/plugin.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/**
- * TinyMCE version 7.1.0 (2024-05-08)
- */
-!function(){"use strict";var n=tinymce.util.Tools.resolve("tinymce.PluginManager");const e=n=>e=>typeof e===n,o=e("boolean"),a=e("number"),t=n=>e=>e.options.get(n),i=t("nonbreaking_force_tab"),s=t("nonbreaking_wrap"),r=(n,e)=>{let o="";for(let a=0;a{const o=s(n)||n.plugins.visualchars?`${r(" ",e)} `:r(" ",e);n.undoManager.transact((()=>n.insertContent(o)))};var l=tinymce.util.Tools.resolve("tinymce.util.VK");const u=n=>e=>{const o=()=>{e.setEnabled(n.selection.isEditable())};return n.on("NodeChange",o),o(),()=>{n.off("NodeChange",o)}};n.add("nonbreaking",(n=>{(n=>{const e=n.options.register;e("nonbreaking_force_tab",{processor:n=>o(n)?{value:n?3:0,valid:!0}:a(n)?{value:n,valid:!0}:{valid:!1,message:"Must be a boolean or number."},default:!1}),e("nonbreaking_wrap",{processor:"boolean",default:!0})})(n),(n=>{n.addCommand("mceNonBreaking",(()=>{c(n,1)}))})(n),(n=>{const e=()=>n.execCommand("mceNonBreaking");n.ui.registry.addButton("nonbreaking",{icon:"non-breaking",tooltip:"Nonbreaking space",onAction:e,onSetup:u(n)}),n.ui.registry.addMenuItem("nonbreaking",{icon:"non-breaking",text:"Nonbreaking space",onAction:e,onSetup:u(n)})})(n),(n=>{const e=i(n);e>0&&n.on("keydown",(o=>{if(o.keyCode===l.TAB&&!o.isDefaultPrevented()){if(o.shiftKey)return;o.preventDefault(),o.stopImmediatePropagation(),c(n,e)}}))})(n)}))}();
\ No newline at end of file
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/pagebreak/plugin.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/pagebreak/plugin.js
deleted file mode 100644
index 7d23ec3..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/pagebreak/plugin.js
+++ /dev/null
@@ -1,117 +0,0 @@
-/**
- * TinyMCE version 7.1.0 (2024-05-08)
- */
-
-(function () {
- 'use strict';
-
- var global$1 = tinymce.util.Tools.resolve('tinymce.PluginManager');
-
- var global = tinymce.util.Tools.resolve('tinymce.Env');
-
- const option = name => editor => editor.options.get(name);
- const register$2 = editor => {
- const registerOption = editor.options.register;
- registerOption('pagebreak_separator', {
- processor: 'string',
- default: ''
- });
- registerOption('pagebreak_split_block', {
- processor: 'boolean',
- default: false
- });
- };
- const getSeparatorHtml = option('pagebreak_separator');
- const shouldSplitBlock = option('pagebreak_split_block');
-
- const pageBreakClass = 'mce-pagebreak';
- const getPlaceholderHtml = shouldSplitBlock => {
- const html = ` `;
- return shouldSplitBlock ? `${ html }
` : html;
- };
- const setup$1 = editor => {
- const separatorHtml = getSeparatorHtml(editor);
- const shouldSplitBlock$1 = () => shouldSplitBlock(editor);
- const pageBreakSeparatorRegExp = new RegExp(separatorHtml.replace(/[\?\.\*\[\]\(\)\{\}\+\^\$\:]/g, a => {
- return '\\' + a;
- }), 'gi');
- editor.on('BeforeSetContent', e => {
- e.content = e.content.replace(pageBreakSeparatorRegExp, getPlaceholderHtml(shouldSplitBlock$1()));
- });
- editor.on('PreInit', () => {
- editor.serializer.addNodeFilter('img', nodes => {
- let i = nodes.length, node, className;
- while (i--) {
- node = nodes[i];
- className = node.attr('class');
- if (className && className.indexOf(pageBreakClass) !== -1) {
- const parentNode = node.parent;
- if (parentNode && editor.schema.getBlockElements()[parentNode.name] && shouldSplitBlock$1()) {
- parentNode.type = 3;
- parentNode.value = separatorHtml;
- parentNode.raw = true;
- node.remove();
- continue;
- }
- node.type = 3;
- node.value = separatorHtml;
- node.raw = true;
- }
- }
- });
- });
- };
-
- const register$1 = editor => {
- editor.addCommand('mcePageBreak', () => {
- editor.insertContent(getPlaceholderHtml(shouldSplitBlock(editor)));
- });
- };
-
- const setup = editor => {
- editor.on('ResolveName', e => {
- if (e.target.nodeName === 'IMG' && editor.dom.hasClass(e.target, pageBreakClass)) {
- e.name = 'pagebreak';
- }
- });
- };
-
- const onSetupEditable = editor => api => {
- const nodeChanged = () => {
- api.setEnabled(editor.selection.isEditable());
- };
- editor.on('NodeChange', nodeChanged);
- nodeChanged();
- return () => {
- editor.off('NodeChange', nodeChanged);
- };
- };
- const register = editor => {
- const onAction = () => editor.execCommand('mcePageBreak');
- editor.ui.registry.addButton('pagebreak', {
- icon: 'page-break',
- tooltip: 'Page break',
- onAction,
- onSetup: onSetupEditable(editor)
- });
- editor.ui.registry.addMenuItem('pagebreak', {
- text: 'Page break',
- icon: 'page-break',
- onAction,
- onSetup: onSetupEditable(editor)
- });
- };
-
- var Plugin = () => {
- global$1.add('pagebreak', editor => {
- register$2(editor);
- register$1(editor);
- register(editor);
- setup$1(editor);
- setup(editor);
- });
- };
-
- Plugin();
-
-})();
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/pagebreak/plugin.min.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/pagebreak/plugin.min.js
deleted file mode 100644
index ae452c6..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/pagebreak/plugin.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/**
- * TinyMCE version 7.1.0 (2024-05-08)
- */
-!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),a=tinymce.util.Tools.resolve("tinymce.Env");const t=e=>a=>a.options.get(e),n=t("pagebreak_separator"),o=t("pagebreak_split_block"),r="mce-pagebreak",s=e=>{const t=` `;return e?`${t}
`:t},c=e=>a=>{const t=()=>{a.setEnabled(e.selection.isEditable())};return e.on("NodeChange",t),t(),()=>{e.off("NodeChange",t)}};e.add("pagebreak",(e=>{(e=>{const a=e.options.register;a("pagebreak_separator",{processor:"string",default:"\x3c!-- pagebreak --\x3e"}),a("pagebreak_split_block",{processor:"boolean",default:!1})})(e),(e=>{e.addCommand("mcePageBreak",(()=>{e.insertContent(s(o(e)))}))})(e),(e=>{const a=()=>e.execCommand("mcePageBreak");e.ui.registry.addButton("pagebreak",{icon:"page-break",tooltip:"Page break",onAction:a,onSetup:c(e)}),e.ui.registry.addMenuItem("pagebreak",{text:"Page break",icon:"page-break",onAction:a,onSetup:c(e)})})(e),(e=>{const a=n(e),t=()=>o(e),c=new RegExp(a.replace(/[\?\.\*\[\]\(\)\{\}\+\^\$\:]/g,(e=>"\\"+e)),"gi");e.on("BeforeSetContent",(e=>{e.content=e.content.replace(c,s(t()))})),e.on("PreInit",(()=>{e.serializer.addNodeFilter("img",(n=>{let o,s,c=n.length;for(;c--;)if(o=n[c],s=o.attr("class"),s&&-1!==s.indexOf(r)){const n=o.parent;if(n&&e.schema.getBlockElements()[n.name]&&t()){n.type=3,n.value=a,n.raw=!0,o.remove();continue}o.type=3,o.value=a,o.raw=!0}}))}))})(e),(e=>{e.on("ResolveName",(a=>{"IMG"===a.target.nodeName&&e.dom.hasClass(a.target,r)&&(a.name="pagebreak")}))})(e)}))}();
\ No newline at end of file
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/preview/plugin.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/preview/plugin.js
deleted file mode 100644
index 424a151..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/preview/plugin.js
+++ /dev/null
@@ -1,97 +0,0 @@
-/**
- * TinyMCE version 7.1.0 (2024-05-08)
- */
-
-(function () {
- 'use strict';
-
- var global$2 = tinymce.util.Tools.resolve('tinymce.PluginManager');
-
- var global$1 = tinymce.util.Tools.resolve('tinymce.Env');
-
- var global = tinymce.util.Tools.resolve('tinymce.util.Tools');
-
- const option = name => editor => editor.options.get(name);
- const getContentStyle = option('content_style');
- const shouldUseContentCssCors = option('content_css_cors');
- const getBodyClass = option('body_class');
- const getBodyId = option('body_id');
-
- const getPreviewHtml = editor => {
- var _a;
- let headHtml = '';
- const encode = editor.dom.encode;
- const contentStyle = (_a = getContentStyle(editor)) !== null && _a !== void 0 ? _a : '';
- headHtml += ' ';
- const cors = shouldUseContentCssCors(editor) ? ' crossorigin="anonymous"' : '';
- global.each(editor.contentCSS, url => {
- headHtml += ' ';
- });
- if (contentStyle) {
- headHtml += '';
- }
- const bodyId = getBodyId(editor);
- const bodyClass = getBodyClass(editor);
- const isMetaKeyPressed = global$1.os.isMacOS() || global$1.os.isiOS() ? 'e.metaKey' : 'e.ctrlKey && !e.altKey';
- const preventClicksOnLinksScript = ' ';
- const directionality = editor.getBody().dir;
- const dirAttr = directionality ? ' dir="' + encode(directionality) + '"' : '';
- const previewHtml = '' + '' + '' + headHtml + '' + '' + editor.getContent() + preventClicksOnLinksScript + '' + '';
- return previewHtml;
- };
-
- const open = editor => {
- const content = getPreviewHtml(editor);
- const dataApi = editor.windowManager.open({
- title: 'Preview',
- size: 'large',
- body: {
- type: 'panel',
- items: [{
- name: 'preview',
- type: 'iframe',
- sandboxed: true,
- transparent: false
- }]
- },
- buttons: [{
- type: 'cancel',
- name: 'close',
- text: 'Close',
- primary: true
- }],
- initialData: { preview: content }
- });
- dataApi.focus('close');
- };
-
- const register$1 = editor => {
- editor.addCommand('mcePreview', () => {
- open(editor);
- });
- };
-
- const register = editor => {
- const onAction = () => editor.execCommand('mcePreview');
- editor.ui.registry.addButton('preview', {
- icon: 'preview',
- tooltip: 'Preview',
- onAction
- });
- editor.ui.registry.addMenuItem('preview', {
- icon: 'preview',
- text: 'Preview',
- onAction
- });
- };
-
- var Plugin = () => {
- global$2.add('preview', editor => {
- register$1(editor);
- register(editor);
- });
- };
-
- Plugin();
-
-})();
diff --git a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/preview/plugin.min.js b/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/preview/plugin.min.js
deleted file mode 100644
index b9459fd..0000000
--- a/src/AspNet.Core.Blazor.WebAssembly/wwwroot/lib/tinymce/plugins/preview/plugin.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/**
- * TinyMCE version 7.1.0 (2024-05-08)
- */
-!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=tinymce.util.Tools.resolve("tinymce.Env"),o=tinymce.util.Tools.resolve("tinymce.util.Tools");const n=e=>t=>t.options.get(e),i=n("content_style"),s=n("content_css_cors"),c=n("body_class"),r=n("body_id");e.add("preview",(e=>{(e=>{e.addCommand("mcePreview",(()=>{(e=>{const n=(e=>{var n;let l="";const a=e.dom.encode,d=null!==(n=i(e))&&void 0!==n?n:"";l+=' ';const m=s(e)?' crossorigin="anonymous"':"";o.each(e.contentCSS,(t=>{l+=' "})),d&&(l+='");const y=r(e),u=c(e),v='