'},ie=i((function t(){var i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};e(this,t),this.customOptions=i,this.settings=o(te,i),this.effectsClasses=this.getAnimationClasses(),this.videoPlayers={},this.apiEvents=[],this.fullElementsList=!1}),[{key:"init",value:function(){var e=this,t=this.getSelector();t&&(this.baseEvents=h("click",{onElement:t,withCallback:function(t,i){t.preventDefault(),e.open(i)}})),this.elements=this.getElements()}},{key:"open",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;if(0===this.elements.length)return!1;this.activeSlide=null,this.prevActiveSlideIndex=null,this.prevActiveSlide=null;var i=z(t)?t:this.settings.startAt;if(E(e)){var n=e.getAttribute("data-gallery");n&&(this.fullElementsList=this.elements,this.elements=this.getGalleryElements(this.elements,n)),O(i)&&(i=this.getElementIndex(e))<0&&(i=0)}z(i)||(i=0),this.build(),v(this.overlay,"none"===this.settings.openEffect?"none":this.settings.cssEfects.fade.in);var s=document.body,l=window.innerWidth-document.documentElement.clientWidth;if(l>0){var o=document.createElement("style");o.type="text/css",o.className="gcss-styles",o.innerText=".gscrollbar-fixer {margin-right: ".concat(l,"px}"),document.head.appendChild(o),d(s,"gscrollbar-fixer")}d(s,"glightbox-open"),d(ee,"glightbox-open"),K&&(d(document.body,"glightbox-mobile"),this.settings.slideEffect="slide"),this.showSlide(i,!0),1===this.elements.length?(d(this.prevButton,"glightbox-button-hidden"),d(this.nextButton,"glightbox-button-hidden")):(c(this.prevButton,"glightbox-button-hidden"),c(this.nextButton,"glightbox-button-hidden")),this.lightboxOpen=!0,this.trigger("open"),C(this.settings.onOpen)&&this.settings.onOpen(),Q&&this.settings.touchNavigation&&J(this),this.settings.keyboardNavigation&&Y(this)}},{key:"openAt",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;this.open(null,e)}},{key:"showSlide",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,i=arguments.length>1&&void 0!==arguments[1]&&arguments[1];p(this.loader),this.index=parseInt(t);var n=this.slidesContainer.querySelector(".current");n&&c(n,"current"),this.slideAnimateOut();var s=this.slidesContainer.querySelectorAll(".gslide")[t];if(u(s,"loaded"))this.slideAnimateIn(s,i),m(this.loader);else{p(this.loader);var l=this.elements[t],o={index:this.index,slide:s,slideNode:s,slideConfig:l.slideConfig,slideIndex:this.index,trigger:l.node,player:null};this.trigger("slide_before_load",o),l.instance.setContent(s,(function(){m(e.loader),e.resize(),e.slideAnimateIn(s,i),e.trigger("slide_after_load",o)}))}this.slideDescription=s.querySelector(".gslide-description"),this.slideDescriptionContained=this.slideDescription&&u(this.slideDescription.parentNode,"gslide-media"),this.settings.preload&&(this.preloadSlide(t+1),this.preloadSlide(t-1)),this.updateNavigationClasses(),this.activeSlide=s}},{key:"preloadSlide",value:function(e){var t=this;if(e<0||e>this.elements.length-1)return!1;if(O(this.elements[e]))return!1;var i=this.slidesContainer.querySelectorAll(".gslide")[e];if(u(i,"loaded"))return!1;var n=this.elements[e],s=n.type,l={index:e,slide:i,slideNode:i,slideConfig:n.slideConfig,slideIndex:e,trigger:n.node,player:null};this.trigger("slide_before_load",l),"video"===s||"external"===s?setTimeout((function(){n.instance.setContent(i,(function(){t.trigger("slide_after_load",l)}))}),200):n.instance.setContent(i,(function(){t.trigger("slide_after_load",l)}))}},{key:"prevSlide",value:function(){this.goToSlide(this.index-1)}},{key:"nextSlide",value:function(){this.goToSlide(this.index+1)}},{key:"goToSlide",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(this.prevActiveSlide=this.activeSlide,this.prevActiveSlideIndex=this.index,!this.loop()&&(e<0||e>this.elements.length-1))return!1;e<0?e=this.elements.length-1:e>=this.elements.length&&(e=0),this.showSlide(e)}},{key:"insertSlide",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:-1;t<0&&(t=this.elements.length);var i=new V(e,this,t),n=i.getConfig(),s=o({},n),l=i.create(),r=this.elements.length-1;s.index=t,s.node=!1,s.instance=i,s.slideConfig=n,this.elements.splice(t,0,s);var a=null,h=null;if(this.slidesContainer){if(t>r)this.slidesContainer.appendChild(l);else{var d=this.slidesContainer.querySelectorAll(".gslide")[t];this.slidesContainer.insertBefore(l,d)}(this.settings.preload&&0==this.index&&0==t||this.index-1==t||this.index+1==t)&&this.preloadSlide(t),0===this.index&&0===t&&(this.index=1),this.updateNavigationClasses(),a=this.slidesContainer.querySelectorAll(".gslide")[t],h=this.getSlidePlayerInstance(t),s.slideNode=a}this.trigger("slide_inserted",{index:t,slide:a,slideNode:a,slideConfig:n,slideIndex:t,trigger:null,player:h}),C(this.settings.slideInserted)&&this.settings.slideInserted({index:t,slide:a,player:h})}},{key:"removeSlide",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:-1;if(e<0||e>this.elements.length-1)return!1;var t=this.slidesContainer&&this.slidesContainer.querySelectorAll(".gslide")[e];t&&(this.getActiveSlideIndex()==e&&(e==this.elements.length-1?this.prevSlide():this.nextSlide()),t.parentNode.removeChild(t)),this.elements.splice(e,1),this.trigger("slide_removed",e),C(this.settings.slideRemoved)&&this.settings.slideRemoved(e)}},{key:"slideAnimateIn",value:function(e,t){var i=this,n=e.querySelector(".gslide-media"),s=e.querySelector(".gslide-description"),l={index:this.prevActiveSlideIndex,slide:this.prevActiveSlide,slideNode:this.prevActiveSlide,slideIndex:this.prevActiveSlide,slideConfig:O(this.prevActiveSlideIndex)?null:this.elements[this.prevActiveSlideIndex].slideConfig,trigger:O(this.prevActiveSlideIndex)?null:this.elements[this.prevActiveSlideIndex].node,player:this.getSlidePlayerInstance(this.prevActiveSlideIndex)},o={index:this.index,slide:this.activeSlide,slideNode:this.activeSlide,slideConfig:this.elements[this.index].slideConfig,slideIndex:this.index,trigger:this.elements[this.index].node,player:this.getSlidePlayerInstance(this.index)};if(n.offsetWidth>0&&s&&(m(s),s.style.display=""),c(e,this.effectsClasses),t)v(e,this.settings.cssEfects[this.settings.openEffect].in,(function(){i.settings.autoplayVideos&&i.slidePlayerPlay(e),i.trigger("slide_changed",{prev:l,current:o}),C(i.settings.afterSlideChange)&&i.settings.afterSlideChange.apply(i,[l,o])}));else{var r=this.settings.slideEffect,a="none"!==r?this.settings.cssEfects[r].in:r;this.prevActiveSlideIndex>this.index&&"slide"==this.settings.slideEffect&&(a=this.settings.cssEfects.slideBack.in),v(e,a,(function(){i.settings.autoplayVideos&&i.slidePlayerPlay(e),i.trigger("slide_changed",{prev:l,current:o}),C(i.settings.afterSlideChange)&&i.settings.afterSlideChange.apply(i,[l,o])}))}setTimeout((function(){i.resize(e)}),100),d(e,"current")}},{key:"slideAnimateOut",value:function(){if(!this.prevActiveSlide)return!1;var e=this.prevActiveSlide;c(e,this.effectsClasses),d(e,"prev");var t=this.settings.slideEffect,i="none"!==t?this.settings.cssEfects[t].out:t;this.slidePlayerPause(e),this.trigger("slide_before_change",{prev:{index:this.prevActiveSlideIndex,slide:this.prevActiveSlide,slideNode:this.prevActiveSlide,slideIndex:this.prevActiveSlideIndex,slideConfig:O(this.prevActiveSlideIndex)?null:this.elements[this.prevActiveSlideIndex].slideConfig,trigger:O(this.prevActiveSlideIndex)?null:this.elements[this.prevActiveSlideIndex].node,player:this.getSlidePlayerInstance(this.prevActiveSlideIndex)},current:{index:this.index,slide:this.activeSlide,slideNode:this.activeSlide,slideIndex:this.index,slideConfig:this.elements[this.index].slideConfig,trigger:this.elements[this.index].node,player:this.getSlidePlayerInstance(this.index)}}),C(this.settings.beforeSlideChange)&&this.settings.beforeSlideChange.apply(this,[{index:this.prevActiveSlideIndex,slide:this.prevActiveSlide,player:this.getSlidePlayerInstance(this.prevActiveSlideIndex)},{index:this.index,slide:this.activeSlide,player:this.getSlidePlayerInstance(this.index)}]),this.prevActiveSlideIndex>this.index&&"slide"==this.settings.slideEffect&&(i=this.settings.cssEfects.slideBack.out),v(e,i,(function(){var t=e.querySelector(".ginner-container"),i=e.querySelector(".gslide-media"),n=e.querySelector(".gslide-description");t.style.transform="",i.style.transform="",c(i,"greset"),i.style.opacity="",n&&(n.style.opacity=""),c(e,"prev")}))}},{key:"getAllPlayers",value:function(){return this.videoPlayers}},{key:"getSlidePlayerInstance",value:function(e){var t="gvideo"+e,i=this.getAllPlayers();return!(!P(i,t)||!i[t])&&i[t]}},{key:"stopSlideVideo",value:function(e){if(E(e)){var t=e.querySelector(".gvideo-wrapper");t&&(e=t.getAttribute("data-index"))}console.log("stopSlideVideo is deprecated, use slidePlayerPause");var i=this.getSlidePlayerInstance(e);i&&i.playing&&i.pause()}},{key:"slidePlayerPause",value:function(e){if(E(e)){var t=e.querySelector(".gvideo-wrapper");t&&(e=t.getAttribute("data-index"))}var i=this.getSlidePlayerInstance(e);i&&i.playing&&i.pause()}},{key:"playSlideVideo",value:function(e){if(E(e)){var t=e.querySelector(".gvideo-wrapper");t&&(e=t.getAttribute("data-index"))}console.log("playSlideVideo is deprecated, use slidePlayerPlay");var i=this.getSlidePlayerInstance(e);i&&!i.playing&&i.play()}},{key:"slidePlayerPlay",value:function(e){var t;if(!K||null!==(t=this.settings.plyr.config)&&void 0!==t&&t.muted){if(E(e)){var i=e.querySelector(".gvideo-wrapper");i&&(e=i.getAttribute("data-index"))}var n=this.getSlidePlayerInstance(e);n&&!n.playing&&(n.play(),this.settings.autofocusVideos&&n.elements.container.focus())}}},{key:"setElements",value:function(e){var t=this;this.settings.elements=!1;var i=[];e&&e.length&&r(e,(function(e,n){var s=new V(e,t,n),l=s.getConfig(),r=o({},l);r.slideConfig=l,r.instance=s,r.index=n,i.push(r)})),this.elements=i,this.lightboxOpen&&(this.slidesContainer.innerHTML="",this.elements.length&&(r(this.elements,(function(){var e=y(t.settings.slideHTML);t.slidesContainer.appendChild(e)})),this.showSlide(0,!0)))}},{key:"getElementIndex",value:function(e){var t=!1;return r(this.elements,(function(i,n){if(P(i,"node")&&i.node==e)return t=n,!0})),t}},{key:"getElements",value:function(){var e=this,t=[];this.elements=this.elements?this.elements:[],!O(this.settings.elements)&&A(this.settings.elements)&&this.settings.elements.length&&r(this.settings.elements,(function(i,n){var s=new V(i,e,n),l=s.getConfig(),r=o({},l);r.node=!1,r.index=n,r.instance=s,r.slideConfig=l,t.push(r)}));var i=!1;return this.getSelector()&&(i=document.querySelectorAll(this.getSelector())),i?(r(i,(function(i,n){var s=new V(i,e,n),l=s.getConfig(),r=o({},l);r.node=i,r.index=n,r.instance=s,r.slideConfig=l,r.gallery=i.getAttribute("data-gallery"),t.push(r)})),t):t}},{key:"getGalleryElements",value:function(e,t){return e.filter((function(e){return e.gallery==t}))}},{key:"getSelector",value:function(){return!this.settings.elements&&(this.settings.selector&&"data-"==this.settings.selector.substring(0,5)?"*[".concat(this.settings.selector,"]"):this.settings.selector)}},{key:"getActiveSlide",value:function(){return this.slidesContainer.querySelectorAll(".gslide")[this.index]}},{key:"getActiveSlideIndex",value:function(){return this.index}},{key:"getAnimationClasses",value:function(){var e=[];for(var t in this.settings.cssEfects)if(this.settings.cssEfects.hasOwnProperty(t)){var i=this.settings.cssEfects[t];e.push("g".concat(i.in)),e.push("g".concat(i.out))}return e.join(" ")}},{key:"build",value:function(){var e=this;if(this.built)return!1;var t=document.body.childNodes,i=[];r(t,(function(e){e.parentNode==document.body&&"#"!==e.nodeName.charAt(0)&&e.hasAttribute&&!e.hasAttribute("aria-hidden")&&(i.push(e),e.setAttribute("aria-hidden","true"))}));var n=P(this.settings.svg,"next")?this.settings.svg.next:"",s=P(this.settings.svg,"prev")?this.settings.svg.prev:"",l=P(this.settings.svg,"close")?this.settings.svg.close:"",o=this.settings.lightboxHTML;o=y(o=(o=(o=o.replace(/{nextSVG}/g,n)).replace(/{prevSVG}/g,s)).replace(/{closeSVG}/g,l)),document.body.appendChild(o);var a=document.getElementById("glightbox-body");this.modal=a;var c=a.querySelector(".gclose");this.prevButton=a.querySelector(".gprev"),this.nextButton=a.querySelector(".gnext"),this.overlay=a.querySelector(".goverlay"),this.loader=a.querySelector(".gloader"),this.slidesContainer=document.getElementById("glightbox-slider"),this.bodyHiddenChildElms=i,this.events={},d(this.modal,"glightbox-"+this.settings.skin),this.settings.closeButton&&c&&(this.events.close=h("click",{onElement:c,withCallback:function(t,i){t.preventDefault(),e.close()}})),c&&!this.settings.closeButton&&c.parentNode.removeChild(c),this.nextButton&&(this.events.next=h("click",{onElement:this.nextButton,withCallback:function(t,i){t.preventDefault(),e.nextSlide()}})),this.prevButton&&(this.events.prev=h("click",{onElement:this.prevButton,withCallback:function(t,i){t.preventDefault(),e.prevSlide()}})),this.settings.closeOnOutsideClick&&(this.events.outClose=h("click",{onElement:a,withCallback:function(t,i){e.preventOutsideClick||u(document.body,"glightbox-mobile")||g(t.target,".ginner-container")||g(t.target,".gbtn")||u(t.target,"gnext")||u(t.target,"gprev")||e.close()}})),r(this.elements,(function(t,i){e.slidesContainer.appendChild(t.instance.create()),t.slideNode=e.slidesContainer.querySelectorAll(".gslide")[i]})),Q&&d(document.body,"glightbox-touch"),this.events.resize=h("resize",{onElement:window,withCallback:function(){e.resize()}}),this.built=!0}},{key:"resize",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;if((e=e||this.activeSlide)&&!u(e,"zoomed")){var t=x(),i=e.querySelector(".gvideo-wrapper"),n=e.querySelector(".gslide-image"),s=this.slideDescription,l=t.width,o=t.height;if(l<=768?d(document.body,"glightbox-mobile"):c(document.body,"glightbox-mobile"),i||n){var r=!1;if(s&&(u(s,"description-bottom")||u(s,"description-top"))&&!u(s,"gabsolute")&&(r=!0),n)if(l<=768)n.querySelector("img");else if(r){var a,h,g=s.offsetHeight,v=n.querySelector("img"),f=null===(a=this.elements[this.index])||void 0===a?void 0:a.node,p="100vh";f&&(p=null!==(h=f.getAttribute("data-height"))&&void 0!==h?h:p),v.setAttribute("style","max-height: calc(".concat(p," - ").concat(g,"px)")),s.setAttribute("style","max-width: ".concat(v.offsetWidth,"px;"))}if(i){var m=P(this.settings.plyr.config,"ratio")?this.settings.plyr.config.ratio:"";if(!m){var y=i.clientWidth,b=i.clientHeight,S=y/b;m="".concat(y/S,":").concat(b/S)}var w=m.split(":"),T=this.settings.videosWidth,C=this.settings.videosWidth,k=(C=z(T)||-1!==T.indexOf("px")?parseInt(T):-1!==T.indexOf("vw")?l*parseInt(T)/100:-1!==T.indexOf("vh")?o*parseInt(T)/100:-1!==T.indexOf("%")?l*parseInt(T)/100:parseInt(i.clientWidth))/(parseInt(w[0])/parseInt(w[1]));if(k=Math.floor(k),r&&(o-=s.offsetHeight),C>l||k>o||oC){var E=i.offsetWidth,A=i.offsetHeight,L=o/A,I={width:E*L,height:A*L};i.parentNode.setAttribute("style","max-width: ".concat(I.width,"px")),r&&s.setAttribute("style","max-width: ".concat(I.width,"px;"))}else i.parentNode.style.maxWidth="".concat(T),r&&s.setAttribute("style","max-width: ".concat(T,";"))}}}}},{key:"reload",value:function(){this.init()}},{key:"updateNavigationClasses",value:function(){var e=this.loop();c(this.nextButton,"disabled"),c(this.prevButton,"disabled"),0==this.index&&this.elements.length-1==0?(d(this.prevButton,"disabled"),d(this.nextButton,"disabled")):0!==this.index||e?this.index!==this.elements.length-1||e||d(this.nextButton,"disabled"):d(this.prevButton,"disabled")}},{key:"loop",value:function(){var e=P(this.settings,"loopAtEnd")?this.settings.loopAtEnd:null;return e=P(this.settings,"loop")?this.settings.loop:e,e}},{key:"close",value:function(){var e=this;if(!this.lightboxOpen){if(this.events){for(var t in this.events)this.events.hasOwnProperty(t)&&this.events[t].destroy();this.events=null}return!1}if(this.closing)return!1;this.closing=!0,this.slidePlayerPause(this.activeSlide),this.fullElementsList&&(this.elements=this.fullElementsList),this.bodyHiddenChildElms.length&&r(this.bodyHiddenChildElms,(function(e){e.removeAttribute("aria-hidden")})),d(this.modal,"glightbox-closing"),v(this.overlay,"none"==this.settings.openEffect?"none":this.settings.cssEfects.fade.out),v(this.activeSlide,this.settings.cssEfects[this.settings.closeEffect].out,(function(){if(e.activeSlide=null,e.prevActiveSlideIndex=null,e.prevActiveSlide=null,e.built=!1,e.events){for(var t in e.events)e.events.hasOwnProperty(t)&&e.events[t].destroy();e.events=null}var i=document.body;c(ee,"glightbox-open"),c(i,"glightbox-open touching gdesc-open glightbox-touch glightbox-mobile gscrollbar-fixer"),e.modal.parentNode.removeChild(e.modal),e.trigger("close"),C(e.settings.onClose)&&e.settings.onClose();var n=document.querySelector(".gcss-styles");n&&n.parentNode.removeChild(n),e.lightboxOpen=!1,e.closing=null}))}},{key:"destroy",value:function(){this.close(),this.clearAllEvents(),this.baseEvents&&this.baseEvents.destroy()}},{key:"on",value:function(e,t){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(!e||!C(t))throw new TypeError("Event name and callback must be defined");this.apiEvents.push({evt:e,once:i,callback:t})}},{key:"once",value:function(e,t){this.on(e,t,!0)}},{key:"trigger",value:function(e){var t=this,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,n=[];r(this.apiEvents,(function(t,s){var l=t.evt,o=t.once,r=t.callback;l==e&&(r(i),o&&n.push(s))})),n.length&&r(n,(function(e){return t.apiEvents.splice(e,1)}))}},{key:"clearAllEvents",value:function(){this.apiEvents.splice(0,this.apiEvents.length)}},{key:"version",value:function(){return"3.3.1"}}]);return function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=new ie(e);return t.init(),t}}));
\ No newline at end of file
diff --git a/docs/assets/resize-observer-polyfill/LICENSE b/docs/assets/resize-observer-polyfill/LICENSE
new file mode 100644
index 000000000..3a568dc69
--- /dev/null
+++ b/docs/assets/resize-observer-polyfill/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2016 Denis Rul
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/docs/assets/resize-observer-polyfill/ResizeObserver.global.js b/docs/assets/resize-observer-polyfill/ResizeObserver.global.js
new file mode 100644
index 000000000..1e7ae5b2e
--- /dev/null
+++ b/docs/assets/resize-observer-polyfill/ResizeObserver.global.js
@@ -0,0 +1,1039 @@
+/*!
+ * resize-observer-polyfill v1.5.1
+ * https://github.com/que-etc/resize-observer-polyfill
+ * Copyright (c) 2016 Denis Rul; Licensed MIT
+*/
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+ typeof define === 'function' && define.amd ? define(factory) :
+ (global.ResizeObserver = factory());
+}(this, (function () { 'use strict';
+
+/**
+ * A collection of shims that provide minimal functionality of the ES6 collections.
+ *
+ * These implementations are not meant to be used outside of the ResizeObserver
+ * modules as they cover only a limited range of use cases.
+ */
+/* eslint-disable require-jsdoc, valid-jsdoc */
+var MapShim = (function () {
+ if (typeof Map !== 'undefined') {
+ return Map;
+ }
+
+ /**
+ * Returns index in provided array that matches the specified key.
+ *
+ * @param {Array} arr
+ * @param {*} key
+ * @returns {number}
+ */
+ function getIndex(arr, key) {
+ var result = -1;
+
+ arr.some(function (entry, index) {
+ if (entry[0] === key) {
+ result = index;
+
+ return true;
+ }
+
+ return false;
+ });
+
+ return result;
+ }
+
+ return (function () {
+ function anonymous() {
+ this.__entries__ = [];
+ }
+
+ var prototypeAccessors = { size: { configurable: true } };
+
+ /**
+ * @returns {boolean}
+ */
+ prototypeAccessors.size.get = function () {
+ return this.__entries__.length;
+ };
+
+ /**
+ * @param {*} key
+ * @returns {*}
+ */
+ anonymous.prototype.get = function (key) {
+ var index = getIndex(this.__entries__, key);
+ var entry = this.__entries__[index];
+
+ return entry && entry[1];
+ };
+
+ /**
+ * @param {*} key
+ * @param {*} value
+ * @returns {void}
+ */
+ anonymous.prototype.set = function (key, value) {
+ var index = getIndex(this.__entries__, key);
+
+ if (~index) {
+ this.__entries__[index][1] = value;
+ } else {
+ this.__entries__.push([key, value]);
+ }
+ };
+
+ /**
+ * @param {*} key
+ * @returns {void}
+ */
+ anonymous.prototype.delete = function (key) {
+ var entries = this.__entries__;
+ var index = getIndex(entries, key);
+
+ if (~index) {
+ entries.splice(index, 1);
+ }
+ };
+
+ /**
+ * @param {*} key
+ * @returns {void}
+ */
+ anonymous.prototype.has = function (key) {
+ return !!~getIndex(this.__entries__, key);
+ };
+
+ /**
+ * @returns {void}
+ */
+ anonymous.prototype.clear = function () {
+ this.__entries__.splice(0);
+ };
+
+ /**
+ * @param {Function} callback
+ * @param {*} [ctx=null]
+ * @returns {void}
+ */
+ anonymous.prototype.forEach = function (callback, ctx) {
+ var this$1 = this;
+ if ( ctx === void 0 ) ctx = null;
+
+ for (var i = 0, list = this$1.__entries__; i < list.length; i += 1) {
+ var entry = list[i];
+
+ callback.call(ctx, entry[1], entry[0]);
+ }
+ };
+
+ Object.defineProperties( anonymous.prototype, prototypeAccessors );
+
+ return anonymous;
+ }());
+})();
+
+/**
+ * Detects whether window and document objects are available in current environment.
+ */
+var isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined' && window.document === document;
+
+// Returns global object of a current environment.
+var global$1 = (function () {
+ if (typeof global !== 'undefined' && global.Math === Math) {
+ return global;
+ }
+
+ if (typeof self !== 'undefined' && self.Math === Math) {
+ return self;
+ }
+
+ if (typeof window !== 'undefined' && window.Math === Math) {
+ return window;
+ }
+
+ // eslint-disable-next-line no-new-func
+ return Function('return this')();
+})();
+
+/**
+ * A shim for the requestAnimationFrame which falls back to the setTimeout if
+ * first one is not supported.
+ *
+ * @returns {number} Requests' identifier.
+ */
+var requestAnimationFrame$1 = (function () {
+ if (typeof requestAnimationFrame === 'function') {
+ // It's required to use a bounded function because IE sometimes throws
+ // an "Invalid calling object" error if rAF is invoked without the global
+ // object on the left hand side.
+ return requestAnimationFrame.bind(global$1);
+ }
+
+ return function (callback) { return setTimeout(function () { return callback(Date.now()); }, 1000 / 60); };
+})();
+
+// Defines minimum timeout before adding a trailing call.
+var trailingTimeout = 2;
+
+/**
+ * Creates a wrapper function which ensures that provided callback will be
+ * invoked only once during the specified delay period.
+ *
+ * @param {Function} callback - Function to be invoked after the delay period.
+ * @param {number} delay - Delay after which to invoke callback.
+ * @returns {Function}
+ */
+var throttle = function (callback, delay) {
+ var leadingCall = false,
+ trailingCall = false,
+ lastCallTime = 0;
+
+ /**
+ * Invokes the original callback function and schedules new invocation if
+ * the "proxy" was called during current request.
+ *
+ * @returns {void}
+ */
+ function resolvePending() {
+ if (leadingCall) {
+ leadingCall = false;
+
+ callback();
+ }
+
+ if (trailingCall) {
+ proxy();
+ }
+ }
+
+ /**
+ * Callback invoked after the specified delay. It will further postpone
+ * invocation of the original function delegating it to the
+ * requestAnimationFrame.
+ *
+ * @returns {void}
+ */
+ function timeoutCallback() {
+ requestAnimationFrame$1(resolvePending);
+ }
+
+ /**
+ * Schedules invocation of the original function.
+ *
+ * @returns {void}
+ */
+ function proxy() {
+ var timeStamp = Date.now();
+
+ if (leadingCall) {
+ // Reject immediately following calls.
+ if (timeStamp - lastCallTime < trailingTimeout) {
+ return;
+ }
+
+ // Schedule new call to be in invoked when the pending one is resolved.
+ // This is important for "transitions" which never actually start
+ // immediately so there is a chance that we might miss one if change
+ // happens amids the pending invocation.
+ trailingCall = true;
+ } else {
+ leadingCall = true;
+ trailingCall = false;
+
+ setTimeout(timeoutCallback, delay);
+ }
+
+ lastCallTime = timeStamp;
+ }
+
+ return proxy;
+};
+
+// Minimum delay before invoking the update of observers.
+var REFRESH_DELAY = 20;
+
+// A list of substrings of CSS properties used to find transition events that
+// might affect dimensions of observed elements.
+var transitionKeys = ['top', 'right', 'bottom', 'left', 'width', 'height', 'size', 'weight'];
+
+// Check if MutationObserver is available.
+var mutationObserverSupported = typeof MutationObserver !== 'undefined';
+
+/**
+ * Singleton controller class which handles updates of ResizeObserver instances.
+ */
+var ResizeObserverController = function() {
+ this.connected_ = false;
+ this.mutationEventsAdded_ = false;
+ this.mutationsObserver_ = null;
+ this.observers_ = [];
+
+ this.onTransitionEnd_ = this.onTransitionEnd_.bind(this);
+ this.refresh = throttle(this.refresh.bind(this), REFRESH_DELAY);
+};
+
+/**
+ * Adds observer to observers list.
+ *
+ * @param {ResizeObserverSPI} observer - Observer to be added.
+ * @returns {void}
+ */
+
+
+/**
+ * Holds reference to the controller's instance.
+ *
+ * @private {ResizeObserverController}
+ */
+
+
+/**
+ * Keeps reference to the instance of MutationObserver.
+ *
+ * @private {MutationObserver}
+ */
+
+/**
+ * Indicates whether DOM listeners have been added.
+ *
+ * @private {boolean}
+ */
+ResizeObserverController.prototype.addObserver = function (observer) {
+ if (!~this.observers_.indexOf(observer)) {
+ this.observers_.push(observer);
+ }
+
+ // Add listeners if they haven't been added yet.
+ if (!this.connected_) {
+ this.connect_();
+ }
+};
+
+/**
+ * Removes observer from observers list.
+ *
+ * @param {ResizeObserverSPI} observer - Observer to be removed.
+ * @returns {void}
+ */
+ResizeObserverController.prototype.removeObserver = function (observer) {
+ var observers = this.observers_;
+ var index = observers.indexOf(observer);
+
+ // Remove observer if it's present in registry.
+ if (~index) {
+ observers.splice(index, 1);
+ }
+
+ // Remove listeners if controller has no connected observers.
+ if (!observers.length && this.connected_) {
+ this.disconnect_();
+ }
+};
+
+/**
+ * Invokes the update of observers. It will continue running updates insofar
+ * it detects changes.
+ *
+ * @returns {void}
+ */
+ResizeObserverController.prototype.refresh = function () {
+ var changesDetected = this.updateObservers_();
+
+ // Continue running updates if changes have been detected as there might
+ // be future ones caused by CSS transitions.
+ if (changesDetected) {
+ this.refresh();
+ }
+};
+
+/**
+ * Updates every observer from observers list and notifies them of queued
+ * entries.
+ *
+ * @private
+ * @returns {boolean} Returns "true" if any observer has detected changes in
+ * dimensions of it's elements.
+ */
+ResizeObserverController.prototype.updateObservers_ = function () {
+ // Collect observers that have active observations.
+ var activeObservers = this.observers_.filter(function (observer) {
+ return observer.gatherActive(), observer.hasActive();
+ });
+
+ // Deliver notifications in a separate cycle in order to avoid any
+ // collisions between observers, e.g. when multiple instances of
+ // ResizeObserver are tracking the same element and the callback of one
+ // of them changes content dimensions of the observed target. Sometimes
+ // this may result in notifications being blocked for the rest of observers.
+ activeObservers.forEach(function (observer) { return observer.broadcastActive(); });
+
+ return activeObservers.length > 0;
+};
+
+/**
+ * Initializes DOM listeners.
+ *
+ * @private
+ * @returns {void}
+ */
+ResizeObserverController.prototype.connect_ = function () {
+ // Do nothing if running in a non-browser environment or if listeners
+ // have been already added.
+ if (!isBrowser || this.connected_) {
+ return;
+ }
+
+ // Subscription to the "Transitionend" event is used as a workaround for
+ // delayed transitions. This way it's possible to capture at least the
+ // final state of an element.
+ document.addEventListener('transitionend', this.onTransitionEnd_);
+
+ window.addEventListener('resize', this.refresh);
+
+ if (mutationObserverSupported) {
+ this.mutationsObserver_ = new MutationObserver(this.refresh);
+
+ this.mutationsObserver_.observe(document, {
+ attributes: true,
+ childList: true,
+ characterData: true,
+ subtree: true
+ });
+ } else {
+ document.addEventListener('DOMSubtreeModified', this.refresh);
+
+ this.mutationEventsAdded_ = true;
+ }
+
+ this.connected_ = true;
+};
+
+/**
+ * Removes DOM listeners.
+ *
+ * @private
+ * @returns {void}
+ */
+ResizeObserverController.prototype.disconnect_ = function () {
+ // Do nothing if running in a non-browser environment or if listeners
+ // have been already removed.
+ if (!isBrowser || !this.connected_) {
+ return;
+ }
+
+ document.removeEventListener('transitionend', this.onTransitionEnd_);
+ window.removeEventListener('resize', this.refresh);
+
+ if (this.mutationsObserver_) {
+ this.mutationsObserver_.disconnect();
+ }
+
+ if (this.mutationEventsAdded_) {
+ document.removeEventListener('DOMSubtreeModified', this.refresh);
+ }
+
+ this.mutationsObserver_ = null;
+ this.mutationEventsAdded_ = false;
+ this.connected_ = false;
+};
+
+/**
+ * "Transitionend" event handler.
+ *
+ * @private
+ * @param {TransitionEvent} event
+ * @returns {void}
+ */
+ResizeObserverController.prototype.onTransitionEnd_ = function (ref) {
+ var propertyName = ref.propertyName; if ( propertyName === void 0 ) propertyName = '';
+
+ // Detect whether transition may affect dimensions of an element.
+ var isReflowProperty = transitionKeys.some(function (key) {
+ return !!~propertyName.indexOf(key);
+ });
+
+ if (isReflowProperty) {
+ this.refresh();
+ }
+};
+
+/**
+ * Returns instance of the ResizeObserverController.
+ *
+ * @returns {ResizeObserverController}
+ */
+ResizeObserverController.getInstance = function () {
+ if (!this.instance_) {
+ this.instance_ = new ResizeObserverController();
+ }
+
+ return this.instance_;
+};
+
+ResizeObserverController.instance_ = null;
+
+/**
+ * Defines non-writable/enumerable properties of the provided target object.
+ *
+ * @param {Object} target - Object for which to define properties.
+ * @param {Object} props - Properties to be defined.
+ * @returns {Object} Target object.
+ */
+var defineConfigurable = (function (target, props) {
+ for (var i = 0, list = Object.keys(props); i < list.length; i += 1) {
+ var key = list[i];
+
+ Object.defineProperty(target, key, {
+ value: props[key],
+ enumerable: false,
+ writable: false,
+ configurable: true
+ });
+ }
+
+ return target;
+});
+
+/**
+ * Returns the global object associated with provided element.
+ *
+ * @param {Object} target
+ * @returns {Object}
+ */
+var getWindowOf = (function (target) {
+ // Assume that the element is an instance of Node, which means that it
+ // has the "ownerDocument" property from which we can retrieve a
+ // corresponding global object.
+ var ownerGlobal = target && target.ownerDocument && target.ownerDocument.defaultView;
+
+ // Return the local global object if it's not possible extract one from
+ // provided element.
+ return ownerGlobal || global$1;
+});
+
+// Placeholder of an empty content rectangle.
+var emptyRect = createRectInit(0, 0, 0, 0);
+
+/**
+ * Converts provided string to a number.
+ *
+ * @param {number|string} value
+ * @returns {number}
+ */
+function toFloat(value) {
+ return parseFloat(value) || 0;
+}
+
+/**
+ * Extracts borders size from provided styles.
+ *
+ * @param {CSSStyleDeclaration} styles
+ * @param {...string} positions - Borders positions (top, right, ...)
+ * @returns {number}
+ */
+function getBordersSize(styles) {
+ var positions = [], len = arguments.length - 1;
+ while ( len-- > 0 ) positions[ len ] = arguments[ len + 1 ];
+
+ return positions.reduce(function (size, position) {
+ var value = styles['border-' + position + '-width'];
+
+ return size + toFloat(value);
+ }, 0);
+}
+
+/**
+ * Extracts paddings sizes from provided styles.
+ *
+ * @param {CSSStyleDeclaration} styles
+ * @returns {Object} Paddings box.
+ */
+function getPaddings(styles) {
+ var positions = ['top', 'right', 'bottom', 'left'];
+ var paddings = {};
+
+ for (var i = 0, list = positions; i < list.length; i += 1) {
+ var position = list[i];
+
+ var value = styles['padding-' + position];
+
+ paddings[position] = toFloat(value);
+ }
+
+ return paddings;
+}
+
+/**
+ * Calculates content rectangle of provided SVG element.
+ *
+ * @param {SVGGraphicsElement} target - Element content rectangle of which needs
+ * to be calculated.
+ * @returns {DOMRectInit}
+ */
+function getSVGContentRect(target) {
+ var bbox = target.getBBox();
+
+ return createRectInit(0, 0, bbox.width, bbox.height);
+}
+
+/**
+ * Calculates content rectangle of provided HTMLElement.
+ *
+ * @param {HTMLElement} target - Element for which to calculate the content rectangle.
+ * @returns {DOMRectInit}
+ */
+function getHTMLElementContentRect(target) {
+ // Client width & height properties can't be
+ // used exclusively as they provide rounded values.
+ var clientWidth = target.clientWidth;
+ var clientHeight = target.clientHeight;
+
+ // By this condition we can catch all non-replaced inline, hidden and
+ // detached elements. Though elements with width & height properties less
+ // than 0.5 will be discarded as well.
+ //
+ // Without it we would need to implement separate methods for each of
+ // those cases and it's not possible to perform a precise and performance
+ // effective test for hidden elements. E.g. even jQuery's ':visible' filter
+ // gives wrong results for elements with width & height less than 0.5.
+ if (!clientWidth && !clientHeight) {
+ return emptyRect;
+ }
+
+ var styles = getWindowOf(target).getComputedStyle(target);
+ var paddings = getPaddings(styles);
+ var horizPad = paddings.left + paddings.right;
+ var vertPad = paddings.top + paddings.bottom;
+
+ // Computed styles of width & height are being used because they are the
+ // only dimensions available to JS that contain non-rounded values. It could
+ // be possible to utilize the getBoundingClientRect if only it's data wasn't
+ // affected by CSS transformations let alone paddings, borders and scroll bars.
+ var width = toFloat(styles.width),
+ height = toFloat(styles.height);
+
+ // Width & height include paddings and borders when the 'border-box' box
+ // model is applied (except for IE).
+ if (styles.boxSizing === 'border-box') {
+ // Following conditions are required to handle Internet Explorer which
+ // doesn't include paddings and borders to computed CSS dimensions.
+ //
+ // We can say that if CSS dimensions + paddings are equal to the "client"
+ // properties then it's either IE, and thus we don't need to subtract
+ // anything, or an element merely doesn't have paddings/borders styles.
+ if (Math.round(width + horizPad) !== clientWidth) {
+ width -= getBordersSize(styles, 'left', 'right') + horizPad;
+ }
+
+ if (Math.round(height + vertPad) !== clientHeight) {
+ height -= getBordersSize(styles, 'top', 'bottom') + vertPad;
+ }
+ }
+
+ // Following steps can't be applied to the document's root element as its
+ // client[Width/Height] properties represent viewport area of the window.
+ // Besides, it's as well not necessary as the itself neither has
+ // rendered scroll bars nor it can be clipped.
+ if (!isDocumentElement(target)) {
+ // In some browsers (only in Firefox, actually) CSS width & height
+ // include scroll bars size which can be removed at this step as scroll
+ // bars are the only difference between rounded dimensions + paddings
+ // and "client" properties, though that is not always true in Chrome.
+ var vertScrollbar = Math.round(width + horizPad) - clientWidth;
+ var horizScrollbar = Math.round(height + vertPad) - clientHeight;
+
+ // Chrome has a rather weird rounding of "client" properties.
+ // E.g. for an element with content width of 314.2px it sometimes gives
+ // the client width of 315px and for the width of 314.7px it may give
+ // 314px. And it doesn't happen all the time. So just ignore this delta
+ // as a non-relevant.
+ if (Math.abs(vertScrollbar) !== 1) {
+ width -= vertScrollbar;
+ }
+
+ if (Math.abs(horizScrollbar) !== 1) {
+ height -= horizScrollbar;
+ }
+ }
+
+ return createRectInit(paddings.left, paddings.top, width, height);
+}
+
+/**
+ * Checks whether provided element is an instance of the SVGGraphicsElement.
+ *
+ * @param {Element} target - Element to be checked.
+ * @returns {boolean}
+ */
+var isSVGGraphicsElement = (function () {
+ // Some browsers, namely IE and Edge, don't have the SVGGraphicsElement
+ // interface.
+ if (typeof SVGGraphicsElement !== 'undefined') {
+ return function (target) { return target instanceof getWindowOf(target).SVGGraphicsElement; };
+ }
+
+ // If it's so, then check that element is at least an instance of the
+ // SVGElement and that it has the "getBBox" method.
+ // eslint-disable-next-line no-extra-parens
+ return function (target) { return target instanceof getWindowOf(target).SVGElement && typeof target.getBBox === 'function'; };
+})();
+
+/**
+ * Checks whether provided element is a document element ().
+ *
+ * @param {Element} target - Element to be checked.
+ * @returns {boolean}
+ */
+function isDocumentElement(target) {
+ return target === getWindowOf(target).document.documentElement;
+}
+
+/**
+ * Calculates an appropriate content rectangle for provided html or svg element.
+ *
+ * @param {Element} target - Element content rectangle of which needs to be calculated.
+ * @returns {DOMRectInit}
+ */
+function getContentRect(target) {
+ if (!isBrowser) {
+ return emptyRect;
+ }
+
+ if (isSVGGraphicsElement(target)) {
+ return getSVGContentRect(target);
+ }
+
+ return getHTMLElementContentRect(target);
+}
+
+/**
+ * Creates rectangle with an interface of the DOMRectReadOnly.
+ * Spec: https://drafts.fxtf.org/geometry/#domrectreadonly
+ *
+ * @param {DOMRectInit} rectInit - Object with rectangle's x/y coordinates and dimensions.
+ * @returns {DOMRectReadOnly}
+ */
+function createReadOnlyRect(ref) {
+ var x = ref.x;
+ var y = ref.y;
+ var width = ref.width;
+ var height = ref.height;
+
+ // If DOMRectReadOnly is available use it as a prototype for the rectangle.
+ var Constr = typeof DOMRectReadOnly !== 'undefined' ? DOMRectReadOnly : Object;
+ var rect = Object.create(Constr.prototype);
+
+ // Rectangle's properties are not writable and non-enumerable.
+ defineConfigurable(rect, {
+ x: x, y: y, width: width, height: height,
+ top: y,
+ right: x + width,
+ bottom: height + y,
+ left: x
+ });
+
+ return rect;
+}
+
+/**
+ * Creates DOMRectInit object based on the provided dimensions and the x/y coordinates.
+ * Spec: https://drafts.fxtf.org/geometry/#dictdef-domrectinit
+ *
+ * @param {number} x - X coordinate.
+ * @param {number} y - Y coordinate.
+ * @param {number} width - Rectangle's width.
+ * @param {number} height - Rectangle's height.
+ * @returns {DOMRectInit}
+ */
+function createRectInit(x, y, width, height) {
+ return { x: x, y: y, width: width, height: height };
+}
+
+/**
+ * Class that is responsible for computations of the content rectangle of
+ * provided DOM element and for keeping track of it's changes.
+ */
+var ResizeObservation = function(target) {
+ this.broadcastWidth = 0;
+ this.broadcastHeight = 0;
+ this.contentRect_ = createRectInit(0, 0, 0, 0);
+
+ this.target = target;
+};
+
+/**
+ * Updates content rectangle and tells whether it's width or height properties
+ * have changed since the last broadcast.
+ *
+ * @returns {boolean}
+ */
+
+
+/**
+ * Reference to the last observed content rectangle.
+ *
+ * @private {DOMRectInit}
+ */
+
+
+/**
+ * Broadcasted width of content rectangle.
+ *
+ * @type {number}
+ */
+ResizeObservation.prototype.isActive = function () {
+ var rect = getContentRect(this.target);
+
+ this.contentRect_ = rect;
+
+ return rect.width !== this.broadcastWidth || rect.height !== this.broadcastHeight;
+};
+
+/**
+ * Updates 'broadcastWidth' and 'broadcastHeight' properties with a data
+ * from the corresponding properties of the last observed content rectangle.
+ *
+ * @returns {DOMRectInit} Last observed content rectangle.
+ */
+ResizeObservation.prototype.broadcastRect = function () {
+ var rect = this.contentRect_;
+
+ this.broadcastWidth = rect.width;
+ this.broadcastHeight = rect.height;
+
+ return rect;
+};
+
+var ResizeObserverEntry = function(target, rectInit) {
+ var contentRect = createReadOnlyRect(rectInit);
+
+ // According to the specification following properties are not writable
+ // and are also not enumerable in the native implementation.
+ //
+ // Property accessors are not being used as they'd require to define a
+ // private WeakMap storage which may cause memory leaks in browsers that
+ // don't support this type of collections.
+ defineConfigurable(this, { target: target, contentRect: contentRect });
+};
+
+var ResizeObserverSPI = function(callback, controller, callbackCtx) {
+ this.activeObservations_ = [];
+ this.observations_ = new MapShim();
+
+ if (typeof callback !== 'function') {
+ throw new TypeError('The callback provided as parameter 1 is not a function.');
+ }
+
+ this.callback_ = callback;
+ this.controller_ = controller;
+ this.callbackCtx_ = callbackCtx;
+};
+
+/**
+ * Starts observing provided element.
+ *
+ * @param {Element} target - Element to be observed.
+ * @returns {void}
+ */
+
+
+/**
+ * Registry of the ResizeObservation instances.
+ *
+ * @private {Map}
+ */
+
+
+/**
+ * Public ResizeObserver instance which will be passed to the callback
+ * function and used as a value of it's "this" binding.
+ *
+ * @private {ResizeObserver}
+ */
+
+/**
+ * Collection of resize observations that have detected changes in dimensions
+ * of elements.
+ *
+ * @private {Array}
+ */
+ResizeObserverSPI.prototype.observe = function (target) {
+ if (!arguments.length) {
+ throw new TypeError('1 argument required, but only 0 present.');
+ }
+
+ // Do nothing if current environment doesn't have the Element interface.
+ if (typeof Element === 'undefined' || !(Element instanceof Object)) {
+ return;
+ }
+
+ if (!(target instanceof getWindowOf(target).Element)) {
+ throw new TypeError('parameter 1 is not of type "Element".');
+ }
+
+ var observations = this.observations_;
+
+ // Do nothing if element is already being observed.
+ if (observations.has(target)) {
+ return;
+ }
+
+ observations.set(target, new ResizeObservation(target));
+
+ this.controller_.addObserver(this);
+
+ // Force the update of observations.
+ this.controller_.refresh();
+};
+
+/**
+ * Stops observing provided element.
+ *
+ * @param {Element} target - Element to stop observing.
+ * @returns {void}
+ */
+ResizeObserverSPI.prototype.unobserve = function (target) {
+ if (!arguments.length) {
+ throw new TypeError('1 argument required, but only 0 present.');
+ }
+
+ // Do nothing if current environment doesn't have the Element interface.
+ if (typeof Element === 'undefined' || !(Element instanceof Object)) {
+ return;
+ }
+
+ if (!(target instanceof getWindowOf(target).Element)) {
+ throw new TypeError('parameter 1 is not of type "Element".');
+ }
+
+ var observations = this.observations_;
+
+ // Do nothing if element is not being observed.
+ if (!observations.has(target)) {
+ return;
+ }
+
+ observations.delete(target);
+
+ if (!observations.size) {
+ this.controller_.removeObserver(this);
+ }
+};
+
+/**
+ * Stops observing all elements.
+ *
+ * @returns {void}
+ */
+ResizeObserverSPI.prototype.disconnect = function () {
+ this.clearActive();
+ this.observations_.clear();
+ this.controller_.removeObserver(this);
+};
+
+/**
+ * Collects observation instances the associated element of which has changed
+ * it's content rectangle.
+ *
+ * @returns {void}
+ */
+ResizeObserverSPI.prototype.gatherActive = function () {
+ var this$1 = this;
+
+ this.clearActive();
+
+ this.observations_.forEach(function (observation) {
+ if (observation.isActive()) {
+ this$1.activeObservations_.push(observation);
+ }
+ });
+};
+
+/**
+ * Invokes initial callback function with a list of ResizeObserverEntry
+ * instances collected from active resize observations.
+ *
+ * @returns {void}
+ */
+ResizeObserverSPI.prototype.broadcastActive = function () {
+ // Do nothing if observer doesn't have active observations.
+ if (!this.hasActive()) {
+ return;
+ }
+
+ var ctx = this.callbackCtx_;
+
+ // Create ResizeObserverEntry instance for every active observation.
+ var entries = this.activeObservations_.map(function (observation) {
+ return new ResizeObserverEntry(observation.target, observation.broadcastRect());
+ });
+
+ this.callback_.call(ctx, entries, ctx);
+ this.clearActive();
+};
+
+/**
+ * Clears the collection of active observations.
+ *
+ * @returns {void}
+ */
+ResizeObserverSPI.prototype.clearActive = function () {
+ this.activeObservations_.splice(0);
+};
+
+/**
+ * Tells whether observer has active observations.
+ *
+ * @returns {boolean}
+ */
+ResizeObserverSPI.prototype.hasActive = function () {
+ return this.activeObservations_.length > 0;
+};
+
+// Registry of internal observers. If WeakMap is not available use current shim
+// for the Map collection as it has all required methods and because WeakMap
+// can't be fully polyfilled anyway.
+var observers = typeof WeakMap !== 'undefined' ? new WeakMap() : new MapShim();
+
+/**
+ * ResizeObserver API. Encapsulates the ResizeObserver SPI implementation
+ * exposing only those methods and properties that are defined in the spec.
+ */
+var ResizeObserver = function(callback) {
+ if (!(this instanceof ResizeObserver)) {
+ throw new TypeError('Cannot call a class as a function.');
+ }
+ if (!arguments.length) {
+ throw new TypeError('1 argument required, but only 0 present.');
+ }
+
+ var controller = ResizeObserverController.getInstance();
+ var observer = new ResizeObserverSPI(callback, controller, this);
+
+ observers.set(this, observer);
+};
+
+// Expose public methods of ResizeObserver.
+['observe', 'unobserve', 'disconnect'].forEach(function (method) {
+ ResizeObserver.prototype[method] = function () {
+ return (ref = observers.get(this))[method].apply(ref, arguments);
+ var ref;
+ };
+});
+
+var index = (function () {
+ // Export existing implementation if available.
+ if (typeof global$1.ResizeObserver !== 'undefined') {
+ return global$1.ResizeObserver;
+ }
+
+ global$1.ResizeObserver = ResizeObserver;
+
+ return ResizeObserver;
+})();
+
+return index;
+
+})));
diff --git a/docs/assets/tablesort.min.js b/docs/assets/tablesort.min.js
new file mode 100644
index 000000000..65a83b113
--- /dev/null
+++ b/docs/assets/tablesort.min.js
@@ -0,0 +1,6 @@
+/*!
+ * tablesort v5.2.1 (2021-10-30)
+ * http://tristen.ca/tablesort/demo/
+ * Copyright (c) 2021 ; Licensed MIT
+*/
+!function(){function a(b,c){if(!(this instanceof a))return new a(b,c);if(!b||"TABLE"!==b.tagName)throw new Error("Element must be a table");this.init(b,c||{})}var b=[],c=function(a){var b;return window.CustomEvent&&"function"==typeof window.CustomEvent?b=new CustomEvent(a):(b=document.createEvent("CustomEvent"),b.initCustomEvent(a,!1,!1,void 0)),b},d=function(a,b){return a.getAttribute(b.sortAttribute||"data-sort")||a.textContent||a.innerText||""},e=function(a,b){return a=a.trim().toLowerCase(),b=b.trim().toLowerCase(),a===b?0:a0)if(a.tHead&&a.tHead.rows.length>0){for(e=0;e0&&n.push(m),o++;if(!n)return}for(o=0;o
+
+
+
+
+ Redirecting to cmemc: Command Line Interface
+
+
+
+
+
+
+
+
diff --git a/docs/develop/marketplace-packages/.pages b/docs/develop/marketplace-packages/.pages
new file mode 100644
index 000000000..1f4c61800
--- /dev/null
+++ b/docs/develop/marketplace-packages/.pages
@@ -0,0 +1,4 @@
+nav:
+ - Marketplace Packages: index.md
+ - Installation and Management: installation
+ - Development and Publication: development
diff --git a/docs/develop/marketplace-packages/development/index.md b/docs/develop/marketplace-packages/development/index.md
new file mode 100644
index 000000000..98af76a4c
--- /dev/null
+++ b/docs/develop/marketplace-packages/development/index.md
@@ -0,0 +1,198 @@
+---
+title: "Marketplace Packages: Development and Publication"
+icon: material/code-json
+tags:
+ - Package
+---
+# Development and Publication of Marketplace Packages
+
+## Introduction
+
+Marketplace Packages are archives that bundle content, functionality, and configuration from Corporate Memory for sharing and reuse.
+
+Each package has its own release cycle.
+Packages can be installed and uninstalled during runtime.
+
+In order to support the development and publication of Marketplace Packages, we published a [package-template](https://github.com/eccenca/cmem-package-template).
+Please have a look at this template to get started.
+
+This page gives an overview of the concepts you need to understand in order to develop packages.
+
+## Package Structure
+
+Use the [package-template](https://github.com/eccenca/cmem-package-template) to create the boilerplate for a package repository.
+
+### License
+
+!!! info "No publication without license"
+
+ Packages without a license declaration cannot be published to a Corporate Memory Marketplace Server.
+
+Our template will bootstrap your package with an _Apache License 2.0 ([`Apache-2.0`](https://spdx.org/licenses/Apache-2.0.html))_.
+See if you need a different license.
+You can remove a license entirely; however, a package that does not declare a license cannot be published.
+
+### Manifest
+
+The `manifest.json` is the central package definition.
+It contains all relevant package metadata and describes the package contents.
+It is used to present package details and contents to the `inspect` command, to install, configure and uninstall all parts of a package.
+
+#### Metadata
+
+`package_type`
+: `project`
+ : A package that may ship any content, mainly intended to contain Build projects, (instance/data) graphs, SHACL shapes, workspace configuration, query catalogs, etc.
+
+ `vocabulary`
+ : A package that is supposed to contribute vocabulary / ontology contents, such as `rdf:`, `org:`, `sso:`, etc. Such a package may contain multiple vocabularies / ontologies. Packaging related SHACL shapes is reasonable, too.
+
+`package_id`
+: Unique package identifier
+
+`package_version`
+: Semantic version identifier string of the package, but limited to proper releases.
+
+`metadata.name`
+: The package name in English.
+
+`metadata.description`
+: The package description in English.
+
+`metadata_comment`
+: A maintainer or publisher comment.
+
+#### Files
+
+A package can contain graphs or Build projects. These contents are referenced in the `manifest.json`.
+
+##### Graphs
+
+Use the following structure to include a graph.
+`register_as_vocabulary` and `import_into` are optional instructions.
+We suggest to organize graphs in a respective sub-folder (here `graphs/`), but this is up to you:
+
+```json
+"files": [
+ …
+ {
+ "file_type": "graph",
+ "file_path": "graphs/file.ttl",
+ "graph_iri": "http://www.example.org/file/",
+ "register_as_vocabulary": true,
+ "import_into": [
+ "http://www.example.org/integration_graph/"
+ ]
+ },
+ …
+]
+```
+
+##### Projects
+
+Use the following structure to include a project.
+We suggest to organize projects in a respective sub-folder (here `projects/`), but this is up to you:
+
+```json
+"files": [
+ …
+ {
+ "file_type": "project",
+ "file_path": "projects/my-build-project.zip",
+ "project_id": "my-build-project"
+ },
+ …
+]
+```
+
+#### Dependencies
+
+Dependencies to other (vocabulary) packages or to Python plugins can be declared in the `copier copy` answers.
+The dependencies are added to the `manifest.json` as described in the next sections.
+
+##### Python Plugin Packages
+
+Use the following to declare a dependency to a Python plugin:
+
+```json
+"dependencies": [
+ …
+ {
+ "dependency_type": "python-package",
+ "pypi_id": "cmem-plugin-pyshacl"
+ },
+ …
+]
+```
+
+##### (Vocabulary) Packages
+
+Use the following to declare a dependency to a (vocabulary) package:
+
+```json
+"dependencies": [
+ …
+ {
+ "dependency_type": "vocabulary",
+ "package_id": "w3c-rdfs-vocab"
+ }
+ …
+]
+```
+
+## Package Development Cycle
+
+!!! info "`cmemc package` reference"
+
+ Refer to [TODO: link](./) for the complete reference of the `package` command group.
+
+Some packages are simply wrapping existing artifacts into a managed structure (e.g. existing vocabulary/ontology).
+
+Most (solution) package development and evolution will be a back and forth between a package repository (making changes to `manifest.json` in terms of adding/removing dependencies, graph files, or Build project files) and a Corporate Memory (package development) instance.
+
+The following pages give an overview about this feature:
+
+{ width="50%" }
+
+### Install (local) Packages
+
+Use the following command to install a local package folder content (or built `.cpa` file) to a Corporate Memory (package development) instance.
+
+```sh
+cmemc package install --input PATH
+```
+
+Make changes to graphs, configuration, or Build projects as needed.
+Newly created or imported graphs or Build projects need to be registered in `manifest.json` so they will be fetched by `export`.
+
+### Export Contents into a Package
+
+Use the following command to export the file artifacts declared in `manifest.json` from a Corporate Memory (package development) instance to a local package folder.
+
+```sh
+cmemc package export PACKAGE_ID
+```
+
+Run this to initially populate package contents from a solution configuration. You can also use it to update contents after making changes on your Corporate Memory (package development) instance, capturing them for building and releasing as a Marketplace Package.
+
+### Inspect Packages
+
+Review and verify the contents of a package with the following command:
+
+```sh
+cmemc package inspect PACKAGE_PATH
+```
+
+### Build Packages
+
+During development you can install a package from a local path (plain folder or a `.cpa` package) using the `cmemc package install --input PATH` command.
+
+Use the `cmemc package build` command.
+This will build a package archive from a package directory.
+
+This command processes a package directory, validates its content including the manifest, and creates a versioned Corporate Memory package archive (`.cpa`) with the following naming convention: `{package_id}-v{version}.cpa`.
+
+### Publish Packages
+
+Package archives can be published to the Marketplace Server using the `cmemc package publish` command.
+After being published packages can be found and installed directly from the Marketplace Server (potential users do not need to have the local package folder or `.cpa` file available).
diff --git a/docs/develop/marketplace-packages/index.md b/docs/develop/marketplace-packages/index.md
new file mode 100644
index 000000000..e00af74b5
--- /dev/null
+++ b/docs/develop/marketplace-packages/index.md
@@ -0,0 +1,49 @@
+---
+status: new
+title: "Marketplace Packages: Overview"
+icon: material/shopping
+tags:
+ - Package
+hide:
+ - toc
+---
+
+# Marketplace Packages
+
+Starting with version 26.1, we support the creation and use of Marketplace Packages.
+
+Marketplace Packages bundle everything for a specific Corporate Memory–based solution or project into a single shareable, managed artifact:
+
+- Vocabularies / Ontologies
+- (SKOS) Taxonomies
+- (Instance / Data) Graphs
+- Build Projects
+- Dependencies on
+ - [python-plugins](../python-plugins/index.md)
+ - (other) Marketplace Packages
+
+The lifecycle of a Corporate Memory Marketplace Package is shown in the following flowchart.
+
+{ width="50%" }
+
+The following pages give an overview of this feature:
+
+
+
+- :material-download-circle-outline: [Installation and Management](installation/index.md)
+
+ ---
+
+ Intended for Linked Data Experts and Corporate Memory Admins, this page outlines how to (un)install and manage Marketplace Packages.
+
+ This section discusses the lifecycle commands and stages `install`, `list` and `uninstall`.
+
+- :material-code-json: [Development and Publication](development/index.md)
+
+ ---
+
+ Intended for Linked Data Experts, Consultants, and Partners, this page gives an overview of how to start developing and publish Marketplace Packages.
+
+ This section discusses the lifecycle commands and stages `copier copy`, _Package Definition and Release_, `inspect`, `install --input PATH` (from local), _Solution Development and Configuration_, `export`, `build`, and `publish`.
+
+
diff --git a/docs/develop/marketplace-packages/installation/index.md b/docs/develop/marketplace-packages/installation/index.md
new file mode 100644
index 000000000..24d6002d2
--- /dev/null
+++ b/docs/develop/marketplace-packages/installation/index.md
@@ -0,0 +1,51 @@
+---
+title: "Marketplace Packages: Installation and Management"
+icon: material/download-circle-outline
+tags:
+ - Package
+---
+# Installation and Management of Marketplace Packages
+
+## Introduction
+
+Marketplace Packages can be installed directly from a Corporate Memory Marketplace Server (e.g. [https://eccenca.market](https://eccenca.market)), or from local **C**orporate Memory **P**ackage **A**rchives (`.cpa` files).
+
+This page describes how to install, list, and uninstall packages using `cmemc`.
+
+!!! info "`cmemc package` reference"
+
+ The [cmemc package command group](../../../automate/cmemc-command-line-interface/command-reference/package/index.md) contains of a needed commands to support
+ the complate package lifecycle.
+
+## Install Packages
+
+Use the following command to install a package from a Marketplace Server:
+
+``` sh
+cmemc package install PACKAGE_ID
+```
+
+For installing local package archives (`.cpa` files) or package directories, use the `--input` option:
+
+``` sh
+cmemc package install --input PATH
+```
+
+## List Packages
+
+Use the following command to list all installed packages:
+
+``` sh
+cmemc package list
+```
+
+## Uninstall Packages
+
+Use the following command to uninstall a package:
+
+``` sh
+cmemc package uninstall PACKAGE_ID
+```
+
+This removes all package contents from the Corporate Memory instance, including graphs and Build projects that were installed as part of the package.
+
diff --git a/docs/develop/marketplace-packages/mmd.txt b/docs/develop/marketplace-packages/mmd.txt
new file mode 100644
index 000000000..fc2ee5b30
--- /dev/null
+++ b/docs/develop/marketplace-packages/mmd.txt
@@ -0,0 +1,13 @@
+# mermaid
+
+## live editor
+
+https://mermaid.live/edit#pako:eNqFU12L2zAQ_CuLIHVb7DSxL3YiykFJHnpwgaMfL636oNgbR0SWjCIdlwv575WcuA6FUvxg7WhmZ3clnUipKySUJEnClBVWIoWlNq023CKssdHmCGtu9mhbyUuEJ17ueY3wKLZYHkuJTHXa0egklLAUThBJXT_iM8qIQlThxtVRDJHdYYMBUeis4TKCM5xHI6YO1lutBK8Nb5LnlKnwdSAw0tutcBvSC60-bsw9VxV8QYn8gCF8K3XJ5TtGgB-g3dc3creR4rDDqqPd9NGT3WYgj8uW9_0NaeENLB8-LFdXhecMiq9aulCTL-8ZQlFLrbai7sR_T7HXN9gMCR7CSsprff-QCHUI84Ve9F2JXnYhOCXCzH6-_wVJch8mABRK3Qo04XdkKkDDlpe3WFqmQsMBDkVd8JAWQjEeF6p1Fp4-ffs8JPg_s2MMXvjiW7I3CbwlhY0Tshr8_TF4sL0cVmglAGHD-wxuLPR9A3uyHbDQPQ2j6MkkJrURFaHWOIxJg6bhISQnpsCPsbuQjFC_vF5JRpg6e1nL1Q-tm15ptKt3hG65PPjItdVwX_-gBlWFZqmdsoSmWZp1WQg9kRdCs2k-nswWxSy7mxaLfF7MYnIkdDpPx5NJUeR5kWZ5ls7PMXntfCfjYpIWd9lsvkizrJjli5hgJaw268tz7V7t-TfNwDqo
+
+## cli
+
+https://github.com/mermaid-js/mermaid-cli
+
+```sh
+mmdc -i mpp-lifecycle.mmd -o mpp-lifecycle.svg -b transparent
+```
diff --git a/docs/develop/marketplace-packages/mpp-lifecycle.mmd b/docs/develop/marketplace-packages/mpp-lifecycle.mmd
new file mode 100644
index 000000000..22960e9d9
--- /dev/null
+++ b/docs/develop/marketplace-packages/mpp-lifecycle.mmd
@@ -0,0 +1,25 @@
+---
+#title: Corporate Memory Marketplace Package Lifecycle
+---
+%%{init: { 'logLevel': 'debug', 'theme': 'neutral' } }%%
+stateDiagram-v2
+
+
+state "Package Definition and Release (local)" as pkg
+state "Published (Marketplace)" as pub
+state ".cpa Package (local & CI/CD)" as cpa
+state "Solution Dev and Config (Corporate Memory)" as cmem
+state "Installed (Corporate Memory)" as ins
+%% state "Uninstalled" as uni
+
+[*] --> pkg : copier copy
+pkg --> pkg : inspect
+cpa --> cmem : install --input PATH
+pkg --> cmem : install --input PATH
+cmem --> pkg : export
+pkg --> cpa : build
+cpa --> pub : publish
+
+pub --> ins : install
+ins --> ins : list
+ins --> [*] : uninstall
diff --git a/docs/develop/marketplace-packages/mpp-lifecycle.svg b/docs/develop/marketplace-packages/mpp-lifecycle.svg
new file mode 100644
index 000000000..a6835805a
--- /dev/null
+++ b/docs/develop/marketplace-packages/mpp-lifecycle.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/docs/explore-and-author/building-a-customized-user-interface/index.html b/docs/explore-and-author/building-a-customized-user-interface/index.html
new file mode 100644
index 000000000..da7e68089
--- /dev/null
+++ b/docs/explore-and-author/building-a-customized-user-interface/index.html
@@ -0,0 +1,23 @@
+
+
+
+
+
+ Redirecting to Building a Customized User Interface
+
+
+
+
+
+
+
+
diff --git a/docs/release-notes/corporate-memory-25-3/index.md b/docs/release-notes/corporate-memory-25-3/index.md
index 4b15ff98b..0f8f34cbe 100644
--- a/docs/release-notes/corporate-memory-25-3/index.md
+++ b/docs/release-notes/corporate-memory-25-3/index.md
@@ -20,15 +20,12 @@ The highlights of this release are:
- Explore: **Companion Chat-Based Data Interaction**
- Introducing an **LLM-powered conversational interface** that lets you interact directly with your data.
-
- Ask questions about your graphs, explore insights using query catalogs or autogenerated queries, and access Corporate Memory resources and modules—all within chat.
-
- This feature takes data accessibility and interaction to an entirely new level.
+ Ask questions about your graphs, explore insights using query catalogs or autogenerated queries, and access Corporate Memory resources and modules—all within chat.
+ This feature takes data accessibility and interaction to an entirely new level.
- Explore: **Graph Insights**
- Visually explore your graphs contents and relationships in an **aggregated representation** that scales easily to graphs with millions of nodes.
-
- Offering a **compact and flexible overview** aggregating objects and relations and shows details on demand.
+ Offering a **compact and flexible overview** aggregating objects and relations and shows details on demand.