gallery-gen 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 1f25b670c71ab9254005520cad1af88946bac47ed5b5b4294a3e9b127877421a
4
+ data.tar.gz: a6b07097cb22ef128f022ea62290d4353d9e8d76f216302a9a7bfd9d2808034a
5
+ SHA512:
6
+ metadata.gz: 5053afc204339f4b2ce5fd97cb85c3393fb44f1a7795334979a600999364a124c50649f53fc173dcc0f9e5a6eea757c775eda6212e92b568afbb171ae8ac1019
7
+ data.tar.gz: 3cabe8f0a2e45c519576285af69553b50354ec879c7d4dee4426c203d1247ad2503121f9ec71005d5bc6ec130248a2ac6e5390db4904b7134d2cbf31cbece70e
@@ -0,0 +1,5 @@
1
+ /*!
2
+ * PhotoSwipe Lightbox 5.3.1 - https://photoswipe.com
3
+ * (c) 2022 Dmytro Semenov
4
+ */
5
+ function t(t,i,s){const h=document.createElement(i||"div");return t&&(h.className=t),s&&s.appendChild(h),h}function i(t,i,s){t.style.width="number"==typeof i?i+"px":i,t.style.height="number"==typeof s?s+"px":s}const s="idle",h="loading",e="loaded",n="error";function o(t,i,s=document){let h=[];if(t instanceof Element)h=[t];else if(t instanceof NodeList||Array.isArray(t))h=Array.from(t);else{const e="string"==typeof t?t:i;e&&(h=Array.from(s.querySelectorAll(e)))}return h}function r(){return!(!navigator.vendor||!navigator.vendor.match(/apple/i))}class a{constructor(t,i){this.type=t,i&&Object.assign(this,i)}preventDefault(){this.defaultPrevented=!0}}class c{constructor(i,s){this.element=t("pswp__img pswp__img--placeholder",i?"img":"",s),i&&(this.element.decoding="async",this.element.alt="",this.element.src=i,this.element.setAttribute("role","presentation")),this.element.setAttribute("aria-hiden","true")}setDisplayedSize(t,s){this.element&&("IMG"===this.element.tagName?(i(this.element,250,"auto"),this.element.style.transformOrigin="0 0",this.element.style.transform=function(t,i,s){let h="translate3d("+t+"px,"+(i||0)+"px,0)";return void 0!==s&&(h+=" scale3d("+s+","+s+",1)"),h}(0,0,t/250)):i(this.element,t,s))}destroy(){this.element.parentNode&&this.element.remove(),this.element=null}}class l{constructor(t,i,h){this.instance=i,this.data=t,this.index=h,this.element=void 0,this.displayedImageWidth=0,this.displayedImageHeight=0,this.width=Number(this.data.w)||Number(this.data.width)||0,this.height=Number(this.data.h)||Number(this.data.height)||0,this.isAttached=!1,this.hasSlide=!1,this.state=s,this.data.type?this.type=this.data.type:this.data.src?this.type="image":this.type="html",this.instance.dispatch("contentInit",{content:this})}removePlaceholder(){this.placeholder&&!this.keepPlaceholder()&&setTimeout((()=>{this.placeholder&&(this.placeholder.destroy(),this.placeholder=null)}),1e3)}load(i,s){if(this.slide&&this.usePlaceholder())if(this.placeholder){const t=this.placeholder.element;t&&!t.parentElement&&this.slide.container.prepend(t)}else{const t=this.instance.applyFilters("placeholderSrc",!(!this.data.msrc||!this.slide.isFirstSlide)&&this.data.msrc,this);this.placeholder=new c(t,this.slide.container)}this.element&&!s||this.instance.dispatch("contentLoad",{content:this,isLazy:i}).defaultPrevented||(this.isImageContent()?(this.element=t("pswp__img","img"),this.displayedImageWidth&&this.loadImage(i)):(this.element=t("pswp__content"),this.element.innerHTML=this.data.html||""),s&&this.slide&&this.slide.updateContentSize(!0))}loadImage(t){const i=this.element;this.instance.dispatch("contentLoadImage",{content:this,isLazy:t}).defaultPrevented||(this.updateSrcsetSizes(),this.data.srcset&&(i.srcset=this.data.srcset),i.src=this.data.src,i.alt=this.data.alt||"",this.state=h,i.complete?this.onLoaded():(i.onload=()=>{this.onLoaded()},i.onerror=()=>{this.onError()}))}setSlide(t){this.slide=t,this.hasSlide=!0,this.instance=t.pswp}onLoaded(){this.state=e,this.slide&&(this.instance.dispatch("loadComplete",{slide:this.slide,content:this}),this.slide.isActive&&this.slide.heavyAppended&&!this.element.parentNode&&(this.append(),this.slide.updateContentSize(!0)),this.state!==e&&this.state!==n||this.removePlaceholder())}onError(){this.state=n,this.slide&&(this.displayError(),this.instance.dispatch("loadComplete",{slide:this.slide,isError:!0,content:this}),this.instance.dispatch("loadError",{slide:this.slide,content:this}))}isLoading(){return this.instance.applyFilters("isContentLoading",this.state===h,this)}isError(){return this.state===n}isImageContent(){return"image"===this.type}setDisplayedSize(t,s){if(this.element&&(this.placeholder&&this.placeholder.setDisplayedSize(t,s),!this.instance.dispatch("contentResize",{content:this,width:t,height:s}).defaultPrevented&&(i(this.element,t,s),this.isImageContent()&&!this.isError()))){const i=!this.displayedImageWidth&&t;this.displayedImageWidth=t,this.displayedImageHeight=s,i?this.loadImage(!1):this.updateSrcsetSizes(),this.slide&&this.instance.dispatch("imageSizeChange",{slide:this.slide,width:t,height:s,content:this})}}isZoomable(){return this.instance.applyFilters("isContentZoomable",this.isImageContent()&&this.state!==n,this)}updateSrcsetSizes(){if(this.data.srcset){const t=this.element,i=this.instance.applyFilters("srcsetSizesWidth",this.displayedImageWidth,this);(!t.dataset.largestUsedSize||i>parseInt(t.dataset.largestUsedSize,10))&&(t.sizes=i+"px",t.dataset.largestUsedSize=String(i))}}usePlaceholder(){return this.instance.applyFilters("useContentPlaceholder",this.isImageContent(),this)}lazyLoad(){this.instance.dispatch("contentLazyLoad",{content:this}).defaultPrevented||this.load(!0)}keepPlaceholder(){return this.instance.applyFilters("isKeepingPlaceholder",this.isLoading(),this)}destroy(){this.hasSlide=!1,this.slide=null,this.instance.dispatch("contentDestroy",{content:this}).defaultPrevented||(this.remove(),this.placeholder&&(this.placeholder.destroy(),this.placeholder=null),this.isImageContent()&&this.element&&(this.element.onload=null,this.element.onerror=null,this.element=null))}displayError(){if(this.slide){let i=t("pswp__error-msg");i.innerText=this.instance.options.errorMsg,i=this.instance.applyFilters("contentErrorElement",i,this),this.element=t("pswp__content pswp__error-msg-container"),this.element.appendChild(i),this.slide.container.innerText="",this.slide.container.appendChild(this.element),this.slide.updateContentSize(!0),this.removePlaceholder()}}append(){if(this.isAttached)return;if(this.isAttached=!0,this.state===n)return void this.displayError();if(this.instance.dispatch("contentAppend",{content:this}).defaultPrevented)return;const t="decode"in this.element;this.isImageContent()?t&&this.slide&&(!this.slide.isActive||r())?(this.isDecoding=!0,this.element.decode().finally((()=>{this.isDecoding=!1,this.appendImage()}))):this.appendImage():this.element&&!this.element.parentNode&&this.slide.container.appendChild(this.element)}activate(){this.instance.dispatch("contentActivate",{content:this}).defaultPrevented||this.slide&&(this.isImageContent()&&this.isDecoding&&!r()?this.appendImage():this.isError()&&this.load(!1,!0))}deactivate(){this.instance.dispatch("contentDeactivate",{content:this})}remove(){this.isAttached=!1,this.instance.dispatch("contentRemove",{content:this}).defaultPrevented||(this.element&&this.element.parentNode&&this.element.remove(),this.placeholder&&this.placeholder.element&&this.placeholder.element.remove())}appendImage(){this.isAttached&&(this.instance.dispatch("contentAppendImage",{content:this}).defaultPrevented||(this.slide&&this.element&&!this.element.parentNode&&this.slide.container.appendChild(this.element),this.state!==e&&this.state!==n||this.removePlaceholder()))}}function u(t,i,s,h,e){let n;if(i.paddingFn)n=i.paddingFn(s,h,e)[t];else if(i.padding)n=i.padding[t];else{const s="padding"+t[0].toUpperCase()+t.slice(1);i[s]&&(n=i[s])}return n||0}class d{constructor(t,i,s,h){this.pswp=h,this.options=t,this.itemData=i,this.index=s}update(t,i,s){this.elementSize={x:t,y:i},this.panAreaSize=s;const h=this.panAreaSize.x/this.elementSize.x,e=this.panAreaSize.y/this.elementSize.y;this.fit=Math.min(1,h<e?h:e),this.fill=Math.min(1,h>e?h:e),this.vFill=Math.min(1,e),this.initial=this.t(),this.secondary=this.i(),this.max=Math.max(this.initial,this.secondary,this.o()),this.min=Math.min(this.fit,this.initial,this.secondary),this.pswp&&this.pswp.dispatch("zoomLevelsUpdate",{zoomLevels:this,slideData:this.itemData})}l(t){const i=t+"ZoomLevel",s=this.options[i];if(s)return"function"==typeof s?s(this):"fill"===s?this.fill:"fit"===s?this.fit:Number(s)}i(){let t=this.l("secondary");return t||(t=Math.min(1,3*this.fit),t*this.elementSize.x>4e3&&(t=4e3/this.elementSize.x),t)}t(){return this.l("initial")||this.fit}o(){const t=this.l("max");return t||Math.max(1,4*this.fit)}}function p(t,i,s){const h=i.createContentFromData(t,s);if(!h||!h.lazyLoad)return;const{options:e}=i,n=i.viewportSize||function(t,i){if(t.getViewportSizeFn){const s=t.getViewportSizeFn(t,i);if(s)return s}return{x:document.documentElement.clientWidth,y:window.innerHeight}}(e,i),o=function(t,i,s,h){return{x:i.x-u("left",t,i,s,h)-u("right",t,i,s,h),y:i.y-u("top",t,i,s,h)-u("bottom",t,i,s,h)}}(e,n,t,s),r=new d(e,t,-1);return r.update(h.width,h.height,o),h.lazyLoad(),h.setDisplayedSize(Math.ceil(h.width*r.initial),Math.ceil(h.height*r.initial)),h}class m extends class extends class{constructor(){this.u={},this.p={},this.pswp=void 0,this.options=void 0}addFilter(t,i,s=100){this.p[t]||(this.p[t]=[]),this.p[t].push({fn:i,priority:s}),this.p[t].sort(((t,i)=>t.priority-i.priority)),this.pswp&&this.pswp.addFilter(t,i,s)}removeFilter(t,i){this.p[t]&&(this.p[t]=this.p[t].filter((t=>t.fn!==i))),this.pswp&&this.pswp.removeFilter(t,i)}applyFilters(t,...i){return this.p[t]&&this.p[t].forEach((t=>{i[0]=t.fn.apply(this,i)})),i[0]}on(t,i){this.u[t]||(this.u[t]=[]),this.u[t].push(i),this.pswp&&this.pswp.on(t,i)}off(t,i){this.u[t]&&(this.u[t]=this.u[t].filter((t=>i!==t))),this.pswp&&this.pswp.off(t,i)}dispatch(t,i){if(this.pswp)return this.pswp.dispatch(t,i);const s=new a(t,i);return this.u?(this.u[t]&&this.u[t].forEach((t=>{t.call(this,s)})),s):s}}{getNumItems(){let t;const{dataSource:i}=this.options;i?"length"in i?t=i.length:"gallery"in i&&(i.items||(i.items=this.m(i.gallery)),i.items&&(t=i.items.length)):t=0;const s=this.dispatch("numItems",{dataSource:i,numItems:t});return this.applyFilters("numItems",s.numItems,i)}createContentFromData(t,i){return new l(t,this,i)}getItemData(t){const{dataSource:i}=this.options;let s;Array.isArray(i)?s=i[t]:i&&i.gallery&&(i.items||(i.items=this.m(i.gallery)),s=i.items[t]);let h=s;h instanceof Element&&(h=this.g(h));const e=this.dispatch("itemData",{itemData:h||{},index:t});return this.applyFilters("itemData",e.itemData,t)}m(t){return this.options.children||this.options.childSelector?o(this.options.children,this.options.childSelector,t)||[]:[t]}g(t){const i={element:t},s="A"===t.tagName?t:t.querySelector("a");if(s){i.src=s.dataset.pswpSrc||s.href,s.dataset.pswpSrcset&&(i.srcset=s.dataset.pswpSrcset),i.width=parseInt(s.dataset.pswpWidth,10),i.height=parseInt(s.dataset.pswpHeight,10),i.w=i.width,i.h=i.height,s.dataset.pswpType&&(i.type=s.dataset.pswpType);const h=t.querySelector("img");h&&(i.msrc=h.currentSrc||h.src,i.alt=h.getAttribute("alt")),(s.dataset.pswpCropped||s.dataset.cropped)&&(i.thumbCropped=!0)}return this.applyFilters("domItemData",i,t,s)}lazyLoadData(t,i){return p(t,this,i)}}{constructor(t){super(),this.options=t||{},this.v=0}init(){this.onThumbnailsClick=this.onThumbnailsClick.bind(this),o(this.options.gallery,this.options.gallerySelector).forEach((t=>{t.addEventListener("click",this.onThumbnailsClick,!1)}))}onThumbnailsClick(t){if(function(t){if(2===t.which||t.ctrlKey||t.metaKey||t.altKey||t.shiftKey)return!0}(t)||window.pswp||!1===window.navigator.onLine)return;let i={x:t.clientX,y:t.clientY};i.x||i.y||(i=null);let s=this.getClickedIndex(t);s=this.applyFilters("clickedIndex",s,t,this);const h={gallery:t.currentTarget};s>=0&&(t.preventDefault(),this.loadAndOpen(s,h,i))}getClickedIndex(t){if(this.options.getClickedIndexFn)return this.options.getClickedIndexFn.call(this,t);const i=t.target,s=o(this.options.children,this.options.childSelector,t.currentTarget).findIndex((t=>t===i||t.contains(i)));return-1!==s?s:this.options.children||this.options.childSelector?-1:0}loadAndOpen(t,i,s){return!window.pswp&&(this.options.index=t,this.options.initialPointerPos=s,this.shouldOpen=!0,this.preload(t,i),!0)}preload(t,i){const{options:s}=this;i&&(s.dataSource=i);const h=[],e=typeof s.pswpModule;if("function"==typeof(n=s.pswpModule)&&n.prototype&&n.prototype.goTo)h.push(Promise.resolve(s.pswpModule));else{if("string"===e)throw new Error("pswpModule as string is no longer supported");if("function"!==e)throw new Error("pswpModule is not valid");h.push(s.pswpModule())}var n;"function"==typeof s.openPromise&&h.push(s.openPromise()),!1!==s.preloadFirstSlide&&t>=0&&(this._=function(t,i){const s=i.getItemData(t);if(!i.dispatch("lazyLoadSlide",{index:t,itemData:s}).defaultPrevented)return p(s,i,t)}(t,this));const o=++this.v;Promise.all(h).then((t=>{if(this.shouldOpen){const i=t[0];this.I(i,o)}}))}I(t,i){if(i!==this.v&&this.shouldOpen)return;if(this.shouldOpen=!1,window.pswp)return;const s="object"==typeof t?new t.default(this.options):new t(this.options);this.pswp=s,window.pswp=s,Object.keys(this.u).forEach((t=>{this.u[t].forEach((i=>{s.on(t,i)}))})),Object.keys(this.p).forEach((t=>{this.p[t].forEach((i=>{s.addFilter(t,i.fn,i.priority)}))})),this._&&(s.contentLoader.addToCache(this._),this._=null),s.on("destroy",(()=>{this.pswp=null,window.pswp=null})),s.init()}destroy(){this.pswp&&this.pswp.destroy(),this.shouldOpen=!1,this.u=null,o(this.options.gallery,this.options.gallerySelector).forEach((t=>{t.removeEventListener("click",this.onThumbnailsClick,!1)}))}}export{m as default};
@@ -0,0 +1,419 @@
1
+ /*! PhotoSwipe main CSS by Dmytro Semenov | photoswipe.com */
2
+
3
+ .pswp {
4
+ --pswp-bg: #000;
5
+ --pswp-placeholder-bg: #222;
6
+
7
+
8
+ --pswp-root-z-index: 100000;
9
+
10
+ --pswp-preloader-color: rgba(79, 79, 79, 0.4);
11
+ --pswp-preloader-color-secondary: rgba(255, 255, 255, 0.9);
12
+
13
+ /* defined via js:
14
+ --pswp-transition-duration: 333ms; */
15
+
16
+ --pswp-icon-color: #fff;
17
+ --pswp-icon-color-secondary: #4f4f4f;
18
+ --pswp-icon-stroke-color: #4f4f4f;
19
+ --pswp-icon-stroke-width: 2px;
20
+
21
+ --pswp-error-text-color: var(--pswp-icon-color);
22
+ }
23
+
24
+
25
+ /*
26
+ Styles for basic PhotoSwipe (pswp) functionality (sliding area, open/close transitions)
27
+ */
28
+
29
+ .pswp {
30
+ position: fixed;
31
+ top: 0;
32
+ left: 0;
33
+ width: 100%;
34
+ height: 100%;
35
+ z-index: var(--pswp-root-z-index);
36
+ display: none;
37
+ touch-action: none;
38
+ outline: 0;
39
+ opacity: 0.003;
40
+ contain: layout style size;
41
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
42
+ }
43
+
44
+ /* Prevents focus outline on the root element,
45
+ (it may be focused initially) */
46
+ .pswp:focus {
47
+ outline: 0;
48
+ }
49
+
50
+ .pswp * {
51
+ box-sizing: border-box;
52
+ }
53
+
54
+ .pswp img {
55
+ max-width: none;
56
+ }
57
+
58
+ .pswp--open {
59
+ display: block;
60
+ }
61
+
62
+ .pswp,
63
+ .pswp__bg {
64
+ transform: translateZ(0);
65
+ will-change: opacity;
66
+ }
67
+
68
+ .pswp__bg {
69
+ opacity: 0.005;
70
+ background: var(--pswp-bg);
71
+ }
72
+
73
+ .pswp,
74
+ .pswp__scroll-wrap {
75
+ overflow: hidden;
76
+ }
77
+
78
+ .pswp__scroll-wrap,
79
+ .pswp__bg,
80
+ .pswp__container,
81
+ .pswp__item,
82
+ .pswp__content,
83
+ .pswp__img,
84
+ .pswp__zoom-wrap {
85
+ position: absolute;
86
+ top: 0;
87
+ left: 0;
88
+ width: 100%;
89
+ height: 100%;
90
+ }
91
+
92
+ .pswp__img,
93
+ .pswp__zoom-wrap {
94
+ width: auto;
95
+ height: auto;
96
+ }
97
+
98
+ .pswp--click-to-zoom.pswp--zoom-allowed .pswp__img {
99
+ cursor: -webkit-zoom-in;
100
+ cursor: -moz-zoom-in;
101
+ cursor: zoom-in;
102
+ }
103
+
104
+ .pswp--click-to-zoom.pswp--zoomed-in .pswp__img {
105
+ cursor: move;
106
+ cursor: -webkit-grab;
107
+ cursor: -moz-grab;
108
+ cursor: grab;
109
+ }
110
+
111
+ .pswp--click-to-zoom.pswp--zoomed-in .pswp__img:active {
112
+ cursor: -webkit-grabbing;
113
+ cursor: -moz-grabbing;
114
+ cursor: grabbing;
115
+ }
116
+
117
+ /* :active to override grabbing cursor */
118
+ .pswp--no-mouse-drag.pswp--zoomed-in .pswp__img,
119
+ .pswp--no-mouse-drag.pswp--zoomed-in .pswp__img:active,
120
+ .pswp__img {
121
+ cursor: -webkit-zoom-out;
122
+ cursor: -moz-zoom-out;
123
+ cursor: zoom-out;
124
+ }
125
+
126
+
127
+ /* Prevent selection and tap highlights */
128
+ .pswp__container,
129
+ .pswp__img,
130
+ .pswp__button,
131
+ .pswp__counter {
132
+ -webkit-user-select: none;
133
+ -moz-user-select: none;
134
+ -ms-user-select: none;
135
+ user-select: none;
136
+ }
137
+
138
+ .pswp__item {
139
+ /* z-index for fade transition */
140
+ z-index: 1;
141
+ overflow: hidden;
142
+ }
143
+
144
+ .pswp__hidden {
145
+ display: none !important;
146
+ }
147
+
148
+ /* Allow to click through pswp__content element, but not its children */
149
+ .pswp__content {
150
+ pointer-events: none;
151
+ }
152
+ .pswp__content > * {
153
+ pointer-events: auto;
154
+ }
155
+
156
+
157
+ /*
158
+
159
+ PhotoSwipe UI
160
+
161
+ */
162
+
163
+ /*
164
+ Error message appears when image is not loaded
165
+ (JS option errorMsg controls markup)
166
+ */
167
+ .pswp__error-msg-container {
168
+ display: grid;
169
+ }
170
+ .pswp__error-msg {
171
+ margin: auto;
172
+ font-size: 1em;
173
+ line-height: 1;
174
+ color: var(--pswp-error-text-color);
175
+ }
176
+
177
+ /*
178
+ class pswp__hide-on-close is applied to elements that
179
+ should hide (for example fade out) when PhotoSwipe is closed
180
+ and show (for example fade in) when PhotoSwipe is opened
181
+ */
182
+ .pswp .pswp__hide-on-close {
183
+ opacity: 0.005;
184
+ will-change: opacity;
185
+ transition: opacity var(--pswp-transition-duration) cubic-bezier(0.4, 0, 0.22, 1);
186
+ z-index: 10; /* always overlap slide content */
187
+ pointer-events: none; /* hidden elements should not be clickable */
188
+ }
189
+
190
+ /* class pswp--ui-visible is added when opening or closing transition starts */
191
+ .pswp--ui-visible .pswp__hide-on-close {
192
+ opacity: 1;
193
+ pointer-events: auto;
194
+ }
195
+
196
+ /* <button> styles, including css reset */
197
+ .pswp__button {
198
+ position: relative;
199
+ display: block;
200
+ width: 50px;
201
+ height: 60px;
202
+ padding: 0;
203
+ margin: 0;
204
+ overflow: hidden;
205
+ cursor: pointer;
206
+ background: none;
207
+ border: 0;
208
+ box-shadow: none;
209
+ opacity: 0.85;
210
+ -webkit-appearance: none;
211
+ -webkit-touch-callout: none;
212
+ }
213
+
214
+ .pswp__button:hover,
215
+ .pswp__button:active,
216
+ .pswp__button:focus {
217
+ transition: none;
218
+ padding: 0;
219
+ background: none;
220
+ border: 0;
221
+ box-shadow: none;
222
+ opacity: 1;
223
+ }
224
+
225
+ .pswp__button:disabled {
226
+ opacity: 0.3;
227
+ cursor: auto;
228
+ }
229
+
230
+ .pswp__icn {
231
+ fill: var(--pswp-icon-color);
232
+ color: var(--pswp-icon-color-secondary);
233
+ }
234
+
235
+ .pswp__icn {
236
+ position: absolute;
237
+ top: 14px;
238
+ left: 9px;
239
+ width: 32px;
240
+ height: 32px;
241
+ overflow: hidden;
242
+ pointer-events: none;
243
+ }
244
+
245
+ .pswp__icn-shadow {
246
+ stroke: var(--pswp-icon-stroke-color);
247
+ stroke-width: var(--pswp-icon-stroke-width);
248
+ fill: none;
249
+ }
250
+
251
+ .pswp__icn:focus {
252
+ outline: 0;
253
+ }
254
+
255
+ /*
256
+ div element that matches size of large image,
257
+ large image loads on top of it,
258
+ used when msrc is not provided
259
+ */
260
+ div.pswp__img--placeholder,
261
+ .pswp__img--with-bg {
262
+ background: var(--pswp-placeholder-bg);
263
+ }
264
+
265
+ .pswp__top-bar {
266
+ position: absolute;
267
+ left: 0;
268
+ top: 0;
269
+ width: 100%;
270
+ height: 60px;
271
+ display: flex;
272
+ flex-direction: row;
273
+ justify-content: flex-end;
274
+ z-index: 10;
275
+
276
+ /* allow events to pass through top bar itself */
277
+ pointer-events: none !important;
278
+ }
279
+ .pswp__top-bar > * {
280
+ pointer-events: auto;
281
+ /* this makes transition significantly more smooth,
282
+ even though inner elements are not animated */
283
+ will-change: opacity;
284
+ }
285
+
286
+
287
+ /*
288
+
289
+ Close button
290
+
291
+ */
292
+ .pswp__button--close {
293
+ margin-right: 6px;
294
+ }
295
+
296
+
297
+ /*
298
+
299
+ Arrow buttons
300
+
301
+ */
302
+ .pswp__button--arrow {
303
+ position: absolute;
304
+ top: 0;
305
+ width: 75px;
306
+ height: 100px;
307
+ top: 50%;
308
+ margin-top: -50px;
309
+ }
310
+
311
+ .pswp__button--arrow:disabled {
312
+ display: none;
313
+ cursor: default;
314
+ }
315
+
316
+ .pswp__button--arrow .pswp__icn {
317
+ top: 50%;
318
+ margin-top: -30px;
319
+ width: 60px;
320
+ height: 60px;
321
+ background: none;
322
+ border-radius: 0;
323
+ }
324
+
325
+ .pswp--one-slide .pswp__button--arrow {
326
+ display: none;
327
+ }
328
+
329
+ /* hide arrows on touch screens */
330
+ .pswp--touch .pswp__button--arrow {
331
+ visibility: hidden;
332
+ }
333
+
334
+ /* show arrows only after mouse was used */
335
+ .pswp--has_mouse .pswp__button--arrow {
336
+ visibility: visible;
337
+ }
338
+
339
+ .pswp__button--arrow--prev {
340
+ right: auto;
341
+ left: 0px;
342
+ }
343
+
344
+ .pswp__button--arrow--next {
345
+ right: 0px;
346
+ }
347
+ .pswp__button--arrow--next .pswp__icn {
348
+ left: auto;
349
+ right: 14px;
350
+ /* flip horizontally */
351
+ transform: scale(-1, 1);
352
+ }
353
+
354
+ /*
355
+
356
+ Zoom button
357
+
358
+ */
359
+ .pswp__button--zoom {
360
+ display: none;
361
+ }
362
+
363
+ .pswp--zoom-allowed .pswp__button--zoom {
364
+ display: block;
365
+ }
366
+
367
+ /* "+" => "-" */
368
+ .pswp--zoomed-in .pswp__zoom-icn-bar-v {
369
+ display: none;
370
+ }
371
+
372
+
373
+ /*
374
+
375
+ Loading indicator
376
+
377
+ */
378
+ .pswp__preloader {
379
+ position: relative;
380
+ overflow: hidden;
381
+ width: 50px;
382
+ height: 60px;
383
+ margin-right: auto;
384
+ }
385
+
386
+ .pswp__preloader .pswp__icn {
387
+ opacity: 0;
388
+ transition: opacity 0.2s linear;
389
+ animation: pswp-clockwise 600ms linear infinite;
390
+ }
391
+
392
+ .pswp__preloader--active .pswp__icn {
393
+ opacity: 0.85;
394
+ }
395
+
396
+ @keyframes pswp-clockwise {
397
+ 0% { transform: rotate(0deg); }
398
+ 100% { transform: rotate(360deg); }
399
+ }
400
+
401
+
402
+ /*
403
+
404
+ "1 of 10" counter
405
+
406
+ */
407
+ .pswp__counter {
408
+ height: 30px;
409
+ margin: 15px 0 0 20px;
410
+ font-size: 14px;
411
+ line-height: 30px;
412
+ color: var(--pswp-icon-color);
413
+ text-shadow: 1px 1px 3px var(--pswp-icon-color-secondary);
414
+ opacity: 0.85;
415
+ }
416
+
417
+ .pswp--one-slide .pswp__counter {
418
+ display: none;
419
+ }
@@ -0,0 +1,5 @@
1
+ /*!
2
+ * PhotoSwipe 5.3.1 - https://photoswipe.com
3
+ * (c) 2022 Dmytro Semenov
4
+ */
5
+ function t(t,i,s){const h=document.createElement(i||"div");return t&&(h.className=t),s&&s.appendChild(h),h}function i(t,i){return t.x=i.x,t.y=i.y,void 0!==i.id&&(t.id=i.id),t}function s(t){t.x=Math.round(t.x),t.y=Math.round(t.y)}function h(t,i){const s=Math.abs(t.x-i.x),h=Math.abs(t.y-i.y);return Math.sqrt(s*s+h*h)}function e(t,i){return t.x===i.x&&t.y===i.y}function n(t,i,s){return Math.min(Math.max(t,i),s)}function o(t,i,s){let h="translate3d("+t+"px,"+(i||0)+"px,0)";return void 0!==s&&(h+=" scale3d("+s+","+s+",1)"),h}function r(t,i,s,h){t.style.transform=o(i,s,h)}function a(t,i,s,h){t.style.transition=i?i+" "+s+"ms "+(h||"cubic-bezier(.4,0,.22,1)"):"none"}function c(t,i,s){t.style.width="number"==typeof i?i+"px":i,t.style.height="number"==typeof s?s+"px":s}const l="idle",p="loading",u="loaded",d="error";function m(){return!(!navigator.vendor||!navigator.vendor.match(/apple/i))}let f=!1;try{window.addEventListener("test",null,Object.defineProperty({},"passive",{get:()=>{f=!0}}))}catch(t){}class w{constructor(){this.t=[]}add(t,i,s,h){this.i(t,i,s,h)}remove(t,i,s,h){this.i(t,i,s,h,!0)}removeAll(){this.t.forEach((t=>{this.i(t.target,t.type,t.listener,t.passive,!0,!0)})),this.t=[]}i(t,i,s,h,e,n){if(!t)return;const o=e?"removeEventListener":"addEventListener";i.split(" ").forEach((i=>{if(i){n||(e?this.t=this.t.filter((h=>h.type!==i||h.listener!==s||h.target!==t)):this.t.push({target:t,type:i,listener:s,passive:h}));const r=!!f&&{passive:h||!1};t[o](i,s,r)}}))}}function g(t,i){if(t.getViewportSizeFn){const s=t.getViewportSizeFn(t,i);if(s)return s}return{x:document.documentElement.clientWidth,y:window.innerHeight}}function _(t,i,s,h,e){let n;if(i.paddingFn)n=i.paddingFn(s,h,e)[t];else if(i.padding)n=i.padding[t];else{const s="padding"+t[0].toUpperCase()+t.slice(1);i[s]&&(n=i[s])}return n||0}function v(t,i,s,h){return{x:i.x-_("left",t,i,s,h)-_("right",t,i,s,h),y:i.y-_("top",t,i,s,h)-_("bottom",t,i,s,h)}}class y{constructor(t){this.slide=t,this.currZoomLevel=1,this.center={},this.max={},this.min={},this.reset()}update(t){this.currZoomLevel=t,this.slide.width?(this.o("x"),this.o("y"),this.slide.pswp.dispatch("calcBounds",{slide:this.slide})):this.reset()}o(t){const{pswp:i}=this.slide,s=this.slide["x"===t?"width":"height"]*this.currZoomLevel,h=_("x"===t?"left":"top",i.options,i.viewportSize,this.slide.data,this.slide.index),e=this.slide.panAreaSize[t];this.center[t]=Math.round((e-s)/2)+h,this.max[t]=s>e?Math.round(e-s)+h:this.center[t],this.min[t]=s>e?h:this.center[t]}reset(){this.center.x=0,this.center.y=0,this.max.x=0,this.max.y=0,this.min.x=0,this.min.y=0}correctPan(t,i){return n(i,this.max[t],this.min[t])}}class b{constructor(t,i,s,h){this.pswp=h,this.options=t,this.itemData=i,this.index=s}update(t,i,s){this.elementSize={x:t,y:i},this.panAreaSize=s;const h=this.panAreaSize.x/this.elementSize.x,e=this.panAreaSize.y/this.elementSize.y;this.fit=Math.min(1,h<e?h:e),this.fill=Math.min(1,h>e?h:e),this.vFill=Math.min(1,e),this.initial=this.l(),this.secondary=this.p(),this.max=Math.max(this.initial,this.secondary,this.u()),this.min=Math.min(this.fit,this.initial,this.secondary),this.pswp&&this.pswp.dispatch("zoomLevelsUpdate",{zoomLevels:this,slideData:this.itemData})}m(t){const i=t+"ZoomLevel",s=this.options[i];if(s)return"function"==typeof s?s(this):"fill"===s?this.fill:"fit"===s?this.fit:Number(s)}p(){let t=this.m("secondary");return t||(t=Math.min(1,3*this.fit),t*this.elementSize.x>4e3&&(t=4e3/this.elementSize.x),t)}l(){return this.m("initial")||this.fit}u(){const t=this.m("max");return t||Math.max(1,4*this.fit)}}class S{constructor(i,s,h){this.data=i,this.index=s,this.pswp=h,this.isActive=s===h.currIndex,this.currentResolution=0,this.panAreaSize={},this.isFirstSlide=this.isActive&&!h.opener.isOpen,this.zoomLevels=new b(h.options,i,s,h),this.pswp.dispatch("gettingData",{slide:this,data:this.data,index:s}),this.pan={x:0,y:0},this.content=this.pswp.contentLoader.getContentBySlide(this),this.container=t("pswp__zoom-wrap"),this.currZoomLevel=1,this.width=this.content.width,this.height=this.content.height,this.bounds=new y(this),this.prevDisplayedWidth=-1,this.prevDisplayedHeight=-1,this.pswp.dispatch("slideInit",{slide:this})}setIsActive(t){t&&!this.isActive?this.activate():!t&&this.isActive&&this.deactivate()}append(t){this.holderElement=t,this.container.style.transformOrigin="0 0",this.data&&(this.calculateSize(),this.load(),this.updateContentSize(),this.appendHeavy(),this.holderElement.appendChild(this.container),this.zoomAndPanToInitial(),this.pswp.dispatch("firstZoomPan",{slide:this}),this.applyCurrentZoomPan(),this.pswp.dispatch("afterSetContent",{slide:this}),this.isActive&&this.activate())}load(){this.content.load(),this.pswp.dispatch("slideLoad",{slide:this})}appendHeavy(){const{pswp:t}=this;!this.heavyAppended&&t.opener.isOpen&&!t.mainScroll.isShifted()&&(this.isActive,1)&&(this.pswp.dispatch("appendHeavy",{slide:this}).defaultPrevented||(this.heavyAppended=!0,this.content.append(),this.pswp.dispatch("appendHeavyContent",{slide:this})))}activate(){this.isActive=!0,this.appendHeavy(),this.content.activate(),this.pswp.dispatch("slideActivate",{slide:this})}deactivate(){this.isActive=!1,this.content.deactivate(),this.currZoomLevel!==this.zoomLevels.initial&&this.calculateSize(),this.currentResolution=0,this.zoomAndPanToInitial(),this.applyCurrentZoomPan(),this.updateContentSize(),this.pswp.dispatch("slideDeactivate",{slide:this})}destroy(){this.content.hasSlide=!1,this.content.remove(),this.container.remove(),this.pswp.dispatch("slideDestroy",{slide:this})}resize(){this.currZoomLevel!==this.zoomLevels.initial&&this.isActive?(this.calculateSize(),this.bounds.update(this.currZoomLevel),this.panTo(this.pan.x,this.pan.y)):(this.calculateSize(),this.currentResolution=0,this.zoomAndPanToInitial(),this.applyCurrentZoomPan(),this.updateContentSize())}updateContentSize(t){const i=this.currentResolution||this.zoomLevels.initial;if(!i)return;const s=Math.round(this.width*i)||this.pswp.viewportSize.x,h=Math.round(this.height*i)||this.pswp.viewportSize.y;(this.sizeChanged(s,h)||t)&&this.content.setDisplayedSize(s,h)}sizeChanged(t,i){return(t!==this.prevDisplayedWidth||i!==this.prevDisplayedHeight)&&(this.prevDisplayedWidth=t,this.prevDisplayedHeight=i,!0)}getPlaceholderElement(){if(this.content.placeholder)return this.content.placeholder.element}zoomTo(t,i,h,e){const{pswp:o}=this;if(!this.isZoomable()||o.mainScroll.isShifted())return;o.dispatch("beforeZoomTo",{destZoomLevel:t,centerPoint:i,transitionDuration:h}),o.animations.stopAllPan();const r=this.currZoomLevel;e||(t=n(t,this.zoomLevels.min,this.zoomLevels.max)),this.setZoomLevel(t),this.pan.x=this.calculateZoomToPanOffset("x",i,r),this.pan.y=this.calculateZoomToPanOffset("y",i,r),s(this.pan);const a=()=>{this.g(t),this.applyCurrentZoomPan()};h?o.animations.startTransition({isPan:!0,name:"zoomTo",target:this.container,transform:this.getCurrentTransform(),onComplete:a,duration:h,easing:o.options.easing}):a()}toggleZoom(t){this.zoomTo(this.currZoomLevel===this.zoomLevels.initial?this.zoomLevels.secondary:this.zoomLevels.initial,t,this.pswp.options.zoomAnimationDuration)}setZoomLevel(t){this.currZoomLevel=t,this.bounds.update(this.currZoomLevel)}calculateZoomToPanOffset(t,i,s){if(0===this.bounds.max[t]-this.bounds.min[t])return this.bounds.center[t];i||(i=this.pswp.getViewportCenterPoint());const h=this.currZoomLevel/s;return this.bounds.correctPan(t,(this.pan[t]-i[t])*h+i[t])}panTo(t,i){this.pan.x=this.bounds.correctPan("x",t),this.pan.y=this.bounds.correctPan("y",i),this.applyCurrentZoomPan()}isPannable(){return this.width&&this.currZoomLevel>this.zoomLevels.fit}isZoomable(){return this.width&&this.content.isZoomable()}applyCurrentZoomPan(){this._(this.pan.x,this.pan.y,this.currZoomLevel),this===this.pswp.currSlide&&this.pswp.dispatch("zoomPanUpdate",{slide:this})}zoomAndPanToInitial(){this.currZoomLevel=this.zoomLevels.initial,this.bounds.update(this.currZoomLevel),i(this.pan,this.bounds.center),this.pswp.dispatch("initialZoomPan",{slide:this})}_(t,i,s){s/=this.currentResolution||this.zoomLevels.initial,r(this.container,t,i,s)}calculateSize(){const{pswp:t}=this;i(this.panAreaSize,v(t.options,t.viewportSize,this.data,this.index)),this.zoomLevels.update(this.width,this.height,this.panAreaSize),t.dispatch("calcSlideSize",{slide:this})}getCurrentTransform(){const t=this.currZoomLevel/(this.currentResolution||this.zoomLevels.initial);return o(this.pan.x,this.pan.y,t)}g(t){t!==this.currentResolution&&(this.currentResolution=t,this.updateContentSize(),this.pswp.dispatch("resolutionChanged"))}}class x{constructor(t){this.gestures=t,this.pswp=t.pswp,this.startPan={}}start(){i(this.startPan,this.pswp.currSlide.pan),this.pswp.animations.stopAll()}change(){const{p1:t,prevP1:i,dragAxis:h,pswp:e}=this.gestures,{currSlide:n}=e;if("y"===h&&e.options.closeOnVerticalDrag&&n.currZoomLevel<=n.zoomLevels.fit&&!this.gestures.isMultitouch){const s=n.pan.y+(t.y-i.y);if(!e.dispatch("verticalDrag",{panY:s}).defaultPrevented){this.v("y",s,.6);const t=1-Math.abs(this.S(n.pan.y));e.applyBgOpacity(t),n.applyCurrentZoomPan()}}else{this.M("x")||(this.M("y"),s(n.pan),n.applyCurrentZoomPan())}}end(){const{pswp:t,velocity:i}=this.gestures,{mainScroll:s}=t;let h=0;if(t.animations.stopAll(),s.isShifted()){const e=(s.x-s.getCurrSlideX())/t.viewportSize.x;i.x<-.5&&e<0||i.x<.1&&e<-.5?(h=1,i.x=Math.min(i.x,0)):(i.x>.5&&e>0||i.x>-.1&&e>.5)&&(h=-1,i.x=Math.max(i.x,0)),s.moveIndexBy(h,!0,i.x)}t.currSlide.currZoomLevel>t.currSlide.zoomLevels.max||this.gestures.isMultitouch?this.gestures.zoomLevels.correctZoomPan(!0):(this.P("x"),this.P("y"))}P(t){const{pswp:i}=this,{currSlide:s}=i,{velocity:h}=this.gestures,{pan:e,bounds:o}=s,r=e[t],a=i.bgOpacity<1&&"y"===t,c=r+function(t,i){return t*i/(1-i)}(h[t],.995);if(a){const t=this.S(r),s=this.S(c);if(t<0&&s<-.4||t>0&&s>.4)return void i.close()}const l=o.correctPan(t,c);if(r===l)return;const p=l===c?1:.82,u=i.bgOpacity,d=l-r;i.animations.startSpring({name:"panGesture"+t,isPan:!0,start:r,end:l,velocity:h[t],dampingRatio:p,onUpdate:h=>{if(a&&i.bgOpacity<1){const t=1-(l-h)/d;i.applyBgOpacity(n(u+(1-u)*t,0,1))}e[t]=Math.floor(h),s.applyCurrentZoomPan()}})}M(t){const{p1:i,pswp:s,dragAxis:h,prevP1:e,isMultitouch:n}=this.gestures,{currSlide:o,mainScroll:r}=s,a=i[t]-e[t],c=r.x+a;if(!a)return;if("x"===t&&!o.isPannable()&&!n)return r.moveTo(c,!0),!0;const{bounds:l}=o,p=o.pan[t]+a;if(s.options.allowPanToNext&&"x"===h&&"x"===t&&!n){const i=r.getCurrSlideX(),s=r.x-i,h=a>0,e=!h;if(p>l.min[t]&&h){if(l.min[t]<=this.startPan[t])return r.moveTo(c,!0),!0;this.v(t,p)}else if(p<l.max[t]&&e){if(this.startPan[t]<=l.max[t])return r.moveTo(c,!0),!0;this.v(t,p)}else if(0!==s){if(s>0)return r.moveTo(Math.max(c,i),!0),!0;if(s<0)return r.moveTo(Math.min(c,i),!0),!0}else this.v(t,p)}else"y"===t&&(r.isShifted()||l.min.y===l.max.y)||this.v(t,p)}S(t){return(t-this.pswp.currSlide.bounds.center.y)/(this.pswp.viewportSize.y/3)}v(t,i,s){const{pan:h,bounds:e}=this.pswp.currSlide;if(e.correctPan(t,i)!==i||s){const e=Math.round(i-h[t]);h[t]+=e*(s||.35)}else h[t]=i}}function M(t,i,s){return t.x=(i.x+s.x)/2,t.y=(i.y+s.y)/2,t}class z{constructor(t){this.gestures=t,this.pswp=this.gestures.pswp,this.C={},this.T={},this.D={}}start(){this.I=this.pswp.currSlide.currZoomLevel,i(this.C,this.pswp.currSlide.pan),this.pswp.animations.stopAllPan(),this.A=!1}change(){const{p1:t,startP1:i,p2:s,startP2:e,pswp:n}=this.gestures,{currSlide:o}=n,r=o.zoomLevels.min,a=o.zoomLevels.max;if(!o.isZoomable()||n.mainScroll.isShifted())return;M(this.T,i,e),M(this.D,t,s);let c=1/h(i,e)*h(t,s)*this.I;if(c>o.zoomLevels.initial+o.zoomLevels.initial/15&&(this.A=!0),c<r)if(n.options.pinchToClose&&!this.A&&this.I<=o.zoomLevels.initial){const t=1-(r-c)/(r/1.2);n.dispatch("pinchClose",{bgOpacity:t}).defaultPrevented||n.applyBgOpacity(t)}else c=r-.15*(r-c);else c>a&&(c=a+.05*(c-a));o.pan.x=this.L("x",c),o.pan.y=this.L("y",c),o.setZoomLevel(c),o.applyCurrentZoomPan()}end(){const{pswp:t}=this,{currSlide:i}=t;i.currZoomLevel<i.zoomLevels.initial&&!this.A&&t.options.pinchToClose?t.close():this.correctZoomPan()}L(t,i){const s=i/this.I;return this.D[t]-(this.T[t]-this.C[t])*s}correctZoomPan(t){const{pswp:s}=this,{currSlide:h}=s;if(!h.isZoomable())return;void 0===this.D.x&&(t=!0);const o=h.currZoomLevel;let r,a=!0;o<h.zoomLevels.initial?r=h.zoomLevels.initial:o>h.zoomLevels.max?r=h.zoomLevels.max:(a=!1,r=o);const c=s.bgOpacity,l=s.bgOpacity<1,p=i({},h.pan);let u=i({},p);t&&(this.D.x=0,this.D.y=0,this.T.x=0,this.T.y=0,this.I=o,i(this.C,p)),a&&(u={x:this.L("x",r),y:this.L("y",r)}),h.setZoomLevel(r),u={x:h.bounds.correctPan("x",u.x),y:h.bounds.correctPan("y",u.y)},h.setZoomLevel(o);let d=!0;if(e(u,p)&&(d=!1),!d&&!a&&!l)return h.g(r),void h.applyCurrentZoomPan();s.animations.stopAllPan(),s.animations.startSpring({isPan:!0,start:0,end:1e3,velocity:0,dampingRatio:1,naturalFrequency:40,onUpdate:t=>{if(t/=1e3,d||a){if(d&&(h.pan.x=p.x+(u.x-p.x)*t,h.pan.y=p.y+(u.y-p.y)*t),a){const i=o+(r-o)*t;h.setZoomLevel(i)}h.applyCurrentZoomPan()}l&&s.bgOpacity<1&&s.applyBgOpacity(n(c+(1-c)*t,0,1))},onComplete:()=>{h.g(r),h.applyCurrentZoomPan()}})}}function P(t){return!!t.target.closest(".pswp__container")}class C{constructor(t){this.gestures=t}click(t,i){const s=i.target.classList,h=s.contains("pswp__img"),e=s.contains("pswp__item")||s.contains("pswp__zoom-wrap");h?this.k("imageClick",t,i):e&&this.k("bgClick",t,i)}tap(t,i){P(i)&&this.k("tap",t,i)}doubleTap(t,i){P(i)&&this.k("doubleTap",t,i)}k(t,i,s){const{pswp:h}=this.gestures,{currSlide:e}=h,n=t+"Action",o=h.options[n];if(!h.dispatch(n,{point:i,originalEvent:s}).defaultPrevented)if("function"!=typeof o)switch(o){case"close":case"next":h[o]();break;case"zoom":e.toggleZoom(i);break;case"zoom-or-close":e.isZoomable()&&e.zoomLevels.secondary!==e.zoomLevels.initial?e.toggleZoom(i):h.options.clickToCloseNonZoomable&&h.close();break;case"toggle-controls":this.gestures.pswp.element.classList.toggle("pswp--ui-visible")}else o.call(h,i,s)}}class T{constructor(t){this.pswp=t,this.dragAxis=void 0,this.p1={},this.p2={},this.prevP1={},this.prevP2={},this.startP1={},this.startP2={},this.velocity={},this.Z={},this.F={},this.O=0,this.B=[],this.R="ontouchstart"in window,this.N=!!window.PointerEvent,this.supportsTouch=this.R||this.N&&navigator.maxTouchPoints>1,this.supportsTouch||(t.options.allowPanToNext=!1),this.drag=new x(this),this.zoomLevels=new z(this),this.tapHandler=new C(this),t.on("bindEvents",(()=>{t.events.add(t.scrollWrap,"click",(t=>this.V(t))),this.N?this.G("pointer","down","up","cancel"):this.R?(this.G("touch","start","end","cancel"),t.scrollWrap.ontouchmove=()=>{},t.scrollWrap.ontouchend=()=>{}):this.G("mouse","down","up")}))}G(t,i,s,h){const{pswp:e}=this,{events:n}=e,o=h?t+h:"";n.add(e.scrollWrap,t+i,this.onPointerDown.bind(this)),n.add(window,t+"move",this.onPointerMove.bind(this)),n.add(window,t+s,this.onPointerUp.bind(this)),o&&n.add(e.scrollWrap,o,this.onPointerUp.bind(this))}onPointerDown(t){let s;if("mousedown"!==t.type&&"mouse"!==t.pointerType||(s=!0),s&&t.button>0)return;const{pswp:h}=this;h.opener.isOpen?h.dispatch("pointerDown",{originalEvent:t}).defaultPrevented||(s&&(h.mouseDetected(),this.U(t)),h.animations.stopAll(),this.q(t,"down"),this.pointerDown=!0,1===this.O&&(this.dragAxis=null,i(this.startP1,this.p1)),this.O>1?(this.H(),this.isMultitouch=!0):this.isMultitouch=!1):t.preventDefault()}onPointerMove(t){t.preventDefault(),this.O&&(this.q(t,"move"),this.pswp.dispatch("pointerMove",{originalEvent:t}).defaultPrevented||(1!==this.O||this.isDragging?this.O>1&&!this.isZooming&&(this.K(),this.isZooming=!0,this.W(),this.zoomLevels.start(),this.j(),this.X()):(this.dragAxis||this.Y(),this.dragAxis&&!this.isDragging&&(this.isZooming&&(this.isZooming=!1,this.zoomLevels.end()),this.isDragging=!0,this.H(),this.W(),this.$=Date.now(),this.J=!1,i(this.F,this.p1),this.velocity.x=0,this.velocity.y=0,this.drag.start(),this.j(),this.X()))))}K(){this.isDragging&&(this.isDragging=!1,this.J||this.tt(!0),this.drag.end(),this.dragAxis=null)}onPointerUp(t){this.O&&(this.q(t,"up"),this.pswp.dispatch("pointerUp",{originalEvent:t}).defaultPrevented||(0===this.O&&(this.pointerDown=!1,this.j(),this.isDragging?this.K():this.isZooming||this.isMultitouch||this.it(t)),this.O<2&&this.isZooming&&(this.isZooming=!1,this.zoomLevels.end(),1===this.O&&(this.dragAxis=null,this.W()))))}X(){(this.isDragging||this.isZooming)&&(this.tt(),this.isDragging?e(this.p1,this.prevP1)||this.drag.change():e(this.p1,this.prevP1)&&e(this.p2,this.prevP2)||this.zoomLevels.change(),this.st(),this.raf=requestAnimationFrame(this.X.bind(this)))}tt(t){const s=Date.now(),h=s-this.$;h<50&&!t||(this.velocity.x=this.ht("x",h),this.velocity.y=this.ht("y",h),this.$=s,i(this.F,this.p1),this.J=!0)}it(t){const{mainScroll:s}=this.pswp;if(s.isShifted())return void s.moveIndexBy(0,!0);if(t.type.indexOf("cancel")>0)return;if("mouseup"===t.type||"mouse"===t.pointerType)return void this.tapHandler.click(this.startP1,t);const e=this.pswp.options.doubleTapAction?300:0;this.et?(this.H(),h(this.Z,this.startP1)<25&&this.tapHandler.doubleTap(this.startP1,t)):(i(this.Z,this.startP1),this.et=setTimeout((()=>{this.tapHandler.tap(this.startP1,t),this.H()}),e))}H(){this.et&&(clearTimeout(this.et),this.et=null)}ht(t,i){const s=this.p1[t]-this.F[t];return Math.abs(s)>1&&i>5?s/i:0}j(){this.raf&&(cancelAnimationFrame(this.raf),this.raf=null)}U(t){return t.preventDefault(),!0}q(t,s){if(this.N){const h=t,e=this.B.findIndex((t=>t.id===h.pointerId));"up"===s&&e>-1?this.B.splice(e,1):"down"===s&&-1===e?this.B.push(this.nt(h,{})):e>-1&&this.nt(h,this.B[e]),this.O=this.B.length,this.O>0&&i(this.p1,this.B[0]),this.O>1&&i(this.p2,this.B[1])}else{const i=t;this.O=0,i.type.indexOf("touch")>-1?i.touches&&i.touches.length>0&&(this.nt(i.touches[0],this.p1),this.O++,i.touches.length>1&&(this.nt(i.touches[1],this.p2),this.O++)):(this.nt(t,this.p1),"up"===s?this.O=0:this.O++)}}st(){i(this.prevP1,this.p1),i(this.prevP2,this.p2)}W(){i(this.startP1,this.p1),i(this.startP2,this.p2),this.st()}Y(){if(this.pswp.mainScroll.isShifted())this.dragAxis="x";else{const t=Math.abs(this.p1.x-this.startP1.x)-Math.abs(this.p1.y-this.startP1.y);if(0!==t){const i=t>0?"x":"y";Math.abs(this.p1[i]-this.startP1[i])>=10&&(this.dragAxis=i)}}}nt(t,i){return i.x=t.pageX-this.pswp.offset.x,i.y=t.pageY-this.pswp.offset.y,"pointerId"in t?i.id=t.pointerId:void 0!==t.identifier&&(i.id=t.identifier),i}V(t){this.pswp.mainScroll.isShifted()&&(t.preventDefault(),t.stopPropagation())}}class D{constructor(t){this.pswp=t,this.x=0,this.slideWidth=void 0,this.itemHolders=void 0,this.resetPosition()}resize(t){const{pswp:i}=this,s=Math.round(i.viewportSize.x+i.viewportSize.x*i.options.spacing),h=s!==this.slideWidth;h&&(this.slideWidth=s,this.moveTo(this.getCurrSlideX())),this.itemHolders.forEach(((i,s)=>{h&&r(i.el,(s+this.ot)*this.slideWidth),t&&i.slide&&i.slide.resize()}))}resetPosition(){this.rt=0,this.ct=0,this.slideWidth=0,this.ot=-1}appendHolders(){this.itemHolders=[];for(let i=0;i<3;i++){const s=t("pswp__item",!1,this.pswp.container);s.style.display=1===i?"block":"none",this.itemHolders.push({el:s})}}canBeSwiped(){return this.pswp.getNumItems()>1}moveIndexBy(t,i,s){const{pswp:h}=this;let e=h.potentialIndex+t;const n=h.getNumItems();if(h.canLoop()){e=h.getLoopedIndex(e);const i=(t+n)%n;t=i<=n/2?i:i-n}else e<0?e=0:e>=n&&(e=n-1),t=e-h.potentialIndex;h.potentialIndex=e,this.rt-=t,h.animations.stopMainScroll();const o=this.getCurrSlideX();if(i){h.animations.startSpring({isMainScroll:!0,start:this.x,end:o,velocity:s||0,naturalFrequency:30,dampingRatio:1,onUpdate:t=>{this.moveTo(t)},onComplete:()=>{this.updateCurrItem(),h.appendHeavy()}});let t=h.potentialIndex-h.currIndex;if(h.canLoop()){const i=(t+n)%n;t=i<=n/2?i:i-n}Math.abs(t)>1&&this.updateCurrItem()}else this.moveTo(o),this.updateCurrItem();if(t)return!0}getCurrSlideX(){return this.slideWidth*this.rt}isShifted(){return this.x!==this.getCurrSlideX()}updateCurrItem(){const{pswp:t}=this,i=this.ct-this.rt;if(!i)return;this.ct=this.rt,t.currIndex=t.potentialIndex;let s,h=Math.abs(i);h>=3&&(this.ot+=i+(i>0?-3:3),h=3);for(let e=0;e<h;e++)i>0?(s=this.itemHolders.shift(),this.itemHolders[2]=s,this.ot++,r(s.el,(this.ot+2)*this.slideWidth),t.setContent(s,t.currIndex-h+e+2)):(s=this.itemHolders.pop(),this.itemHolders.unshift(s),this.ot--,r(s.el,this.ot*this.slideWidth),t.setContent(s,t.currIndex+h-e-2));Math.abs(this.ot)>50&&!this.isShifted()&&(this.resetPosition(),this.resize()),t.animations.stopAllPan(),this.itemHolders.forEach(((t,i)=>{t.slide&&t.slide.setIsActive(1===i)})),t.currSlide=this.itemHolders[1].slide,t.contentLoader.updateLazy(i),t.currSlide.applyCurrentZoomPan(),t.dispatch("change")}moveTo(t,i){let s,h;!this.pswp.canLoop()&&i&&(s=(this.slideWidth*this.rt-t)/this.slideWidth,s+=this.pswp.currIndex,h=Math.round(t-this.x),(s<0&&h>0||s>=this.pswp.getNumItems()-1&&h<0)&&(t=this.x+.35*h)),this.x=t,r(this.pswp.container,t),this.pswp.dispatch("moveMainScroll",{x:t,dragging:i})}}class I{constructor(t){this.pswp=t,t.on("bindEvents",(()=>{t.options.initialPointerPos||this.lt(),t.events.add(document,"focusin",this.ut.bind(this)),t.events.add(document,"keydown",this.dt.bind(this))}));const i=document.activeElement;t.on("destroy",(()=>{t.options.returnFocus&&i&&this.ft&&i.focus()}))}lt(){this.ft||(this.pswp.element.focus(),this.ft=!0)}dt(t){const{pswp:i}=this;if(i.dispatch("keydown",{originalEvent:t}).defaultPrevented)return;if(function(t){if(2===t.which||t.ctrlKey||t.metaKey||t.altKey||t.shiftKey)return!0}(t))return;let s,h,e;switch(t.keyCode){case 27:i.options.escKey&&(s="close");break;case 90:s="toggleZoom";break;case 37:h="x";break;case 38:h="y";break;case 39:h="x",e=!0;break;case 40:e=!0,h="y";break;case 9:this.lt()}if(h){t.preventDefault();const{currSlide:n}=i;i.options.arrowKeys&&"x"===h&&i.getNumItems()>1?s=e?"next":"prev":n&&n.currZoomLevel>n.zoomLevels.fit&&(n.pan[h]+=e?-80:80,n.panTo(n.pan.x,n.pan.y))}s&&(t.preventDefault(),i[s]())}ut(t){const{template:i}=this.pswp;document===t.target||i===t.target||i.contains(t.target)||i.focus()}}class A{constructor(t){this.props=t;const{target:i,onComplete:s,transform:h,onFinish:e}=t;let{duration:n,easing:o}=t;this.onFinish=e;const r=h?"transform":"opacity",c=t[r];this.wt=i,this.gt=s,n=n||333,o=o||"cubic-bezier(.4,0,.22,1)",this._t=this._t.bind(this),this.vt=setTimeout((()=>{a(i,r,n,o),this.vt=setTimeout((()=>{i.addEventListener("transitionend",this._t,!1),i.addEventListener("transitioncancel",this._t,!1),this.vt=setTimeout((()=>{this.yt()}),n+500),i.style[r]=c}),30)}),0)}_t(t){t.target===this.wt&&this.yt()}yt(){this.bt||(this.bt=!0,this.onFinish(),this.gt&&this.gt())}destroy(){this.vt&&clearTimeout(this.vt),a(this.wt),this.wt.removeEventListener("transitionend",this._t,!1),this.wt.removeEventListener("transitioncancel",this._t,!1),this.bt||this.yt()}}class E{constructor(t,i,s){this.velocity=1e3*t,this.St=i||.75,this.xt=s||12,this.St<1&&(this.Mt=this.xt*Math.sqrt(1-this.St*this.St))}easeFrame(t,i){let s,h=0;i/=1e3;const e=Math.E**(-this.St*this.xt*i);if(1===this.St)s=this.velocity+this.xt*t,h=(t+s*i)*e,this.velocity=h*-this.xt+s*e;else if(this.St<1){s=1/this.Mt*(this.St*this.xt*t+this.velocity);const n=Math.cos(this.Mt*i),o=Math.sin(this.Mt*i);h=e*(t*n+s*o),this.velocity=h*-this.xt*this.St+e*(-this.Mt*t*o+this.Mt*s*n)}return h}}class L{constructor(t){this.props=t;const{start:i,end:s,velocity:h,onUpdate:e,onComplete:n,onFinish:o,dampingRatio:r,naturalFrequency:a}=t;this.onFinish=o;const c=new E(h,r,a);let l=Date.now(),p=i-s;const u=()=>{this.zt&&(p=c.easeFrame(p,Date.now()-l),Math.abs(p)<1&&Math.abs(c.velocity)<50?(e(s),n&&n(),this.onFinish()):(l=Date.now(),e(p+s),this.zt=requestAnimationFrame(u)))};this.zt=requestAnimationFrame(u)}destroy(){this.zt>=0&&cancelAnimationFrame(this.zt),this.zt=null}}class k{constructor(){this.activeAnimations=[]}startSpring(t){this.Pt(t,!0)}startTransition(t){this.Pt(t)}Pt(t,i){let s;return s=i?new L(t):new A(t),this.activeAnimations.push(s),s.onFinish=()=>this.stop(s),s}stop(t){t.destroy();const i=this.activeAnimations.indexOf(t);i>-1&&this.activeAnimations.splice(i,1)}stopAll(){this.activeAnimations.forEach((t=>{t.destroy()})),this.activeAnimations=[]}stopAllPan(){this.activeAnimations=this.activeAnimations.filter((t=>!t.props.isPan||(t.destroy(),!1)))}stopMainScroll(){this.activeAnimations=this.activeAnimations.filter((t=>!t.props.isMainScroll||(t.destroy(),!1)))}isPanRunning(){return this.activeAnimations.some((t=>t.props.isPan))}}class Z{constructor(t){this.pswp=t,t.events.add(t.element,"wheel",this.Ct.bind(this))}Ct(t){t.preventDefault();const{currSlide:i}=this.pswp;let{deltaX:s,deltaY:h}=t;if(i&&!this.pswp.dispatch("wheel",{originalEvent:t}).defaultPrevented)if(t.ctrlKey||this.pswp.options.wheelToZoom){if(i.isZoomable()){let s=-h;1===t.deltaMode?s*=.05:s*=t.deltaMode?1:.002,s=2**s;const e=i.currZoomLevel*s;i.zoomTo(e,{x:t.clientX,y:t.clientY})}}else i.isPannable()&&(1===t.deltaMode&&(s*=18,h*=18),i.panTo(i.pan.x-s,i.pan.y-h))}}class F{constructor(i,s){const h=s.name||s.className;let e=s.html;if(!1===i.options[h])return;"string"==typeof i.options[h+"SVG"]&&(e=i.options[h+"SVG"]),i.dispatch("uiElementCreate",{data:s});let n,o="";s.isButton?(o+="pswp__button ",o+=s.className||`pswp__button--${s.name}`):o+=s.className||`pswp__${s.name}`;let r=s.isButton?s.tagName||"button":s.tagName||"div";if(r=r.toLowerCase(),n=t(o,r),s.isButton){n=t(o,r),"button"===r&&(n.type="button");let{title:e}=s;const{ariaLabel:a}=s;"string"==typeof i.options[h+"Title"]&&(e=i.options[h+"Title"]),e&&(n.title=e),(a||e)&&n.setAttribute("aria-label",a||e)}n.innerHTML=function(t){if("string"==typeof t)return t;if(!t||!t.isCustomSVG)return"";const i=t;let s='<svg aria-hidden="true" class="pswp__icn" viewBox="0 0 %d %d" width="%d" height="%d">';return s=s.split("%d").join(i.size||32),i.outlineID&&(s+='<use class="pswp__icn-shadow" xlink:href="#'+i.outlineID+'"/>'),s+=i.inner,s+="</svg>",s}(e),s.onInit&&s.onInit(n,i),s.onClick&&(n.onclick=t=>{"string"==typeof s.onClick?i[s.onClick]():s.onClick(t,n,i)});const a=s.appendTo||"bar";let c;"bar"===a?(i.topBar||(i.topBar=t("pswp__top-bar pswp__hide-on-close","div",i.scrollWrap)),c=i.topBar):(n.classList.add("pswp__hide-on-close"),c="wrapper"===a?i.scrollWrap:i.element),c.appendChild(i.applyFilters("uiElement",n,s))}}function O(t,i,s){t.classList.add("pswp__button--arrow"),i.on("change",(()=>{i.options.loop||(t.disabled=s?!(i.currIndex<i.getNumItems()-1):!(i.currIndex>0))}))}const B={name:"arrowPrev",className:"pswp__button--arrow--prev",title:"Previous",order:10,isButton:!0,appendTo:"wrapper",html:{isCustomSVG:!0,size:60,inner:'<path d="M29 43l-3 3-16-16 16-16 3 3-13 13 13 13z" id="pswp__icn-arrow"/>',outlineID:"pswp__icn-arrow"},onClick:"prev",onInit:O},R={name:"arrowNext",className:"pswp__button--arrow--next",title:"Next",order:11,isButton:!0,appendTo:"wrapper",html:{isCustomSVG:!0,size:60,inner:'<use xlink:href="#pswp__icn-arrow"/>',outlineID:"pswp__icn-arrow"},onClick:"next",onInit:(t,i)=>{O(t,i,!0)}},N={name:"close",title:"Close",order:20,isButton:!0,html:{isCustomSVG:!0,inner:'<path d="M24 10l-2-2-6 6-6-6-2 2 6 6-6 6 2 2 6-6 6 6 2-2-6-6z" id="pswp__icn-close"/>',outlineID:"pswp__icn-close"},onClick:"close"},V={name:"zoom",title:"Zoom",order:10,isButton:!0,html:{isCustomSVG:!0,inner:'<path d="M17.426 19.926a6 6 0 1 1 1.5-1.5L23 22.5 21.5 24l-4.074-4.074z" id="pswp__icn-zoom"/><path fill="currentColor" class="pswp__zoom-icn-bar-h" d="M11 16v-2h6v2z"/><path fill="currentColor" class="pswp__zoom-icn-bar-v" d="M13 12h2v6h-2z"/>',outlineID:"pswp__icn-zoom"},onClick:"toggleZoom"},G={name:"preloader",appendTo:"bar",order:7,html:{isCustomSVG:!0,inner:'<path fill-rule="evenodd" clip-rule="evenodd" d="M21.2 16a5.2 5.2 0 1 1-5.2-5.2V8a8 8 0 1 0 8 8h-2.8Z" id="pswp__icn-loading"/>',outlineID:"pswp__icn-loading"},onInit:(t,i)=>{let s,h;const e=i=>{var h,e;s!==i&&(s=i,h="active",e=i,t.classList[e?"add":"remove"]("pswp__preloader--"+h))},n=()=>{if(!i.currSlide.content.isLoading())return e(!1),void(h&&(clearTimeout(h),h=null));h||(h=setTimeout((()=>{e(i.currSlide.content.isLoading()),h=null}),i.options.preloaderDelay))};i.on("change",n),i.on("loadComplete",(t=>{i.currSlide===t.slide&&n()})),i.ui.updatePreloaderVisibility=n}},U={name:"counter",order:5,onInit:(t,i)=>{i.on("change",(()=>{t.innerText=i.currIndex+1+i.options.indexIndicatorSep+i.getNumItems()}))}};function q(t,i){t.classList[i?"add":"remove"]("pswp--zoomed-in")}class H{constructor(t){this.pswp=t,this.updatePreloaderVisibility=void 0,this.Tt=void 0}init(){const{pswp:t}=this;this.isRegistered=!1,this.uiElementsData=[N,B,R,V,G,U],t.dispatch("uiRegister"),this.uiElementsData.sort(((t,i)=>(t.order||0)-(i.order||0))),this.items=[],this.isRegistered=!0,this.uiElementsData.forEach((t=>{this.registerElement(t)})),t.on("change",(()=>{t.element.classList[1===t.getNumItems()?"add":"remove"]("pswp--one-slide")})),t.on("zoomPanUpdate",(()=>this.Dt()))}registerElement(t){this.isRegistered?this.items.push(new F(this.pswp,t)):this.uiElementsData.push(t)}Dt(){const{template:t,currSlide:i,options:s}=this.pswp;let{currZoomLevel:h}=i;if(this.pswp.opener.isClosing)return;if(this.pswp.opener.isOpen||(h=i.zoomLevels.initial),h===this.Tt)return;this.Tt=h;const e=i.zoomLevels.initial-i.zoomLevels.secondary;if(Math.abs(e)<.01||!i.isZoomable())return q(t,!1),void t.classList.remove("pswp--zoom-allowed");t.classList.add("pswp--zoom-allowed");q(t,(h===i.zoomLevels.initial?i.zoomLevels.secondary:i.zoomLevels.initial)<=h),"zoom"!==s.imageClickAction&&"zoom-or-close"!==s.imageClickAction||t.classList.add("pswp--click-to-zoom")}}class K{constructor(t,i){this.type=t,i&&Object.assign(this,i)}preventDefault(){this.defaultPrevented=!0}}class W{constructor(i,s){this.element=t("pswp__img pswp__img--placeholder",i?"img":"",s),i&&(this.element.decoding="async",this.element.alt="",this.element.src=i,this.element.setAttribute("role","presentation")),this.element.setAttribute("aria-hiden","true")}setDisplayedSize(t,i){this.element&&("IMG"===this.element.tagName?(c(this.element,250,"auto"),this.element.style.transformOrigin="0 0",this.element.style.transform=o(0,0,t/250)):c(this.element,t,i))}destroy(){this.element.parentNode&&this.element.remove(),this.element=null}}class j{constructor(t,i,s){this.instance=i,this.data=t,this.index=s,this.element=void 0,this.displayedImageWidth=0,this.displayedImageHeight=0,this.width=Number(this.data.w)||Number(this.data.width)||0,this.height=Number(this.data.h)||Number(this.data.height)||0,this.isAttached=!1,this.hasSlide=!1,this.state=l,this.data.type?this.type=this.data.type:this.data.src?this.type="image":this.type="html",this.instance.dispatch("contentInit",{content:this})}removePlaceholder(){this.placeholder&&!this.keepPlaceholder()&&setTimeout((()=>{this.placeholder&&(this.placeholder.destroy(),this.placeholder=null)}),1e3)}load(i,s){if(this.slide&&this.usePlaceholder())if(this.placeholder){const t=this.placeholder.element;t&&!t.parentElement&&this.slide.container.prepend(t)}else{const t=this.instance.applyFilters("placeholderSrc",!(!this.data.msrc||!this.slide.isFirstSlide)&&this.data.msrc,this);this.placeholder=new W(t,this.slide.container)}this.element&&!s||this.instance.dispatch("contentLoad",{content:this,isLazy:i}).defaultPrevented||(this.isImageContent()?(this.element=t("pswp__img","img"),this.displayedImageWidth&&this.loadImage(i)):(this.element=t("pswp__content"),this.element.innerHTML=this.data.html||""),s&&this.slide&&this.slide.updateContentSize(!0))}loadImage(t){const i=this.element;this.instance.dispatch("contentLoadImage",{content:this,isLazy:t}).defaultPrevented||(this.updateSrcsetSizes(),this.data.srcset&&(i.srcset=this.data.srcset),i.src=this.data.src,i.alt=this.data.alt||"",this.state=p,i.complete?this.onLoaded():(i.onload=()=>{this.onLoaded()},i.onerror=()=>{this.onError()}))}setSlide(t){this.slide=t,this.hasSlide=!0,this.instance=t.pswp}onLoaded(){this.state=u,this.slide&&(this.instance.dispatch("loadComplete",{slide:this.slide,content:this}),this.slide.isActive&&this.slide.heavyAppended&&!this.element.parentNode&&(this.append(),this.slide.updateContentSize(!0)),this.state!==u&&this.state!==d||this.removePlaceholder())}onError(){this.state=d,this.slide&&(this.displayError(),this.instance.dispatch("loadComplete",{slide:this.slide,isError:!0,content:this}),this.instance.dispatch("loadError",{slide:this.slide,content:this}))}isLoading(){return this.instance.applyFilters("isContentLoading",this.state===p,this)}isError(){return this.state===d}isImageContent(){return"image"===this.type}setDisplayedSize(t,i){if(this.element&&(this.placeholder&&this.placeholder.setDisplayedSize(t,i),!this.instance.dispatch("contentResize",{content:this,width:t,height:i}).defaultPrevented&&(c(this.element,t,i),this.isImageContent()&&!this.isError()))){const s=!this.displayedImageWidth&&t;this.displayedImageWidth=t,this.displayedImageHeight=i,s?this.loadImage(!1):this.updateSrcsetSizes(),this.slide&&this.instance.dispatch("imageSizeChange",{slide:this.slide,width:t,height:i,content:this})}}isZoomable(){return this.instance.applyFilters("isContentZoomable",this.isImageContent()&&this.state!==d,this)}updateSrcsetSizes(){if(this.data.srcset){const t=this.element,i=this.instance.applyFilters("srcsetSizesWidth",this.displayedImageWidth,this);(!t.dataset.largestUsedSize||i>parseInt(t.dataset.largestUsedSize,10))&&(t.sizes=i+"px",t.dataset.largestUsedSize=String(i))}}usePlaceholder(){return this.instance.applyFilters("useContentPlaceholder",this.isImageContent(),this)}lazyLoad(){this.instance.dispatch("contentLazyLoad",{content:this}).defaultPrevented||this.load(!0)}keepPlaceholder(){return this.instance.applyFilters("isKeepingPlaceholder",this.isLoading(),this)}destroy(){this.hasSlide=!1,this.slide=null,this.instance.dispatch("contentDestroy",{content:this}).defaultPrevented||(this.remove(),this.placeholder&&(this.placeholder.destroy(),this.placeholder=null),this.isImageContent()&&this.element&&(this.element.onload=null,this.element.onerror=null,this.element=null))}displayError(){if(this.slide){let i=t("pswp__error-msg");i.innerText=this.instance.options.errorMsg,i=this.instance.applyFilters("contentErrorElement",i,this),this.element=t("pswp__content pswp__error-msg-container"),this.element.appendChild(i),this.slide.container.innerText="",this.slide.container.appendChild(this.element),this.slide.updateContentSize(!0),this.removePlaceholder()}}append(){if(this.isAttached)return;if(this.isAttached=!0,this.state===d)return void this.displayError();if(this.instance.dispatch("contentAppend",{content:this}).defaultPrevented)return;const t="decode"in this.element;this.isImageContent()?t&&this.slide&&(!this.slide.isActive||m())?(this.isDecoding=!0,this.element.decode().finally((()=>{this.isDecoding=!1,this.appendImage()}))):this.appendImage():this.element&&!this.element.parentNode&&this.slide.container.appendChild(this.element)}activate(){this.instance.dispatch("contentActivate",{content:this}).defaultPrevented||this.slide&&(this.isImageContent()&&this.isDecoding&&!m()?this.appendImage():this.isError()&&this.load(!1,!0))}deactivate(){this.instance.dispatch("contentDeactivate",{content:this})}remove(){this.isAttached=!1,this.instance.dispatch("contentRemove",{content:this}).defaultPrevented||(this.element&&this.element.parentNode&&this.element.remove(),this.placeholder&&this.placeholder.element&&this.placeholder.element.remove())}appendImage(){this.isAttached&&(this.instance.dispatch("contentAppendImage",{content:this}).defaultPrevented||(this.slide&&this.element&&!this.element.parentNode&&this.slide.container.appendChild(this.element),this.state!==u&&this.state!==d||this.removePlaceholder()))}}function X(t,i,s){const h=i.createContentFromData(t,s);if(!h||!h.lazyLoad)return;const{options:e}=i,n=v(e,i.viewportSize||g(e,i),t,s),o=new b(e,t,-1);return o.update(h.width,h.height,n),h.lazyLoad(),h.setDisplayedSize(Math.ceil(h.width*o.initial),Math.ceil(h.height*o.initial)),h}class Y{constructor(t){this.pswp=t,this.limit=Math.max(t.options.preload[0]+t.options.preload[1]+1,5),this.It=[]}updateLazy(t){const{pswp:i}=this;if(i.dispatch("lazyLoad").defaultPrevented)return;const{preload:s}=i.options,h=void 0===t||t>=0;let e;for(e=0;e<=s[1];e++)this.loadSlideByIndex(i.currIndex+(h?e:-e));for(e=1;e<=s[0];e++)this.loadSlideByIndex(i.currIndex+(h?-e:e))}loadSlideByIndex(t){t=this.pswp.getLoopedIndex(t);let i=this.getContentByIndex(t);i||(i=function(t,i){const s=i.getItemData(t);if(!i.dispatch("lazyLoadSlide",{index:t,itemData:s}).defaultPrevented)return X(s,i,t)}(t,this.pswp),i&&this.addToCache(i))}getContentBySlide(t){let i=this.getContentByIndex(t.index);return i||(i=this.pswp.createContentFromData(t.data,t.index),i&&this.addToCache(i)),i&&i.setSlide(t),i}addToCache(t){if(this.removeByIndex(t.index),this.It.push(t),this.It.length>this.limit){const t=this.It.findIndex((t=>!t.isAttached&&!t.hasSlide));if(-1!==t){this.It.splice(t,1)[0].destroy()}}}removeByIndex(t){const i=this.It.findIndex((i=>i.index===t));-1!==i&&this.It.splice(i,1)}getContentByIndex(t){return this.It.find((i=>i.index===t))}destroy(){this.It.forEach((t=>t.destroy())),this.It=null}}class ${constructor(t){this.pswp=t,this.isClosed=!0,this.At=this.At.bind(this),this.Et=void 0,t.on("firstZoomPan",this.At)}open(){this.At(),this.Pt()}close(){if(this.isClosed||this.isClosing||this.isOpening)return!1;const t=this.pswp.currSlide;return this.isOpen=!1,this.isOpening=!1,this.isClosing=!0,this.Lt=this.pswp.options.hideAnimationDuration,t&&t.currZoomLevel*t.width>=this.pswp.options.maxWidthToAnimate&&(this.Lt=0),this.kt(),setTimeout((()=>{this.Pt()}),this.Zt?30:0),!0}At(){if(this.pswp.off("firstZoomPan",this.At),!this.isOpening){const t=this.pswp.currSlide;this.isOpening=!0,this.isClosing=!1,this.Lt=this.pswp.options.showAnimationDuration,t&&t.zoomLevels.initial*t.width>=this.pswp.options.maxWidthToAnimate&&(this.Lt=0),this.kt()}}kt(){const{pswp:t}=this,i=this.pswp.currSlide,{options:s}=t;if("fade"===s.showHideAnimationType?(s.showHideOpacity=!0,this.Et=!1):"none"===s.showHideAnimationType?(s.showHideOpacity=!1,this.Lt=0,this.Et=!1):this.isOpening&&t.Ft?this.Et=t.Ft:this.Et=this.pswp.getThumbBounds(),this.Ot=i.getPlaceholderElement(),t.animations.stopAll(),this.Bt=this.Lt>50,this.Rt=Boolean(this.Et)&&i.content&&i.content.usePlaceholder()&&(!this.isClosing||!t.mainScroll.isShifted()),this.Rt?this.Nt=s.showHideOpacity:(this.Nt=!0,this.isOpening&&(i.zoomAndPanToInitial(),i.applyCurrentZoomPan())),this.Vt=!this.Nt&&this.pswp.options.bgOpacity>.003,this.Gt=this.Nt?t.element:t.bg,!this.Bt)return this.Lt=0,this.Rt=!1,this.Vt=!1,this.Nt=!0,void(this.isOpening&&(t.element.style.opacity=String(.003),t.applyBgOpacity(1)));this.Rt&&this.Et&&this.Et.innerRect?(this.Zt=!0,this.Ut=this.pswp.container,this.qt=this.pswp.currSlide.holderElement,t.container.style.overflow="hidden",t.container.style.width=t.viewportSize.x+"px"):this.Zt=!1,this.isOpening?(this.Nt?(t.element.style.opacity=String(.003),t.applyBgOpacity(1)):(this.Vt&&(t.bg.style.opacity=String(.003)),t.element.style.opacity="1"),this.Rt&&(this.Ht(),this.Ot&&(this.Ot.style.willChange="transform",this.Ot.style.opacity=String(.003)))):this.isClosing&&(t.mainScroll.itemHolders[0].el.style.display="none",t.mainScroll.itemHolders[2].el.style.display="none",this.Zt&&0!==t.mainScroll.x&&(t.mainScroll.resetPosition(),t.mainScroll.resize()))}Pt(){this.isOpening&&this.Bt&&this.Ot&&"IMG"===this.Ot.tagName?new Promise((t=>{let i=!1,s=!0;var h;(h=this.Ot,"decode"in h?h.decode():h.complete?Promise.resolve(h):new Promise(((t,i)=>{h.onload=()=>t(h),h.onerror=i}))).finally((()=>{i=!0,s||t()})),setTimeout((()=>{s=!1,i&&t()}),50),setTimeout(t,250)})).finally((()=>this.Kt())):this.Kt()}Kt(){this.pswp.element.style.setProperty("--pswp-transition-duration",this.Lt+"ms"),this.pswp.dispatch(this.isOpening?"openingAnimationStart":"closingAnimationStart"),this.pswp.dispatch("initialZoom"+(this.isOpening?"In":"Out")),this.pswp.element.classList[this.isOpening?"add":"remove"]("pswp--ui-visible"),this.isOpening?(this.Ot&&(this.Ot.style.opacity="1"),this.Wt()):this.isClosing&&this.jt(),this.Bt||this.Xt()}Xt(){const{pswp:t}=this;this.isOpen=this.isOpening,this.isClosed=this.isClosing,this.isOpening=!1,this.isClosing=!1,t.dispatch(this.isOpen?"openingAnimationEnd":"closingAnimationEnd"),t.dispatch("initialZoom"+(this.isOpen?"InEnd":"OutEnd")),this.isClosed?t.destroy():this.isOpen&&(this.Rt&&(t.container.style.overflow="visible",t.container.style.width="100%"),t.currSlide.applyCurrentZoomPan())}Wt(){const{pswp:t}=this;this.Rt&&(this.Zt&&(this.Yt(this.Ut,"transform","translate3d(0,0,0)"),this.Yt(this.qt,"transform","none")),t.currSlide.zoomAndPanToInitial(),this.Yt(t.currSlide.container,"transform",t.currSlide.getCurrentTransform())),this.Vt&&this.Yt(t.bg,"opacity",String(t.options.bgOpacity)),this.Nt&&this.Yt(t.element,"opacity","1")}jt(){const{pswp:t}=this;this.Rt&&this.Ht(!0),this.Vt&&t.bgOpacity>.01&&this.Yt(t.bg,"opacity","0"),this.Nt&&this.Yt(t.element,"opacity","0")}Ht(t){if(!this.Et)return;const{pswp:s}=this,{innerRect:h}=this.Et,{currSlide:e,viewportSize:n}=s;if(this.Zt){const i=-n.x+(this.Et.x-h.x)+h.w,s=-n.y+(this.Et.y-h.y)+h.h,e=n.x-h.w,a=n.y-h.h;t?(this.Yt(this.Ut,"transform",o(i,s)),this.Yt(this.qt,"transform",o(e,a))):(r(this.Ut,i,s),r(this.qt,e,a))}i(e.pan,h||this.Et),e.currZoomLevel=this.Et.w/e.width,t?this.Yt(e.container,"transform",e.getCurrentTransform()):e.applyCurrentZoomPan()}Yt(t,i,s){if(!this.Lt)return void(t.style[i]=s);const{animations:h}=this.pswp,e={duration:this.Lt,easing:this.pswp.options.easing,onComplete:()=>{h.activeAnimations.length||this.Xt()},target:t};e[i]=s,h.startTransition(e)}}const J={allowPanToNext:!0,spacing:.1,loop:!0,pinchToClose:!0,closeOnVerticalDrag:!0,hideAnimationDuration:333,showAnimationDuration:333,zoomAnimationDuration:333,escKey:!0,arrowKeys:!0,returnFocus:!0,maxWidthToAnimate:4e3,clickToCloseNonZoomable:!0,imageClickAction:"zoom-or-close",bgClickAction:"close",tapAction:"toggle-controls",doubleTapAction:"zoom",indexIndicatorSep:" / ",preloaderDelay:2e3,bgOpacity:.8,index:0,errorMsg:"The image cannot be loaded",preload:[1,2],easing:"cubic-bezier(.4,0,.22,1)"};class Q extends class extends class{constructor(){this.$t={},this.Jt={},this.pswp=void 0,this.options=void 0}addFilter(t,i,s=100){this.Jt[t]||(this.Jt[t]=[]),this.Jt[t].push({fn:i,priority:s}),this.Jt[t].sort(((t,i)=>t.priority-i.priority)),this.pswp&&this.pswp.addFilter(t,i,s)}removeFilter(t,i){this.Jt[t]&&(this.Jt[t]=this.Jt[t].filter((t=>t.fn!==i))),this.pswp&&this.pswp.removeFilter(t,i)}applyFilters(t,...i){return this.Jt[t]&&this.Jt[t].forEach((t=>{i[0]=t.fn.apply(this,i)})),i[0]}on(t,i){this.$t[t]||(this.$t[t]=[]),this.$t[t].push(i),this.pswp&&this.pswp.on(t,i)}off(t,i){this.$t[t]&&(this.$t[t]=this.$t[t].filter((t=>i!==t))),this.pswp&&this.pswp.off(t,i)}dispatch(t,i){if(this.pswp)return this.pswp.dispatch(t,i);const s=new K(t,i);return this.$t?(this.$t[t]&&this.$t[t].forEach((t=>{t.call(this,s)})),s):s}}{getNumItems(){let t;const{dataSource:i}=this.options;i?"length"in i?t=i.length:"gallery"in i&&(i.items||(i.items=this.Qt(i.gallery)),i.items&&(t=i.items.length)):t=0;const s=this.dispatch("numItems",{dataSource:i,numItems:t});return this.applyFilters("numItems",s.numItems,i)}createContentFromData(t,i){return new j(t,this,i)}getItemData(t){const{dataSource:i}=this.options;let s;Array.isArray(i)?s=i[t]:i&&i.gallery&&(i.items||(i.items=this.Qt(i.gallery)),s=i.items[t]);let h=s;h instanceof Element&&(h=this.ti(h));const e=this.dispatch("itemData",{itemData:h||{},index:t});return this.applyFilters("itemData",e.itemData,t)}Qt(t){return this.options.children||this.options.childSelector?function(t,i,s=document){let h=[];if(t instanceof Element)h=[t];else if(t instanceof NodeList||Array.isArray(t))h=Array.from(t);else{const e="string"==typeof t?t:i;e&&(h=Array.from(s.querySelectorAll(e)))}return h}(this.options.children,this.options.childSelector,t)||[]:[t]}ti(t){const i={element:t},s="A"===t.tagName?t:t.querySelector("a");if(s){i.src=s.dataset.pswpSrc||s.href,s.dataset.pswpSrcset&&(i.srcset=s.dataset.pswpSrcset),i.width=parseInt(s.dataset.pswpWidth,10),i.height=parseInt(s.dataset.pswpHeight,10),i.w=i.width,i.h=i.height,s.dataset.pswpType&&(i.type=s.dataset.pswpType);const h=t.querySelector("img");h&&(i.msrc=h.currentSrc||h.src,i.alt=h.getAttribute("alt")),(s.dataset.pswpCropped||s.dataset.cropped)&&(i.thumbCropped=!0)}return this.applyFilters("domItemData",i,t,s)}lazyLoadData(t,i){return X(t,this,i)}}{constructor(t){super(),this.ii(t),this.offset={},this.si={},this.viewportSize={},this.bgOpacity=1,this.topBar=void 0,this.events=new w,this.animations=new k,this.mainScroll=new D(this),this.gestures=new T(this),this.opener=new $(this),this.keyboard=new I(this),this.contentLoader=new Y(this)}init(){if(this.isOpen||this.isDestroying)return;this.isOpen=!0,this.dispatch("init"),this.dispatch("beforeOpen"),this.hi();let t="pswp--open";return this.gestures.supportsTouch&&(t+=" pswp--touch"),this.options.mainClass&&(t+=" "+this.options.mainClass),this.element.className+=" "+t,this.currIndex=this.options.index||0,this.potentialIndex=this.currIndex,this.dispatch("firstUpdate"),this.scrollWheel=new Z(this),(Number.isNaN(this.currIndex)||this.currIndex<0||this.currIndex>=this.getNumItems())&&(this.currIndex=0),this.gestures.supportsTouch||this.mouseDetected(),this.updateSize(),this.offset.y=window.pageYOffset,this.ei=this.getItemData(this.currIndex),this.dispatch("gettingData",{index:this.currIndex,data:this.ei,slide:void 0}),this.Ft=this.getThumbBounds(),this.dispatch("initialLayout"),this.on("openingAnimationEnd",(()=>{this.mainScroll.itemHolders[0].el.style.display="block",this.mainScroll.itemHolders[2].el.style.display="block",this.setContent(this.mainScroll.itemHolders[0],this.currIndex-1),this.setContent(this.mainScroll.itemHolders[2],this.currIndex+1),this.appendHeavy(),this.contentLoader.updateLazy(),this.events.add(window,"resize",this.ni.bind(this)),this.events.add(window,"scroll",this.oi.bind(this)),this.dispatch("bindEvents")})),this.setContent(this.mainScroll.itemHolders[1],this.currIndex),this.dispatch("change"),this.opener.open(),this.dispatch("afterInit"),!0}getLoopedIndex(t){const i=this.getNumItems();return this.options.loop&&(t>i-1&&(t-=i),t<0&&(t+=i)),t=n(t,0,i-1)}appendHeavy(){this.mainScroll.itemHolders.forEach((t=>{t.slide&&t.slide.appendHeavy()}))}goTo(t){this.mainScroll.moveIndexBy(this.getLoopedIndex(t)-this.potentialIndex)}next(){this.goTo(this.potentialIndex+1)}prev(){this.goTo(this.potentialIndex-1)}zoomTo(...t){this.currSlide.zoomTo(...t)}toggleZoom(){this.currSlide.toggleZoom()}close(){this.opener.isOpen&&!this.isDestroying&&(this.isDestroying=!0,this.dispatch("close"),this.events.removeAll(),this.opener.close())}destroy(){if(!this.isDestroying)return this.options.showHideAnimationType="none",void this.close();this.dispatch("destroy"),this.listeners=null,this.scrollWrap.ontouchmove=null,this.scrollWrap.ontouchend=null,this.element.remove(),this.mainScroll.itemHolders.forEach((t=>{t.slide&&t.slide.destroy()})),this.contentLoader.destroy(),this.events.removeAll()}refreshSlideContent(t){this.contentLoader.removeByIndex(t),this.mainScroll.itemHolders.forEach(((i,s)=>{let h=this.currSlide.index-1+s;this.canLoop()&&(h=this.getLoopedIndex(h)),h===t&&(this.setContent(i,t,!0),1===s&&(this.currSlide=i.slide,i.slide.setIsActive(!0)))})),this.dispatch("change")}setContent(t,i,s){if(this.canLoop()&&(i=this.getLoopedIndex(i)),t.slide){if(t.slide.index===i&&!s)return;t.slide.destroy(),t.slide=null}if(!this.canLoop()&&(i<0||i>=this.getNumItems()))return;const h=this.getItemData(i);t.slide=new S(h,i,this),i===this.currIndex&&(this.currSlide=t.slide),t.slide.append(t.el)}getViewportCenterPoint(){return{x:this.viewportSize.x/2,y:this.viewportSize.y/2}}updateSize(t){if(this.isDestroying)return;const s=g(this.options,this);!t&&e(s,this.si)||(i(this.si,s),this.dispatch("beforeResize"),i(this.viewportSize,this.si),this.oi(),this.dispatch("viewportSize"),this.mainScroll.resize(this.opener.isOpen),!this.hasMouse&&window.matchMedia("(any-hover: hover)").matches&&this.mouseDetected(),this.dispatch("resize"))}applyBgOpacity(t){this.bgOpacity=Math.max(t,0),this.bg.style.opacity=String(this.bgOpacity*this.options.bgOpacity)}mouseDetected(){this.hasMouse||(this.hasMouse=!0,this.element.classList.add("pswp--has_mouse"))}ni(){this.updateSize(),/iPhone|iPad|iPod/i.test(window.navigator.userAgent)&&setTimeout((()=>{this.updateSize()}),500)}oi(){this.setScrollOffset(0,window.pageYOffset)}setScrollOffset(t,i){this.offset.x=t,this.offset.y=i,this.dispatch("updateScrollOffset")}hi(){this.element=t("pswp"),this.element.setAttribute("tabindex","-1"),this.element.setAttribute("role","dialog"),this.template=this.element,this.bg=t("pswp__bg",!1,this.element),this.scrollWrap=t("pswp__scroll-wrap",!1,this.element),this.container=t("pswp__container",!1,this.scrollWrap),this.mainScroll.appendHolders(),this.ui=new H(this),this.ui.init(),(this.options.appendToEl||document.body).appendChild(this.element)}getThumbBounds(){return function(t,i,s){const h=s.dispatch("thumbBounds",{index:t,itemData:i,instance:s});if(h.thumbBounds)return h.thumbBounds;const{element:e}=i;let n,o;if(e&&!1!==s.options.thumbSelector){const t=s.options.thumbSelector||"img";o=e.matches(t)?e:e.querySelector(t)}return o=s.applyFilters("thumbEl",o,i,t),o&&(n=i.thumbCropped?function(t,i,s){const h=t.getBoundingClientRect(),e=h.width/i,n=h.height/s,o=e>n?e:n,r=(h.width-i*o)/2,a=(h.height-s*o)/2,c={x:h.left+r,y:h.top+a,w:i*o};return c.innerRect={w:h.width,h:h.height,x:r,y:a},c}(o,i.width||i.w,i.height||i.h):function(t){const i=t.getBoundingClientRect();return{x:i.left,y:i.top,w:i.width}}(o)),s.applyFilters("thumbBounds",n,i,t)}(this.currIndex,this.currSlide?this.currSlide.data:this.ei,this)}canLoop(){return this.options.loop&&this.getNumItems()>2}ii(t){window.matchMedia("(prefers-reduced-motion), (update: slow)").matches&&(t.showHideAnimationType="none",t.zoomAnimationDuration=0),this.options={...J,...t}}}export{Q as default};
@@ -0,0 +1,33 @@
1
+ .gallery {
2
+ display: flex;
3
+ flex-wrap: wrap;
4
+ gap: 5px;
5
+ }
6
+ .gallery > a {
7
+ line-height: 0;
8
+ }
9
+ .gallery > a > img {
10
+ max-width: 1270px;
11
+ }
12
+ @media only screen and (max-width: 400px) {
13
+ .gallery > a > img {
14
+ max-height: 50px;
15
+ max-width: 200px;
16
+ }
17
+ }
18
+ @media only screen and (max-width: 1280px) {
19
+ .gallery > a > img {
20
+ max-height: 100px;
21
+ max-width: 390px;
22
+ }
23
+ }
24
+
25
+ .gallery-image-id {
26
+ color: white;
27
+ opacity: 0.85;
28
+ height: 30px;
29
+ line-height: 30px;
30
+ margin: 15px 0 0 9px;
31
+ font-size: 14px; /* smaller, as image seq nr. */
32
+ text-shadow: 1px 1px 3px var(--pswp-icon-color-secondary);
33
+ }
data/assets/gallery.js ADDED
@@ -0,0 +1,132 @@
1
+ import PhotoSwipeLightbox from './photoswipe-lightbox.esm.min.js';
2
+
3
+ // https://photoswipe.com/v5/docs/native-fullscreen-on-open/
4
+
5
+ const fullscreenAPI = getFullscreenAPI();
6
+ const pswpContainer = getContainer();
7
+
8
+ const lightbox = new PhotoSwipeLightbox({
9
+ pswpModule: () => import('./photoswipe.esm.min.js'),
10
+ gallery: '.gallery',
11
+ children: 'a',
12
+
13
+ openPromise: getFullscreenPromise,
14
+ appendToEl: fullscreenAPI ? pswpContainer : document.body,
15
+
16
+ showAnimationDuration: 0,
17
+ hideAnimationDuration: 0,
18
+
19
+ preloadFirstSlide: false
20
+ });
21
+ lightbox.on('uiRegister', function () {
22
+ lightbox.pswp.ui.registerElement({
23
+ name: 'image-id',
24
+ className: 'gallery-image-id',
25
+ order: 6,
26
+ isButton: false,
27
+ appendTo: 'bar',
28
+ onInit: (el, pswp) => {
29
+ lightbox.pswp.on('change', () => {
30
+ const currSlide = lightbox.pswp.currSlide.data.element;
31
+ if (currSlide) {
32
+ el.innerHTML = currSlide.getAttribute('data-gallery-image-id');
33
+ }
34
+ });
35
+ }
36
+ });
37
+ });
38
+ lightbox.on('close', () => {
39
+ pswpContainer.style.display = 'none';
40
+ if (fullscreenAPI && fullscreenAPI.isFullscreen()) {
41
+ fullscreenAPI.exit();
42
+ }
43
+ });
44
+ document.addEventListener('fullscreenchange', (event) => {
45
+ if (!document.fullscreenElement) {
46
+ lightbox.pswp.close();
47
+ }
48
+ });
49
+ lightbox.init();
50
+
51
+
52
+ function getFullscreenAPI() {
53
+ let api;
54
+ let enterFS;
55
+ let exitFS;
56
+ let elementFS;
57
+ let changeEvent;
58
+ let errorEvent;
59
+
60
+ if (document.documentElement.requestFullscreen) {
61
+ enterFS = 'requestFullscreen';
62
+ exitFS = 'exitFullscreen';
63
+ elementFS = 'fullscreenElement';
64
+ changeEvent = 'fullscreenchange';
65
+ errorEvent = 'fullscreenerror';
66
+ } else if (document.documentElement.webkitRequestFullscreen) {
67
+ enterFS = 'webkitRequestFullscreen';
68
+ exitFS = 'webkitExitFullscreen';
69
+ elementFS = 'webkitFullscreenElement';
70
+ changeEvent = 'webkitfullscreenchange';
71
+ errorEvent = 'webkitfullscreenerror';
72
+ }
73
+
74
+ if (enterFS) {
75
+ api = {
76
+ request: function (el) {
77
+ if (enterFS === 'webkitRequestFullscreen') {
78
+ el[enterFS](Element.ALLOW_KEYBOARD_INPUT);
79
+ } else {
80
+ el[enterFS]();
81
+ }
82
+ },
83
+ exit: function () {
84
+ return document[exitFS]();
85
+ },
86
+ isFullscreen: function () {
87
+ return document[elementFS];
88
+ },
89
+ change: changeEvent,
90
+ error: errorEvent
91
+ };
92
+ }
93
+ return api;
94
+ }
95
+
96
+ function getFullscreenPromise() {
97
+ return new Promise((resolve) => {
98
+ if (!fullscreenAPI || fullscreenAPI.isFullscreen()) {
99
+ resolve();
100
+ return;
101
+ }
102
+ document.addEventListener(fullscreenAPI.change, (event) => {
103
+ pswpContainer.style.display = 'block';
104
+ resolve();
105
+ }, {once: true});
106
+ fullscreenAPI.request(pswpContainer);
107
+ });
108
+ }
109
+
110
+ function getContainer() {
111
+ const pswpContainer = document.createElement('div');
112
+ pswpContainer.style.background = '#000';
113
+ pswpContainer.style.width = '100%';
114
+ pswpContainer.style.height = '100%';
115
+ pswpContainer.style.display = 'none';
116
+ document.body.appendChild(pswpContainer);
117
+ return pswpContainer;
118
+ }
119
+
120
+ function addStylesheet(path) {
121
+ let css = document.createElement("link");
122
+ css.rel = "stylesheet";
123
+ let url = new URL(path, import.meta.url);
124
+ css.href = url.href;
125
+ document.body.appendChild(css);
126
+ new URL("gallery.css", import.meta.url)
127
+ }
128
+
129
+ addStylesheet("gallery.css");
130
+ addStylesheet("photoswipe.css");
131
+
132
+ // vim: sw=2 ts=2 et
data/bin/gallery-gen ADDED
@@ -0,0 +1,156 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'json'
4
+ require 'yaml'
5
+ require 'digest'
6
+ require 'pathname'
7
+ require 'fileutils'
8
+
9
+ require 'rmagick'
10
+
11
+ begin
12
+ config = YAML.load_file '_config.yml'
13
+ rescue
14
+ print "Config file not found. Do you want to create an example site ? [Y/n] "
15
+ reply = gets
16
+ if not reply or reply.downcase.start_with? "y"
17
+ gem_dir = Pathname.new(__dir__ + "/..").realpath.to_s
18
+ FileUtils.cp_r File.join(gem_dir, 'example_site'), 'example_site', verbose: true
19
+ puts
20
+ puts "Copied example site to 'example_site'."
21
+ puts "Now you can 'cd' into it and run 'gallery-gen' again."
22
+ puts
23
+ end
24
+ return
25
+ end
26
+
27
+ data_dir = "_data"
28
+ $site_dir = "_site"
29
+ $galleries_dir = "galleries"
30
+ galleries_out_dir = File.join $site_dir, $galleries_dir
31
+
32
+ gallery_data = []
33
+ config['galleries']
34
+ .select { |k, v| v.class == Hash }
35
+ .each do |name, gallery|
36
+ gallery[:name] = name
37
+ gallery_data.push process_gallery gallery_data, gallery
38
+ end
39
+
40
+ makedir data_dir
41
+ STDERR.puts "Writing #{data_dir + "/gallery-data.json"}"
42
+ File.write data_dir + "/gallery-data.json", JSON.pretty_generate(gallery_data)
43
+
44
+ makedir galleries_out_dir
45
+ STDERR.puts "Copying assets to #{galleries_out_dir}"
46
+ gem_dir = Pathname.new(__dir__ + "/..").realpath.to_s
47
+ Dir.glob(%w(assets/gallery.{css,js} PhotoSwipe/dist/*.{css,min.js}), base: gem_dir)
48
+ .each { |path| FileUtils.cp File.join(gem_dir, path), galleries_out_dir, verbose: true }
49
+
50
+ puts
51
+ puts " Gallery generated. Now try $ jekyll serve -o"
52
+ puts
53
+
54
+ BEGIN {
55
+ def process_gallery(gallery_data, gallery)
56
+ if gallery['parent']
57
+ parent = gallery_data.find { |g| g[:name] == gallery['parent'] }
58
+ gallery = parent.merge gallery
59
+ end
60
+ unless gallery[:images]
61
+ gallery_dir = File.join $galleries_dir, gallery[:name]
62
+ makedir File.join $site_dir, gallery_dir
63
+ images = Dir.glob(File.join(gallery_dir, "**/*"))
64
+ .select { |path| File.file? path }
65
+ .map { |path| process_image gallery, path }
66
+ images.sort_by! { |it| it[:date] }
67
+ gallery[:images] = images
68
+ end
69
+ if gallery['selection']
70
+ gallery[:images] =
71
+ gallery[:images].select { |i| gallery['selection'].include? i[:id] }
72
+ end
73
+ gallery
74
+ end
75
+
76
+ def process_image(gallery, img_path)
77
+ STDERR.puts "Processing #{img_path}"
78
+ img1 = Magick::Image::read(img_path).first
79
+ date1 = img1.get_exif_by_entry('DateTimeOriginal')[0][1]
80
+ if date1
81
+ date = DateTime.strptime(date1, '%Y:%m:%d %H:%M:%S')
82
+ # STDERR.puts " Date: #{date}"
83
+ else
84
+ date = 0
85
+ end
86
+ img = img1.auto_orient
87
+ img1.destroy!
88
+ img.strip! # strip exif data
89
+ abs_path = File.expand_path(img_path)
90
+ ext = File.extname(img_path).downcase
91
+ dig = Digest::MD5.digest img.to_blob
92
+ digest = Proquint.encode(dig.unpack 'SS')
93
+ out_dir = File.join $galleries_dir, gallery[:name]
94
+ orig_link = "#{out_dir}/#{digest}#{ext}"
95
+ out = { id: digest, name: File.basename(img_path, ".*"), path: img_path, date: date,
96
+ original: { path: orig_link, width: img.columns, height: img.rows }, renditions: [] }
97
+ Dir.chdir($site_dir) do
98
+ relorig = Pathname.new(abs_path).relative_path_from(File.expand_path(out_dir))
99
+ File.symlink(relorig.to_s, orig_link) unless File.exist? orig_link
100
+ gallery['geometries'].each do |geometry|
101
+ img.change_geometry(geometry) do |columns, rows, i|
102
+ rendition_path = "#{out_dir}/#{digest}-#{columns}x#{rows}#{ext}"
103
+ render(i, rendition_path, columns, rows)
104
+ out[:renditions].push({ path: rendition_path, width: columns, height: rows, geometry: geometry })
105
+ end
106
+ end
107
+ rendition_path = "#{out_dir}/#{digest}-#{img.columns}x#{img.rows}#{ext}"
108
+ render(img, rendition_path)
109
+ out[:renditions].push({ path: rendition_path, width: img.columns, height: img.rows, geometry: "100%" })
110
+ end
111
+ img.destroy!
112
+ out[:srcset] = out[:renditions].map { |s| s[:path] + " " + s[:width].to_s + "w" }.join(", ")
113
+ out
114
+ end
115
+
116
+ def render(i, out_path, columns = nil, rows = nil)
117
+ unless File.file? out_path
118
+ STDERR.puts " Generating #{out_path}"
119
+ i = i.resize(columns, rows) if columns
120
+ i.write(out_path) { |img| img.quality = 75; img.interlace = Magick::PlaneInterlace }
121
+ i.destroy! if columns
122
+ end
123
+ end
124
+
125
+ def makedir(out_path)
126
+ unless Dir.exist?(out_path)
127
+ STDERR.puts "Creating output directory #{out_path}"
128
+ FileUtils.mkdir_p(out_path)
129
+ end
130
+ end
131
+
132
+ module Proquint
133
+ extend self
134
+
135
+ CONSONANTS = %w[b d f g j k l m n p r s t v x z]
136
+ VOWELS = %w[a i o u]
137
+ REVERSE = {}
138
+ CONSONANTS.each_with_index { |c, i| REVERSE[c] = i }
139
+ VOWELS.each_with_index { |c, i| REVERSE[c] = i }
140
+
141
+ # Convert an array of uint16s to a proquint
142
+ def encode(shorts, sep = "-")
143
+ shorts.map do |s|
144
+ raise ArgumentError.new("Can't encode negative numbers") if s < 0x0000
145
+ raise ArgumentError.new("Can't encode numbers > 16 bits") if s > 0xffff
146
+ CONSONANTS[(s & 0xf000) >> 12] +
147
+ VOWELS[(s & 0x0c00) >> 10] +
148
+ CONSONANTS[(s & 0x03c0) >> 6] +
149
+ VOWELS[(s & 0x0030) >> 4] +
150
+ CONSONANTS[s & 0x000f]
151
+ end.join sep
152
+ end
153
+ end
154
+ }
155
+
156
+ # vim: sw=2 ts=2 et
@@ -0,0 +1,4 @@
1
+ dev:
2
+ rm -rf _site
3
+ ../bin/gallery-gen
4
+ jekyll build
@@ -0,0 +1,20 @@
1
+ title: Sample Gallery
2
+
3
+ exclude: [ galleries ]
4
+ keep_files: [ galleries ]
5
+
6
+ galleries:
7
+ bumthang:
8
+ title: Bumthang
9
+ geometries: [ x200 ]
10
+
11
+ selected_photos:
12
+ title: Selection of Photos
13
+ parent: bumthang
14
+ selection:
15
+ - rusij-sizov
16
+ - savud-bagom
17
+
18
+ surroundings:
19
+ title: Surroundings
20
+ geometries: [ x200 ]
@@ -0,0 +1,30 @@
1
+ ---
2
+ ---
3
+
4
+ <!doctype html>
5
+ <html lang="en">
6
+ <head>
7
+ <meta charset="utf-8"/>
8
+ <title>{{ site.title }}</title>
9
+ <meta name="viewport" content="width=device-width, initial-scale=1"/>
10
+ </head>
11
+ <body>
12
+
13
+ {% for gallery in site.data.gallery-data %}
14
+ <h3>{{gallery.title}}</h3>
15
+ <div id="{{gallery.name}}-gallery" class="gallery">
16
+ {% for image in gallery.images %}
17
+ <a href="{{image.original.path}}"
18
+ target="_blank" data-gallery-image-id="{{image.id}}" data-gallery-image-name="{{image.name}}"
19
+ data-pswp-width="{{image.original.width}}" data-pswp-height="{{image.original.height}}"
20
+ data-pswp-srcset="{{image.srcset}}">
21
+ <img src="{{image.renditions[0].path}}" alt="{{image.name}}"/>
22
+ </a>
23
+ {% endfor %}
24
+ </div>
25
+ {% endfor %}
26
+
27
+ <script type="module" src="galleries/gallery.js"></script>
28
+
29
+ </body>
30
+ </html>
metadata ADDED
@@ -0,0 +1,93 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: gallery-gen
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Patrick Pfeifer
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-08-09 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rmagick
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 4.2.6
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 4.2.6
27
+ - !ruby/object:Gem::Dependency
28
+ name: jekyll
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 4.2.2
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 4.2.2
41
+ description: Quickly generate a mobile-ready photo gallery from a directory of images.
42
+ email:
43
+ executables:
44
+ - gallery-gen
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - PhotoSwipe/dist/photoswipe-lightbox.esm.min.js
49
+ - PhotoSwipe/dist/photoswipe.css
50
+ - PhotoSwipe/dist/photoswipe.esm.min.js
51
+ - assets/gallery.css
52
+ - assets/gallery.js
53
+ - bin/gallery-gen
54
+ - example_site/Makefile
55
+ - example_site/_config.yml
56
+ - example_site/galleries/bumthang/Bue Sky.jpg
57
+ - example_site/galleries/bumthang/Bumthang Valley.jpg
58
+ - example_site/galleries/bumthang/Hilly Landscape.jpg
59
+ - example_site/galleries/bumthang/Jakar Dzong.jpg
60
+ - example_site/galleries/bumthang/Prayer Flags.jpg
61
+ - example_site/galleries/bumthang/Yaks.jpg
62
+ - example_site/galleries/surroundings/Bedrooms Building.jpg
63
+ - example_site/galleries/surroundings/Garden.jpg
64
+ - example_site/galleries/surroundings/Main Table.jpg
65
+ - example_site/galleries/surroundings/Outside Table.jpg
66
+ - example_site/galleries/surroundings/Sunny Annex.jpg
67
+ - example_site/galleries/surroundings/Winter.jpg
68
+ - example_site/index.html
69
+ homepage: https://github.com/Pfiver/gallery-gen
70
+ licenses:
71
+ - MIT
72
+ metadata:
73
+ source_code_uri: https://github.com/Pfiver/gallery-gen
74
+ post_install_message:
75
+ rdoc_options: []
76
+ require_paths:
77
+ - lib
78
+ required_ruby_version: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ required_rubygems_version: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ requirements: []
89
+ rubygems_version: 3.0.3.1
90
+ signing_key:
91
+ specification_version: 4
92
+ summary: Gallery-Generator
93
+ test_files: []