@ckeditor/ckeditor5-image 29.2.0 → 30.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build/image.js CHANGED
@@ -2,4 +2,4 @@
2
2
  * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
3
3
  * For licensing, see LICENSE.md.
4
4
  */
5
- !function(e){const t=e.en=e.en||{};t.dictionary=Object.assign(t.dictionary||{},{"Break text":"Break text","Centered image":"Centered image","Change image text alternative":"Change image text alternative","Enter image caption":"Enter image caption","Full size image":"Full size image","Image resize list":"Image resize list","Image toolbar":"Image toolbar","image widget":"image widget","In line":"In line",Insert:"Insert","Insert image":"Insert image","Insert image via URL":"Insert image via URL","Left aligned image":"Left aligned image",Original:"Original","Resize image":"Resize image","Resize image to %0":"Resize image to %0","Resize image to the original size":"Resize image to the original size","Right aligned image":"Right aligned image","Side image":"Side image","Text alternative":"Text alternative",Update:"Update","Update image URL":"Update image URL","Upload failed":"Upload failed","Wrap text":"Wrap text"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})),window.CKEditor5=window.CKEditor5||{},window.CKEditor5.image=function(e){var t={};function i(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,i),o.l=!0,o.exports}return i.m=e,i.c=t,i.d=function(e,t,n){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(i.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)i.d(n,o,function(t){return e[t]}.bind(null,o));return n},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="",i(i.s=33)}([function(e,t,i){e.exports=i(7)("./src/core.js")},function(e,t,i){e.exports=i(7)("./src/ui.js")},function(e,t,i){e.exports=i(7)("./src/utils.js")},function(e,t,i){e.exports=i(7)("./src/widget.js")},function(e,t,i){e.exports=i(7)("./src/engine.js")},function(e,t,i){"use strict";var n,o=function(){return void 0===n&&(n=Boolean(window&&document&&document.all&&!window.atob)),n},a=function(){var e={};return function(t){if(void 0===e[t]){var i=document.querySelector(t);if(window.HTMLIFrameElement&&i instanceof window.HTMLIFrameElement)try{i=i.contentDocument.head}catch(e){i=null}e[t]=i}return e[t]}}(),s=[];function r(e){for(var t=-1,i=0;i<s.length;i++)if(s[i].identifier===e){t=i;break}return t}function l(e,t){for(var i={},n=[],o=0;o<e.length;o++){var a=e[o],l=t.base?a[0]+t.base:a[0],c=i[l]||0,g="".concat(l," ").concat(c);i[l]=c+1;var d=r(g),m={css:a[1],media:a[2],sourceMap:a[3]};-1!==d?(s[d].references++,s[d].updater(m)):s.push({identifier:g,updater:f(m,t),references:1}),n.push(g)}return n}function c(e){var t=document.createElement("style"),n=e.attributes||{};if(void 0===n.nonce){var o=i.nc;o&&(n.nonce=o)}if(Object.keys(n).forEach((function(e){t.setAttribute(e,n[e])})),"function"==typeof e.insert)e.insert(t);else{var s=a(e.insert||"head");if(!s)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");s.appendChild(t)}return t}var g,d=(g=[],function(e,t){return g[e]=t,g.filter(Boolean).join("\n")});function m(e,t,i,n){var o=i?"":n.media?"@media ".concat(n.media," {").concat(n.css,"}"):n.css;if(e.styleSheet)e.styleSheet.cssText=d(t,o);else{var a=document.createTextNode(o),s=e.childNodes;s[t]&&e.removeChild(s[t]),s.length?e.insertBefore(a,s[t]):e.appendChild(a)}}function u(e,t,i){var n=i.css,o=i.media,a=i.sourceMap;if(o?e.setAttribute("media",o):e.removeAttribute("media"),a&&"undefined"!=typeof btoa&&(n+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(a))))," */")),e.styleSheet)e.styleSheet.cssText=n;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(n))}}var p=null,h=0;function f(e,t){var i,n,o;if(t.singleton){var a=h++;i=p||(p=c(t)),n=m.bind(null,i,a,!1),o=m.bind(null,i,a,!0)}else i=c(t),n=u.bind(null,i,t),o=function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(i)};return n(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;n(e=t)}else o()}}e.exports=function(e,t){(t=t||{}).singleton||"boolean"==typeof t.singleton||(t.singleton=o());var i=l(e=e||[],t);return function(e){if(e=e||[],"[object Array]"===Object.prototype.toString.call(e)){for(var n=0;n<i.length;n++){var o=r(i[n]);s[o].references--}for(var a=l(e,t),c=0;c<i.length;c++){var g=r(i[c]);0===s[g].references&&(s[g].updater(),s.splice(g,1))}i=a}}}},function(e,t,i){e.exports=i(7)("./src/upload.js")},function(e,t){e.exports=CKEditor5.dll},function(e,t,i){e.exports=i(7)("./src/clipboard.js")},function(e,t,i){var n=i(5),o=i(16);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var a={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,a);e.exports=o.locals||{}},function(e,t,i){e.exports=i(7)("./src/undo.js")},,function(e,t,i){var n=i(5),o=i(13);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var a={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,a);e.exports=o.locals||{}},function(e,t){e.exports=".ck.ck-text-alternative-form{display:flex;flex-direction:row;flex-wrap:nowrap}.ck.ck-text-alternative-form .ck-labeled-field-view{display:inline-block}.ck.ck-text-alternative-form .ck-label{display:none}@media screen and (max-width:600px){.ck.ck-text-alternative-form{flex-wrap:wrap}.ck.ck-text-alternative-form .ck-labeled-field-view{flex-basis:100%}.ck.ck-text-alternative-form .ck-button{flex-basis:50%}}"},function(e,t,i){var n=i(5),o=i(15);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var a={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,a);e.exports=o.locals||{}},function(e,t){e.exports='.ck-vertical-form .ck-button:after{content:"";width:0;position:absolute;right:-1px;top:var(--ck-spacing-small);bottom:var(--ck-spacing-small);z-index:1}@media screen and (max-width:600px){.ck.ck-responsive-form .ck-button:after{content:"";width:0;position:absolute;right:-1px;top:var(--ck-spacing-small);bottom:var(--ck-spacing-small);z-index:1}}.ck-vertical-form>.ck-button:nth-last-child(2):after{border-right:1px solid var(--ck-color-base-border)}.ck.ck-responsive-form{padding:var(--ck-spacing-large)}.ck.ck-responsive-form:focus{outline:none}[dir=ltr] .ck.ck-responsive-form>:not(:first-child),[dir=rtl] .ck.ck-responsive-form>:not(:last-child){margin-left:var(--ck-spacing-standard)}@media screen and (max-width:600px){.ck.ck-responsive-form{padding:0;width:calc(var(--ck-input-text-width)*0.8)}.ck.ck-responsive-form .ck-labeled-field-view{margin:var(--ck-spacing-large) var(--ck-spacing-large) 0}.ck.ck-responsive-form .ck-labeled-field-view .ck-input-text{min-width:0;width:100%}.ck.ck-responsive-form .ck-labeled-field-view .ck-labeled-field-view__error{white-space:normal}.ck.ck-responsive-form>.ck-button:last-child,.ck.ck-responsive-form>.ck-button:nth-last-child(2){padding:var(--ck-spacing-standard);margin-top:var(--ck-spacing-large);border-radius:0;border:0;border-top:1px solid var(--ck-color-base-border)}[dir=ltr] .ck.ck-responsive-form>.ck-button:last-child,[dir=ltr] .ck.ck-responsive-form>.ck-button:nth-last-child(2),[dir=rtl] .ck.ck-responsive-form>.ck-button:last-child,[dir=rtl] .ck.ck-responsive-form>.ck-button:nth-last-child(2){margin-left:0}.ck.ck-responsive-form>.ck-button:nth-last-child(2):after,[dir=rtl] .ck.ck-responsive-form>.ck-button:last-child:last-of-type,[dir=rtl] .ck.ck-responsive-form>.ck-button:nth-last-child(2):last-of-type{border-right:1px solid var(--ck-color-base-border)}}'},function(e,t){e.exports=".ck-content .image{display:table;clear:both;text-align:center;margin:.9em auto;min-width:50px}.ck-content .image img{display:block;margin:0 auto;max-width:100%;min-width:100%}.ck-content .image-inline{display:inline-flex;max-width:100%;align-items:flex-start}.ck-content .image-inline picture{display:flex}.ck-content .image-inline img,.ck-content .image-inline picture{flex-grow:1;flex-shrink:1;max-width:100%}.ck.ck-editor__editable .image>figcaption.ck-placeholder:before{padding-left:inherit;padding-right:inherit;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ck.ck-editor__editable .image-inline.ck-widget_selected,.ck.ck-editor__editable .image.ck-widget_selected{z-index:1}.ck.ck-editor__editable .image-inline.ck-widget_selected ::selection{display:none}.ck.ck-editor__editable td .image-inline img,.ck.ck-editor__editable th .image-inline img{max-width:none}"},function(e,t,i){var n=i(5),o=i(18);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var a={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,a);e.exports=o.locals||{}},function(e,t){e.exports=":root{--ck-color-image-caption-background:#f7f7f7;--ck-color-image-caption-text:#333;--ck-color-image-caption-highligted-background:#fd0}.ck-content .image>figcaption{display:table-caption;caption-side:bottom;word-break:break-word;color:var(--ck-color-image-caption-text);background-color:var(--ck-color-image-caption-background);padding:.6em;font-size:.75em;outline-offset:-1px}.ck.ck-editor__editable .image>figcaption.image__caption_highlighted{animation:ck-image-caption-highlight .6s ease-out}@keyframes ck-image-caption-highlight{0%{background-color:var(--ck-color-image-caption-highligted-background)}to{background-color:var(--ck-color-image-caption-background)}}"},function(e,t,i){var n=i(5),o=i(20);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var a={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,a);e.exports=o.locals||{}},function(e,t){e.exports=".ck.ck-editor__editable .image,.ck.ck-editor__editable .image-inline{position:relative}.ck.ck-editor__editable .image-inline .ck-progress-bar,.ck.ck-editor__editable .image .ck-progress-bar{position:absolute;top:0;left:0}.ck.ck-editor__editable .image-inline.ck-appear,.ck.ck-editor__editable .image.ck-appear{animation:fadeIn .7s}.ck.ck-editor__editable .image-inline .ck-progress-bar,.ck.ck-editor__editable .image .ck-progress-bar{height:2px;width:0;background:var(--ck-color-upload-bar-background);transition:width .1s}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}"},function(e,t,i){var n=i(5),o=i(22);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var a={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,a);e.exports=o.locals||{}},function(e,t){e.exports='.ck-image-upload-complete-icon{display:block;position:absolute;top:min(var(--ck-spacing-medium),6%);right:min(var(--ck-spacing-medium),6%);border-radius:50%;z-index:1}.ck-image-upload-complete-icon:after{content:"";position:absolute}:root{--ck-color-image-upload-icon:#fff;--ck-color-image-upload-icon-background:#008a00;--ck-image-upload-icon-size:20;--ck-image-upload-icon-width:2px;--ck-image-upload-icon-is-visible:clamp(0px,100% - 50px,1px)}.ck-image-upload-complete-icon{opacity:0;background:var(--ck-color-image-upload-icon-background);animation-name:ck-upload-complete-icon-show,ck-upload-complete-icon-hide;animation-fill-mode:forwards,forwards;animation-duration:.5s,.5s;font-size:calc(1px*var(--ck-image-upload-icon-size));animation-delay:0ms,3s;overflow:hidden;width:calc(var(--ck-image-upload-icon-is-visible)*var(--ck-image-upload-icon-size));height:calc(var(--ck-image-upload-icon-is-visible)*var(--ck-image-upload-icon-size))}.ck-image-upload-complete-icon:after{left:25%;top:50%;opacity:0;height:0;width:0;transform:scaleX(-1) rotate(135deg);transform-origin:left top;border-top:var(--ck-image-upload-icon-width) solid var(--ck-color-image-upload-icon);border-right:var(--ck-image-upload-icon-width) solid var(--ck-color-image-upload-icon);animation-name:ck-upload-complete-icon-check;animation-duration:.5s;animation-delay:.5s;animation-fill-mode:forwards;box-sizing:border-box}@keyframes ck-upload-complete-icon-show{0%{opacity:0}to{opacity:1}}@keyframes ck-upload-complete-icon-hide{0%{opacity:1}to{opacity:0}}@keyframes ck-upload-complete-icon-check{0%{opacity:1;width:0;height:0}33%{width:.3em;height:0}to{opacity:1;width:.3em;height:.45em}}'},function(e,t,i){var n=i(5),o=i(24);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var a={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,a);e.exports=o.locals||{}},function(e,t){e.exports='.ck .ck-upload-placeholder-loader{position:absolute;display:flex;align-items:center;justify-content:center;top:0;left:0}.ck .ck-upload-placeholder-loader:before{content:"";position:relative}:root{--ck-color-upload-placeholder-loader:#b3b3b3;--ck-upload-placeholder-loader-size:32px}.ck .ck-image-upload-placeholder{width:100%;margin:0}.ck .ck-upload-placeholder-loader{width:100%;height:100%}.ck .ck-upload-placeholder-loader:before{width:var(--ck-upload-placeholder-loader-size);height:var(--ck-upload-placeholder-loader-size);border-radius:50%;border-top:3px solid var(--ck-color-upload-placeholder-loader);border-right:2px solid transparent;animation:ck-upload-placeholder-loader 1s linear infinite}@keyframes ck-upload-placeholder-loader{to{transform:rotate(1turn)}}'},function(e,t,i){var n=i(5),o=i(26);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var a={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,a);e.exports=o.locals||{}},function(e,t){e.exports=".ck.ck-image-insert-form:focus{outline:none}.ck.ck-form__row{display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:space-between}.ck.ck-form__row>:not(.ck-label){flex-grow:1}.ck.ck-form__row.ck-image-insert-form__action-row{margin-top:var(--ck-spacing-standard)}.ck.ck-form__row.ck-image-insert-form__action-row .ck-button-cancel,.ck.ck-form__row.ck-image-insert-form__action-row .ck-button-save{justify-content:center}.ck.ck-form__row.ck-image-insert-form__action-row .ck-button .ck-button__label{color:var(--ck-color-text)}"},function(e,t,i){var n=i(5),o=i(28);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var a={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,a);e.exports=o.locals||{}},function(e,t){e.exports=".ck.ck-image-insert__panel{padding:var(--ck-spacing-large)}.ck.ck-image-insert__ck-finder-button{display:block;width:100%;margin:var(--ck-spacing-standard) auto;border:1px solid #ccc;border-radius:var(--ck-border-radius)}.ck.ck-splitbutton>.ck-file-dialog-button.ck-button{padding:0;margin:0;border:none}"},function(e,t,i){var n=i(5),o=i(30);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var a={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,a);e.exports=o.locals||{}},function(e,t){e.exports=".ck-content .image.image_resized{max-width:100%;display:block;box-sizing:border-box}.ck-content .image.image_resized img{width:100%}.ck-content .image.image_resized>figcaption{display:block}.ck.ck-editor__editable td .image-inline.image_resized img,.ck.ck-editor__editable th .image-inline.image_resized img{max-width:100%}[dir=ltr] .ck.ck-button.ck-button_with-text.ck-resize-image-button .ck-button__icon{margin-right:var(--ck-spacing-standard)}[dir=rtl] .ck.ck-button.ck-button_with-text.ck-resize-image-button .ck-button__icon{margin-left:var(--ck-spacing-standard)}.ck.ck-dropdown .ck-button.ck-resize-image-button .ck-button__label{width:4em}"},function(e,t,i){var n=i(5),o=i(32);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var a={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,a);e.exports=o.locals||{}},function(e,t){e.exports=":root{--ck-image-style-spacing:1.5em;--ck-inline-image-style-spacing:calc(var(--ck-image-style-spacing)/2)}.ck-content .image-style-block-align-left,.ck-content .image-style-block-align-right{max-width:calc(100% - var(--ck-image-style-spacing))}.ck-content .image-style-align-left,.ck-content .image-style-align-right{clear:none}.ck-content .image-style-side{float:right;margin-left:var(--ck-image-style-spacing);max-width:50%}.ck-content .image-style-align-left{float:left;margin-right:var(--ck-image-style-spacing)}.ck-content .image-style-align-center{margin-left:auto;margin-right:auto}.ck-content .image-style-align-right{float:right;margin-left:var(--ck-image-style-spacing)}.ck-content .image-style-block-align-right{margin-right:0;margin-left:auto}.ck-content .image-style-block-align-left{margin-left:0;margin-right:auto}.ck-content p+.image-style-align-left,.ck-content p+.image-style-align-right,.ck-content p+.image-style-side{margin-top:0}.ck-content .image-inline.image-style-align-left,.ck-content .image-inline.image-style-align-right{margin-top:var(--ck-inline-image-style-spacing);margin-bottom:var(--ck-inline-image-style-spacing)}.ck-content .image-inline.image-style-align-left{margin-right:var(--ck-inline-image-style-spacing)}.ck-content .image-inline.image-style-align-right{margin-left:var(--ck-inline-image-style-spacing)}.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__action:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled):not(:hover),.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__action:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__arrow:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__arrow:not(.ck-disabled):not(:hover){background-color:var(--ck-color-button-on-background)}.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__action:not(.ck-disabled):after,.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled):after,.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled):not(:hover):after,.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__action:not(.ck-disabled):after,.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__arrow:not(.ck-disabled):after,.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__arrow:not(.ck-disabled):not(:hover):after{display:none}.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open:hover>.ck-splitbutton__action:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open:hover>.ck-splitbutton__arrow:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open:hover>.ck-splitbutton__arrow:not(.ck-disabled):not(:hover){background-color:var(--ck-color-button-on-hover-background)}"},function(e,t,i){"use strict";i.r(t),i.d(t,"AutoImage",(function(){return h})),i.d(t,"Image",(function(){return R})),i.d(t,"ImageEditing",(function(){return T})),i.d(t,"ImageCaption",(function(){return F})),i.d(t,"ImageCaptionEditing",(function(){return j})),i.d(t,"ImageInsert",(function(){return se})),i.d(t,"ImageInsertUI",(function(){return ae})),i.d(t,"ImageResize",(function(){return pe})),i.d(t,"ImageResizeButtons",(function(){return ge})),i.d(t,"ImageResizeEditing",(function(){return le})),i.d(t,"ImageResizeHandles",(function(){return ue})),i.d(t,"ImageStyle",(function(){return Pe})),i.d(t,"ImageStyleEditing",(function(){return Be})),i.d(t,"ImageStyleUI",(function(){return ze})),i.d(t,"ImageTextAlternative",(function(){return _})),i.d(t,"ImageTextAlternativeEditing",(function(){return b})),i.d(t,"ImageTextAlternativeUI",(function(){return v})),i.d(t,"ImageToolbar",(function(){return je})),i.d(t,"ImageUpload",(function(){return te})),i.d(t,"ImageUploadEditing",(function(){return Z})),i.d(t,"ImageUploadProgress",(function(){return H})),i.d(t,"ImageUploadUI",(function(){return $}));var n=i(0),o=i(8),a=i(4),s=i(10),r=i(2),l=i(3);function c(e,t){const i=e.createEmptyElement("img"),n="imageBlock"===t?e.createContainerElement("figure",{class:"image"}):e.createContainerElement("span",{class:"image-inline"},{isAllowedInsideAttributeElement:!0});return e.insert(e.createPositionAt(n,0),i),n}function g(e,t){if(e.plugins.has("ImageInlineEditing")!==e.plugins.has("ImageBlockEditing"))return{name:"img",attributes:{src:!0}};const i=e.plugins.get("ImageUtils");return e=>{if(!i.isInlineImageView(e)||!e.hasAttribute("src"))return null;return(e.findAncestor(i.isBlockImageView)?"imageBlock":"imageInline")!==t?null:{name:!0,attributes:["src"]}}}function d(e,t){const i=Object(r.first)(t.getSelectedBlocks());return!i||e.isObject(i)||i.isEmpty&&"listItem"!=i.name?"imageBlock":"imageInline"}class m extends n.Plugin{static get pluginName(){return"ImageUtils"}isImage(e){return this.isInlineImage(e)||this.isBlockImage(e)}isInlineImageView(e){return!!e&&e.is("element","img")}isBlockImageView(e){return!!e&&e.is("element","figure")&&e.hasClass("image")}insertImage(e={},t=null,i=null){const n=this.editor,o=n.model,a=o.document.selection;i=u(n,t||a,i),e={...Object.fromEntries(a.getAttributes()),...e};for(const t in e)o.schema.checkAttribute(i,t)||delete e[t];return o.change(n=>{const s=n.createElement(i,e);return t||"imageInline"==i||(t=Object(l.findOptimalInsertionRange)(a,o)),o.insertContent(s,t),s.parent?(n.setSelection(s,"on"),s):null})}getClosestSelectedImageWidget(e){const t=e.getSelectedElement();if(t&&this.isImageWidget(t))return t;let i=e.getFirstPosition().parent;for(;i;){if(i.is("element")&&this.isImageWidget(i))return i;i=i.parent}return null}getClosestSelectedImageElement(e){const t=e.getSelectedElement();return this.isImage(t)?t:e.getFirstPosition().findAncestor("imageBlock")}isImageAllowed(){const e=this.editor.model.document.selection;return function(e,t){if("imageBlock"==u(e,t)){const i=function(e,t){const i=Object(l.findOptimalInsertionRange)(e,t).start.parent;if(i.isEmpty&&!i.is("element","$root"))return i.parent;return i}(t,e.model);if(e.model.schema.checkChild(i,"imageBlock"))return!0}else if(e.model.schema.checkChild(t.focus,"imageInline"))return!0;return!1}(this.editor,e)&&function(e){return[...e.focus.getAncestors()].every(e=>!e.is("element","imageBlock"))}(e)}toImageWidget(e,t,i){t.setCustomProperty("image",!0,e);return Object(l.toWidget)(e,t,{label:()=>{const t=this.findViewImgElement(e).getAttribute("alt");return t?`${t} ${i}`:i}})}isImageWidget(e){return!!e.getCustomProperty("image")&&Object(l.isWidget)(e)}isBlockImage(e){return!!e&&e.is("element","imageBlock")}isInlineImage(e){return!!e&&e.is("element","imageInline")}findViewImgElement(e){if(this.isInlineImageView(e))return e;const t=this.editor.editing.view;for(const{item:i}of t.createRangeIn(e))if(this.isInlineImageView(i))return i}}function u(e,t,i){const n=e.model.schema,o=e.config.get("image.insert.type");return e.plugins.has("ImageBlockEditing")?e.plugins.has("ImageInlineEditing")?i||("inline"===o?"imageInline":"block"===o?"imageBlock":t.is("selection")?d(n,t):n.checkChild(t,"imageInline")?"imageInline":"imageBlock"):"imageBlock":"imageInline"}const p=new RegExp(String(/^(http(s)?:\/\/)?[\w-]+\.[\w.~:/[\]@!$&'()*+,;=%-]+/.source+/\.(jpg|jpeg|png|gif|ico|webp|JPG|JPEG|PNG|GIF|ICO|WEBP)/.source+/(\?[\w.~:/[\]@!$&'()*+,;=%-]*)?/.source+/(#[\w.~:/[\]@!$&'()*+,;=%-]*)?$/.source));class h extends n.Plugin{static get requires(){return[o.Clipboard,m,s.Undo]}static get pluginName(){return"AutoImage"}constructor(e){super(e),this._timeoutId=null,this._positionToInsert=null}init(){const e=this.editor,t=e.model.document;this.listenTo(e.plugins.get("ClipboardPipeline"),"inputTransformation",()=>{const e=t.selection.getFirstRange(),i=a.LivePosition.fromPosition(e.start);i.stickiness="toPrevious";const n=a.LivePosition.fromPosition(e.end);n.stickiness="toNext",t.once("change:data",()=>{this._embedImageBetweenPositions(i,n),i.detach(),n.detach()},{priority:"high"})}),e.commands.get("undo").on("execute",()=>{this._timeoutId&&(r.global.window.clearTimeout(this._timeoutId),this._positionToInsert.detach(),this._timeoutId=null,this._positionToInsert=null)},{priority:"high"})}_embedImageBetweenPositions(e,t){const i=this.editor,n=new a.LiveRange(e,t),o=n.getWalker({ignoreElementEnd:!0}),s=Object.fromEntries(i.model.document.selection.getAttributes()),l=this.editor.plugins.get("ImageUtils");let c="";for(const e of o)e.item.is("$textProxy")&&(c+=e.item.data);c=c.trim(),c.match(p)?(this._positionToInsert=a.LivePosition.fromPosition(e),this._timeoutId=r.global.window.setTimeout(()=>{i.commands.get("insertImage").isEnabled?i.model.change(e=>{let t;this._timeoutId=null,e.remove(n),n.detach(),"$graveyard"!==this._positionToInsert.root.rootName&&(t=this._positionToInsert.toPosition()),l.insertImage({...s,src:c},t),this._positionToInsert.detach(),this._positionToInsert=null}):n.detach()},100)):n.detach()}}class f extends n.Command{refresh(){const e=this.editor.plugins.get("ImageUtils").getClosestSelectedImageElement(this.editor.model.document.selection);this.isEnabled=!!e,this.isEnabled&&e.hasAttribute("alt")?this.value=e.getAttribute("alt"):this.value=!1}execute(e){const t=this.editor,i=t.plugins.get("ImageUtils"),n=t.model,o=i.getClosestSelectedImageElement(n.document.selection);n.change(t=>{t.setAttribute("alt",e.newValue,o)})}}class b extends n.Plugin{static get requires(){return[m]}static get pluginName(){return"ImageTextAlternativeEditing"}init(){this.editor.commands.add("imageTextAlternative",new f(this.editor))}}var k=i(1);i(12),i(14);class w extends k.View{constructor(e){super(e);const t=this.locale.t;this.focusTracker=new r.FocusTracker,this.keystrokes=new r.KeystrokeHandler,this.labeledInput=this._createLabeledInputView(),this.saveButtonView=this._createButton(t("Save"),n.icons.check,"ck-button-save"),this.saveButtonView.type="submit",this.cancelButtonView=this._createButton(t("Cancel"),n.icons.cancel,"ck-button-cancel","cancel"),this._focusables=new k.ViewCollection,this._focusCycler=new k.FocusCycler({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}}),this.setTemplate({tag:"form",attributes:{class:["ck","ck-text-alternative-form","ck-responsive-form"],tabindex:"-1"},children:[this.labeledInput,this.saveButtonView,this.cancelButtonView]}),Object(k.injectCssTransitionDisabler)(this)}render(){super.render(),this.keystrokes.listenTo(this.element),Object(k.submitHandler)({view:this}),[this.labeledInput,this.saveButtonView,this.cancelButtonView].forEach(e=>{this._focusables.add(e),this.focusTracker.add(e.element)})}_createButton(e,t,i,n){const o=new k.ButtonView(this.locale);return o.set({label:e,icon:t,tooltip:!0}),o.extendTemplate({attributes:{class:i}}),n&&o.delegate("execute").to(this,n),o}_createLabeledInputView(){const e=this.locale.t,t=new k.LabeledFieldView(this.locale,k.createLabeledInputText);return t.label=e("Text alternative"),t}}function I(e){const t=e.editing.view,i=k.BalloonPanelView.defaultPositions,n=e.plugins.get("ImageUtils");return{target:t.domConverter.viewToDom(n.getClosestSelectedImageWidget(t.document.selection)),positions:[i.northArrowSouth,i.northArrowSouthWest,i.northArrowSouthEast,i.southArrowNorth,i.southArrowNorthWest,i.southArrowNorthEast]}}class v extends n.Plugin{static get requires(){return[k.ContextualBalloon]}static get pluginName(){return"ImageTextAlternativeUI"}init(){this._createButton(),this._createForm()}destroy(){super.destroy(),this._form.destroy()}_createButton(){const e=this.editor,t=e.t;e.ui.componentFactory.add("imageTextAlternative",i=>{const o=e.commands.get("imageTextAlternative"),a=new k.ButtonView(i);return a.set({label:t("Change image text alternative"),icon:n.icons.lowVision,tooltip:!0}),a.bind("isEnabled").to(o,"isEnabled"),this.listenTo(a,"execute",()=>{this._showForm()}),a})}_createForm(){const e=this.editor,t=e.editing.view.document,i=e.plugins.get("ImageUtils");this._balloon=this.editor.plugins.get("ContextualBalloon"),this._form=new w(e.locale),this._form.render(),this.listenTo(this._form,"submit",()=>{e.execute("imageTextAlternative",{newValue:this._form.labeledInput.fieldView.element.value}),this._hideForm(!0)}),this.listenTo(this._form,"cancel",()=>{this._hideForm(!0)}),this._form.keystrokes.set("Esc",(e,t)=>{this._hideForm(!0),t()}),this.listenTo(e.ui,"update",()=>{i.getClosestSelectedImageWidget(t.selection)?this._isVisible&&function(e){const t=e.plugins.get("ContextualBalloon");if(e.plugins.get("ImageUtils").getClosestSelectedImageWidget(e.editing.view.document.selection)){const i=I(e);t.updatePosition(i)}}(e):this._hideForm(!0)}),Object(k.clickOutsideHandler)({emitter:this._form,activator:()=>this._isVisible,contextElements:[this._balloon.view.element],callback:()=>this._hideForm()})}_showForm(){if(this._isVisible)return;const e=this.editor,t=e.commands.get("imageTextAlternative"),i=this._form.labeledInput;this._form.disableCssTransitions(),this._isInBalloon||this._balloon.add({view:this._form,position:I(e)}),i.fieldView.value=i.fieldView.element.value=t.value||"",this._form.labeledInput.fieldView.select(),this._form.enableCssTransitions()}_hideForm(e){this._isInBalloon&&(this._form.focusTracker.isFocused&&this._form.saveButtonView.focus(),this._balloon.remove(this._form),e&&this.editor.editing.view.focus())}get _isVisible(){return this._balloon.visibleView===this._form}get _isInBalloon(){return this._balloon.hasView(this._form)}}class _ extends n.Plugin{static get requires(){return[b,v]}static get pluginName(){return"ImageTextAlternative"}}function y(e,t){return e=>{e.on("attribute:srcset:"+t,i)};function i(t,i,n){if(!n.consumable.consume(i.item,t.name))return;const o=n.writer,a=n.mapper.toViewElement(i.item),s=e.findViewImgElement(a);if(null===i.attributeNewValue){const e=i.attributeOldValue;e.data&&(o.removeAttribute("srcset",s),o.removeAttribute("sizes",s),e.width&&o.removeAttribute("width",s))}else{const e=i.attributeNewValue;e.data&&(o.setAttribute("srcset",e.data,s),o.setAttribute("sizes","100vw",s),e.width&&o.setAttribute("width",e.width,s))}}}function x(e,t,i){return e=>{e.on(`attribute:${i}:${t}`,n)};function n(t,i,n){if(!n.consumable.consume(i.item,t.name))return;const o=n.writer,a=n.mapper.toViewElement(i.item),s=e.findViewImgElement(a);o.setAttribute(i.attributeKey,i.attributeNewValue||"",s)}}class E extends a.Observer{observe(e){this.listenTo(e,"load",(e,t)=>{const i=t.target;this.checkShouldIgnoreEventFromTarget(i)||"IMG"==i.tagName&&this._fireEvents(t)},{useCapture:!0})}_fireEvents(e){this.isEnabled&&(this.document.fire("layoutChanged"),this.document.fire("imageLoaded",e))}}class C extends n.Command{constructor(e){super(e);const t=e.config.get("image.insert.type");e.plugins.has("ImageBlockEditing")||"block"===t&&Object(r.logWarning)("image-block-plugin-required"),e.plugins.has("ImageInlineEditing")||"inline"===t&&Object(r.logWarning)("image-inline-plugin-required")}refresh(){this.isEnabled=this.editor.plugins.get("ImageUtils").isImageAllowed()}execute(e){const t=Object(r.toArray)(e.source),i=this.editor.model.document.selection,n=this.editor.plugins.get("ImageUtils"),o=Object.fromEntries(i.getAttributes());t.forEach((e,t)=>{const a=i.getSelectedElement();if("string"==typeof e&&(e={src:e}),t&&a&&n.isImage(a)){const t=this.editor.model.createPositionAfter(a);n.insertImage({...e,...o},t)}else n.insertImage({...e,...o})})}}class T extends n.Plugin{static get requires(){return[m]}static get pluginName(){return"ImageEditing"}init(){const e=this.editor,t=e.conversion;e.editing.view.addObserver(E),t.for("upcast").attributeToAttribute({view:{name:"img",key:"alt"},model:"alt"}).attributeToAttribute({view:{name:"img",key:"srcset"},model:{key:"srcset",value:e=>{const t={data:e.getAttribute("srcset")};return e.hasAttribute("width")&&(t.width=e.getAttribute("width")),t}}});const i=new C(e);e.commands.add("insertImage",i),e.commands.add("imageInsert",i)}}class S extends n.Command{constructor(e,t){super(e),this._modelElementName=t}refresh(){const e=this.editor.plugins.get("ImageUtils"),t=e.getClosestSelectedImageElement(this.editor.model.document.selection);"imageBlock"===this._modelElementName?this.isEnabled=e.isInlineImage(t):this.isEnabled=e.isBlockImage(t)}execute(){const e=this.editor,t=this.editor.model,i=e.plugins.get("ImageUtils"),n=i.getClosestSelectedImageElement(t.document.selection),o=Object.fromEntries(n.getAttributes());return o.src||o.uploadId?t.change(e=>{const a=Array.from(t.markers).filter(e=>e.getRange().containsItem(n)),s=i.insertImage(o,t.createSelection(n,"on"),this._modelElementName);if(!s)return null;const r=e.createRangeOn(s);for(const t of a){const i=t.getRange(),n="$graveyard"!=i.root.rootName?i.getJoined(r,!0):r;e.updateMarker(t,{range:n})}return{oldElement:n,newElement:s}}):null}}class B extends n.Plugin{static get requires(){return[T,m,o.ClipboardPipeline]}static get pluginName(){return"ImageBlockEditing"}init(){const e=this.editor;e.model.schema.register("imageBlock",{isObject:!0,isBlock:!0,allowWhere:"$block",allowAttributes:["alt","src","srcset"]}),this._setupConversion(),e.plugins.has("ImageInlineEditing")&&(e.commands.add("imageTypeBlock",new S(this.editor,"imageBlock")),this._setupClipboardIntegration())}_setupConversion(){const e=this.editor,t=e.t,i=e.conversion,n=e.plugins.get("ImageUtils");i.for("dataDowncast").elementToElement({model:"imageBlock",view:(e,{writer:t})=>c(t,"imageBlock")}),i.for("editingDowncast").elementToElement({model:"imageBlock",view:(e,{writer:i})=>n.toImageWidget(c(i,"imageBlock"),i,t("image widget"))}),i.for("downcast").add(x(n,"imageBlock","src")).add(x(n,"imageBlock","alt")).add(y(n,"imageBlock")),i.for("upcast").elementToElement({view:g(e,"imageBlock"),model:(e,{writer:t})=>t.createElement("imageBlock",{src:e.getAttribute("src")})}).add(function(e){return e=>{e.on("element:figure",t)};function t(t,i,n){if(!n.consumable.test(i.viewItem,{name:!0,classes:"image"}))return;const o=e.findViewImgElement(i.viewItem);if(!o||!o.hasAttribute("src")||!n.consumable.test(o,{name:!0}))return;const a=n.convertItem(o,i.modelCursor),s=Object(r.first)(a.modelRange.getItems());s&&(n.convertChildren(i.viewItem,s),n.updateConversionResult(s,i))}}(n))}_setupClipboardIntegration(){const e=this.editor,t=e.model,i=e.editing.view,n=e.plugins.get("ImageUtils");this.listenTo(e.plugins.get("ClipboardPipeline"),"inputTransformation",(o,s)=>{const r=Array.from(s.content.getChildren());let l;if(!r.every(n.isInlineImageView))return;l=s.targetRanges?e.editing.mapper.toModelRange(s.targetRanges[0]):t.document.selection.getFirstRange();const c=t.createSelection(l);if("imageBlock"===d(t.schema,c)){const e=new a.UpcastWriter(i.document),t=r.map(t=>e.createElement("figure",{class:"image"},t));s.content=e.createDocumentFragment(t)}})}}i(9);class A extends n.Plugin{static get requires(){return[B,l.Widget,_]}static get pluginName(){return"ImageBlock"}}class V extends n.Plugin{static get requires(){return[T,m,o.ClipboardPipeline]}static get pluginName(){return"ImageInlineEditing"}init(){const e=this.editor,t=e.model.schema;t.register("imageInline",{isObject:!0,isInline:!0,allowWhere:"$text",allowAttributes:["alt","src","srcset"]}),t.addChildCheck((e,t)=>{if(e.endsWith("caption")&&"imageInline"===t.name)return!1}),this._setupConversion(),e.plugins.has("ImageBlockEditing")&&(e.commands.add("imageTypeInline",new S(this.editor,"imageInline")),this._setupClipboardIntegration())}_setupConversion(){const e=this.editor,t=e.t,i=e.conversion,n=e.plugins.get("ImageUtils");i.for("dataDowncast").elementToElement({model:"imageInline",view:(e,{writer:t})=>t.createEmptyElement("img")}),i.for("editingDowncast").elementToElement({model:"imageInline",view:(e,{writer:i})=>n.toImageWidget(c(i,"imageInline"),i,t("image widget"))}),i.for("downcast").add(x(n,"imageInline","src")).add(x(n,"imageInline","alt")).add(y(n,"imageInline")),i.for("upcast").elementToElement({view:g(e,"imageInline"),model:(e,{writer:t})=>t.createElement("imageInline",{src:e.getAttribute("src")})})}_setupClipboardIntegration(){const e=this.editor,t=e.model,i=e.editing.view,n=e.plugins.get("ImageUtils");this.listenTo(e.plugins.get("ClipboardPipeline"),"inputTransformation",(o,s)=>{const r=Array.from(s.content.getChildren());let l;if(!r.every(n.isBlockImageView))return;l=s.targetRanges?e.editing.mapper.toModelRange(s.targetRanges[0]):t.document.selection.getFirstRange();const c=t.createSelection(l);if("imageInline"===d(t.schema,c)){const e=new a.UpcastWriter(i.document),t=r.map(t=>1===t.childCount?(Array.from(t.getAttributes()).forEach(i=>e.setAttribute(...i,n.findViewImgElement(t))),t.getChild(0)):t);s.content=e.createDocumentFragment(t)}})}}class z extends n.Plugin{static get requires(){return[V,l.Widget,_]}static get pluginName(){return"ImageInline"}}class R extends n.Plugin{static get requires(){return[A,z]}static get pluginName(){return"Image"}}function U(e){for(const t of e.getChildren())if(t&&t.is("element","caption"))return t;return null}function O(e,t){const i=t.getFirstPosition().findAncestor("caption");return i&&e.isBlockImage(i.parent)?i:null}class P extends n.Command{refresh(){const e=this.editor,t=e.plugins.get("ImageUtils");if(!e.plugins.has(B))return this.isEnabled=!1,void(this.value=!1);const i=e.model.document.selection,n=i.getSelectedElement();if(!n){const e=O(t,i);return this.isEnabled=!!e,void(this.value=!!e)}this.isEnabled=this.editor.plugins.get("ImageUtils").isImage(n),this.isEnabled?this.value=!!U(n):this.value=!1}execute(e={}){const{focusCaptionOnShow:t}=e;this.editor.model.change(e=>{this.value?this._hideImageCaption(e):this._showImageCaption(e,t)})}_showImageCaption(e,t){const i=this.editor.model.document.selection,n=this.editor.plugins.get("ImageCaptionEditing");let o=i.getSelectedElement();const a=n._getSavedCaption(o);this.editor.plugins.get("ImageUtils").isInlineImage(o)&&(this.editor.execute("imageTypeBlock"),o=i.getSelectedElement());const s=a||e.createElement("caption");e.append(s,o),t&&e.setSelection(s,"in")}_hideImageCaption(e){const t=this.editor,i=t.model.document.selection,n=t.plugins.get("ImageCaptionEditing"),o=t.plugins.get("ImageUtils");let a,s=i.getSelectedElement();s?a=U(s):(a=O(o,i),s=a.parent),n._saveCaption(s,a),e.setSelection(s,"on"),e.remove(a)}}class j extends n.Plugin{static get requires(){return[m]}static get pluginName(){return"ImageCaptionEditing"}constructor(e){super(e),this._savedCaptionsMap=new WeakMap}init(){const e=this.editor,t=e.model.schema;t.isRegistered("caption")?t.extend("caption",{allowIn:"imageBlock"}):t.register("caption",{allowIn:"imageBlock",allowContentOf:"$block",isLimit:!0}),e.commands.add("toggleImageCaption",new P(this.editor)),this._setupConversion(),this._setupImageTypeCommandsIntegration()}_setupConversion(){const e=this.editor,t=e.editing.view,i=e.plugins.get("ImageUtils"),n=e.t;e.conversion.for("upcast").elementToElement({view:e=>function(e,t){return"figcaption"==t.name&&e.isBlockImageView(t.parent)?{name:!0}:null}(i,e),model:"caption"}),e.conversion.for("dataDowncast").elementToElement({model:"caption",view:(e,{writer:t})=>i.isBlockImage(e.parent)?t.createContainerElement("figcaption"):null}),e.conversion.for("editingDowncast").elementToElement({model:"caption",view:(e,{writer:o})=>{if(!i.isBlockImage(e.parent))return null;const s=o.createEditableElement("figcaption");o.setCustomProperty("imageCaption",!0,s),Object(a.enablePlaceholder)({view:t,element:s,text:n("Enter image caption"),keepOnFocus:!0});const c=Object(l.toWidgetEditable)(s,o);return Object(l.setHighlightHandling)(c,o,(e,t,i)=>i.addClass(Object(r.toArray)(t.classes),e),(e,t,i)=>i.removeClass(Object(r.toArray)(t.classes),e)),c}}),e.editing.mapper.on("modelToViewPosition",N(t)),e.data.mapper.on("modelToViewPosition",N(t))}_setupImageTypeCommandsIntegration(){const e=this.editor,t=e.plugins.get("ImageUtils"),i=e.commands.get("imageTypeInline"),n=e.commands.get("imageTypeBlock"),o=e=>{if(!e.return)return;const{oldElement:i,newElement:n}=e.return;if(!i)return;if(t.isBlockImage(i)){const e=U(i);if(e)return void this._saveCaption(n,e)}const o=this._getSavedCaption(i);o&&this._saveCaption(n,o)};i&&this.listenTo(i,"execute",o,{priority:"low"}),n&&this.listenTo(n,"execute",o,{priority:"low"})}_getSavedCaption(e){const t=this._savedCaptionsMap.get(e);return t?a.Element.fromJSON(t):null}_saveCaption(e,t){this._savedCaptionsMap.set(e,t.toJSON())}}function N(e){return(t,i)=>{const n=i.modelPosition,o=n.parent;if(!o.is("element","imageBlock"))return;const a=i.mapper.toViewElement(o);i.viewPosition=e.createPositionAt(a,n.offset+1)}}class L extends n.Plugin{static get requires(){return[m]}static get pluginName(){return"ImageCaptionUI"}init(){const e=this.editor,t=e.editing.view,i=e.plugins.get("ImageUtils"),o=e.t;e.ui.componentFactory.add("toggleImageCaption",a=>{const s=e.commands.get("toggleImageCaption"),r=new k.ButtonView(a);return r.set({icon:n.icons.caption,tooltip:!0,isToggleable:!0}),r.bind("isOn","isEnabled").to(s,"value","isEnabled"),r.bind("label").to(s,"value",e=>o(e?"Toggle caption off":"Toggle caption on")),this.listenTo(r,"execute",()=>{e.execute("toggleImageCaption",{focusCaptionOnShow:!0});const n=O(i,e.model.document.selection);if(n){const i=e.editing.mapper.toViewElement(n);t.scrollToTheSelection(),t.change(e=>{e.addClass("image__caption_highlighted",i)})}}),r})}}i(17);class F extends n.Plugin{static get requires(){return[j,L]}static get pluginName(){return"ImageCaption"}}var D=i(6);function M(e){const t=e.map(e=>e.replace("+","\\+"));return new RegExp(`^image\\/(${t.join("|")})$`)}function W(e){return new Promise((t,i)=>{const n=e.getAttribute("src");fetch(n).then(e=>e.blob()).then(e=>{const i=q(e,n),o=i.replace("image/",""),a=new File([e],"image."+o,{type:i});t(a)}).catch(e=>e&&"TypeError"===e.name?function(e){return function(e){return new Promise((t,i)=>{const n=r.global.document.createElement("img");n.addEventListener("load",()=>{const e=r.global.document.createElement("canvas");e.width=n.width,e.height=n.height;e.getContext("2d").drawImage(n,0,0),e.toBlob(e=>e?t(e):i())}),n.addEventListener("error",()=>i()),n.src=e})}(e).then(t=>{const i=q(t,e),n=i.replace("image/","");return new File([t],"image."+n,{type:i})})}(n).then(t).catch(i):i(e))})}function q(e,t){return e.type?e.type:t.match(/data:(image\/\w+);base64/)?t.match(/data:(image\/\w+);base64/)[1].toLowerCase():"image/jpeg"}class $ extends n.Plugin{static get pluginName(){return"ImageUploadUI"}init(){const e=this.editor,t=e.t,i=i=>{const o=new D.FileDialogButtonView(i),a=e.commands.get("uploadImage"),s=e.config.get("image.upload.types"),r=M(s);return o.set({acceptedType:s.map(e=>"image/"+e).join(","),allowMultipleFiles:!0}),o.buttonView.set({label:t("Insert image"),icon:n.icons.image,tooltip:!0}),o.buttonView.bind("isEnabled").to(a),o.on("done",(t,i)=>{const n=Array.from(i).filter(e=>r.test(e.type));n.length&&e.execute("uploadImage",{file:n})}),o};e.ui.componentFactory.add("uploadImage",i),e.ui.componentFactory.add("imageUpload",i)}}i(19),i(21),i(23);class H extends n.Plugin{static get pluginName(){return"ImageUploadProgress"}constructor(e){super(e),this.placeholder="data:image/svg+xml;utf8,"+encodeURIComponent('<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 700 250"><rect rx="4"/></svg>')}init(){const e=this.editor;e.plugins.has("ImageBlockEditing")&&e.editing.downcastDispatcher.on("attribute:uploadStatus:imageBlock",(...e)=>this.uploadStatusChange(...e)),e.plugins.has("ImageInlineEditing")&&e.editing.downcastDispatcher.on("attribute:uploadStatus:imageInline",(...e)=>this.uploadStatusChange(...e))}uploadStatusChange(e,t,i){const n=this.editor,o=t.item,a=o.getAttribute("uploadId");if(!i.consumable.consume(t.item,e.name))return;const s=n.plugins.get("ImageUtils"),r=n.plugins.get(D.FileRepository),l=a?t.attributeNewValue:null,c=this.placeholder,g=n.editing.mapper.toViewElement(o),d=i.writer;if("reading"==l)return K(g,d),void G(s,c,g,d);if("uploading"==l){const e=r.loaders.get(a);return K(g,d),void(e?(J(g,d),function(e,t,i,n){const o=function(e){const t=e.createUIElement("div",{class:"ck-progress-bar"});return e.setCustomProperty("progressBar",!0,t),t}(t);t.insert(t.createPositionAt(e,"end"),o),i.on("change:uploadedPercent",(e,t,i)=>{n.change(e=>{e.setStyle("width",i+"%",o)})})}(g,d,e,n.editing.view),function(e,t,i,n){if(n.data){const o=e.findViewImgElement(t);i.setAttribute("src",n.data,o)}}(s,g,d,e)):G(s,c,g,d))}"complete"==l&&r.loaders.get(a)&&function(e,t,i){const n=t.createUIElement("div",{class:"ck-image-upload-complete-icon"});t.insert(t.createPositionAt(e,"end"),n),setTimeout(()=>{i.change(e=>e.remove(e.createRangeOn(n)))},3e3)}(g,d,n.editing.view),function(e,t){Q(e,t,"progressBar")}(g,d),J(g,d),function(e,t){t.removeClass("ck-appear",e)}(g,d)}}function K(e,t){e.hasClass("ck-appear")||t.addClass("ck-appear",e)}function G(e,t,i,n){i.hasClass("ck-image-upload-placeholder")||n.addClass("ck-image-upload-placeholder",i);const o=e.findViewImgElement(i);o.getAttribute("src")!==t&&n.setAttribute("src",t,o),X(i,"placeholder")||n.insert(n.createPositionAfter(o),function(e){const t=e.createUIElement("div",{class:"ck-upload-placeholder-loader"});return e.setCustomProperty("placeholder",!0,t),t}(n))}function J(e,t){e.hasClass("ck-image-upload-placeholder")&&t.removeClass("ck-image-upload-placeholder",e),Q(e,t,"placeholder")}function X(e,t){for(const i of e.getChildren())if(i.getCustomProperty(t))return i}function Q(e,t,i){const n=X(e,i);n&&t.remove(t.createRangeOn(n))}class Y extends n.Command{refresh(){const e=this.editor,t=e.plugins.get("ImageUtils"),i=e.model.document.selection.getSelectedElement();this.isEnabled=t.isImageAllowed()||t.isImage(i)}execute(e){const t=Object(r.toArray)(e.file),i=this.editor.model.document.selection,n=this.editor.plugins.get("ImageUtils"),o=Object.fromEntries(i.getAttributes());t.forEach((e,t)=>{const a=i.getSelectedElement();if(t&&a&&n.isImage(a)){const t=this.editor.model.createPositionAfter(a);this._uploadImage(e,o,t)}else this._uploadImage(e,o)})}_uploadImage(e,t,i){const n=this.editor,o=n.plugins.get(D.FileRepository).createLoader(e),a=n.plugins.get("ImageUtils");o&&a.insertImage({...t,uploadId:o.id},i)}}class Z extends n.Plugin{static get requires(){return[D.FileRepository,k.Notification,o.ClipboardPipeline,m]}static get pluginName(){return"ImageUploadEditing"}constructor(e){super(e),e.config.define("image",{upload:{types:["jpeg","png","gif","bmp","webp","tiff"]}}),this._uploadImageElements=new Map}init(){const e=this.editor,t=e.model.document,i=e.conversion,n=e.plugins.get(D.FileRepository),o=e.plugins.get("ImageUtils"),s=M(e.config.get("image.upload.types")),r=new Y(e);e.commands.add("uploadImage",r),e.commands.add("imageUpload",r),i.for("upcast").attributeToAttribute({view:{name:"img",key:"uploadId"},model:"uploadId"}),this.listenTo(e.editing.view.document,"clipboardInput",(t,i)=>{if(n=i.dataTransfer,Array.from(n.types).includes("text/html")&&""!==n.getData("text/html"))return;var n;const o=Array.from(i.dataTransfer.files).filter(e=>!!e&&s.test(e.type));o.length&&(t.stop(),e.model.change(t=>{i.targetRanges&&t.setSelection(i.targetRanges.map(t=>e.editing.mapper.toModelRange(t))),e.model.enqueueChange("default",()=>{e.execute("uploadImage",{file:o})})}))}),this.listenTo(e.plugins.get("ClipboardPipeline"),"inputTransformation",(t,i)=>{const s=Array.from(e.editing.view.createRangeIn(i.content)).filter(e=>function(e,t){return!(!e.isInlineImageView(t)||!t.getAttribute("src"))&&(t.getAttribute("src").match(/^data:image\/\w+;base64,/g)||t.getAttribute("src").match(/^blob:/g))}(o,e.item)&&!e.item.getAttribute("uploadProcessed")).map(e=>({promise:W(e.item),imageElement:e.item}));if(!s.length)return;const r=new a.UpcastWriter(e.editing.view.document);for(const e of s){r.setAttribute("uploadProcessed",!0,e.imageElement);const t=n.createLoader(e.promise);t&&(r.setAttribute("src","",e.imageElement),r.setAttribute("uploadId",t.id,e.imageElement))}}),e.editing.view.document.on("dragover",(e,t)=>{t.preventDefault()}),t.on("change",()=>{const i=t.differ.getChanges({includeChangesInGraveyard:!0}).reverse(),o=new Set;for(const t of i)if("insert"==t.type&&"$text"!=t.name){const i=t.position.nodeAfter,a="$graveyard"==t.position.root.rootName;for(const t of ee(e,i)){const e=t.getAttribute("uploadId");if(!e)continue;const i=n.loaders.get(e);i&&(a?o.has(e)||i.abort():(o.add(e),this._uploadImageElements.set(e,t),"idle"==i.status&&this._readAndUpload(i)))}}}),this.on("uploadComplete",(e,{imageElement:t,data:i})=>{const n=i.urls?i.urls:i;this.editor.model.change(e=>{e.setAttribute("src",n.default,t),this._parseAndSetSrcsetAttributeOnImage(n,t,e)})},{priority:"low"})}afterInit(){const e=this.editor.model.schema;this.editor.plugins.has("ImageBlockEditing")&&e.extend("imageBlock",{allowAttributes:["uploadId","uploadStatus"]}),this.editor.plugins.has("ImageInlineEditing")&&e.extend("imageInline",{allowAttributes:["uploadId","uploadStatus"]})}_readAndUpload(e){const t=this.editor,i=t.model,n=t.locale.t,o=t.plugins.get(D.FileRepository),a=t.plugins.get(k.Notification),s=t.plugins.get("ImageUtils"),l=this._uploadImageElements;return i.enqueueChange("transparent",t=>{t.setAttribute("uploadStatus","reading",l.get(e.id))}),e.read().then(()=>{const n=e.upload(),o=l.get(e.id);if(r.env.isSafari){const e=t.editing.mapper.toViewElement(o),i=s.findViewImgElement(e);t.editing.view.once("render",()=>{if(!i.parent)return;const e=t.editing.view.domConverter.mapViewToDom(i.parent);if(!e)return;const n=e.style.display;e.style.display="none",e._ckHack=e.offsetHeight,e.style.display=n})}return i.enqueueChange("transparent",e=>{e.setAttribute("uploadStatus","uploading",o)}),n}).then(t=>{i.enqueueChange("transparent",i=>{const n=l.get(e.id);i.setAttribute("uploadStatus","complete",n),this.fire("uploadComplete",{data:t,imageElement:n})}),c()}).catch(t=>{if("error"!==e.status&&"aborted"!==e.status)throw t;"error"==e.status&&t&&a.showWarning(t,{title:n("Upload failed"),namespace:"upload"}),i.enqueueChange("transparent",t=>{t.remove(l.get(e.id))}),c()});function c(){i.enqueueChange("transparent",t=>{const i=l.get(e.id);t.removeAttribute("uploadId",i),t.removeAttribute("uploadStatus",i),l.delete(e.id)}),o.destroyLoader(e)}}_parseAndSetSrcsetAttributeOnImage(e,t,i){let n=0;const o=Object.keys(e).filter(e=>{const t=parseInt(e,10);if(!isNaN(t))return n=Math.max(n,t),!0}).map(t=>`${e[t]} ${t}w`).join(", ");""!=o&&i.setAttribute("srcset",{data:o,width:n},t)}}function ee(e,t){const i=e.plugins.get("ImageUtils");return Array.from(e.model.createRangeOn(t)).filter(e=>i.isImage(e.item)).map(e=>e.item)}class te extends n.Plugin{static get pluginName(){return"ImageUpload"}static get requires(){return[Z,$,H]}}i(25);class ie extends k.View{constructor(e,t={}){super(e);const i=this.bindTemplate;this.set("class",t.class||null),this.children=this.createCollection(),t.children&&t.children.forEach(e=>this.children.add(e)),this.set("_role",null),this.set("_ariaLabelledBy",null),t.labelView&&this.set({_role:"group",_ariaLabelledBy:t.labelView.id}),this.setTemplate({tag:"div",attributes:{class:["ck","ck-form__row",i.to("class")],role:i.to("_role"),"aria-labelledby":i.to("_ariaLabelledBy")},children:this.children})}}i(27);class ne extends k.View{constructor(e,t){super(e);const{insertButtonView:i,cancelButtonView:n}=this._createActionButtons(e);if(this.insertButtonView=i,this.cancelButtonView=n,this.dropdownView=this._createDropdownView(e),this.set("imageURLInputValue",""),this.focusTracker=new r.FocusTracker,this.keystrokes=new r.KeystrokeHandler,this._focusables=new k.ViewCollection,this._focusCycler=new k.FocusCycler({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}}),this.set("_integrations",new r.Collection),t)for(const[e,i]of Object.entries(t))"insertImageViaUrl"===e&&(i.fieldView.bind("value").to(this,"imageURLInputValue",e=>e||""),i.fieldView.on("input",()=>{this.imageURLInputValue=i.fieldView.element.value.trim()})),i.name=e,this._integrations.add(i);this.setTemplate({tag:"form",attributes:{class:["ck","ck-image-insert-form"],tabindex:"-1"},children:[...this._integrations,new ie(e,{children:[this.insertButtonView,this.cancelButtonView],class:"ck-image-insert-form__action-row"})]})}render(){super.render(),Object(k.submitHandler)({view:this});const e=[...this._integrations,this.insertButtonView,this.cancelButtonView];e.forEach(e=>{this._focusables.add(e),this.focusTracker.add(e.element)}),this.keystrokes.listenTo(this.element);const t=e=>e.stopPropagation();this.keystrokes.set("arrowright",t),this.keystrokes.set("arrowleft",t),this.keystrokes.set("arrowup",t),this.keystrokes.set("arrowdown",t),this.listenTo(e[0].element,"selectstart",(e,t)=>{t.stopPropagation()},{priority:"high"})}getIntegration(e){return this._integrations.find(t=>t.name===e)}_createDropdownView(e){const t=e.t,i=Object(k.createDropdown)(e,k.SplitButtonView),o=i.buttonView,a=i.panelView;return o.set({label:t("Insert image"),icon:n.icons.image,tooltip:!0}),a.extendTemplate({attributes:{class:"ck-image-insert__panel"}}),i}_createActionButtons(e){const t=e.t,i=new k.ButtonView(e),o=new k.ButtonView(e);return i.set({label:t("Insert"),icon:n.icons.check,class:"ck-button-save",type:"submit",withText:!0,isEnabled:this.imageURLInputValue}),o.set({label:t("Cancel"),icon:n.icons.cancel,class:"ck-button-cancel",withText:!0}),i.bind("isEnabled").to(this,"imageURLInputValue",e=>!!e),i.delegate("execute").to(this,"submit"),o.delegate("execute").to(this,"cancel"),{insertButtonView:i,cancelButtonView:o}}focus(){this._focusCycler.focusFirst()}}function oe(e){const t=e.t,i=new k.LabeledFieldView(e,k.createLabeledInputText);return i.set({label:t("Insert image via URL")}),i.fieldView.placeholder="https://example.com/image.png",i}class ae extends n.Plugin{static get pluginName(){return"ImageInsertUI"}init(){const e=this.editor,t=e=>this._createDropdownView(e);e.ui.componentFactory.add("insertImage",t),e.ui.componentFactory.add("imageInsert",t)}_createDropdownView(e){const t=this.editor,i=new ne(e,function(e){const t=e.config.get("image.insert.integrations"),i=e.plugins.get("ImageInsertUI"),n={insertImageViaUrl:oe(e.locale)};if(!t)return n;if(t.find(e=>"openCKFinder"===e)&&e.ui.componentFactory.has("ckfinder")){const t=e.ui.componentFactory.create("ckfinder");t.set({withText:!0,class:"ck-image-insert__ck-finder-button"}),t.delegate("execute").to(i,"cancel"),n.openCKFinder=t}return t.reduce((t,i)=>(n[i]?t[i]=n[i]:e.ui.componentFactory.has(i)&&(t[i]=e.ui.componentFactory.create(i)),t),{})}(t)),n=t.commands.get("uploadImage"),o=i.dropdownView,a=o.buttonView;return a.actionView=t.ui.componentFactory.create("uploadImage"),a.actionView.extendTemplate({attributes:{class:"ck ck-button ck-splitbutton__action"}}),this._setUpDropdown(o,i,n)}_setUpDropdown(e,t,i){const n=this.editor,o=n.t,a=t.insertButtonView,s=t.getIntegration("insertImageViaUrl"),r=e.panelView,l=this.editor.plugins.get("ImageUtils");function c(){n.editing.view.focus(),e.isOpen=!1}return e.bind("isEnabled").to(i),e.buttonView.once("open",()=>{r.children.add(t)}),e.on("change:isOpen",()=>{const i=n.model.document.selection.getSelectedElement();e.isOpen&&(t.focus(),l.isImage(i)?(t.imageURLInputValue=i.getAttribute("src"),a.label=o("Update"),s.label=o("Update image URL")):(t.imageURLInputValue="",a.label=o("Insert"),s.label=o("Insert image via URL")))},{priority:"low"}),t.delegate("submit","cancel").to(e),this.delegate("cancel").to(e),e.on("submit",()=>{c(),function(){const e=n.model.document.selection.getSelectedElement();l.isImage(e)?n.model.change(i=>{i.setAttribute("src",t.imageURLInputValue,e),i.removeAttribute("srcset",e),i.removeAttribute("sizes",e)}):n.execute("insertImage",{source:t.imageURLInputValue})}()}),e.on("cancel",()=>{c()}),e}}class se extends n.Plugin{static get pluginName(){return"ImageInsert"}static get requires(){return[te,ae]}}class re extends n.Command{refresh(){const e=this.editor,t=e.plugins.get("ImageUtils").getClosestSelectedImageElement(e.model.document.selection);this.isEnabled=!!t,t&&t.hasAttribute("width")?this.value={width:t.getAttribute("width"),height:null}:this.value=null}execute(e){const t=this.editor,i=t.model,n=t.plugins.get("ImageUtils").getClosestSelectedImageElement(i.document.selection);this.value={width:e.width,height:null},n&&i.change(t=>{t.setAttribute("width",e.width,n)})}}class le extends n.Plugin{static get requires(){return[m]}static get pluginName(){return"ImageResizeEditing"}constructor(e){super(e),e.config.define("image",{resizeUnit:"%",resizeOptions:[{name:"resizeImage:original",value:null,icon:"original"},{name:"resizeImage:25",value:"25",icon:"small"},{name:"resizeImage:50",value:"50",icon:"medium"},{name:"resizeImage:75",value:"75",icon:"large"}]})}init(){const e=this.editor,t=new re(e);this._registerSchema(),this._registerConverters("imageBlock"),this._registerConverters("imageInline"),e.commands.add("resizeImage",t),e.commands.add("imageResize",t)}_registerSchema(){this.editor.plugins.has("ImageBlockEditing")&&this.editor.model.schema.extend("imageBlock",{allowAttributes:"width"}),this.editor.plugins.has("ImageInlineEditing")&&this.editor.model.schema.extend("imageInline",{allowAttributes:"width"})}_registerConverters(e){const t=this.editor;t.conversion.for("downcast").add(t=>t.on("attribute:width:"+e,(e,t,i)=>{if(!i.consumable.consume(t.item,e.name))return;const n=i.writer,o=i.mapper.toViewElement(t.item);null!==t.attributeNewValue?(n.setStyle("width",t.attributeNewValue,o),n.addClass("image_resized",o)):(n.removeStyle("width",o),n.removeClass("image_resized",o))})),t.conversion.for("upcast").attributeToAttribute({view:{name:"imageBlock"===e?"figure":"img",styles:{width:/.+/}},model:{key:"width",value:e=>e.getStyle("width")}})}}const ce={small:n.icons.objectSizeSmall,medium:n.icons.objectSizeMedium,large:n.icons.objectSizeLarge,original:n.icons.objectSizeFull};class ge extends n.Plugin{static get requires(){return[le]}static get pluginName(){return"ImageResizeButtons"}constructor(e){super(e),this._resizeUnit=e.config.get("image.resizeUnit")}init(){const e=this.editor,t=e.config.get("image.resizeOptions"),i=e.commands.get("resizeImage");this.bind("isEnabled").to(i);for(const e of t)this._registerImageResizeButton(e);this._registerImageResizeDropdown(t)}_registerImageResizeButton(e){const t=this.editor,{name:i,value:n,icon:o}=e,a=n?n+this._resizeUnit:null;t.ui.componentFactory.add(i,i=>{const n=new k.ButtonView(i),s=t.commands.get("resizeImage"),l=this._getOptionLabelValue(e,!0);if(!ce[o])throw new r.CKEditorError("imageresizebuttons-missing-icon",t,e);return n.set({label:l,icon:ce[o],tooltip:l,isToggleable:!0}),n.bind("isEnabled").to(this),n.bind("isOn").to(s,"value",de(a)),this.listenTo(n,"execute",()=>{t.execute("resizeImage",{width:a})}),n})}_registerImageResizeDropdown(e){const t=this.editor,i=t.t,n=e.find(e=>!e.value),o=o=>{const a=t.commands.get("resizeImage"),s=Object(k.createDropdown)(o,k.DropdownButtonView),r=s.buttonView;return r.set({tooltip:i("Resize image"),commandValue:n.value,icon:ce.medium,isToggleable:!0,label:this._getOptionLabelValue(n),withText:!0,class:"ck-resize-image-button"}),r.bind("label").to(a,"value",e=>e&&e.width?e.width:this._getOptionLabelValue(n)),s.bind("isOn").to(a),s.bind("isEnabled").to(this),Object(k.addListToDropdown)(s,this._getResizeDropdownListItemDefinitions(e,a)),s.listView.ariaLabel=i("Image resize list"),this.listenTo(s,"execute",e=>{t.execute(e.source.commandName,{width:e.source.commandValue}),t.editing.view.focus()}),s};t.ui.componentFactory.add("resizeImage",o),t.ui.componentFactory.add("imageResize",o)}_getOptionLabelValue(e,t){const i=this.editor.t;return e.label?e.label:t?e.value?i("Resize image to %0",e.value+this._resizeUnit):i("Resize image to the original size"):e.value?e.value+this._resizeUnit:i("Original")}_getResizeDropdownListItemDefinitions(e,t){const i=new r.Collection;return e.map(e=>{const n=e.value?e.value+this._resizeUnit:null,o={type:"button",model:new k.Model({commandName:"resizeImage",commandValue:n,label:this._getOptionLabelValue(e),withText:!0,icon:null})};o.model.bind("isOn").to(t,"value",de(n)),i.add(o)}),i}}function de(e){return t=>null===e&&t===e||t&&t.width===e}const me=/(image|image-inline)/;class ue extends n.Plugin{static get requires(){return[l.WidgetResize]}static get pluginName(){return"ImageResizeHandles"}init(){const e=this.editor.commands.get("resizeImage");this.bind("isEnabled").to(e),this._setupResizerCreator()}_setupResizerCreator(){const e=this.editor,t=e.editing.view;t.addObserver(E),this.listenTo(t.document,"imageLoaded",(i,n)=>{if(!n.target.matches("figure.image.ck-widget > img,figure.image.ck-widget > picture > img,figure.image.ck-widget > a > img,figure.image.ck-widget > a > picture > img,span.image-inline.ck-widget > img,span.image-inline.ck-widget > picture > img"))return;const o=e.editing.view.domConverter,a=o.domToView(n.target).findAncestor({classes:me});let s=this.editor.plugins.get(l.WidgetResize).getResizerByViewElement(a);if(s)return void s.redraw();const r=e.editing.mapper,c=r.toModelElement(a);s=e.plugins.get(l.WidgetResize).attachTo({unit:e.config.get("image.resizeUnit"),modelElement:c,viewElement:a,editor:e,getHandleHost:e=>e.querySelector("img"),getResizeHost:()=>o.viewToDom(r.toViewElement(c.parent)),isCentered(){const e=c.getAttribute("imageStyle");return!e||"block"==e||"alignCenter"==e},onCommit(i){t.change(e=>{e.removeClass("image_resized",a)}),e.execute("resizeImage",{width:i})}}),s.on("updateSize",()=>{a.hasClass("image_resized")||t.change(e=>{e.addClass("image_resized",a)})}),s.bind("isEnabled").to(this)})}}i(29);class pe extends n.Plugin{static get requires(){return[le,ue,ge]}static get pluginName(){return"ImageResize"}}class he extends n.Command{constructor(e,t){super(e),this._defaultStyles={imageBlock:!1,imageInline:!1},this._styles=new Map(t.map(e=>{if(e.isDefault)for(const t of e.modelElements)this._defaultStyles[t]=e.name;return[e.name,e]}))}refresh(){const e=this.editor.plugins.get("ImageUtils").getClosestSelectedImageElement(this.editor.model.document.selection);this.isEnabled=!!e,this.isEnabled?e.hasAttribute("imageStyle")?this.value=e.getAttribute("imageStyle"):this.value=this._defaultStyles[e.name]:this.value=!1}execute(e={}){const t=this.editor,i=t.model,n=t.plugins.get("ImageUtils");i.change(t=>{const o=e.value;let a=n.getClosestSelectedImageElement(i.document.selection);o&&this.shouldConvertImageType(o,a)&&(this.editor.execute(n.isBlockImage(a)?"imageTypeInline":"imageTypeBlock"),a=n.getClosestSelectedImageElement(i.document.selection)),!o||this._styles.get(o).isDefault?t.removeAttribute("imageStyle",a):t.setAttribute("imageStyle",o,a)})}shouldConvertImageType(e,t){return!this._styles.get(e).modelElements.includes(t.name)}}const{objectFullWidth:fe,objectInline:be,objectLeft:ke,objectRight:we,objectCenter:Ie,objectBlockLeft:ve,objectBlockRight:_e}=n.icons,ye={inline:{name:"inline",title:"In line",icon:be,modelElements:["imageInline"],isDefault:!0},alignLeft:{name:"alignLeft",title:"Left aligned image",icon:ke,modelElements:["imageBlock","imageInline"],className:"image-style-align-left"},alignBlockLeft:{name:"alignBlockLeft",title:"Left aligned image",icon:ve,modelElements:["imageBlock"],className:"image-style-block-align-left"},alignCenter:{name:"alignCenter",title:"Centered image",icon:Ie,modelElements:["imageBlock"],className:"image-style-align-center"},alignRight:{name:"alignRight",title:"Right aligned image",icon:we,modelElements:["imageBlock","imageInline"],className:"image-style-align-right"},alignBlockRight:{name:"alignBlockRight",title:"Right aligned image",icon:_e,modelElements:["imageBlock"],className:"image-style-block-align-right"},block:{name:"block",title:"Centered image",icon:Ie,modelElements:["imageBlock"],isDefault:!0},side:{name:"side",title:"Side image",icon:we,modelElements:["imageBlock"],className:"image-style-side"}},xe={full:fe,left:ve,right:_e,center:Ie,inlineLeft:ke,inlineRight:we,inline:be},Ee=[{name:"imageStyle:wrapText",title:"Wrap text",defaultItem:"imageStyle:alignLeft",items:["imageStyle:alignLeft","imageStyle:alignRight"]},{name:"imageStyle:breakText",title:"Break text",defaultItem:"imageStyle:block",items:["imageStyle:alignBlockLeft","imageStyle:block","imageStyle:alignBlockRight"]}];function Ce(e){Object(r.logWarning)("image-style-configuration-definition-invalid",e)}var Te={normalizeStyles:function(e){return(e.configuredStyles.options||[]).map(e=>function(e){e="string"==typeof e?ye[e]?{...ye[e]}:{name:e}:function(e,t){const i={...t};for(const n in e)Object.prototype.hasOwnProperty.call(t,n)||(i[n]=e[n]);return i}(ye[e.name],e);"string"==typeof e.icon&&(e.icon=xe[e.icon]||e.icon);return e}(e)).filter(t=>function(e,{isBlockPluginLoaded:t,isInlinePluginLoaded:i}){const{modelElements:n,name:o}=e;if(!(n&&n.length&&o))return Ce({style:e}),!1;{const o=[t?"imageBlock":null,i?"imageInline":null];if(!n.some(e=>o.includes(e)))return Object(r.logWarning)("image-style-missing-dependency",{style:e,missingPlugins:n.map(e=>"imageBlock"===e?"ImageBlockEditing":"ImageInlineEditing")}),!1}return!0}(t,e))},getDefaultStylesConfiguration:function(e,t){return e&&t?{options:["inline","alignLeft","alignRight","alignCenter","alignBlockLeft","alignBlockRight","block","side"]}:e?{options:["block","side"]}:t?{options:["inline","alignLeft","alignRight"]}:{}},getDefaultDropdownDefinitions:function(e){return e.has("ImageBlockEditing")&&e.has("ImageInlineEditing")?[...Ee]:[]},warnInvalidStyle:Ce,DEFAULT_OPTIONS:ye,DEFAULT_ICONS:xe,DEFAULT_DROPDOWN_DEFINITIONS:Ee};function Se(e,t){for(const i of t)if(i.name===e)return i}class Be extends n.Plugin{static get pluginName(){return"ImageStyleEditing"}static get requires(){return[m]}init(){const{normalizeStyles:e,getDefaultStylesConfiguration:t}=Te,i=this.editor,n=i.plugins.has("ImageBlockEditing"),o=i.plugins.has("ImageInlineEditing");i.config.define("image.styles",t(n,o)),this.normalizedStyles=e({configuredStyles:i.config.get("image.styles"),isBlockPluginLoaded:n,isInlinePluginLoaded:o}),this._setupConversion(n,o),this._setupPostFixer(),i.commands.add("imageStyle",new he(i,this.normalizedStyles))}_setupConversion(e,t){const i=this.editor,n=i.model.schema,o=(a=this.normalizedStyles,(e,t,i)=>{if(!i.consumable.consume(t.item,e.name))return;const n=Se(t.attributeNewValue,a),o=Se(t.attributeOldValue,a),s=i.mapper.toViewElement(t.item),r=i.writer;o&&r.removeClass(o.className,s),n&&r.addClass(n.className,s)});var a;const s=function(e){const t={imageInline:e.filter(e=>!e.isDefault&&e.modelElements.includes("imageInline")),imageBlock:e.filter(e=>!e.isDefault&&e.modelElements.includes("imageBlock"))};return(e,i,n)=>{if(!i.modelRange)return;const o=i.viewItem,a=Object(r.first)(i.modelRange.getItems());if(a&&n.schema.checkAttribute(a,"imageStyle"))for(const e of t[a.name])n.consumable.consume(o,{classes:e.className})&&n.writer.setAttribute("imageStyle",e.name,a)}}(this.normalizedStyles);i.editing.downcastDispatcher.on("attribute:imageStyle",o),i.data.downcastDispatcher.on("attribute:imageStyle",o),e&&(n.extend("imageBlock",{allowAttributes:"imageStyle"}),i.data.upcastDispatcher.on("element:figure",s,{priority:"low"})),t&&(n.extend("imageInline",{allowAttributes:"imageStyle"}),i.data.upcastDispatcher.on("element:img",s,{priority:"low"}))}_setupPostFixer(){const e=this.editor,t=e.model.document,i=e.plugins.get(m),n=new Map(this.normalizedStyles.map(e=>[e.name,e]));t.registerPostFixer(e=>{let o=!1;for(const a of t.differ.getChanges())if("insert"==a.type||"attribute"==a.type&&"imageStyle"==a.attributeKey){let t="insert"==a.type?a.position.nodeAfter:a.range.start.nodeAfter;if(t&&t.is("element","paragraph")&&t.childCount>0&&(t=t.getChild(0)),!i.isImage(t))continue;const s=t.getAttribute("imageStyle");if(!s)continue;const r=n.get(s);r&&r.modelElements.includes(t.name)||(e.removeAttribute("imageStyle",t),o=!0)}return o})}}var Ae=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)};var Ve=function(e){return e};i(31);class ze extends n.Plugin{static get requires(){return[Be]}static get pluginName(){return"ImageStyleUI"}get localizedDefaultStylesTitles(){const e=this.editor.t;return{"Wrap text":e("Wrap text"),"Break text":e("Break text"),"In line":e("In line"),"Full size image":e("Full size image"),"Side image":e("Side image"),"Left aligned image":e("Left aligned image"),"Centered image":e("Centered image"),"Right aligned image":e("Right aligned image")}}init(){const e=this.editor.plugins,t=this.editor.config.get("image.toolbar")||[],i=Re(e.get("ImageStyleEditing").normalizedStyles,this.localizedDefaultStylesTitles);for(const e of i)this._createButton(e);const n=Re([...t.filter(Ae),...Te.getDefaultDropdownDefinitions(e)],this.localizedDefaultStylesTitles);for(const e of n)this._createDropdown(e,i)}_createDropdown(e,t){const i=this.editor.ui.componentFactory;i.add(e.name,n=>{let o;const{defaultItem:a,items:s,title:r}=e,l=s.filter(e=>t.find(({name:t})=>Ue(t)===e)).map(e=>{const t=i.create(e);return e===a&&(o=t),t});s.length!==l.length&&Te.warnInvalidStyle({dropdown:e});const c=Object(k.createDropdown)(n,k.SplitButtonView),g=c.buttonView;return Object(k.addToolbarToDropdown)(c,l),g.set({label:Oe(r,o.label),class:null,tooltip:!0}),g.bind("icon").toMany(l,"isOn",(...e)=>{const t=e.findIndex(Ve);return t<0?o.icon:l[t].icon}),g.bind("label").toMany(l,"isOn",(...e)=>{const t=e.findIndex(Ve);return Oe(r,t<0?o.label:l[t].label)}),g.bind("isOn").toMany(l,"isOn",(...e)=>e.some(Ve)),g.bind("class").toMany(l,"isOn",(...e)=>e.some(Ve)?"ck-splitbutton_flatten":null),g.on("execute",()=>{l.some(({isOn:e})=>e)?c.isOpen=!c.isOpen:o.fire("execute")}),c.bind("isEnabled").toMany(l,"isEnabled",(...e)=>e.some(Ve)),c})}_createButton(e){const t=e.name;this.editor.ui.componentFactory.add(Ue(t),i=>{const n=this.editor.commands.get("imageStyle"),o=new k.ButtonView(i);return o.set({label:e.title,icon:e.icon,tooltip:!0,isToggleable:!0}),o.bind("isEnabled").to(n,"isEnabled"),o.bind("isOn").to(n,"value",e=>e===t),o.on("execute",this._executeCommand.bind(this,t)),o})}_executeCommand(e){this.editor.execute("imageStyle",{value:e}),this.editor.editing.view.focus()}}function Re(e,t){for(const i of e)t[i.title]&&(i.title=t[i.title]);return e}function Ue(e){return"imageStyle:"+e}function Oe(e,t){return(e?e+": ":"")+t}class Pe extends n.Plugin{static get requires(){return[Be,ze]}static get pluginName(){return"ImageStyle"}}class je extends n.Plugin{static get requires(){return[l.WidgetToolbarRepository,m]}static get pluginName(){return"ImageToolbar"}afterInit(){const e=this.editor,t=e.t,i=e.plugins.get(l.WidgetToolbarRepository),n=e.plugins.get("ImageUtils");var o;i.register("image",{ariaLabel:t("Image toolbar"),items:(o=e.config.get("image.toolbar")||[],o.map(e=>Ae(e)?e.name:e)),getRelatedElement:e=>n.getClosestSelectedImageWidget(e)})}}}]);
5
+ !function(e){const t=e.en=e.en||{};t.dictionary=Object.assign(t.dictionary||{},{"Break text":"Break text","Centered image":"Centered image","Change image text alternative":"Change image text alternative","Enter image caption":"Enter image caption","Full size image":"Full size image","Image resize list":"Image resize list","Image toolbar":"Image toolbar","image widget":"image widget","In line":"In line",Insert:"Insert","Insert image":"Insert image","Insert image via URL":"Insert image via URL","Left aligned image":"Left aligned image",Original:"Original","Resize image":"Resize image","Resize image to %0":"Resize image to %0","Resize image to the original size":"Resize image to the original size","Right aligned image":"Right aligned image","Side image":"Side image","Text alternative":"Text alternative",Update:"Update","Update image URL":"Update image URL","Upload failed":"Upload failed","Wrap text":"Wrap text"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})),window.CKEditor5=window.CKEditor5||{},window.CKEditor5.image=function(e){var t={};function i(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,i),o.l=!0,o.exports}return i.m=e,i.c=t,i.d=function(e,t,n){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(i.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)i.d(n,o,function(t){return e[t]}.bind(null,o));return n},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="",i(i.s=34)}([function(e,t,i){e.exports=i(7)("./src/core.js")},function(e,t,i){e.exports=i(7)("./src/ui.js")},function(e,t,i){e.exports=i(7)("./src/utils.js")},function(e,t,i){e.exports=i(7)("./src/widget.js")},function(e,t,i){e.exports=i(7)("./src/engine.js")},function(e,t,i){"use strict";var n,o=function(){return void 0===n&&(n=Boolean(window&&document&&document.all&&!window.atob)),n},a=function(){var e={};return function(t){if(void 0===e[t]){var i=document.querySelector(t);if(window.HTMLIFrameElement&&i instanceof window.HTMLIFrameElement)try{i=i.contentDocument.head}catch(e){i=null}e[t]=i}return e[t]}}(),s=[];function r(e){for(var t=-1,i=0;i<s.length;i++)if(s[i].identifier===e){t=i;break}return t}function l(e,t){for(var i={},n=[],o=0;o<e.length;o++){var a=e[o],l=t.base?a[0]+t.base:a[0],c=i[l]||0,g="".concat(l," ").concat(c);i[l]=c+1;var d=r(g),m={css:a[1],media:a[2],sourceMap:a[3]};-1!==d?(s[d].references++,s[d].updater(m)):s.push({identifier:g,updater:f(m,t),references:1}),n.push(g)}return n}function c(e){var t=document.createElement("style"),n=e.attributes||{};if(void 0===n.nonce){var o=i.nc;o&&(n.nonce=o)}if(Object.keys(n).forEach((function(e){t.setAttribute(e,n[e])})),"function"==typeof e.insert)e.insert(t);else{var s=a(e.insert||"head");if(!s)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");s.appendChild(t)}return t}var g,d=(g=[],function(e,t){return g[e]=t,g.filter(Boolean).join("\n")});function m(e,t,i,n){var o=i?"":n.media?"@media ".concat(n.media," {").concat(n.css,"}"):n.css;if(e.styleSheet)e.styleSheet.cssText=d(t,o);else{var a=document.createTextNode(o),s=e.childNodes;s[t]&&e.removeChild(s[t]),s.length?e.insertBefore(a,s[t]):e.appendChild(a)}}function u(e,t,i){var n=i.css,o=i.media,a=i.sourceMap;if(o?e.setAttribute("media",o):e.removeAttribute("media"),a&&"undefined"!=typeof btoa&&(n+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(a))))," */")),e.styleSheet)e.styleSheet.cssText=n;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(n))}}var p=null,h=0;function f(e,t){var i,n,o;if(t.singleton){var a=h++;i=p||(p=c(t)),n=m.bind(null,i,a,!1),o=m.bind(null,i,a,!0)}else i=c(t),n=u.bind(null,i,t),o=function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(i)};return n(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;n(e=t)}else o()}}e.exports=function(e,t){(t=t||{}).singleton||"boolean"==typeof t.singleton||(t.singleton=o());var i=l(e=e||[],t);return function(e){if(e=e||[],"[object Array]"===Object.prototype.toString.call(e)){for(var n=0;n<i.length;n++){var o=r(i[n]);s[o].references--}for(var a=l(e,t),c=0;c<i.length;c++){var g=r(i[c]);0===s[g].references&&(s[g].updater(),s.splice(g,1))}i=a}}}},function(e,t,i){e.exports=i(7)("./src/upload.js")},function(e,t){e.exports=CKEditor5.dll},function(e,t,i){e.exports=i(7)("./src/clipboard.js")},function(e,t,i){var n=i(5),o=i(17);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var a={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,a);e.exports=o.locals||{}},function(e,t,i){e.exports=i(7)("./src/undo.js")},function(e,t,i){e.exports=i(7)("./src/typing.js")},,function(e,t,i){var n=i(5),o=i(14);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var a={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,a);e.exports=o.locals||{}},function(e,t){e.exports=".ck.ck-text-alternative-form{display:flex;flex-direction:row;flex-wrap:nowrap}.ck.ck-text-alternative-form .ck-labeled-field-view{display:inline-block}.ck.ck-text-alternative-form .ck-label{display:none}@media screen and (max-width:600px){.ck.ck-text-alternative-form{flex-wrap:wrap}.ck.ck-text-alternative-form .ck-labeled-field-view{flex-basis:100%}.ck.ck-text-alternative-form .ck-button{flex-basis:50%}}"},function(e,t,i){var n=i(5),o=i(16);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var a={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,a);e.exports=o.locals||{}},function(e,t){e.exports='.ck-vertical-form .ck-button:after{content:"";width:0;position:absolute;right:-1px;top:var(--ck-spacing-small);bottom:var(--ck-spacing-small);z-index:1}@media screen and (max-width:600px){.ck.ck-responsive-form .ck-button:after{content:"";width:0;position:absolute;right:-1px;top:var(--ck-spacing-small);bottom:var(--ck-spacing-small);z-index:1}}.ck-vertical-form>.ck-button:nth-last-child(2):after{border-right:1px solid var(--ck-color-base-border)}.ck.ck-responsive-form{padding:var(--ck-spacing-large)}.ck.ck-responsive-form:focus{outline:none}[dir=ltr] .ck.ck-responsive-form>:not(:first-child),[dir=rtl] .ck.ck-responsive-form>:not(:last-child){margin-left:var(--ck-spacing-standard)}@media screen and (max-width:600px){.ck.ck-responsive-form{padding:0;width:calc(var(--ck-input-text-width)*0.8)}.ck.ck-responsive-form .ck-labeled-field-view{margin:var(--ck-spacing-large) var(--ck-spacing-large) 0}.ck.ck-responsive-form .ck-labeled-field-view .ck-input-text{min-width:0;width:100%}.ck.ck-responsive-form .ck-labeled-field-view .ck-labeled-field-view__error{white-space:normal}.ck.ck-responsive-form>.ck-button:last-child,.ck.ck-responsive-form>.ck-button:nth-last-child(2){padding:var(--ck-spacing-standard);margin-top:var(--ck-spacing-large);border-radius:0;border:0;border-top:1px solid var(--ck-color-base-border)}[dir=ltr] .ck.ck-responsive-form>.ck-button:last-child,[dir=ltr] .ck.ck-responsive-form>.ck-button:nth-last-child(2),[dir=rtl] .ck.ck-responsive-form>.ck-button:last-child,[dir=rtl] .ck.ck-responsive-form>.ck-button:nth-last-child(2){margin-left:0}.ck.ck-responsive-form>.ck-button:nth-last-child(2):after,[dir=rtl] .ck.ck-responsive-form>.ck-button:last-child:last-of-type,[dir=rtl] .ck.ck-responsive-form>.ck-button:nth-last-child(2):last-of-type{border-right:1px solid var(--ck-color-base-border)}}'},function(e,t){e.exports=".ck-content .image{display:table;clear:both;text-align:center;margin:.9em auto;min-width:50px}.ck-content .image img{display:block;margin:0 auto;max-width:100%;min-width:100%}.ck-content .image-inline{display:inline-flex;max-width:100%;align-items:flex-start}.ck-content .image-inline picture{display:flex}.ck-content .image-inline img,.ck-content .image-inline picture{flex-grow:1;flex-shrink:1;max-width:100%}.ck.ck-editor__editable .image>figcaption.ck-placeholder:before{padding-left:inherit;padding-right:inherit;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ck.ck-editor__editable .image-inline.ck-widget_selected,.ck.ck-editor__editable .image.ck-widget_selected{z-index:1}.ck.ck-editor__editable .image-inline.ck-widget_selected ::selection{display:none}.ck.ck-editor__editable td .image-inline img,.ck.ck-editor__editable th .image-inline img{max-width:none}"},function(e,t,i){var n=i(5),o=i(19);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var a={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,a);e.exports=o.locals||{}},function(e,t){e.exports=":root{--ck-color-image-caption-background:#f7f7f7;--ck-color-image-caption-text:#333;--ck-color-image-caption-highligted-background:#fd0}.ck-content .image>figcaption{display:table-caption;caption-side:bottom;word-break:break-word;color:var(--ck-color-image-caption-text);background-color:var(--ck-color-image-caption-background);padding:.6em;font-size:.75em;outline-offset:-1px}.ck.ck-editor__editable .image>figcaption.image__caption_highlighted{animation:ck-image-caption-highlight .6s ease-out}@keyframes ck-image-caption-highlight{0%{background-color:var(--ck-color-image-caption-highligted-background)}to{background-color:var(--ck-color-image-caption-background)}}"},function(e,t,i){var n=i(5),o=i(21);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var a={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,a);e.exports=o.locals||{}},function(e,t){e.exports=".ck.ck-editor__editable .image,.ck.ck-editor__editable .image-inline{position:relative}.ck.ck-editor__editable .image-inline .ck-progress-bar,.ck.ck-editor__editable .image .ck-progress-bar{position:absolute;top:0;left:0}.ck.ck-editor__editable .image-inline.ck-appear,.ck.ck-editor__editable .image.ck-appear{animation:fadeIn .7s}.ck.ck-editor__editable .image-inline .ck-progress-bar,.ck.ck-editor__editable .image .ck-progress-bar{height:2px;width:0;background:var(--ck-color-upload-bar-background);transition:width .1s}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}"},function(e,t,i){var n=i(5),o=i(23);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var a={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,a);e.exports=o.locals||{}},function(e,t){e.exports='.ck-image-upload-complete-icon{display:block;position:absolute;top:min(var(--ck-spacing-medium),6%);right:min(var(--ck-spacing-medium),6%);border-radius:50%;z-index:1}.ck-image-upload-complete-icon:after{content:"";position:absolute}:root{--ck-color-image-upload-icon:#fff;--ck-color-image-upload-icon-background:#008a00;--ck-image-upload-icon-size:20;--ck-image-upload-icon-width:2px;--ck-image-upload-icon-is-visible:clamp(0px,100% - 50px,1px)}.ck-image-upload-complete-icon{opacity:0;background:var(--ck-color-image-upload-icon-background);animation-name:ck-upload-complete-icon-show,ck-upload-complete-icon-hide;animation-fill-mode:forwards,forwards;animation-duration:.5s,.5s;font-size:calc(1px*var(--ck-image-upload-icon-size));animation-delay:0ms,3s;overflow:hidden;width:calc(var(--ck-image-upload-icon-is-visible)*var(--ck-image-upload-icon-size));height:calc(var(--ck-image-upload-icon-is-visible)*var(--ck-image-upload-icon-size))}.ck-image-upload-complete-icon:after{left:25%;top:50%;opacity:0;height:0;width:0;transform:scaleX(-1) rotate(135deg);transform-origin:left top;border-top:var(--ck-image-upload-icon-width) solid var(--ck-color-image-upload-icon);border-right:var(--ck-image-upload-icon-width) solid var(--ck-color-image-upload-icon);animation-name:ck-upload-complete-icon-check;animation-duration:.5s;animation-delay:.5s;animation-fill-mode:forwards;box-sizing:border-box}@keyframes ck-upload-complete-icon-show{0%{opacity:0}to{opacity:1}}@keyframes ck-upload-complete-icon-hide{0%{opacity:1}to{opacity:0}}@keyframes ck-upload-complete-icon-check{0%{opacity:1;width:0;height:0}33%{width:.3em;height:0}to{opacity:1;width:.3em;height:.45em}}'},function(e,t,i){var n=i(5),o=i(25);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var a={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,a);e.exports=o.locals||{}},function(e,t){e.exports='.ck .ck-upload-placeholder-loader{position:absolute;display:flex;align-items:center;justify-content:center;top:0;left:0}.ck .ck-upload-placeholder-loader:before{content:"";position:relative}:root{--ck-color-upload-placeholder-loader:#b3b3b3;--ck-upload-placeholder-loader-size:32px}.ck .ck-image-upload-placeholder{width:100%;margin:0}.ck .ck-upload-placeholder-loader{width:100%;height:100%}.ck .ck-upload-placeholder-loader:before{width:var(--ck-upload-placeholder-loader-size);height:var(--ck-upload-placeholder-loader-size);border-radius:50%;border-top:3px solid var(--ck-color-upload-placeholder-loader);border-right:2px solid transparent;animation:ck-upload-placeholder-loader 1s linear infinite}@keyframes ck-upload-placeholder-loader{to{transform:rotate(1turn)}}'},function(e,t,i){var n=i(5),o=i(27);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var a={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,a);e.exports=o.locals||{}},function(e,t){e.exports=".ck.ck-image-insert-form:focus{outline:none}.ck.ck-form__row{display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:space-between}.ck.ck-form__row>:not(.ck-label){flex-grow:1}.ck.ck-form__row.ck-image-insert-form__action-row{margin-top:var(--ck-spacing-standard)}.ck.ck-form__row.ck-image-insert-form__action-row .ck-button-cancel,.ck.ck-form__row.ck-image-insert-form__action-row .ck-button-save{justify-content:center}.ck.ck-form__row.ck-image-insert-form__action-row .ck-button .ck-button__label{color:var(--ck-color-text)}"},function(e,t,i){var n=i(5),o=i(29);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var a={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,a);e.exports=o.locals||{}},function(e,t){e.exports=".ck.ck-image-insert__panel{padding:var(--ck-spacing-large)}.ck.ck-image-insert__ck-finder-button{display:block;width:100%;margin:var(--ck-spacing-standard) auto;border:1px solid #ccc;border-radius:var(--ck-border-radius)}.ck.ck-splitbutton>.ck-file-dialog-button.ck-button{padding:0;margin:0;border:none}"},function(e,t,i){var n=i(5),o=i(31);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var a={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,a);e.exports=o.locals||{}},function(e,t){e.exports=".ck-content .image.image_resized{max-width:100%;display:block;box-sizing:border-box}.ck-content .image.image_resized img{width:100%}.ck-content .image.image_resized>figcaption{display:block}.ck.ck-editor__editable td .image-inline.image_resized img,.ck.ck-editor__editable th .image-inline.image_resized img{max-width:100%}[dir=ltr] .ck.ck-button.ck-button_with-text.ck-resize-image-button .ck-button__icon{margin-right:var(--ck-spacing-standard)}[dir=rtl] .ck.ck-button.ck-button_with-text.ck-resize-image-button .ck-button__icon{margin-left:var(--ck-spacing-standard)}.ck.ck-dropdown .ck-button.ck-resize-image-button .ck-button__label{width:4em}"},function(e,t,i){var n=i(5),o=i(33);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var a={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};n(o,a);e.exports=o.locals||{}},function(e,t){e.exports=":root{--ck-image-style-spacing:1.5em;--ck-inline-image-style-spacing:calc(var(--ck-image-style-spacing)/2)}.ck-content .image-style-block-align-left,.ck-content .image-style-block-align-right{max-width:calc(100% - var(--ck-image-style-spacing))}.ck-content .image-style-align-left,.ck-content .image-style-align-right{clear:none}.ck-content .image-style-side{float:right;margin-left:var(--ck-image-style-spacing);max-width:50%}.ck-content .image-style-align-left{float:left;margin-right:var(--ck-image-style-spacing)}.ck-content .image-style-align-center{margin-left:auto;margin-right:auto}.ck-content .image-style-align-right{float:right;margin-left:var(--ck-image-style-spacing)}.ck-content .image-style-block-align-right{margin-right:0;margin-left:auto}.ck-content .image-style-block-align-left{margin-left:0;margin-right:auto}.ck-content p+.image-style-align-left,.ck-content p+.image-style-align-right,.ck-content p+.image-style-side{margin-top:0}.ck-content .image-inline.image-style-align-left,.ck-content .image-inline.image-style-align-right{margin-top:var(--ck-inline-image-style-spacing);margin-bottom:var(--ck-inline-image-style-spacing)}.ck-content .image-inline.image-style-align-left{margin-right:var(--ck-inline-image-style-spacing)}.ck-content .image-inline.image-style-align-right{margin-left:var(--ck-inline-image-style-spacing)}.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__action:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled):not(:hover),.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__action:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__arrow:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__arrow:not(.ck-disabled):not(:hover){background-color:var(--ck-color-button-on-background)}.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__action:not(.ck-disabled):after,.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled):after,.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled):not(:hover):after,.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__action:not(.ck-disabled):after,.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__arrow:not(.ck-disabled):after,.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__arrow:not(.ck-disabled):not(:hover):after{display:none}.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open:hover>.ck-splitbutton__action:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open:hover>.ck-splitbutton__arrow:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open:hover>.ck-splitbutton__arrow:not(.ck-disabled):not(:hover){background-color:var(--ck-color-button-on-hover-background)}"},function(e,t,i){"use strict";i.r(t),i.d(t,"AutoImage",(function(){return f})),i.d(t,"Image",(function(){return U})),i.d(t,"ImageEditing",(function(){return S})),i.d(t,"ImageCaption",(function(){return D})),i.d(t,"ImageCaptionEditing",(function(){return N})),i.d(t,"ImageInsert",(function(){return re})),i.d(t,"ImageInsertUI",(function(){return se})),i.d(t,"ImageResize",(function(){return he})),i.d(t,"ImageResizeButtons",(function(){return de})),i.d(t,"ImageResizeEditing",(function(){return ce})),i.d(t,"ImageResizeHandles",(function(){return pe})),i.d(t,"ImageStyle",(function(){return je})),i.d(t,"ImageStyleEditing",(function(){return Ae})),i.d(t,"ImageStyleUI",(function(){return Re})),i.d(t,"ImageTextAlternative",(function(){return y})),i.d(t,"ImageTextAlternativeEditing",(function(){return k})),i.d(t,"ImageTextAlternativeUI",(function(){return _})),i.d(t,"ImageToolbar",(function(){return Ne})),i.d(t,"ImageUpload",(function(){return ie})),i.d(t,"ImageUploadEditing",(function(){return ee})),i.d(t,"ImageUploadProgress",(function(){return K})),i.d(t,"ImageUploadUI",(function(){return H}));var n=i(0),o=i(8),a=i(4),s=i(10),r=i(11),l=i(2),c=i(3);function g(e,t){const i=e.createEmptyElement("img"),n="imageBlock"===t?e.createContainerElement("figure",{class:"image"}):e.createContainerElement("span",{class:"image-inline"},{isAllowedInsideAttributeElement:!0});return e.insert(e.createPositionAt(n,0),i),n}function d(e,t){if(e.plugins.has("ImageInlineEditing")!==e.plugins.has("ImageBlockEditing"))return{name:"img"};const i=e.plugins.get("ImageUtils");return e=>{if(!i.isInlineImageView(e))return null;return(e.findAncestor(i.isBlockImageView)?"imageBlock":"imageInline")!==t?null:{name:!0}}}function m(e,t){const i=Object(l.first)(t.getSelectedBlocks());return!i||e.isObject(i)||i.isEmpty&&"listItem"!=i.name?"imageBlock":"imageInline"}class u extends n.Plugin{static get pluginName(){return"ImageUtils"}isImage(e){return this.isInlineImage(e)||this.isBlockImage(e)}isInlineImageView(e){return!!e&&e.is("element","img")}isBlockImageView(e){return!!e&&e.is("element","figure")&&e.hasClass("image")}insertImage(e={},t=null,i=null){const n=this.editor,o=n.model,a=o.document.selection;i=p(n,t||a,i),e={...Object.fromEntries(a.getAttributes()),...e};for(const t in e)o.schema.checkAttribute(i,t)||delete e[t];return o.change(n=>{const s=n.createElement(i,e);return t||"imageInline"==i||(t=Object(c.findOptimalInsertionRange)(a,o)),o.insertContent(s,t),s.parent?(n.setSelection(s,"on"),s):null})}getClosestSelectedImageWidget(e){const t=e.getSelectedElement();if(t&&this.isImageWidget(t))return t;let i=e.getFirstPosition().parent;for(;i;){if(i.is("element")&&this.isImageWidget(i))return i;i=i.parent}return null}getClosestSelectedImageElement(e){const t=e.getSelectedElement();return this.isImage(t)?t:e.getFirstPosition().findAncestor("imageBlock")}isImageAllowed(){const e=this.editor.model.document.selection;return function(e,t){if("imageBlock"==p(e,t)){const i=function(e,t){const i=Object(c.findOptimalInsertionRange)(e,t).start.parent;if(i.isEmpty&&!i.is("element","$root"))return i.parent;return i}(t,e.model);if(e.model.schema.checkChild(i,"imageBlock"))return!0}else if(e.model.schema.checkChild(t.focus,"imageInline"))return!0;return!1}(this.editor,e)&&function(e){return[...e.focus.getAncestors()].every(e=>!e.is("element","imageBlock"))}(e)}toImageWidget(e,t,i){t.setCustomProperty("image",!0,e);return Object(c.toWidget)(e,t,{label:()=>{const t=this.findViewImgElement(e).getAttribute("alt");return t?`${t} ${i}`:i}})}isImageWidget(e){return!!e.getCustomProperty("image")&&Object(c.isWidget)(e)}isBlockImage(e){return!!e&&e.is("element","imageBlock")}isInlineImage(e){return!!e&&e.is("element","imageInline")}findViewImgElement(e){if(this.isInlineImageView(e))return e;const t=this.editor.editing.view;for(const{item:i}of t.createRangeIn(e))if(this.isInlineImageView(i))return i}}function p(e,t,i){const n=e.model.schema,o=e.config.get("image.insert.type");return e.plugins.has("ImageBlockEditing")?e.plugins.has("ImageInlineEditing")?i||("inline"===o?"imageInline":"block"===o?"imageBlock":t.is("selection")?m(n,t):n.checkChild(t,"imageInline")?"imageInline":"imageBlock"):"imageBlock":"imageInline"}const h=new RegExp(String(/^(http(s)?:\/\/)?[\w-]+\.[\w.~:/[\]@!$&'()*+,;=%-]+/.source+/\.(jpg|jpeg|png|gif|ico|webp|JPG|JPEG|PNG|GIF|ICO|WEBP)/.source+/(\?[\w.~:/[\]@!$&'()*+,;=%-]*)?/.source+/(#[\w.~:/[\]@!$&'()*+,;=%-]*)?$/.source));class f extends n.Plugin{static get requires(){return[o.Clipboard,u,s.Undo,r.Delete]}static get pluginName(){return"AutoImage"}constructor(e){super(e),this._timeoutId=null,this._positionToInsert=null}init(){const e=this.editor,t=e.model.document;this.listenTo(e.plugins.get("ClipboardPipeline"),"inputTransformation",()=>{const e=t.selection.getFirstRange(),i=a.LivePosition.fromPosition(e.start);i.stickiness="toPrevious";const n=a.LivePosition.fromPosition(e.end);n.stickiness="toNext",t.once("change:data",()=>{this._embedImageBetweenPositions(i,n),i.detach(),n.detach()},{priority:"high"})}),e.commands.get("undo").on("execute",()=>{this._timeoutId&&(l.global.window.clearTimeout(this._timeoutId),this._positionToInsert.detach(),this._timeoutId=null,this._positionToInsert=null)},{priority:"high"})}_embedImageBetweenPositions(e,t){const i=this.editor,n=new a.LiveRange(e,t),o=n.getWalker({ignoreElementEnd:!0}),s=Object.fromEntries(i.model.document.selection.getAttributes()),r=this.editor.plugins.get("ImageUtils");let c="";for(const e of o)e.item.is("$textProxy")&&(c+=e.item.data);c=c.trim(),c.match(h)?(this._positionToInsert=a.LivePosition.fromPosition(e),this._timeoutId=l.global.window.setTimeout(()=>{i.commands.get("insertImage").isEnabled?(i.model.change(e=>{let t;this._timeoutId=null,e.remove(n),n.detach(),"$graveyard"!==this._positionToInsert.root.rootName&&(t=this._positionToInsert.toPosition()),r.insertImage({...s,src:c},t),this._positionToInsert.detach(),this._positionToInsert=null}),i.plugins.get("Delete").requestUndoOnBackspace()):n.detach()},100)):n.detach()}}class b extends n.Command{refresh(){const e=this.editor.plugins.get("ImageUtils").getClosestSelectedImageElement(this.editor.model.document.selection);this.isEnabled=!!e,this.isEnabled&&e.hasAttribute("alt")?this.value=e.getAttribute("alt"):this.value=!1}execute(e){const t=this.editor,i=t.plugins.get("ImageUtils"),n=t.model,o=i.getClosestSelectedImageElement(n.document.selection);n.change(t=>{t.setAttribute("alt",e.newValue,o)})}}class k extends n.Plugin{static get requires(){return[u]}static get pluginName(){return"ImageTextAlternativeEditing"}init(){this.editor.commands.add("imageTextAlternative",new b(this.editor))}}var w=i(1);i(13),i(15);class I extends w.View{constructor(e){super(e);const t=this.locale.t;this.focusTracker=new l.FocusTracker,this.keystrokes=new l.KeystrokeHandler,this.labeledInput=this._createLabeledInputView(),this.saveButtonView=this._createButton(t("Save"),n.icons.check,"ck-button-save"),this.saveButtonView.type="submit",this.cancelButtonView=this._createButton(t("Cancel"),n.icons.cancel,"ck-button-cancel","cancel"),this._focusables=new w.ViewCollection,this._focusCycler=new w.FocusCycler({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}}),this.setTemplate({tag:"form",attributes:{class:["ck","ck-text-alternative-form","ck-responsive-form"],tabindex:"-1"},children:[this.labeledInput,this.saveButtonView,this.cancelButtonView]}),Object(w.injectCssTransitionDisabler)(this)}render(){super.render(),this.keystrokes.listenTo(this.element),Object(w.submitHandler)({view:this}),[this.labeledInput,this.saveButtonView,this.cancelButtonView].forEach(e=>{this._focusables.add(e),this.focusTracker.add(e.element)})}_createButton(e,t,i,n){const o=new w.ButtonView(this.locale);return o.set({label:e,icon:t,tooltip:!0}),o.extendTemplate({attributes:{class:i}}),n&&o.delegate("execute").to(this,n),o}_createLabeledInputView(){const e=this.locale.t,t=new w.LabeledFieldView(this.locale,w.createLabeledInputText);return t.label=e("Text alternative"),t}}function v(e){const t=e.editing.view,i=w.BalloonPanelView.defaultPositions,n=e.plugins.get("ImageUtils");return{target:t.domConverter.viewToDom(n.getClosestSelectedImageWidget(t.document.selection)),positions:[i.northArrowSouth,i.northArrowSouthWest,i.northArrowSouthEast,i.southArrowNorth,i.southArrowNorthWest,i.southArrowNorthEast,i.viewportStickyNorth]}}class _ extends n.Plugin{static get requires(){return[w.ContextualBalloon]}static get pluginName(){return"ImageTextAlternativeUI"}init(){this._createButton(),this._createForm()}destroy(){super.destroy(),this._form.destroy()}_createButton(){const e=this.editor,t=e.t;e.ui.componentFactory.add("imageTextAlternative",i=>{const o=e.commands.get("imageTextAlternative"),a=new w.ButtonView(i);return a.set({label:t("Change image text alternative"),icon:n.icons.lowVision,tooltip:!0}),a.bind("isEnabled").to(o,"isEnabled"),this.listenTo(a,"execute",()=>{this._showForm()}),a})}_createForm(){const e=this.editor,t=e.editing.view.document,i=e.plugins.get("ImageUtils");this._balloon=this.editor.plugins.get("ContextualBalloon"),this._form=new I(e.locale),this._form.render(),this.listenTo(this._form,"submit",()=>{e.execute("imageTextAlternative",{newValue:this._form.labeledInput.fieldView.element.value}),this._hideForm(!0)}),this.listenTo(this._form,"cancel",()=>{this._hideForm(!0)}),this._form.keystrokes.set("Esc",(e,t)=>{this._hideForm(!0),t()}),this.listenTo(e.ui,"update",()=>{i.getClosestSelectedImageWidget(t.selection)?this._isVisible&&function(e){const t=e.plugins.get("ContextualBalloon");if(e.plugins.get("ImageUtils").getClosestSelectedImageWidget(e.editing.view.document.selection)){const i=v(e);t.updatePosition(i)}}(e):this._hideForm(!0)}),Object(w.clickOutsideHandler)({emitter:this._form,activator:()=>this._isVisible,contextElements:[this._balloon.view.element],callback:()=>this._hideForm()})}_showForm(){if(this._isVisible)return;const e=this.editor,t=e.commands.get("imageTextAlternative"),i=this._form.labeledInput;this._form.disableCssTransitions(),this._isInBalloon||this._balloon.add({view:this._form,position:v(e)}),i.fieldView.value=i.fieldView.element.value=t.value||"",this._form.labeledInput.fieldView.select(),this._form.enableCssTransitions()}_hideForm(e){this._isInBalloon&&(this._form.focusTracker.isFocused&&this._form.saveButtonView.focus(),this._balloon.remove(this._form),e&&this.editor.editing.view.focus())}get _isVisible(){return this._balloon.visibleView===this._form}get _isInBalloon(){return this._balloon.hasView(this._form)}}class y extends n.Plugin{static get requires(){return[k,_]}static get pluginName(){return"ImageTextAlternative"}}function x(e,t){return e=>{e.on("attribute:srcset:"+t,i)};function i(t,i,n){if(!n.consumable.consume(i.item,t.name))return;const o=n.writer,a=n.mapper.toViewElement(i.item),s=e.findViewImgElement(a);if(null===i.attributeNewValue){const e=i.attributeOldValue;e.data&&(o.removeAttribute("srcset",s),o.removeAttribute("sizes",s),e.width&&o.removeAttribute("width",s))}else{const e=i.attributeNewValue;e.data&&(o.setAttribute("srcset",e.data,s),o.setAttribute("sizes","100vw",s),e.width&&o.setAttribute("width",e.width,s))}}}function E(e,t,i){return e=>{e.on(`attribute:${i}:${t}`,n)};function n(t,i,n){if(!n.consumable.consume(i.item,t.name))return;const o=n.writer,a=n.mapper.toViewElement(i.item),s=e.findViewImgElement(a);o.setAttribute(i.attributeKey,i.attributeNewValue||"",s)}}class C extends a.Observer{observe(e){this.listenTo(e,"load",(e,t)=>{const i=t.target;this.checkShouldIgnoreEventFromTarget(i)||"IMG"==i.tagName&&this._fireEvents(t)},{useCapture:!0})}_fireEvents(e){this.isEnabled&&(this.document.fire("layoutChanged"),this.document.fire("imageLoaded",e))}}class T extends n.Command{constructor(e){super(e);const t=e.config.get("image.insert.type");e.plugins.has("ImageBlockEditing")||"block"===t&&Object(l.logWarning)("image-block-plugin-required"),e.plugins.has("ImageInlineEditing")||"inline"===t&&Object(l.logWarning)("image-inline-plugin-required")}refresh(){this.isEnabled=this.editor.plugins.get("ImageUtils").isImageAllowed()}execute(e){const t=Object(l.toArray)(e.source),i=this.editor.model.document.selection,n=this.editor.plugins.get("ImageUtils"),o=Object.fromEntries(i.getAttributes());t.forEach((e,t)=>{const a=i.getSelectedElement();if("string"==typeof e&&(e={src:e}),t&&a&&n.isImage(a)){const t=this.editor.model.createPositionAfter(a);n.insertImage({...e,...o},t)}else n.insertImage({...e,...o})})}}class S extends n.Plugin{static get requires(){return[u]}static get pluginName(){return"ImageEditing"}init(){const e=this.editor,t=e.conversion;e.editing.view.addObserver(C),t.for("upcast").attributeToAttribute({view:{name:"img",key:"alt"},model:"alt"}).attributeToAttribute({view:{name:"img",key:"srcset"},model:{key:"srcset",value:e=>{const t={data:e.getAttribute("srcset")};return e.hasAttribute("width")&&(t.width=e.getAttribute("width")),t}}});const i=new T(e);e.commands.add("insertImage",i),e.commands.add("imageInsert",i)}}class B extends n.Command{constructor(e,t){super(e),this._modelElementName=t}refresh(){const e=this.editor.plugins.get("ImageUtils"),t=e.getClosestSelectedImageElement(this.editor.model.document.selection);"imageBlock"===this._modelElementName?this.isEnabled=e.isInlineImage(t):this.isEnabled=e.isBlockImage(t)}execute(){const e=this.editor,t=this.editor.model,i=e.plugins.get("ImageUtils"),n=i.getClosestSelectedImageElement(t.document.selection),o=Object.fromEntries(n.getAttributes());return o.src||o.uploadId?t.change(e=>{const a=Array.from(t.markers).filter(e=>e.getRange().containsItem(n)),s=i.insertImage(o,t.createSelection(n,"on"),this._modelElementName);if(!s)return null;const r=e.createRangeOn(s);for(const t of a){const i=t.getRange(),n="$graveyard"!=i.root.rootName?i.getJoined(r,!0):r;e.updateMarker(t,{range:n})}return{oldElement:n,newElement:s}}):null}}class A extends n.Plugin{static get requires(){return[S,u,o.ClipboardPipeline]}static get pluginName(){return"ImageBlockEditing"}init(){const e=this.editor;e.model.schema.register("imageBlock",{isObject:!0,isBlock:!0,allowWhere:"$block",allowAttributes:["alt","src","srcset"]}),this._setupConversion(),e.plugins.has("ImageInlineEditing")&&(e.commands.add("imageTypeBlock",new B(this.editor,"imageBlock")),this._setupClipboardIntegration())}_setupConversion(){const e=this.editor,t=e.t,i=e.conversion,n=e.plugins.get("ImageUtils");i.for("dataDowncast").elementToElement({model:"imageBlock",view:(e,{writer:t})=>g(t,"imageBlock")}),i.for("editingDowncast").elementToElement({model:"imageBlock",view:(e,{writer:i})=>n.toImageWidget(g(i,"imageBlock"),i,t("image widget"))}),i.for("downcast").add(E(n,"imageBlock","src")).add(E(n,"imageBlock","alt")).add(x(n,"imageBlock")),i.for("upcast").elementToElement({view:d(e,"imageBlock"),model:(e,{writer:t})=>t.createElement("imageBlock",e.hasAttribute("src")?{src:e.getAttribute("src")}:null)}).add(function(e){return e=>{e.on("element:figure",t)};function t(t,i,n){if(!n.consumable.test(i.viewItem,{name:!0,classes:"image"}))return;const o=e.findViewImgElement(i.viewItem);if(!o||!n.consumable.test(o,{name:!0}))return;const a=n.convertItem(o,i.modelCursor),s=Object(l.first)(a.modelRange.getItems());s&&(n.consumable.consume(i.viewItem,{name:!0,classes:"image"}),n.convertChildren(i.viewItem,s),n.updateConversionResult(s,i))}}(n))}_setupClipboardIntegration(){const e=this.editor,t=e.model,i=e.editing.view,n=e.plugins.get("ImageUtils");this.listenTo(e.plugins.get("ClipboardPipeline"),"inputTransformation",(o,s)=>{const r=Array.from(s.content.getChildren());let l;if(!r.every(n.isInlineImageView))return;l=s.targetRanges?e.editing.mapper.toModelRange(s.targetRanges[0]):t.document.selection.getFirstRange();const c=t.createSelection(l);if("imageBlock"===m(t.schema,c)){const e=new a.UpcastWriter(i.document),t=r.map(t=>e.createElement("figure",{class:"image"},t));s.content=e.createDocumentFragment(t)}})}}i(9);class V extends n.Plugin{static get requires(){return[A,c.Widget,y]}static get pluginName(){return"ImageBlock"}}class z extends n.Plugin{static get requires(){return[S,u,o.ClipboardPipeline]}static get pluginName(){return"ImageInlineEditing"}init(){const e=this.editor,t=e.model.schema;t.register("imageInline",{isObject:!0,isInline:!0,allowWhere:"$text",allowAttributes:["alt","src","srcset"]}),t.addChildCheck((e,t)=>{if(e.endsWith("caption")&&"imageInline"===t.name)return!1}),this._setupConversion(),e.plugins.has("ImageBlockEditing")&&(e.commands.add("imageTypeInline",new B(this.editor,"imageInline")),this._setupClipboardIntegration())}_setupConversion(){const e=this.editor,t=e.t,i=e.conversion,n=e.plugins.get("ImageUtils");i.for("dataDowncast").elementToElement({model:"imageInline",view:(e,{writer:t})=>t.createEmptyElement("img")}),i.for("editingDowncast").elementToElement({model:"imageInline",view:(e,{writer:i})=>n.toImageWidget(g(i,"imageInline"),i,t("image widget"))}),i.for("downcast").add(E(n,"imageInline","src")).add(E(n,"imageInline","alt")).add(x(n,"imageInline")),i.for("upcast").elementToElement({view:d(e,"imageInline"),model:(e,{writer:t})=>t.createElement("imageInline",e.hasAttribute("src")?{src:e.getAttribute("src")}:null)})}_setupClipboardIntegration(){const e=this.editor,t=e.model,i=e.editing.view,n=e.plugins.get("ImageUtils");this.listenTo(e.plugins.get("ClipboardPipeline"),"inputTransformation",(o,s)=>{const r=Array.from(s.content.getChildren());let l;if(!r.every(n.isBlockImageView))return;l=s.targetRanges?e.editing.mapper.toModelRange(s.targetRanges[0]):t.document.selection.getFirstRange();const c=t.createSelection(l);if("imageInline"===m(t.schema,c)){const e=new a.UpcastWriter(i.document),t=r.map(t=>1===t.childCount?(Array.from(t.getAttributes()).forEach(i=>e.setAttribute(...i,n.findViewImgElement(t))),t.getChild(0)):t);s.content=e.createDocumentFragment(t)}})}}class R extends n.Plugin{static get requires(){return[z,c.Widget,y]}static get pluginName(){return"ImageInline"}}class U extends n.Plugin{static get requires(){return[V,R]}static get pluginName(){return"Image"}}function O(e){for(const t of e.getChildren())if(t&&t.is("element","caption"))return t;return null}function P(e,t){const i=t.getFirstPosition().findAncestor("caption");return i&&e.isBlockImage(i.parent)?i:null}class j extends n.Command{refresh(){const e=this.editor,t=e.plugins.get("ImageUtils");if(!e.plugins.has(A))return this.isEnabled=!1,void(this.value=!1);const i=e.model.document.selection,n=i.getSelectedElement();if(!n){const e=P(t,i);return this.isEnabled=!!e,void(this.value=!!e)}this.isEnabled=this.editor.plugins.get("ImageUtils").isImage(n),this.isEnabled?this.value=!!O(n):this.value=!1}execute(e={}){const{focusCaptionOnShow:t}=e;this.editor.model.change(e=>{this.value?this._hideImageCaption(e):this._showImageCaption(e,t)})}_showImageCaption(e,t){const i=this.editor.model.document.selection,n=this.editor.plugins.get("ImageCaptionEditing");let o=i.getSelectedElement();const a=n._getSavedCaption(o);this.editor.plugins.get("ImageUtils").isInlineImage(o)&&(this.editor.execute("imageTypeBlock"),o=i.getSelectedElement());const s=a||e.createElement("caption");e.append(s,o),t&&e.setSelection(s,"in")}_hideImageCaption(e){const t=this.editor,i=t.model.document.selection,n=t.plugins.get("ImageCaptionEditing"),o=t.plugins.get("ImageUtils");let a,s=i.getSelectedElement();s?a=O(s):(a=P(o,i),s=a.parent),n._saveCaption(s,a),e.setSelection(s,"on"),e.remove(a)}}class N extends n.Plugin{static get requires(){return[u]}static get pluginName(){return"ImageCaptionEditing"}constructor(e){super(e),this._savedCaptionsMap=new WeakMap}init(){const e=this.editor,t=e.model.schema;t.isRegistered("caption")?t.extend("caption",{allowIn:"imageBlock"}):t.register("caption",{allowIn:"imageBlock",allowContentOf:"$block",isLimit:!0}),e.commands.add("toggleImageCaption",new j(this.editor)),this._setupConversion(),this._setupImageTypeCommandsIntegration()}_setupConversion(){const e=this.editor,t=e.editing.view,i=e.plugins.get("ImageUtils"),n=e.t;e.conversion.for("upcast").elementToElement({view:e=>function(e,t){return"figcaption"==t.name&&e.isBlockImageView(t.parent)?{name:!0}:null}(i,e),model:"caption"}),e.conversion.for("dataDowncast").elementToElement({model:"caption",view:(e,{writer:t})=>i.isBlockImage(e.parent)?t.createContainerElement("figcaption"):null}),e.conversion.for("editingDowncast").elementToElement({model:"caption",view:(e,{writer:o})=>{if(!i.isBlockImage(e.parent))return null;const s=o.createEditableElement("figcaption");return o.setCustomProperty("imageCaption",!0,s),Object(a.enablePlaceholder)({view:t,element:s,text:n("Enter image caption"),keepOnFocus:!0}),Object(c.toWidgetEditable)(s,o)}}),e.editing.mapper.on("modelToViewPosition",L(t)),e.data.mapper.on("modelToViewPosition",L(t))}_setupImageTypeCommandsIntegration(){const e=this.editor,t=e.plugins.get("ImageUtils"),i=e.commands.get("imageTypeInline"),n=e.commands.get("imageTypeBlock"),o=e=>{if(!e.return)return;const{oldElement:i,newElement:n}=e.return;if(!i)return;if(t.isBlockImage(i)){const e=O(i);if(e)return void this._saveCaption(n,e)}const o=this._getSavedCaption(i);o&&this._saveCaption(n,o)};i&&this.listenTo(i,"execute",o,{priority:"low"}),n&&this.listenTo(n,"execute",o,{priority:"low"})}_getSavedCaption(e){const t=this._savedCaptionsMap.get(e);return t?a.Element.fromJSON(t):null}_saveCaption(e,t){this._savedCaptionsMap.set(e,t.toJSON())}}function L(e){return(t,i)=>{const n=i.modelPosition,o=n.parent;if(!o.is("element","imageBlock"))return;const a=i.mapper.toViewElement(o);i.viewPosition=e.createPositionAt(a,n.offset+1)}}class F extends n.Plugin{static get requires(){return[u]}static get pluginName(){return"ImageCaptionUI"}init(){const e=this.editor,t=e.editing.view,i=e.plugins.get("ImageUtils"),o=e.t;e.ui.componentFactory.add("toggleImageCaption",a=>{const s=e.commands.get("toggleImageCaption"),r=new w.ButtonView(a);return r.set({icon:n.icons.caption,tooltip:!0,isToggleable:!0}),r.bind("isOn","isEnabled").to(s,"value","isEnabled"),r.bind("label").to(s,"value",e=>o(e?"Toggle caption off":"Toggle caption on")),this.listenTo(r,"execute",()=>{e.execute("toggleImageCaption",{focusCaptionOnShow:!0});const n=P(i,e.model.document.selection);if(n){const i=e.editing.mapper.toViewElement(n);t.scrollToTheSelection(),t.change(e=>{e.addClass("image__caption_highlighted",i)})}}),r})}}i(18);class D extends n.Plugin{static get requires(){return[N,F]}static get pluginName(){return"ImageCaption"}}var M=i(6);function W(e){const t=e.map(e=>e.replace("+","\\+"));return new RegExp(`^image\\/(${t.join("|")})$`)}function q(e){return new Promise((t,i)=>{const n=e.getAttribute("src");fetch(n).then(e=>e.blob()).then(e=>{const i=$(e,n),o=i.replace("image/",""),a=new File([e],"image."+o,{type:i});t(a)}).catch(e=>e&&"TypeError"===e.name?function(e){return function(e){return new Promise((t,i)=>{const n=l.global.document.createElement("img");n.addEventListener("load",()=>{const e=l.global.document.createElement("canvas");e.width=n.width,e.height=n.height;e.getContext("2d").drawImage(n,0,0),e.toBlob(e=>e?t(e):i())}),n.addEventListener("error",()=>i()),n.src=e})}(e).then(t=>{const i=$(t,e),n=i.replace("image/","");return new File([t],"image."+n,{type:i})})}(n).then(t).catch(i):i(e))})}function $(e,t){return e.type?e.type:t.match(/data:(image\/\w+);base64/)?t.match(/data:(image\/\w+);base64/)[1].toLowerCase():"image/jpeg"}class H extends n.Plugin{static get pluginName(){return"ImageUploadUI"}init(){const e=this.editor,t=e.t,i=i=>{const o=new M.FileDialogButtonView(i),a=e.commands.get("uploadImage"),s=e.config.get("image.upload.types"),r=W(s);return o.set({acceptedType:s.map(e=>"image/"+e).join(","),allowMultipleFiles:!0}),o.buttonView.set({label:t("Insert image"),icon:n.icons.image,tooltip:!0}),o.buttonView.bind("isEnabled").to(a),o.on("done",(t,i)=>{const n=Array.from(i).filter(e=>r.test(e.type));n.length&&e.execute("uploadImage",{file:n})}),o};e.ui.componentFactory.add("uploadImage",i),e.ui.componentFactory.add("imageUpload",i)}}i(20),i(22),i(24);class K extends n.Plugin{static get pluginName(){return"ImageUploadProgress"}constructor(e){super(e),this.placeholder="data:image/svg+xml;utf8,"+encodeURIComponent('<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 700 250"><rect rx="4"/></svg>')}init(){const e=this.editor;e.plugins.has("ImageBlockEditing")&&e.editing.downcastDispatcher.on("attribute:uploadStatus:imageBlock",(...e)=>this.uploadStatusChange(...e)),e.plugins.has("ImageInlineEditing")&&e.editing.downcastDispatcher.on("attribute:uploadStatus:imageInline",(...e)=>this.uploadStatusChange(...e))}uploadStatusChange(e,t,i){const n=this.editor,o=t.item,a=o.getAttribute("uploadId");if(!i.consumable.consume(t.item,e.name))return;const s=n.plugins.get("ImageUtils"),r=n.plugins.get(M.FileRepository),l=a?t.attributeNewValue:null,c=this.placeholder,g=n.editing.mapper.toViewElement(o),d=i.writer;if("reading"==l)return G(g,d),void J(s,c,g,d);if("uploading"==l){const e=r.loaders.get(a);return G(g,d),void(e?(X(g,d),function(e,t,i,n){const o=function(e){const t=e.createUIElement("div",{class:"ck-progress-bar"});return e.setCustomProperty("progressBar",!0,t),t}(t);t.insert(t.createPositionAt(e,"end"),o),i.on("change:uploadedPercent",(e,t,i)=>{n.change(e=>{e.setStyle("width",i+"%",o)})})}(g,d,e,n.editing.view),function(e,t,i,n){if(n.data){const o=e.findViewImgElement(t);i.setAttribute("src",n.data,o)}}(s,g,d,e)):J(s,c,g,d))}"complete"==l&&r.loaders.get(a)&&function(e,t,i){const n=t.createUIElement("div",{class:"ck-image-upload-complete-icon"});t.insert(t.createPositionAt(e,"end"),n),setTimeout(()=>{i.change(e=>e.remove(e.createRangeOn(n)))},3e3)}(g,d,n.editing.view),function(e,t){Y(e,t,"progressBar")}(g,d),X(g,d),function(e,t){t.removeClass("ck-appear",e)}(g,d)}}function G(e,t){e.hasClass("ck-appear")||t.addClass("ck-appear",e)}function J(e,t,i,n){i.hasClass("ck-image-upload-placeholder")||n.addClass("ck-image-upload-placeholder",i);const o=e.findViewImgElement(i);o.getAttribute("src")!==t&&n.setAttribute("src",t,o),Q(i,"placeholder")||n.insert(n.createPositionAfter(o),function(e){const t=e.createUIElement("div",{class:"ck-upload-placeholder-loader"});return e.setCustomProperty("placeholder",!0,t),t}(n))}function X(e,t){e.hasClass("ck-image-upload-placeholder")&&t.removeClass("ck-image-upload-placeholder",e),Y(e,t,"placeholder")}function Q(e,t){for(const i of e.getChildren())if(i.getCustomProperty(t))return i}function Y(e,t,i){const n=Q(e,i);n&&t.remove(t.createRangeOn(n))}class Z extends n.Command{refresh(){const e=this.editor,t=e.plugins.get("ImageUtils"),i=e.model.document.selection.getSelectedElement();this.isEnabled=t.isImageAllowed()||t.isImage(i)}execute(e){const t=Object(l.toArray)(e.file),i=this.editor.model.document.selection,n=this.editor.plugins.get("ImageUtils"),o=Object.fromEntries(i.getAttributes());t.forEach((e,t)=>{const a=i.getSelectedElement();if(t&&a&&n.isImage(a)){const t=this.editor.model.createPositionAfter(a);this._uploadImage(e,o,t)}else this._uploadImage(e,o)})}_uploadImage(e,t,i){const n=this.editor,o=n.plugins.get(M.FileRepository).createLoader(e),a=n.plugins.get("ImageUtils");o&&a.insertImage({...t,uploadId:o.id},i)}}class ee extends n.Plugin{static get requires(){return[M.FileRepository,w.Notification,o.ClipboardPipeline,u]}static get pluginName(){return"ImageUploadEditing"}constructor(e){super(e),e.config.define("image",{upload:{types:["jpeg","png","gif","bmp","webp","tiff"]}}),this._uploadImageElements=new Map}init(){const e=this.editor,t=e.model.document,i=e.conversion,n=e.plugins.get(M.FileRepository),o=e.plugins.get("ImageUtils"),s=W(e.config.get("image.upload.types")),r=new Z(e);e.commands.add("uploadImage",r),e.commands.add("imageUpload",r),i.for("upcast").attributeToAttribute({view:{name:"img",key:"uploadId"},model:"uploadId"}),this.listenTo(e.editing.view.document,"clipboardInput",(t,i)=>{if(n=i.dataTransfer,Array.from(n.types).includes("text/html")&&""!==n.getData("text/html"))return;var n;const o=Array.from(i.dataTransfer.files).filter(e=>!!e&&s.test(e.type));o.length&&(t.stop(),e.model.change(t=>{i.targetRanges&&t.setSelection(i.targetRanges.map(t=>e.editing.mapper.toModelRange(t))),e.model.enqueueChange("default",()=>{e.execute("uploadImage",{file:o})})}))}),this.listenTo(e.plugins.get("ClipboardPipeline"),"inputTransformation",(t,i)=>{const s=Array.from(e.editing.view.createRangeIn(i.content)).filter(e=>function(e,t){return!(!e.isInlineImageView(t)||!t.getAttribute("src"))&&(t.getAttribute("src").match(/^data:image\/\w+;base64,/g)||t.getAttribute("src").match(/^blob:/g))}(o,e.item)&&!e.item.getAttribute("uploadProcessed")).map(e=>({promise:q(e.item),imageElement:e.item}));if(!s.length)return;const r=new a.UpcastWriter(e.editing.view.document);for(const e of s){r.setAttribute("uploadProcessed",!0,e.imageElement);const t=n.createLoader(e.promise);t&&(r.setAttribute("src","",e.imageElement),r.setAttribute("uploadId",t.id,e.imageElement))}}),e.editing.view.document.on("dragover",(e,t)=>{t.preventDefault()}),t.on("change",()=>{const i=t.differ.getChanges({includeChangesInGraveyard:!0}).reverse(),o=new Set;for(const t of i)if("insert"==t.type&&"$text"!=t.name){const i=t.position.nodeAfter,a="$graveyard"==t.position.root.rootName;for(const t of te(e,i)){const e=t.getAttribute("uploadId");if(!e)continue;const i=n.loaders.get(e);i&&(a?o.has(e)||i.abort():(o.add(e),this._uploadImageElements.set(e,t),"idle"==i.status&&this._readAndUpload(i)))}}}),this.on("uploadComplete",(e,{imageElement:t,data:i})=>{const n=i.urls?i.urls:i;this.editor.model.change(e=>{e.setAttribute("src",n.default,t),this._parseAndSetSrcsetAttributeOnImage(n,t,e)})},{priority:"low"})}afterInit(){const e=this.editor.model.schema;this.editor.plugins.has("ImageBlockEditing")&&e.extend("imageBlock",{allowAttributes:["uploadId","uploadStatus"]}),this.editor.plugins.has("ImageInlineEditing")&&e.extend("imageInline",{allowAttributes:["uploadId","uploadStatus"]})}_readAndUpload(e){const t=this.editor,i=t.model,n=t.locale.t,o=t.plugins.get(M.FileRepository),a=t.plugins.get(w.Notification),s=t.plugins.get("ImageUtils"),r=this._uploadImageElements;return i.enqueueChange("transparent",t=>{t.setAttribute("uploadStatus","reading",r.get(e.id))}),e.read().then(()=>{const n=e.upload(),o=r.get(e.id);if(l.env.isSafari){const e=t.editing.mapper.toViewElement(o),i=s.findViewImgElement(e);t.editing.view.once("render",()=>{if(!i.parent)return;const e=t.editing.view.domConverter.mapViewToDom(i.parent);if(!e)return;const n=e.style.display;e.style.display="none",e._ckHack=e.offsetHeight,e.style.display=n})}return i.enqueueChange("transparent",e=>{e.setAttribute("uploadStatus","uploading",o)}),n}).then(t=>{i.enqueueChange("transparent",i=>{const n=r.get(e.id);i.setAttribute("uploadStatus","complete",n),this.fire("uploadComplete",{data:t,imageElement:n})}),c()}).catch(t=>{if("error"!==e.status&&"aborted"!==e.status)throw t;"error"==e.status&&t&&a.showWarning(t,{title:n("Upload failed"),namespace:"upload"}),i.enqueueChange("transparent",t=>{t.remove(r.get(e.id))}),c()});function c(){i.enqueueChange("transparent",t=>{const i=r.get(e.id);t.removeAttribute("uploadId",i),t.removeAttribute("uploadStatus",i),r.delete(e.id)}),o.destroyLoader(e)}}_parseAndSetSrcsetAttributeOnImage(e,t,i){let n=0;const o=Object.keys(e).filter(e=>{const t=parseInt(e,10);if(!isNaN(t))return n=Math.max(n,t),!0}).map(t=>`${e[t]} ${t}w`).join(", ");""!=o&&i.setAttribute("srcset",{data:o,width:n},t)}}function te(e,t){const i=e.plugins.get("ImageUtils");return Array.from(e.model.createRangeOn(t)).filter(e=>i.isImage(e.item)).map(e=>e.item)}class ie extends n.Plugin{static get pluginName(){return"ImageUpload"}static get requires(){return[ee,H,K]}}i(26);class ne extends w.View{constructor(e,t={}){super(e);const i=this.bindTemplate;this.set("class",t.class||null),this.children=this.createCollection(),t.children&&t.children.forEach(e=>this.children.add(e)),this.set("_role",null),this.set("_ariaLabelledBy",null),t.labelView&&this.set({_role:"group",_ariaLabelledBy:t.labelView.id}),this.setTemplate({tag:"div",attributes:{class:["ck","ck-form__row",i.to("class")],role:i.to("_role"),"aria-labelledby":i.to("_ariaLabelledBy")},children:this.children})}}i(28);class oe extends w.View{constructor(e,t){super(e);const{insertButtonView:i,cancelButtonView:n}=this._createActionButtons(e);if(this.insertButtonView=i,this.cancelButtonView=n,this.dropdownView=this._createDropdownView(e),this.set("imageURLInputValue",""),this.focusTracker=new l.FocusTracker,this.keystrokes=new l.KeystrokeHandler,this._focusables=new w.ViewCollection,this._focusCycler=new w.FocusCycler({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}}),this.set("_integrations",new l.Collection),t)for(const[e,i]of Object.entries(t))"insertImageViaUrl"===e&&(i.fieldView.bind("value").to(this,"imageURLInputValue",e=>e||""),i.fieldView.on("input",()=>{this.imageURLInputValue=i.fieldView.element.value.trim()})),i.name=e,this._integrations.add(i);this.setTemplate({tag:"form",attributes:{class:["ck","ck-image-insert-form"],tabindex:"-1"},children:[...this._integrations,new ne(e,{children:[this.insertButtonView,this.cancelButtonView],class:"ck-image-insert-form__action-row"})]})}render(){super.render(),Object(w.submitHandler)({view:this});const e=[...this._integrations,this.insertButtonView,this.cancelButtonView];e.forEach(e=>{this._focusables.add(e),this.focusTracker.add(e.element)}),this.keystrokes.listenTo(this.element);const t=e=>e.stopPropagation();this.keystrokes.set("arrowright",t),this.keystrokes.set("arrowleft",t),this.keystrokes.set("arrowup",t),this.keystrokes.set("arrowdown",t),this.listenTo(e[0].element,"selectstart",(e,t)=>{t.stopPropagation()},{priority:"high"})}getIntegration(e){return this._integrations.find(t=>t.name===e)}_createDropdownView(e){const t=e.t,i=Object(w.createDropdown)(e,w.SplitButtonView),o=i.buttonView,a=i.panelView;return o.set({label:t("Insert image"),icon:n.icons.image,tooltip:!0}),a.extendTemplate({attributes:{class:"ck-image-insert__panel"}}),i}_createActionButtons(e){const t=e.t,i=new w.ButtonView(e),o=new w.ButtonView(e);return i.set({label:t("Insert"),icon:n.icons.check,class:"ck-button-save",type:"submit",withText:!0,isEnabled:this.imageURLInputValue}),o.set({label:t("Cancel"),icon:n.icons.cancel,class:"ck-button-cancel",withText:!0}),i.bind("isEnabled").to(this,"imageURLInputValue",e=>!!e),i.delegate("execute").to(this,"submit"),o.delegate("execute").to(this,"cancel"),{insertButtonView:i,cancelButtonView:o}}focus(){this._focusCycler.focusFirst()}}function ae(e){const t=e.t,i=new w.LabeledFieldView(e,w.createLabeledInputText);return i.set({label:t("Insert image via URL")}),i.fieldView.placeholder="https://example.com/image.png",i}class se extends n.Plugin{static get pluginName(){return"ImageInsertUI"}init(){const e=this.editor,t=e=>this._createDropdownView(e);e.ui.componentFactory.add("insertImage",t),e.ui.componentFactory.add("imageInsert",t)}_createDropdownView(e){const t=this.editor,i=new oe(e,function(e){const t=e.config.get("image.insert.integrations"),i=e.plugins.get("ImageInsertUI"),n={insertImageViaUrl:ae(e.locale)};if(!t)return n;if(t.find(e=>"openCKFinder"===e)&&e.ui.componentFactory.has("ckfinder")){const t=e.ui.componentFactory.create("ckfinder");t.set({withText:!0,class:"ck-image-insert__ck-finder-button"}),t.delegate("execute").to(i,"cancel"),n.openCKFinder=t}return t.reduce((t,i)=>(n[i]?t[i]=n[i]:e.ui.componentFactory.has(i)&&(t[i]=e.ui.componentFactory.create(i)),t),{})}(t)),n=t.commands.get("uploadImage"),o=i.dropdownView,a=o.buttonView;return a.actionView=t.ui.componentFactory.create("uploadImage"),a.actionView.extendTemplate({attributes:{class:"ck ck-button ck-splitbutton__action"}}),this._setUpDropdown(o,i,n)}_setUpDropdown(e,t,i){const n=this.editor,o=n.t,a=t.insertButtonView,s=t.getIntegration("insertImageViaUrl"),r=e.panelView,l=this.editor.plugins.get("ImageUtils");function c(){n.editing.view.focus(),e.isOpen=!1}return e.bind("isEnabled").to(i),e.buttonView.once("open",()=>{r.children.add(t)}),e.on("change:isOpen",()=>{const i=n.model.document.selection.getSelectedElement();e.isOpen&&(t.focus(),l.isImage(i)?(t.imageURLInputValue=i.getAttribute("src"),a.label=o("Update"),s.label=o("Update image URL")):(t.imageURLInputValue="",a.label=o("Insert"),s.label=o("Insert image via URL")))},{priority:"low"}),t.delegate("submit","cancel").to(e),this.delegate("cancel").to(e),e.on("submit",()=>{c(),function(){const e=n.model.document.selection.getSelectedElement();l.isImage(e)?n.model.change(i=>{i.setAttribute("src",t.imageURLInputValue,e),i.removeAttribute("srcset",e),i.removeAttribute("sizes",e)}):n.execute("insertImage",{source:t.imageURLInputValue})}()}),e.on("cancel",()=>{c()}),e}}class re extends n.Plugin{static get pluginName(){return"ImageInsert"}static get requires(){return[ie,se]}}class le extends n.Command{refresh(){const e=this.editor,t=e.plugins.get("ImageUtils").getClosestSelectedImageElement(e.model.document.selection);this.isEnabled=!!t,t&&t.hasAttribute("width")?this.value={width:t.getAttribute("width"),height:null}:this.value=null}execute(e){const t=this.editor,i=t.model,n=t.plugins.get("ImageUtils").getClosestSelectedImageElement(i.document.selection);this.value={width:e.width,height:null},n&&i.change(t=>{t.setAttribute("width",e.width,n)})}}class ce extends n.Plugin{static get requires(){return[u]}static get pluginName(){return"ImageResizeEditing"}constructor(e){super(e),e.config.define("image",{resizeUnit:"%",resizeOptions:[{name:"resizeImage:original",value:null,icon:"original"},{name:"resizeImage:25",value:"25",icon:"small"},{name:"resizeImage:50",value:"50",icon:"medium"},{name:"resizeImage:75",value:"75",icon:"large"}]})}init(){const e=this.editor,t=new le(e);this._registerSchema(),this._registerConverters("imageBlock"),this._registerConverters("imageInline"),e.commands.add("resizeImage",t),e.commands.add("imageResize",t)}_registerSchema(){this.editor.plugins.has("ImageBlockEditing")&&this.editor.model.schema.extend("imageBlock",{allowAttributes:"width"}),this.editor.plugins.has("ImageInlineEditing")&&this.editor.model.schema.extend("imageInline",{allowAttributes:"width"})}_registerConverters(e){const t=this.editor;t.conversion.for("downcast").add(t=>t.on("attribute:width:"+e,(e,t,i)=>{if(!i.consumable.consume(t.item,e.name))return;const n=i.writer,o=i.mapper.toViewElement(t.item);null!==t.attributeNewValue?(n.setStyle("width",t.attributeNewValue,o),n.addClass("image_resized",o)):(n.removeStyle("width",o),n.removeClass("image_resized",o))})),t.conversion.for("upcast").attributeToAttribute({view:{name:"imageBlock"===e?"figure":"img",styles:{width:/.+/}},model:{key:"width",value:e=>e.getStyle("width")}})}}const ge={small:n.icons.objectSizeSmall,medium:n.icons.objectSizeMedium,large:n.icons.objectSizeLarge,original:n.icons.objectSizeFull};class de extends n.Plugin{static get requires(){return[ce]}static get pluginName(){return"ImageResizeButtons"}constructor(e){super(e),this._resizeUnit=e.config.get("image.resizeUnit")}init(){const e=this.editor,t=e.config.get("image.resizeOptions"),i=e.commands.get("resizeImage");this.bind("isEnabled").to(i);for(const e of t)this._registerImageResizeButton(e);this._registerImageResizeDropdown(t)}_registerImageResizeButton(e){const t=this.editor,{name:i,value:n,icon:o}=e,a=n?n+this._resizeUnit:null;t.ui.componentFactory.add(i,i=>{const n=new w.ButtonView(i),s=t.commands.get("resizeImage"),r=this._getOptionLabelValue(e,!0);if(!ge[o])throw new l.CKEditorError("imageresizebuttons-missing-icon",t,e);return n.set({label:r,icon:ge[o],tooltip:r,isToggleable:!0}),n.bind("isEnabled").to(this),n.bind("isOn").to(s,"value",me(a)),this.listenTo(n,"execute",()=>{t.execute("resizeImage",{width:a})}),n})}_registerImageResizeDropdown(e){const t=this.editor,i=t.t,n=e.find(e=>!e.value),o=o=>{const a=t.commands.get("resizeImage"),s=Object(w.createDropdown)(o,w.DropdownButtonView),r=s.buttonView;return r.set({tooltip:i("Resize image"),commandValue:n.value,icon:ge.medium,isToggleable:!0,label:this._getOptionLabelValue(n),withText:!0,class:"ck-resize-image-button"}),r.bind("label").to(a,"value",e=>e&&e.width?e.width:this._getOptionLabelValue(n)),s.bind("isOn").to(a),s.bind("isEnabled").to(this),Object(w.addListToDropdown)(s,this._getResizeDropdownListItemDefinitions(e,a)),s.listView.ariaLabel=i("Image resize list"),this.listenTo(s,"execute",e=>{t.execute(e.source.commandName,{width:e.source.commandValue}),t.editing.view.focus()}),s};t.ui.componentFactory.add("resizeImage",o),t.ui.componentFactory.add("imageResize",o)}_getOptionLabelValue(e,t){const i=this.editor.t;return e.label?e.label:t?e.value?i("Resize image to %0",e.value+this._resizeUnit):i("Resize image to the original size"):e.value?e.value+this._resizeUnit:i("Original")}_getResizeDropdownListItemDefinitions(e,t){const i=new l.Collection;return e.map(e=>{const n=e.value?e.value+this._resizeUnit:null,o={type:"button",model:new w.Model({commandName:"resizeImage",commandValue:n,label:this._getOptionLabelValue(e),withText:!0,icon:null})};o.model.bind("isOn").to(t,"value",me(n)),i.add(o)}),i}}function me(e){return t=>null===e&&t===e||t&&t.width===e}const ue=/(image|image-inline)/;class pe extends n.Plugin{static get requires(){return[c.WidgetResize]}static get pluginName(){return"ImageResizeHandles"}init(){const e=this.editor.commands.get("resizeImage");this.bind("isEnabled").to(e),this._setupResizerCreator()}_setupResizerCreator(){const e=this.editor,t=e.editing.view;t.addObserver(C),this.listenTo(t.document,"imageLoaded",(i,n)=>{if(!n.target.matches("figure.image.ck-widget > img,figure.image.ck-widget > picture > img,figure.image.ck-widget > a > img,figure.image.ck-widget > a > picture > img,span.image-inline.ck-widget > img,span.image-inline.ck-widget > picture > img"))return;const o=e.editing.view.domConverter,a=o.domToView(n.target).findAncestor({classes:ue});let s=this.editor.plugins.get(c.WidgetResize).getResizerByViewElement(a);if(s)return void s.redraw();const r=e.editing.mapper,l=r.toModelElement(a);s=e.plugins.get(c.WidgetResize).attachTo({unit:e.config.get("image.resizeUnit"),modelElement:l,viewElement:a,editor:e,getHandleHost:e=>e.querySelector("img"),getResizeHost:()=>o.viewToDom(r.toViewElement(l.parent)),isCentered(){const e=l.getAttribute("imageStyle");return!e||"block"==e||"alignCenter"==e},onCommit(i){t.change(e=>{e.removeClass("image_resized",a)}),e.execute("resizeImage",{width:i})}}),s.on("updateSize",()=>{a.hasClass("image_resized")||t.change(e=>{e.addClass("image_resized",a)})}),s.bind("isEnabled").to(this)})}}i(30);class he extends n.Plugin{static get requires(){return[ce,pe,de]}static get pluginName(){return"ImageResize"}}class fe extends n.Command{constructor(e,t){super(e),this._defaultStyles={imageBlock:!1,imageInline:!1},this._styles=new Map(t.map(e=>{if(e.isDefault)for(const t of e.modelElements)this._defaultStyles[t]=e.name;return[e.name,e]}))}refresh(){const e=this.editor.plugins.get("ImageUtils").getClosestSelectedImageElement(this.editor.model.document.selection);this.isEnabled=!!e,this.isEnabled?e.hasAttribute("imageStyle")?this.value=e.getAttribute("imageStyle"):this.value=this._defaultStyles[e.name]:this.value=!1}execute(e={}){const t=this.editor,i=t.model,n=t.plugins.get("ImageUtils");i.change(t=>{const o=e.value;let a=n.getClosestSelectedImageElement(i.document.selection);o&&this.shouldConvertImageType(o,a)&&(this.editor.execute(n.isBlockImage(a)?"imageTypeInline":"imageTypeBlock"),a=n.getClosestSelectedImageElement(i.document.selection)),!o||this._styles.get(o).isDefault?t.removeAttribute("imageStyle",a):t.setAttribute("imageStyle",o,a)})}shouldConvertImageType(e,t){return!this._styles.get(e).modelElements.includes(t.name)}}const{objectFullWidth:be,objectInline:ke,objectLeft:we,objectRight:Ie,objectCenter:ve,objectBlockLeft:_e,objectBlockRight:ye}=n.icons,xe={inline:{name:"inline",title:"In line",icon:ke,modelElements:["imageInline"],isDefault:!0},alignLeft:{name:"alignLeft",title:"Left aligned image",icon:we,modelElements:["imageBlock","imageInline"],className:"image-style-align-left"},alignBlockLeft:{name:"alignBlockLeft",title:"Left aligned image",icon:_e,modelElements:["imageBlock"],className:"image-style-block-align-left"},alignCenter:{name:"alignCenter",title:"Centered image",icon:ve,modelElements:["imageBlock"],className:"image-style-align-center"},alignRight:{name:"alignRight",title:"Right aligned image",icon:Ie,modelElements:["imageBlock","imageInline"],className:"image-style-align-right"},alignBlockRight:{name:"alignBlockRight",title:"Right aligned image",icon:ye,modelElements:["imageBlock"],className:"image-style-block-align-right"},block:{name:"block",title:"Centered image",icon:ve,modelElements:["imageBlock"],isDefault:!0},side:{name:"side",title:"Side image",icon:Ie,modelElements:["imageBlock"],className:"image-style-side"}},Ee={full:be,left:_e,right:ye,center:ve,inlineLeft:we,inlineRight:Ie,inline:ke},Ce=[{name:"imageStyle:wrapText",title:"Wrap text",defaultItem:"imageStyle:alignLeft",items:["imageStyle:alignLeft","imageStyle:alignRight"]},{name:"imageStyle:breakText",title:"Break text",defaultItem:"imageStyle:block",items:["imageStyle:alignBlockLeft","imageStyle:block","imageStyle:alignBlockRight"]}];function Te(e){Object(l.logWarning)("image-style-configuration-definition-invalid",e)}var Se={normalizeStyles:function(e){return(e.configuredStyles.options||[]).map(e=>function(e){e="string"==typeof e?xe[e]?{...xe[e]}:{name:e}:function(e,t){const i={...t};for(const n in e)Object.prototype.hasOwnProperty.call(t,n)||(i[n]=e[n]);return i}(xe[e.name],e);"string"==typeof e.icon&&(e.icon=Ee[e.icon]||e.icon);return e}(e)).filter(t=>function(e,{isBlockPluginLoaded:t,isInlinePluginLoaded:i}){const{modelElements:n,name:o}=e;if(!(n&&n.length&&o))return Te({style:e}),!1;{const o=[t?"imageBlock":null,i?"imageInline":null];if(!n.some(e=>o.includes(e)))return Object(l.logWarning)("image-style-missing-dependency",{style:e,missingPlugins:n.map(e=>"imageBlock"===e?"ImageBlockEditing":"ImageInlineEditing")}),!1}return!0}(t,e))},getDefaultStylesConfiguration:function(e,t){return e&&t?{options:["inline","alignLeft","alignRight","alignCenter","alignBlockLeft","alignBlockRight","block","side"]}:e?{options:["block","side"]}:t?{options:["inline","alignLeft","alignRight"]}:{}},getDefaultDropdownDefinitions:function(e){return e.has("ImageBlockEditing")&&e.has("ImageInlineEditing")?[...Ce]:[]},warnInvalidStyle:Te,DEFAULT_OPTIONS:xe,DEFAULT_ICONS:Ee,DEFAULT_DROPDOWN_DEFINITIONS:Ce};function Be(e,t){for(const i of t)if(i.name===e)return i}class Ae extends n.Plugin{static get pluginName(){return"ImageStyleEditing"}static get requires(){return[u]}init(){const{normalizeStyles:e,getDefaultStylesConfiguration:t}=Se,i=this.editor,n=i.plugins.has("ImageBlockEditing"),o=i.plugins.has("ImageInlineEditing");i.config.define("image.styles",t(n,o)),this.normalizedStyles=e({configuredStyles:i.config.get("image.styles"),isBlockPluginLoaded:n,isInlinePluginLoaded:o}),this._setupConversion(n,o),this._setupPostFixer(),i.commands.add("imageStyle",new fe(i,this.normalizedStyles))}_setupConversion(e,t){const i=this.editor,n=i.model.schema,o=(a=this.normalizedStyles,(e,t,i)=>{if(!i.consumable.consume(t.item,e.name))return;const n=Be(t.attributeNewValue,a),o=Be(t.attributeOldValue,a),s=i.mapper.toViewElement(t.item),r=i.writer;o&&r.removeClass(o.className,s),n&&r.addClass(n.className,s)});var a;const s=function(e){const t={imageInline:e.filter(e=>!e.isDefault&&e.modelElements.includes("imageInline")),imageBlock:e.filter(e=>!e.isDefault&&e.modelElements.includes("imageBlock"))};return(e,i,n)=>{if(!i.modelRange)return;const o=i.viewItem,a=Object(l.first)(i.modelRange.getItems());if(a&&n.schema.checkAttribute(a,"imageStyle"))for(const e of t[a.name])n.consumable.consume(o,{classes:e.className})&&n.writer.setAttribute("imageStyle",e.name,a)}}(this.normalizedStyles);i.editing.downcastDispatcher.on("attribute:imageStyle",o),i.data.downcastDispatcher.on("attribute:imageStyle",o),e&&(n.extend("imageBlock",{allowAttributes:"imageStyle"}),i.data.upcastDispatcher.on("element:figure",s,{priority:"low"})),t&&(n.extend("imageInline",{allowAttributes:"imageStyle"}),i.data.upcastDispatcher.on("element:img",s,{priority:"low"}))}_setupPostFixer(){const e=this.editor,t=e.model.document,i=e.plugins.get(u),n=new Map(this.normalizedStyles.map(e=>[e.name,e]));t.registerPostFixer(e=>{let o=!1;for(const a of t.differ.getChanges())if("insert"==a.type||"attribute"==a.type&&"imageStyle"==a.attributeKey){let t="insert"==a.type?a.position.nodeAfter:a.range.start.nodeAfter;if(t&&t.is("element","paragraph")&&t.childCount>0&&(t=t.getChild(0)),!i.isImage(t))continue;const s=t.getAttribute("imageStyle");if(!s)continue;const r=n.get(s);r&&r.modelElements.includes(t.name)||(e.removeAttribute("imageStyle",t),o=!0)}return o})}}var Ve=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)};var ze=function(e){return e};i(32);class Re extends n.Plugin{static get requires(){return[Ae]}static get pluginName(){return"ImageStyleUI"}get localizedDefaultStylesTitles(){const e=this.editor.t;return{"Wrap text":e("Wrap text"),"Break text":e("Break text"),"In line":e("In line"),"Full size image":e("Full size image"),"Side image":e("Side image"),"Left aligned image":e("Left aligned image"),"Centered image":e("Centered image"),"Right aligned image":e("Right aligned image")}}init(){const e=this.editor.plugins,t=this.editor.config.get("image.toolbar")||[],i=Ue(e.get("ImageStyleEditing").normalizedStyles,this.localizedDefaultStylesTitles);for(const e of i)this._createButton(e);const n=Ue([...t.filter(Ve),...Se.getDefaultDropdownDefinitions(e)],this.localizedDefaultStylesTitles);for(const e of n)this._createDropdown(e,i)}_createDropdown(e,t){const i=this.editor.ui.componentFactory;i.add(e.name,n=>{let o;const{defaultItem:a,items:s,title:r}=e,l=s.filter(e=>t.find(({name:t})=>Oe(t)===e)).map(e=>{const t=i.create(e);return e===a&&(o=t),t});s.length!==l.length&&Se.warnInvalidStyle({dropdown:e});const c=Object(w.createDropdown)(n,w.SplitButtonView),g=c.buttonView;return Object(w.addToolbarToDropdown)(c,l),g.set({label:Pe(r,o.label),class:null,tooltip:!0}),g.bind("icon").toMany(l,"isOn",(...e)=>{const t=e.findIndex(ze);return t<0?o.icon:l[t].icon}),g.bind("label").toMany(l,"isOn",(...e)=>{const t=e.findIndex(ze);return Pe(r,t<0?o.label:l[t].label)}),g.bind("isOn").toMany(l,"isOn",(...e)=>e.some(ze)),g.bind("class").toMany(l,"isOn",(...e)=>e.some(ze)?"ck-splitbutton_flatten":null),g.on("execute",()=>{l.some(({isOn:e})=>e)?c.isOpen=!c.isOpen:o.fire("execute")}),c.bind("isEnabled").toMany(l,"isEnabled",(...e)=>e.some(ze)),c})}_createButton(e){const t=e.name;this.editor.ui.componentFactory.add(Oe(t),i=>{const n=this.editor.commands.get("imageStyle"),o=new w.ButtonView(i);return o.set({label:e.title,icon:e.icon,tooltip:!0,isToggleable:!0}),o.bind("isEnabled").to(n,"isEnabled"),o.bind("isOn").to(n,"value",e=>e===t),o.on("execute",this._executeCommand.bind(this,t)),o})}_executeCommand(e){this.editor.execute("imageStyle",{value:e}),this.editor.editing.view.focus()}}function Ue(e,t){for(const i of e)t[i.title]&&(i.title=t[i.title]);return e}function Oe(e){return"imageStyle:"+e}function Pe(e,t){return(e?e+": ":"")+t}class je extends n.Plugin{static get requires(){return[Ae,Re]}static get pluginName(){return"ImageStyle"}}class Ne extends n.Plugin{static get requires(){return[c.WidgetToolbarRepository,u]}static get pluginName(){return"ImageToolbar"}afterInit(){const e=this.editor,t=e.t,i=e.plugins.get(c.WidgetToolbarRepository),n=e.plugins.get("ImageUtils");var o;i.register("image",{ariaLabel:t("Image toolbar"),items:(o=e.config.get("image.toolbar")||[],o.map(e=>Ve(e)?e.name:e)),getRelatedElement:e=>n.getClosestSelectedImageWidget(e)})}}}]);
@@ -1 +1 @@
1
- !function(e){const i=e.nl=e.nl||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"Gecentreerde afbeelding","Change image text alternative":"Verander alt-tekst van de afbeelding","Enter image caption":"Typ een afbeeldingsbijschrift","Full size image":"Afbeelding op volledige grootte","Image resize list":"","Image toolbar":"Afbeeldingswerkbalk","image widget":"afbeeldingswidget","In line":"",Insert:"","Insert image":"Afbeelding toevoegen","Insert image via URL":"","Left aligned image":"Links uitgelijnde afbeelding",Original:"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"Rechts uitgelijnde afbeelding","Side image":"Afbeelding naast tekst","Text alternative":"Alt-tekst",Update:"","Update image URL":"","Upload failed":"Uploaden afbeelding mislukt","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
1
+ !function(e){const i=e.nl=e.nl||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"Gecentreerde afbeelding","Change image text alternative":"Verander alt-tekst van de afbeelding","Enter image caption":"Typ een afbeeldingsbijschrift","Full size image":"Afbeelding op volledige grootte","Image resize list":"","Image toolbar":"Afbeeldingswerkbalk","image widget":"afbeeldingswidget","In line":"",Insert:"Invoegen","Insert image":"Afbeelding toevoegen","Insert image via URL":"","Left aligned image":"Links uitgelijnde afbeelding",Original:"Origineel","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Right aligned image":"Rechts uitgelijnde afbeelding","Side image":"Afbeelding naast tekst","Text alternative":"Alt-tekst",Update:"","Update image URL":"","Upload failed":"Uploaden afbeelding mislukt","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
@@ -1 +1 @@
1
- !function(i){const e=i["sr-latn"]=i["sr-latn"]||{};e.dictionary=Object.assign(e.dictionary||{},{"Break text":"","Centered image":"Slika u sredini","Change image text alternative":"Izmena alternativnog teksta","Enter image caption":"Odredi tekst ispod slike","Full size image":"Slika u punoj veličini","Image resize list":"Lista veličine slike","Image toolbar":"Slika traka sa alatkama","image widget":"modul sa slikom","In line":"",Insert:"Ubaci","Insert image":"Dodaj sliku","Insert image via URL":"Ubaci sliku preko URL-a","Left aligned image":"Leva slika",Original:"Original","Resize image":"Promenite veličinu slike","Resize image to %0":"Promenite veličinu slike na% 0","Resize image to the original size":"Promenite veličinu slike do originalne veličine","Right aligned image":"Desna slika","Side image":"Bočna slika","Text alternative":"Alternativni tekst",Update:"Ažuriraj","Update image URL":"Ažuriraj URL slike","Upload failed":"Postavljanje neuspešno","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
1
+ !function(e){const i=e["sr-latn"]=e["sr-latn"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"Prelom teksta","Centered image":"Slika u sredini","Change image text alternative":"Izmena alternativnog teksta","Enter image caption":"Odredi tekst ispod slike","Full size image":"Slika u punoj veličini","Image resize list":"Lista veličine slike","Image toolbar":"Slika traka sa alatkama","image widget":"modul sa slikom","In line":"U redu",Insert:"Ubaci","Insert image":"Dodaj sliku","Insert image via URL":"Ubaci sliku preko URL-a","Left aligned image":"Leva slika",Original:"Original","Resize image":"Promenite veličinu slike","Resize image to %0":"Promenite veličinu slike na% 0","Resize image to the original size":"Promenite veličinu slike do originalne veličine","Right aligned image":"Desna slika","Side image":"Bočna slika","Text alternative":"Alternativni tekst",Update:"Ažuriraj","Update image URL":"Ažuriraj URL slike","Upload failed":"Postavljanje neuspešno","Wrap text":"Prelomiti tekst"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
@@ -1 +1 @@
1
- !function(e){const i=e.sr=e.sr||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"","Centered image":"Слика у средини","Change image text alternative":"Измена алтернативног текста","Enter image caption":"Одреди текст испод слике","Full size image":"Слика у пуној величини","Image resize list":"Листа величине слике","Image toolbar":"Слика трака са алтакама","image widget":"модул са сликом","In line":"",Insert:"Убаци","Insert image":"Додај слику","Insert image via URL":"Убаци слику преко УРЛ-а","Left aligned image":"Лева слика",Original:"Оригинал","Resize image":"Промените величину слике","Resize image to %0":"Промените величину слике на% 0","Resize image to the original size":"Промените величину слике до оригиналне величине","Right aligned image":"Десна слика","Side image":"Бочна слика","Text alternative":"Алтернативни текст",Update:"Ажурирај","Update image URL":"Ажурирај УРЛ слике","Upload failed":"Постављање неуспешно","Wrap text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
1
+ !function(e){const i=e.sr=e.sr||{};i.dictionary=Object.assign(i.dictionary||{},{"Break text":"Прелом текста","Centered image":"Слика у средини","Change image text alternative":"Измена алтернативног текста","Enter image caption":"Одреди текст испод слике","Full size image":"Слика у пуној величини","Image resize list":"Листа величине слике","Image toolbar":"Слика трака са алтакама","image widget":"модул са сликом","In line":"У реду",Insert:"Убаци","Insert image":"Додај слику","Insert image via URL":"Убаци слику преко УРЛ-а","Left aligned image":"Лева слика",Original:"Оригинал","Resize image":"Промените величину слике","Resize image to %0":"Промените величину слике на% 0","Resize image to the original size":"Промените величину слике до оригиналне величине","Right aligned image":"Десна слика","Side image":"Бочна слика","Text alternative":"Алтернативни текст",Update:"Ажурирај","Update image URL":"Ажурирај УРЛ слике","Upload failed":"Постављање неуспешно","Wrap text":"Преломити текст"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
@@ -90,7 +90,7 @@ msgstr ""
90
90
 
91
91
  msgctxt "The default label for the resize option that resets the size of the image."
92
92
  msgid "Original"
93
- msgstr ""
93
+ msgstr "Origineel"
94
94
 
95
95
  msgctxt "The accessibility label of the image resize dropdown for screen readers."
96
96
  msgid "Image resize list"
@@ -98,7 +98,7 @@ msgstr ""
98
98
 
99
99
  msgctxt "The label of the form submit button if the image source URL input has no value."
100
100
  msgid "Insert"
101
- msgstr ""
101
+ msgstr "Invoegen"
102
102
 
103
103
  msgctxt "The label of the form submit button if the image source URL input has a value."
104
104
  msgid "Update"
@@ -22,15 +22,15 @@ msgstr "modul sa slikom"
22
22
 
23
23
  msgctxt "The label for the image style button that wraps text around the image."
24
24
  msgid "Wrap text"
25
- msgstr ""
25
+ msgstr "Prelomiti tekst"
26
26
 
27
27
  msgctxt "The label for the image style button that breaks the text around the image."
28
28
  msgid "Break text"
29
- msgstr ""
29
+ msgstr "Prelom teksta"
30
30
 
31
31
  msgctxt "The label for the image style button that places the image inside the line of text."
32
32
  msgid "In line"
33
- msgstr ""
33
+ msgstr "U redu"
34
34
 
35
35
  msgctxt "The label for the Side image option."
36
36
  msgid "Side image"
@@ -22,15 +22,15 @@ msgstr "модул са сликом"
22
22
 
23
23
  msgctxt "The label for the image style button that wraps text around the image."
24
24
  msgid "Wrap text"
25
- msgstr ""
25
+ msgstr "Преломити текст"
26
26
 
27
27
  msgctxt "The label for the image style button that breaks the text around the image."
28
28
  msgid "Break text"
29
- msgstr ""
29
+ msgstr "Прелом текста"
30
30
 
31
31
  msgctxt "The label for the image style button that places the image inside the line of text."
32
32
  msgid "In line"
33
- msgstr ""
33
+ msgstr "У реду"
34
34
 
35
35
  msgctxt "The label for the Side image option."
36
36
  msgid "Side image"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ckeditor/ckeditor5-image",
3
- "version": "29.2.0",
3
+ "version": "30.0.0",
4
4
  "description": "Image feature for CKEditor 5.",
5
5
  "keywords": [
6
6
  "ckeditor",
@@ -12,39 +12,39 @@
12
12
  ],
13
13
  "main": "src/index.js",
14
14
  "dependencies": {
15
- "@ckeditor/ckeditor5-ui": "^29.2.0",
16
- "ckeditor5": "^29.2.0",
15
+ "@ckeditor/ckeditor5-ui": "^30.0.0",
16
+ "ckeditor5": "^30.0.0",
17
17
  "lodash-es": "^4.17.15"
18
18
  },
19
19
  "devDependencies": {
20
- "@ckeditor/ckeditor5-adapter-ckfinder": "^29.2.0",
21
- "@ckeditor/ckeditor5-autoformat": "^29.2.0",
22
- "@ckeditor/ckeditor5-basic-styles": "^29.2.0",
23
- "@ckeditor/ckeditor5-block-quote": "^29.2.0",
24
- "@ckeditor/ckeditor5-ckfinder": "^29.2.0",
25
- "@ckeditor/ckeditor5-clipboard": "^29.2.0",
26
- "@ckeditor/ckeditor5-cloud-services": "^29.2.0",
27
- "@ckeditor/ckeditor5-core": "^29.2.0",
20
+ "@ckeditor/ckeditor5-adapter-ckfinder": "^30.0.0",
21
+ "@ckeditor/ckeditor5-autoformat": "^30.0.0",
22
+ "@ckeditor/ckeditor5-basic-styles": "^30.0.0",
23
+ "@ckeditor/ckeditor5-block-quote": "^30.0.0",
24
+ "@ckeditor/ckeditor5-ckfinder": "^30.0.0",
25
+ "@ckeditor/ckeditor5-clipboard": "^30.0.0",
26
+ "@ckeditor/ckeditor5-cloud-services": "^30.0.0",
27
+ "@ckeditor/ckeditor5-core": "^30.0.0",
28
28
  "@ckeditor/ckeditor5-dev-utils": "^25.4.0",
29
- "@ckeditor/ckeditor5-easy-image": "^29.2.0",
30
- "@ckeditor/ckeditor5-editor-classic": "^29.2.0",
31
- "@ckeditor/ckeditor5-engine": "^29.2.0",
32
- "@ckeditor/ckeditor5-enter": "^29.2.0",
33
- "@ckeditor/ckeditor5-essentials": "^29.2.0",
34
- "@ckeditor/ckeditor5-heading": "^29.2.0",
35
- "@ckeditor/ckeditor5-html-embed": "^29.2.0",
36
- "@ckeditor/ckeditor5-indent": "^29.2.0",
37
- "@ckeditor/ckeditor5-link": "^29.2.0",
38
- "@ckeditor/ckeditor5-list": "^29.2.0",
39
- "@ckeditor/ckeditor5-media-embed": "^29.2.0",
40
- "@ckeditor/ckeditor5-paragraph": "^29.2.0",
41
- "@ckeditor/ckeditor5-table": "^29.2.0",
42
- "@ckeditor/ckeditor5-theme-lark": "^29.2.0",
43
- "@ckeditor/ckeditor5-typing": "^29.2.0",
44
- "@ckeditor/ckeditor5-undo": "^29.2.0",
45
- "@ckeditor/ckeditor5-upload": "^29.2.0",
46
- "@ckeditor/ckeditor5-utils": "^29.2.0",
47
- "@ckeditor/ckeditor5-widget": "^29.2.0",
29
+ "@ckeditor/ckeditor5-easy-image": "^30.0.0",
30
+ "@ckeditor/ckeditor5-editor-classic": "^30.0.0",
31
+ "@ckeditor/ckeditor5-engine": "^30.0.0",
32
+ "@ckeditor/ckeditor5-enter": "^30.0.0",
33
+ "@ckeditor/ckeditor5-essentials": "^30.0.0",
34
+ "@ckeditor/ckeditor5-heading": "^30.0.0",
35
+ "@ckeditor/ckeditor5-html-embed": "^30.0.0",
36
+ "@ckeditor/ckeditor5-indent": "^30.0.0",
37
+ "@ckeditor/ckeditor5-link": "^30.0.0",
38
+ "@ckeditor/ckeditor5-list": "^30.0.0",
39
+ "@ckeditor/ckeditor5-media-embed": "^30.0.0",
40
+ "@ckeditor/ckeditor5-paragraph": "^30.0.0",
41
+ "@ckeditor/ckeditor5-table": "^30.0.0",
42
+ "@ckeditor/ckeditor5-theme-lark": "^30.0.0",
43
+ "@ckeditor/ckeditor5-typing": "^30.0.0",
44
+ "@ckeditor/ckeditor5-undo": "^30.0.0",
45
+ "@ckeditor/ckeditor5-upload": "^30.0.0",
46
+ "@ckeditor/ckeditor5-utils": "^30.0.0",
47
+ "@ckeditor/ckeditor5-widget": "^30.0.0",
48
48
  "webpack": "^4.43.0",
49
49
  "webpack-cli": "^3.3.11"
50
50
  },
package/src/autoimage.js CHANGED
@@ -11,6 +11,7 @@ import { Plugin } from 'ckeditor5/src/core';
11
11
  import { Clipboard } from 'ckeditor5/src/clipboard';
12
12
  import { LivePosition, LiveRange } from 'ckeditor5/src/engine';
13
13
  import { Undo } from 'ckeditor5/src/undo';
14
+ import { Delete } from 'ckeditor5/src/typing';
14
15
  import { global } from 'ckeditor5/src/utils';
15
16
 
16
17
  import ImageUtils from './imageutils';
@@ -32,7 +33,7 @@ export default class AutoImage extends Plugin {
32
33
  * @inheritDoc
33
34
  */
34
35
  static get requires() {
35
- return [ Clipboard, ImageUtils, Undo ];
36
+ return [ Clipboard, ImageUtils, Undo, Delete ];
36
37
  }
37
38
 
38
39
  /**
@@ -173,6 +174,8 @@ export default class AutoImage extends Plugin {
173
174
  this._positionToInsert.detach();
174
175
  this._positionToInsert = null;
175
176
  } );
177
+
178
+ editor.plugins.get( 'Delete' ).requestUndoOnBackspace();
176
179
  }, 100 );
177
180
  }
178
181
  }
@@ -39,8 +39,8 @@ export function upcastImageFigure( imageUtils ) {
39
39
  // Find an image element inside the figure element.
40
40
  const viewImage = imageUtils.findViewImgElement( data.viewItem );
41
41
 
42
- // Do not convert if image element is absent, is missing src attribute or was already converted.
43
- if ( !viewImage || !viewImage.hasAttribute( 'src' ) || !conversionApi.consumable.test( viewImage, { name: true } ) ) {
42
+ // Do not convert if image element is absent or was already converted.
43
+ if ( !viewImage || !conversionApi.consumable.test( viewImage, { name: true } ) ) {
44
44
  return;
45
45
  }
46
46
 
@@ -55,6 +55,9 @@ export function upcastImageFigure( imageUtils ) {
55
55
  return;
56
56
  }
57
57
 
58
+ // Consume the figure to prevent other converters from processing it again.
59
+ conversionApi.consumable.consume( data.viewItem, { name: true, classes: 'image' } );
60
+
58
61
  // Convert rest of the figure element's children as an image children.
59
62
  conversionApi.convertChildren( data.viewItem, modelImage );
60
63
 
@@ -136,12 +139,6 @@ export function upcastPicture( imageUtils ) {
136
139
  data.modelCursor = conversionResult.modelCursor;
137
140
 
138
141
  modelImage = first( conversionResult.modelRange.getItems() );
139
-
140
- // It could be that the <img/> was broken (e.g. missing "src"). There's no point in converting
141
- // <picture> any further around a broken <img/>.
142
- if ( !modelImage ) {
143
- return;
144
- }
145
142
  }
146
143
 
147
144
  conversionApi.consumable.consume( pictureViewElement, { name: true } );
@@ -112,7 +112,10 @@ export default class ImageBlockEditing extends Plugin {
112
112
  conversion.for( 'upcast' )
113
113
  .elementToElement( {
114
114
  view: getImgViewElementMatcher( editor, 'imageBlock' ),
115
- model: ( viewImage, { writer } ) => writer.createElement( 'imageBlock', { src: viewImage.getAttribute( 'src' ) } )
115
+ model: ( viewImage, { writer } ) => writer.createElement(
116
+ 'imageBlock',
117
+ viewImage.hasAttribute( 'src' ) ? { src: viewImage.getAttribute( 'src' ) } : null
118
+ )
116
119
  } )
117
120
  .add( upcastImageFigure( imageUtils ) );
118
121
  }
@@ -120,7 +120,10 @@ export default class ImageInlineEditing extends Plugin {
120
120
  conversion.for( 'upcast' )
121
121
  .elementToElement( {
122
122
  view: getImgViewElementMatcher( editor, 'imageInline' ),
123
- model: ( viewImage, { writer } ) => writer.createElement( 'imageInline', { src: viewImage.getAttribute( 'src' ) } )
123
+ model: ( viewImage, { writer } ) => writer.createElement(
124
+ 'imageInline',
125
+ viewImage.hasAttribute( 'src' ) ? { src: viewImage.getAttribute( 'src' ) } : null
126
+ )
124
127
  } );
125
128
  }
126
129
 
@@ -47,7 +47,8 @@ export function getBalloonPositionData( editor ) {
47
47
  defaultPositions.northArrowSouthEast,
48
48
  defaultPositions.southArrowNorth,
49
49
  defaultPositions.southArrowNorthWest,
50
- defaultPositions.southArrowNorthEast
50
+ defaultPositions.southArrowNorthEast,
51
+ defaultPositions.viewportStickyNorth
51
52
  ]
52
53
  };
53
54
  }
@@ -49,19 +49,14 @@ export function createImageViewElement( writer, imageType ) {
49
49
  */
50
50
  export function getImgViewElementMatcher( editor, matchImageType ) {
51
51
  if ( editor.plugins.has( 'ImageInlineEditing' ) !== editor.plugins.has( 'ImageBlockEditing' ) ) {
52
- return {
53
- name: 'img',
54
- attributes: {
55
- src: true
56
- }
57
- };
52
+ return { name: 'img' };
58
53
  }
59
54
 
60
55
  const imageUtils = editor.plugins.get( 'ImageUtils' );
61
56
 
62
57
  return element => {
63
- // Convert only images with src attribute.
64
- if ( !imageUtils.isInlineImageView( element ) || !element.hasAttribute( 'src' ) ) {
58
+ // Check if view element is an `img`.
59
+ if ( !imageUtils.isInlineImageView( element ) ) {
65
60
  return null;
66
61
  }
67
62
 
@@ -73,7 +68,7 @@ export function getImgViewElementMatcher( editor, matchImageType ) {
73
68
  return null;
74
69
  }
75
70
 
76
- return { name: true, attributes: [ 'src' ] };
71
+ return { name: true };
77
72
  };
78
73
  }
79
74
 
@@ -9,8 +9,7 @@
9
9
 
10
10
  import { Plugin } from 'ckeditor5/src/core';
11
11
  import { Element, enablePlaceholder } from 'ckeditor5/src/engine';
12
- import { setHighlightHandling, toWidgetEditable } from 'ckeditor5/src/widget';
13
- import { toArray } from 'ckeditor5/src/utils';
12
+ import { toWidgetEditable } from 'ckeditor5/src/widget';
14
13
 
15
14
  import ToggleImageCaptionCommand from './toggleimagecaptioncommand';
16
15
 
@@ -132,16 +131,7 @@ export default class ImageCaptionEditing extends Plugin {
132
131
  keepOnFocus: true
133
132
  } );
134
133
 
135
- const widgetEditable = toWidgetEditable( figcaptionElement, writer );
136
-
137
- setHighlightHandling(
138
- widgetEditable,
139
- writer,
140
- ( element, descriptor, writer ) => writer.addClass( toArray( descriptor.classes ), element ),
141
- ( element, descriptor, writer ) => writer.removeClass( toArray( descriptor.classes ), element )
142
- );
143
-
144
- return widgetEditable;
134
+ return toWidgetEditable( figcaptionElement, writer );
145
135
  }
146
136
  } );
147
137
 
@@ -61,7 +61,8 @@ export function viewToModelStyleAttribute( styles ) {
61
61
  const viewElement = data.viewItem;
62
62
  const modelImageElement = first( data.modelRange.getItems() );
63
63
 
64
- // Check if `modelImageElement` exists (see: #8270, and #9563)...
64
+ // Run this converter only if an image has been found in the model.
65
+ // In some cases it may not be found (for example if we run this on a figure with different type than image).
65
66
  if ( !modelImageElement ) {
66
67
  return;
67
68
  }
package/CHANGELOG.md DELETED
@@ -1,423 +0,0 @@
1
- Changelog
2
- =========
3
-
4
- All changes in the package are documented in the main repository. See: https://github.com/ckeditor/ckeditor5/blob/master/CHANGELOG.md.
5
-
6
- Changes for the past releases are available below.
7
-
8
- ## [19.0.0](https://github.com/ckeditor/ckeditor5-image/compare/v18.0.0...v19.0.0) (2020-04-29)
9
-
10
- ### Other changes
11
-
12
- * Replaced `LabeledInputView` with `LabeledFieldView`. See [ckeditor/ckeditor5#6110](https://github.com/ckeditor/ckeditor5/issues/6110). ([3416fb2](https://github.com/ckeditor/ckeditor5-image/commit/3416fb2))
13
- * Updated translations. ([88300ff](https://github.com/ckeditor/ckeditor5-image/commit/88300ff))
14
-
15
-
16
- ## [18.0.0](https://github.com/ckeditor/ckeditor5-image/compare/v17.0.0...v18.0.0) (2020-03-19)
17
-
18
- ### Bug fixes
19
-
20
- * The image converters should not assume that <img> is a first child of a <figure>. Closes [ckeditor/ckeditor5#6294](https://github.com/ckeditor/ckeditor5/issues/6294). ([97450b7](https://github.com/ckeditor/ckeditor5-image/commit/97450b7))
21
-
22
- ### Other changes
23
-
24
- * Updated translations. ([79db6f5](https://github.com/ckeditor/ckeditor5-image/commit/79db6f5))
25
-
26
-
27
- ## [17.0.0](https://github.com/ckeditor/ckeditor5-image/compare/v16.0.0...v17.0.0) (2020-02-19)
28
-
29
- ### MINOR BREAKING CHANGES
30
-
31
- * Resizer options object now also takes the editor instance.
32
- * Removed the `downcastWriter` property from the [`ResizerOptions` interface](https://ckeditor.com/docs/ckeditor5/latest/api/module_widget_widgetresize-ResizerOptions.html).
33
-
34
- ### Bug fixes
35
-
36
- * Fixed image resize behavior upon short clicking a handle without dragging. Image will no longer became full width, nor will it briefly flash an unexpected size. Closes [ckeditor/ckeditor5#5189](https://github.com/ckeditor/ckeditor5/issues/5189) and closes [ckeditor/ckeditor5#5195](https://github.com/ckeditor/ckeditor5/issues/5195). ([9148013](https://github.com/ckeditor/ckeditor5-image/commit/9148013))
37
- * Focus the editor before executing toolbar buttons' command. See [ckeditor/ckeditor5#353](https://github.com/ckeditor/ckeditor5/issues/353). ([5a700a2](https://github.com/ckeditor/ckeditor5-image/commit/5a700a2))
38
-
39
- ### Other changes
40
-
41
- * Updated translations. ([b81e08c](https://github.com/ckeditor/ckeditor5-image/commit/b81e08c))
42
-
43
-
44
- ## [16.0.0](https://github.com/ckeditor/ckeditor5-image/compare/v15.0.0...v16.0.0) (2019-12-04)
45
-
46
- ### Bug fixes
47
-
48
- * Improved markup operation performance of the editor with the image plugin enabled. See [ckeditor/ckeditor5#4504](https://github.com/ckeditor/ckeditor5/issues/4504). ([6c7fc94](https://github.com/ckeditor/ckeditor5-image/commit/6c7fc94))
49
-
50
- ### Other changes
51
-
52
- * Updated translations. ([01cdb59](https://github.com/ckeditor/ckeditor5-image/commit/01cdb59))
53
-
54
-
55
- ## [15.0.0](https://github.com/ckeditor/ckeditor5-image/compare/v14.0.0...v15.0.0) (2019-10-23)
56
-
57
- ### MAJOR BREAKING CHANGES
58
-
59
- * Removed `isImageType()` util.
60
-
61
- ### Features
62
-
63
- * Introduced `config.image.upload.types` configuration option for setting allowed image mime-types. Closes [#295](https://github.com/ckeditor/ckeditor5-image/issues/295). Closes [ckeditor/ckeditor5#674](https://github.com/ckeditor/ckeditor5/issues/674). ([8c36aee](https://github.com/ckeditor/ckeditor5-image/commit/8c36aee))
64
-
65
- ### Bug fixes
66
-
67
- * Initial resize of a side image with no width predefined now gives correct percentage values. Closes [#306](https://github.com/ckeditor/ckeditor5-image/issues/306). ([b084de5](https://github.com/ckeditor/ckeditor5-image/commit/b084de5))
68
-
69
- ### Other changes
70
-
71
- * Added `pluginName` property to editing plugins. ([71adead](https://github.com/ckeditor/ckeditor5-image/commit/71adead))
72
- * Improved the resizer performance. Closes [ckeditor/ckeditor5#5191](https://github.com/ckeditor/ckeditor5/issues/5191). ([c46072b](https://github.com/ckeditor/ckeditor5-image/commit/c46072b))
73
- * Make the `Clipboard` plugin a required dependency of `ImageUploadEditing`. Closes [ckeditor/ckeditor5-core#193](https://github.com/ckeditor/ckeditor5-core/issues/193). ([311c48c](https://github.com/ckeditor/ckeditor5-image/commit/311c48c))
74
- * Updated translations. ([27effa2](https://github.com/ckeditor/ckeditor5-image/commit/27effa2)) ([93aa0bb](https://github.com/ckeditor/ckeditor5-image/commit/93aa0bb))
75
-
76
-
77
- ## [14.0.0](https://github.com/ckeditor/ckeditor5-image/compare/v13.1.2...v14.0.0) (2019-08-26)
78
-
79
- ### Features
80
-
81
- * Introduced widget resizer. Closes [#241](https://github.com/ckeditor/ckeditor5-image/issues/241). ([ddcb1b3](https://github.com/ckeditor/ckeditor5-image/commit/ddcb1b3))
82
-
83
- ### Bug fixes
84
-
85
- * Image upload should handle images that are deeply nested in other blocks. Closes [ckeditor/ckeditor5#1985](https://github.com/ckeditor/ckeditor5/issues/1985). ([5a729d3](https://github.com/ckeditor/ckeditor5-image/commit/5a729d3))
86
- * Image widgets should not span the entire width of the editor. Closes [ckeditor/ckeditor5#1870](https://github.com/ckeditor/ckeditor5/issues/1870). ([b82ea85](https://github.com/ckeditor/ckeditor5-image/commit/b82ea85))
87
- * Improved stability of `ImageTextAlternative` balloon used in rotator. ([2e979cd](https://github.com/ckeditor/ckeditor5-image/commit/2e979cd))
88
- * The UI buttons should be marked as toggleable for better assistive technologies support (see [ckeditor/ckeditor5#1403](https://github.com/ckeditor/ckeditor5/issues/1403)). ([6c74d59](https://github.com/ckeditor/ckeditor5-image/commit/6c74d59))
89
- * Worked around Safari's image size bug. Closes [ckeditor/ckeditor5#1975](https://github.com/ckeditor/ckeditor5/issues/1975). ([8e14b03](https://github.com/ckeditor/ckeditor5-image/commit/8e14b03))
90
-
91
- ### Other changes
92
-
93
- * The issue tracker for this package was moved to https://github.com/ckeditor/ckeditor5/issues. See [ckeditor/ckeditor5#1988](https://github.com/ckeditor/ckeditor5/issues/1988). ([a5451d6](https://github.com/ckeditor/ckeditor5-image/commit/a5451d6))
94
- * Removed the obsolete `--ck-color-upload-infinite-background` CSS custom property. See https://github.com/ckeditor/ckeditor5-theme-lark/pull/240. ([65c07cd](https://github.com/ckeditor/ckeditor5-image/commit/65c07cd))
95
- * The image widget toolbar should have a proper `aria-label` attribute (see [ckeditor/ckeditor5#1404](https://github.com/ckeditor/ckeditor5/issues/1404)). ([13af143](https://github.com/ckeditor/ckeditor5-image/commit/13af143))
96
- * Updated translations. ([f2a760d](https://github.com/ckeditor/ckeditor5-image/commit/f2a760d))
97
-
98
- ### BREAKING CHANGES
99
-
100
- * From now on, all images in the editor use CSS `display: table` by default (`.ck-content .image { display: table }`). It can affect integrations and we recommend checking if images render correctly in your project after this update. There is a possibility you might need to adjust the CSS to adapt to this change.
101
-
102
-
103
- ## [13.1.2](https://github.com/ckeditor/ckeditor5-image/compare/v13.1.1...v13.1.2) (2019-07-10)
104
-
105
- Internal changes only (updated dependencies, documentation, etc.).
106
-
107
-
108
- ## [13.1.1](https://github.com/ckeditor/ckeditor5-image/compare/v13.1.0...v13.1.1) (2019-07-04)
109
-
110
- Internal changes only (updated dependencies, documentation, etc.).
111
-
112
-
113
- ## [13.1.0](https://github.com/ckeditor/ckeditor5-image/compare/v13.0.1...v13.1.0) (2019-06-05)
114
-
115
- ### Bug fixes
116
-
117
- * Fixed the scope of the "click outside handler" in `ImageTextAlternative`. Closes [#292](https://github.com/ckeditor/ckeditor5-image/issues/292). ([78e619e](https://github.com/ckeditor/ckeditor5-image/commit/78e619e))
118
-
119
- ### Other changes
120
-
121
- * Changed `ImageStyleCommand#defaultStyle` from private to public readonly property. Closes [#289](https://github.com/ckeditor/ckeditor5-image/issues/289). ([fb35177](https://github.com/ckeditor/ckeditor5-image/commit/fb35177))
122
- * Updated translations. ([01125b7](https://github.com/ckeditor/ckeditor5-image/commit/01125b7))
123
-
124
-
125
- ## [13.0.1](https://github.com/ckeditor/ckeditor5-image/compare/v13.0.0...v13.0.1) (2019-04-10)
126
-
127
- ### Other changes
128
-
129
- * Updated translations. ([e674e9c](https://github.com/ckeditor/ckeditor5-image/commit/e674e9c))
130
-
131
-
132
- ## [13.0.0](https://github.com/ckeditor/ckeditor5-image/compare/v12.0.0...v13.0.0) (2019-02-28)
133
-
134
- ### Features
135
-
136
- * Enable images in table cells. ([3a4d2ca](https://github.com/ckeditor/ckeditor5-image/commit/3a4d2ca))
137
-
138
- ### Bug fixes
139
-
140
- * Insert missing caption for images that are nested in other elements. Closes https://github.com/ckeditor/ckeditor5/issues/1524. ([0e3a7c5](https://github.com/ckeditor/ckeditor5-image/commit/0e3a7c5))
141
- * The text alternative input should be blurred before the form is removed from the DOM. Closes ckeditor/ckeditor5/issues#1501. ([f89fe04](https://github.com/ckeditor/ckeditor5-image/commit/f89fe04))
142
- * Fixed memory leaks during editor initialization and destruction (see [ckeditor/ckeditor5#1341](https://github.com/ckeditor/ckeditor5/issues/1341)). ([205f119](https://github.com/ckeditor/ckeditor5-image/commit/205f119))
143
-
144
- ### Other changes
145
-
146
- * Aligned to the new `WidgetToolbarRepository` API. Replaced the `isImageWidgetSelected()` utility with `getSelectedImageWidget()` (see [ckeditor/ckeditor5-widget#60](https://github.com/ckeditor/ckeditor5-widget/issues/60)). ([699d586](https://github.com/ckeditor/ckeditor5-image/commit/699d586))
147
- * Remove `ImageEditing` plugin from requires method of `ImageStyleEditing`. Closes [#261](https://github.com/ckeditor/ckeditor5-image/issues/261). ([5dea054](https://github.com/ckeditor/ckeditor5-image/commit/5dea054))
148
- * The image uploading listener for handling `base64/blob` images no longer stops `inputTransformation` event. Closes [#263](https://github.com/ckeditor/ckeditor5-image/issues/263). Closes [ckeditor/ckeditor5-paste-from-office#44](https://github.com/ckeditor/ckeditor5-paste-from-office/issues/44). ([8c5b4fc](https://github.com/ckeditor/ckeditor5-image/commit/8c5b4fc))
149
- * Updated translations. ([1f4e70d](https://github.com/ckeditor/ckeditor5-image/commit/1f4e70d)) ([6c9e15c](https://github.com/ckeditor/ckeditor5-image/commit/6c9e15c)) ([a1b03b9](https://github.com/ckeditor/ckeditor5-image/commit/a1b03b9))
150
-
151
- ### BREAKING CHANGES
152
-
153
- * Upgraded minimal versions of Node to `8.0.0` and npm to `5.7.1`. See: [ckeditor/ckeditor5#1507](https://github.com/ckeditor/ckeditor5/issues/1507). ([612ea3c](https://github.com/ckeditor/ckeditor5-cloud-services/commit/612ea3c))
154
- * The `isImageWidgetSelected()` utility has been replaced by `getSelectedImageWidget()` and returns an editing `View` element instead of `Boolean`.
155
-
156
-
157
- ## [12.0.0](https://github.com/ckeditor/ckeditor5-image/compare/v11.0.0...v12.0.0) (2018-12-05)
158
-
159
- ### Features
160
-
161
- * Improved responsiveness of the text alternative view in narrow viewports (see [ckeditor/ckeditor5#416](https://github.com/ckeditor/ckeditor5/issues/416)). ([ff5394a](https://github.com/ckeditor/ckeditor5-image/commit/ff5394a))
162
- * Introduced the `'imageInsert'` command. Closes [#245](https://github.com/ckeditor/ckeditor5-image/issues/245). Closes [#251](https://github.com/ckeditor/ckeditor5-image/issues/251). ([cc1e7a3](https://github.com/ckeditor/ckeditor5-image/commit/cc1e7a3))
163
- * Support for uploading images pasted with a base64 source. Closes [#246](https://github.com/ckeditor/ckeditor5-image/issues/246). Closes [ckeditor/ckeditor5-paste-from-office#24](https://github.com/ckeditor/ckeditor5-paste-from-office/issues/24). ([89ab27e](https://github.com/ckeditor/ckeditor5-image/commit/89ab27e))
164
-
165
- ### Bug fixes
166
-
167
- * Prevent errors when (for unclear reasons) the native `DataTransfer#files` contains `null` values when drag&dropping files into the editor in Chrome. ([2a45481](https://github.com/ckeditor/ckeditor5-image/commit/2a45481))
168
-
169
- Thanks to [@code-chris](https://github.com/code-chris)!
170
-
171
- ### Other changes
172
-
173
- * Moved widget spacing styles from `@ckeditor/ckeditor5-theme-lark` to the feature content styles sheet (see [ckeditor/ckeditor5-theme-lark#209](https://github.com/ckeditor/ckeditor5-theme-lark/issues/209)). ([671e1b8](https://github.com/ckeditor/ckeditor5-image/commit/671e1b8))
174
- * Removed obsolete fill attributes in SVG icons. ([0f9dad3](https://github.com/ckeditor/ckeditor5-image/commit/0f9dad3)) ([57bd34c](https://github.com/ckeditor/ckeditor5-image/commit/57bd34c)) ([ebc27e6](https://github.com/ckeditor/ckeditor5-image/commit/ebc27e6)) ([6192cf3](https://github.com/ckeditor/ckeditor5-image/commit/6192cf3))
175
- * Updated translations. ([3c85c37](https://github.com/ckeditor/ckeditor5-image/commit/3c85c37))
176
-
177
- ### BREAKING CHANGES
178
-
179
- * The `ImageUploadCommand#execute()`'s `files` parameter was renamed to `file`. It can still accept an array of files.
180
-
181
-
182
- ## [11.0.0](https://github.com/ckeditor/ckeditor5-image/compare/v10.2.0...v11.0.0) (2018-10-08)
183
-
184
- ### Other changes
185
-
186
- * Aligned `ImageToolbar` to use the new widget toolbar repository. ([980681d](https://github.com/ckeditor/ckeditor5-image/commit/980681d))
187
- * Image feature should insert image the same way as other widget features do. ([26638f5](https://github.com/ckeditor/ckeditor5-image/commit/26638f5))
188
- * The `ImageUploadCommand` should check whether it can be executed in the context of the current document selection. Closes [#225](https://github.com/ckeditor/ckeditor5-image/issues/225). Closes [#227](https://github.com/ckeditor/ckeditor5-image/issues/227). Closes [#235](https://github.com/ckeditor/ckeditor5-image/issues/235). ([4c1f27f](https://github.com/ckeditor/ckeditor5-image/commit/4c1f27f))
189
- * Updated translations. ([59f3604](https://github.com/ckeditor/ckeditor5-image/commit/59f3604))
190
-
191
- ### BREAKING CHANGES
192
-
193
- * The `options.file` property was renamed to `options.files` in `ImageUploadCommand#execute()`.
194
- * The `options.insertAt` property of `ImageUploadCommand#execute()` was removed. The command will now use model's selection.
195
- * Removed `findOptimalInsertionPosition()` from utils. This method can now be found in the `@ckeditor/ckeditor5-widget/src/utils` module.
196
-
197
-
198
- ## [10.2.0](https://github.com/ckeditor/ckeditor5-image/compare/v10.1.0...v10.2.0) (2018-07-18)
199
-
200
- ### Features
201
-
202
- * Implemented a CSS–styled image upload loader. Closes [#207](https://github.com/ckeditor/ckeditor5-image/issues/207). ([997d39b](https://github.com/ckeditor/ckeditor5-image/commit/997d39b))
203
- * Introduced `ImageLoadObserver`. Closes [#213](https://github.com/ckeditor/ckeditor5-image/issues/213). ([1128cb8](https://github.com/ckeditor/ckeditor5-image/commit/1128cb8))
204
-
205
- ### Bug fixes
206
-
207
- * Complete upload icon should not be rendered in Edge due to an [Edge's bug](https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/105834/). Closes https://github.com/ckeditor/ckeditor5/issues/1066. ([9a62cf1](https://github.com/ckeditor/ckeditor5-image/commit/9a62cf1))
208
- * The UI should update once the image is loaded. Closes [#142](https://github.com/ckeditor/ckeditor5-image/issues/142). ([dee20c0](https://github.com/ckeditor/ckeditor5-image/commit/dee20c0))
209
-
210
- Used the `EditorUI#update` event instead of `View#render` to attach the UI components (see [ckeditor/ckeditor5-core#130](https://github.com/ckeditor/ckeditor5-core/issues/130)).
211
-
212
- ### Other changes
213
-
214
- * Updated translations. ([e6f77fe](https://github.com/ckeditor/ckeditor5-image/commit/e6f77fe))
215
-
216
-
217
- ## [10.1.0](https://github.com/ckeditor/ckeditor5-image/compare/v10.0.0...v10.1.0) (2018-06-21)
218
-
219
- ### Features
220
-
221
- * Added "upload completed" icon. Closes [#204](https://github.com/ckeditor/ckeditor5-image/issues/204). ([004eda7](https://github.com/ckeditor/ckeditor5-image/commit/004eda7))
222
-
223
- ### Bug fixes
224
-
225
- * Made image upload by drag&drop work when the `ImageUploadCommand` is disabled. Closes [#208](https://github.com/ckeditor/ckeditor5-image/issues/208). ([6908ec6](https://github.com/ckeditor/ckeditor5-image/commit/6908ec6))
226
-
227
- ### Other changes
228
-
229
- * Updated translations. ([bfc9456](https://github.com/ckeditor/ckeditor5-image/commit/bfc9456))
230
-
231
-
232
- ## [10.0.0](https://github.com/ckeditor/ckeditor5-image/compare/v1.0.0-beta.4...v10.0.0) (2018-04-25)
233
-
234
- ### Other changes
235
-
236
- * Changed the license to GPL2+ only. See [ckeditor/ckeditor5#991](https://github.com/ckeditor/ckeditor5/issues/991). ([7b11bc5](https://github.com/ckeditor/ckeditor5-image/commit/7b11bc5))
237
-
238
- ### BREAKING CHANGES
239
-
240
- * The license under which CKEditor 5 is released has been changed from a triple GPL, LGPL and MPL license to a GPL2+ only. See [ckeditor/ckeditor5#991](https://github.com/ckeditor/ckeditor5/issues/991) for more information.
241
-
242
-
243
- ## [1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-image/compare/v1.0.0-beta.2...v1.0.0-beta.4) (2018-04-19)
244
-
245
- ### Other changes
246
-
247
- * Updated translations. ([de6b58e](https://github.com/ckeditor/ckeditor5-image/commit/de6b58e))
248
-
249
-
250
- ## [1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-image/compare/v1.0.0-beta.1...v1.0.0-beta.2) (2018-04-10)
251
-
252
- ### Bug fixes
253
-
254
- * Fixed image upload progress updates. Now each upload status is treated separately. Closes [#191](https://github.com/ckeditor/ckeditor5-image/issues/191). ([66d67c0](https://github.com/ckeditor/ckeditor5-image/commit/66d67c0))
255
- * Image element will be cleared from upload progress classes if `uploadId` attribute changed to `null`. Closes [#200](https://github.com/ckeditor/ckeditor5-image/issues/200). ([5fadcf0](https://github.com/ckeditor/ckeditor5-image/commit/5fadcf0))
256
- * `ImageUploadEditing` should not throw unhandled async errors. Closes [#186](https://github.com/ckeditor/ckeditor5-image/issues/186). ([4357336](https://github.com/ckeditor/ckeditor5-image/commit/4357336))
257
-
258
- ### Other changes
259
-
260
- * Made the image text alternative form buttons thicker with a fill color and no background. Closes [#187](https://github.com/ckeditor/ckeditor5-image/issues/187). ([25c17ad](https://github.com/ckeditor/ckeditor5-image/commit/25c17ad))
261
-
262
-
263
- ## [1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-image/compare/v1.0.0-alpha.2...v1.0.0-beta.1) (2018-03-15)
264
-
265
- ### Features
266
-
267
- * Intorduced the `ImageUpload` feature. It was moved from the `@ckeditor/ckeditor5-upload` package. See [ckeditor/ckeditor5-upload#22](https://github.com/ckeditor/ckeditor5-upload/issues/22). ([b974bb0](https://github.com/ckeditor/ckeditor5-image/commit/b974bb0))
268
- * Simplified the text alternative UI, aligning the image package to the redesigned Lark theme (see [ckeditor/ckeditor5#645](https://github.com/ckeditor/ckeditor5/issues/645)). ([9a069b0](https://github.com/ckeditor/ckeditor5-image/commit/9a069b0))
269
-
270
- ### Other changes
271
-
272
- * Aligned feature class naming to the new scheme. ([8690765](https://github.com/ckeditor/ckeditor5-image/commit/8690765))
273
- * Migrated package styles to PostCSS. Moved visual styles to `@ckeditor/ckeditor5-theme-lark` (see [ckeditor/ckeditor5-ui#144](https://github.com/ckeditor/ckeditor5-ui/issues/144)). ([ed6e1cf](https://github.com/ckeditor/ckeditor5-image/commit/ed6e1cf))
274
- * Removed the `.ck-editor-toolbar` and `.ck-editor-toolbar-container` classes from the UI (see [ckeditor/ckeditor5-theme-lark#135](https://github.com/ckeditor/ckeditor5-theme-lark/issues/135)). ([1c08fdd](https://github.com/ckeditor/ckeditor5-image/commit/1c08fdd))
275
- * Renamed `uploadImage` command and button to `imageUpload`. Closes [#184](https://github.com/ckeditor/ckeditor5-image/issues/184). ([6f891b8](https://github.com/ckeditor/ckeditor5-image/commit/6f891b8))
276
- * Updated naming of UI components & commands. ([2e7fbee](https://github.com/ckeditor/ckeditor5-image/commit/2e7fbee))
277
- * Updated translations. ([02f9cf5](https://github.com/ckeditor/ckeditor5-image/commit/02f9cf5))
278
-
279
- ### BREAKING CHANGES
280
-
281
- * `uploadImage` command and button are now called `imageUpload`.
282
- * Renamed the `'imageUpload'` command to `'uploadImage'`.
283
- * The `'imageStyleFull'`, `'imageStyleSide'`, `'imageStyleAlignLeft'`, `'imageStyleAlignRight'` and `'imageStyleAlignCenter'` commands are no longer available. They were replaced by the `'imageStyle'` command that accepts name of an image style as a value.
284
- * The `'imageStyleFull'`, `'imageStyleSide'`, `'imageStyleAlignLeft'`, `'imageStyleAlignRight'` and `'imageStyleAlignCenter'` UI components are no longer available. Replaced by `'imageStyle:full'`, `'imageStyle:side'`, `'imageStyle:alignLeft'`, `'imageStyle:alignRight'` and `'imageStyle:alignCenter'`.
285
- * The `ImageStyleCommand#value` property is no longer a boolean only. Now it represents a name of an image style of the currently selected image element.
286
- * The `ImageStyleCommand` constructor's second parameter is now an array of supported image styles.
287
- * The DOM structure of the text alternative form has changed.
288
-
289
-
290
- ## 0.0.1 (2017-11-06)
291
-
292
- Internal changes only (updated dependencies, documentation, etc.).
293
-
294
-
295
- ## [1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-image/compare/v1.0.0-alpha.1...v1.0.0-alpha.2) (2017-11-14)
296
-
297
- ### Bug fixes
298
-
299
- * Default style's command will properly remove model element's attribute. Closes [#147](https://github.com/ckeditor/ckeditor5-image/issues/147). ([c96fb19](https://github.com/ckeditor/ckeditor5-image/commit/c96fb19))
300
-
301
- ### Other changes
302
-
303
- * Updated translations. ([eb4ba5b](https://github.com/ckeditor/ckeditor5-image/commit/eb4ba5b))
304
- * Aligned UI library usage to the [changes in the UI framework](https://github.com/ckeditor/ckeditor5-ui/pull/332).
305
-
306
-
307
- ## [1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-image/compare/v0.7.0...v1.0.0-alpha.1) (2017-10-03)
308
-
309
- ### Bug fixes
310
-
311
- * Fixed a bug causing the editor with `ImageCaption` plugin enabled to throw an error after the view got rendered. Closes [#127](https://github.com/ckeditor/ckeditor5-image/issues/127). ([6147fee](https://github.com/ckeditor/ckeditor5-image/commit/6147fee))
312
- * The `ImageTextAlternative`'s UI should be hidden when the edited image element has been removed by an external change. Closes [#137](https://github.com/ckeditor/ckeditor5-image/issues/137). ([6ab8c40](https://github.com/ckeditor/ckeditor5-image/commit/6ab8c40))
313
-
314
- ### Features
315
-
316
- * Allowed customization of the default image styles. Defined formatting–oriented styles. Simplified `config.image.styles` syntax. Closes [#134](https://github.com/ckeditor/ckeditor5-image/issues/134). Closes [#135](https://github.com/ckeditor/ckeditor5-image/issues/135). ([eab98ef](https://github.com/ckeditor/ckeditor5-image/commit/eab98ef))
317
- * Keyboard navigation will now work in the `TextAlternativeFormView`. Closes [#40](https://github.com/ckeditor/ckeditor5-image/issues/40). Closes [ckeditor/ckeditor5#490](https://github.com/ckeditor/ckeditor5/issues/490). ([fa92de6](https://github.com/ckeditor/ckeditor5-image/commit/fa92de6))
318
- * The `srcset` attribute in the model will now be converted to three attributes in the view: `srcset`, `sizes` and `width`. Closes [#145](https://github.com/ckeditor/ckeditor5-image/issues/145). Closes [ckeditor/ckeditor5-easy-image#4](https://github.com/ckeditor/ckeditor5-easy-image/issues/4). ([9ca651e](https://github.com/ckeditor/ckeditor5-image/commit/9ca651e))
319
-
320
- ### BREAKING CHANGES
321
-
322
- * The format of the `srcset` attribute has been changed.
323
- * From now on, the `imageStyleFull` uses `object-full-width.svg` icon.
324
-
325
-
326
- ## [0.7.0](https://github.com/ckeditor/ckeditor5-image/compare/v0.6.0...v0.7.0) (2017-09-03)
327
-
328
- ### Bug fixes
329
-
330
- * `ImageStyleCommand` should switch properly between any two non-null styles. Closes [#132](https://github.com/ckeditor/ckeditor5-image/issues/132). ([d6c847d](https://github.com/ckeditor/ckeditor5-image/commit/d6c847d))
331
- * Text alternative input should synchronize its value when the balloon shows up. Closes [#114](https://github.com/ckeditor/ckeditor5-image/issues/114). ([9b105ed](https://github.com/ckeditor/ckeditor5-image/commit/9b105ed))
332
- * The arrow of the toolbar's balloon should inherit the background color. Closes [#109](https://github.com/ckeditor/ckeditor5-image/issues/109). ([4322b04](https://github.com/ckeditor/ckeditor5-image/commit/4322b04))
333
- * The image toolbar should not be doubled when the `ContextualToolbar` plugin is in use. Closes [#110](https://github.com/ckeditor/ckeditor5-image/issues/110). ([5ace9a0](https://github.com/ckeditor/ckeditor5-image/commit/5ace9a0))
334
-
335
- ### Features
336
-
337
- * Introduced support for responsive image's `srcset` attribute. Closes [#2](https://github.com/ckeditor/ckeditor5-image/issues/2). ([5b433d2](https://github.com/ckeditor/ckeditor5-image/commit/5b433d2))
338
-
339
- ### Other changes
340
-
341
- * Aligned the implementation to the new Command API (see https://github.com/ckeditor/ckeditor5-core/issues/88). ([2c0044c](https://github.com/ckeditor/ckeditor5-image/commit/2c0044c))
342
-
343
- ### BREAKING CHANGES
344
-
345
- * The command API has been changed.
346
-
347
-
348
- ## [0.6.0](https://github.com/ckeditor/ckeditor5-image/compare/v0.5.0...v0.6.0) (2017-05-07)
349
-
350
- ### Bug fixes
351
-
352
- * Bare `<img>` (not wrapped with `<figure class="image">`) can now be pasted into the editor. Closes [#8](https://github.com/ckeditor/ckeditor5-image/issues/8). ([fb6ab1a](https://github.com/ckeditor/ckeditor5-image/commit/fb6ab1a))
353
- * Fixed toolbar positioning in MS Edge. Closes [#101](https://github.com/ckeditor/ckeditor5-image/issues/101). ([19941e9](https://github.com/ckeditor/ckeditor5-image/commit/19941e9))
354
- * The `caption` item should inherit from `$block` to automatically allow the same content. Closes [#94](https://github.com/ckeditor/ckeditor5-image/issues/94). ([02869eb](https://github.com/ckeditor/ckeditor5-image/commit/02869eb))
355
-
356
- ### Features
357
-
358
- * Introduced support for pasting and loading images in context in which they cannot appear in the editor. For example, if `<p>foo<img>bar</p>` is pasted, the pasted paragraph will be split (because an image in the editor cannot be contained in a paragraph). Closes [#98](https://github.com/ckeditor/ckeditor5-image/issues/98). ([e2104b1](https://github.com/ckeditor/ckeditor5-image/commit/e2104b1))
359
-
360
- ### Other changes
361
-
362
- * Removed automatically filled `config.image.defaultToolbar`. Now, when initializing the editor one must always define `config.image.toolbar`. Closes [#60](https://github.com/ckeditor/ckeditor5-image/issues/60). ([4db7b34](https://github.com/ckeditor/ckeditor5-image/commit/4db7b34))
363
- * Updated translations. ([22b5dbc](https://github.com/ckeditor/ckeditor5-image/commit/22b5dbc))
364
-
365
- ### BREAKING CHANGES
366
-
367
- * The `config.image.defaultToolbar` is no longer available. All editor instances must have `config.image.toolbar` configured instead.
368
-
369
-
370
- ## [0.5.0](https://github.com/ckeditor/ckeditor5-image/compare/v0.4.0...v0.5.0) (2017-04-05)
371
-
372
- ### Bug fixes
373
-
374
- * Caption will not be automatically added for the second time if it was already added before "caption fixer" was fired. Closes [#78](https://github.com/ckeditor/ckeditor5-image/issues/78). ([e651b01](https://github.com/ckeditor/ckeditor5-image/commit/e651b01))
375
- * Image captions in the view are hidden instead of being removed (from the view and the DOM). Closes [#77](https://github.com/ckeditor/ckeditor5-image/issues/77). ([aae2957](https://github.com/ckeditor/ckeditor5-image/commit/aae2957))
376
- * The editor no longer crashes when undoing or redoing changes reshow temporarily invisible image caption. Closes [#58](https://github.com/ckeditor/ckeditor5-image/issues/58). ([8e36645](https://github.com/ckeditor/ckeditor5-image/commit/8e36645))
377
- * The image should not go (visually) beyond the boundaries of the parent container. Closes [#67](https://github.com/ckeditor/ckeditor5-image/issues/67). ([d1ee92d](https://github.com/ckeditor/ckeditor5-image/commit/d1ee92d))
378
-
379
- ### Features
380
-
381
- * Added "Enter caption here" placeholders to empty image captions. Closes [#71](https://github.com/ckeditor/ckeditor5-image/issues/71). ([3818544](https://github.com/ckeditor/ckeditor5-image/commit/3818544))
382
- * Introduced `toWidgetEditable()`. Closes [#57](https://github.com/ckeditor/ckeditor5-image/issues/57). ([ecbe435](https://github.com/ckeditor/ckeditor5-image/commit/ecbe435))
383
-
384
- The styling and behavior of image's caption will now be reusable in other widgets.
385
- * Named existing plugin(s). ([de96d07](https://github.com/ckeditor/ckeditor5-image/commit/de96d07))
386
-
387
- ### Other changes
388
-
389
- * Aligned the use of the `Widget` plugin. Closes [#89](https://github.com/ckeditor/ckeditor5-image/issues/89). ([16f285d](https://github.com/ckeditor/ckeditor5-image/commit/16f285d))
390
- * Extracted widget API to a separate package. Closes [#35](https://github.com/ckeditor/ckeditor5-image/issues/35). ([016b68e](https://github.com/ckeditor/ckeditor5-image/commit/016b68e))
391
- * Fixed import paths after [refactoring in ckeditor5-ui](https://github.com/ckeditor/ckeditor5-ui/pull/156). Closes [#52](https://github.com/ckeditor/ckeditor5-image/issues/52). ([cc8f671](https://github.com/ckeditor/ckeditor5-image/commit/cc8f671))
392
- * Imported captioned image styles from ckeditor5.github.io. Closes [#68](https://github.com/ckeditor/ckeditor5-image/issues/68). ([2f993bc](https://github.com/ckeditor/ckeditor5-image/commit/2f993bc))
393
- * Improved visual styles of the image widget. Closes [#12](https://github.com/ckeditor/ckeditor5-image/issues/12). ([8fa3746](https://github.com/ckeditor/ckeditor5-image/commit/8fa3746))
394
- * Updated translations. ([966d911](https://github.com/ckeditor/ckeditor5-image/commit/966d911))
395
-
396
- ### BREAKING CHANGES
397
-
398
- * The widget API is now available in the `ckeditor5-widget` package. See [#35](https://github.com/ckeditor/ckeditor5-image/issues/35).
399
-
400
-
401
- ## [0.4.0](https://github.com/ckeditor/ckeditor5-image/compare/v0.3.0...v0.4.0) (2017-03-06)
402
-
403
- ### Bug fixes
404
-
405
- * Moved focus tracking setup to `ImageBalloonPanelView#init()` method to prevent too early access to the view element. Closes [#42](https://github.com/ckeditor/ckeditor5/issues/42). ([985e509](https://github.com/ckeditor/ckeditor5-image/commit/985e509))
406
- * Used "low-vision" icon instead of "input" for text alternative button. Closes [#59](https://github.com/ckeditor/ckeditor5/issues/59). ([6edd823](https://github.com/ckeditor/ckeditor5-image/commit/6edd823))
407
-
408
- ### Features
409
-
410
- * Added a separator between image styles and text alternative buttons in the image toolbar. Closes [#64](https://github.com/ckeditor/ckeditor5/issues/64). ([925a538](https://github.com/ckeditor/ckeditor5-image/commit/925a538))
411
- * Introduced image captions support. Closes [#28](https://github.com/ckeditor/ckeditor5/issues/28). ([6bb4069](https://github.com/ckeditor/ckeditor5-image/commit/6bb4069))
412
-
413
- ### Other changes
414
-
415
- * Enhanced how selection label for widgets is defined. Closes [#9](https://github.com/ckeditor/ckeditor5/issues/9). ([5c1897d](https://github.com/ckeditor/ckeditor5-image/commit/5c1897d))
416
- * Renamed "Image alternate text" to "Image text alternative" all across the code. Improved directory structure to have most important features in the top level of `src/`. Closes [#37](https://github.com/ckeditor/ckeditor5/issues/37). ([e38675f](https://github.com/ckeditor/ckeditor5-image/commit/e38675f))
417
- * Uploaded translations. ([d619f1d](https://github.com/ckeditor/ckeditor5-image/commit/d619f1d))
418
-
419
-
420
- ### BREAKING CHANGES
421
-
422
- * The `src/imagealternatetext/imagealternatetext` module is now `src/imagetextalternative`. All other related classes and directories were renamed too.
423
- * All the base image's util modules are now inside `src/image/`. The same applies to all other features. The main features are now directly in `src/`. Closes [#33](https://github.com/ckeditor/ckeditor5/issues/33). Closes [#26](https://github.com/ckeditor/ckeditor5/issues/26).